神经网络深层网络实现

神经网络深层网络实现

步骤

  1. 随机初始化数据
    • 对于权重(W^{[l]}), 一般采用(np.random.randn(l, l - 1) * sqrt{{1over{dimension of previous layer}}})
    • 如果当前的(l)层的激活函数为(ReLU), 则使用(He initialization), 也就是(np.random.randn(l, l - 1) * sqrt{{2over{dimension of previous layer}}})
    • 对于偏移量(b^{[l]}), 一般采用(np.zeros((l, 1)))
  2. 确定迭代次数
  3. 进入迭代循环
  4. 前向传播, 主要目的是计算出AL
    • 在神经网络中会有很多层, 如果要通过一个函数直接前向传播到最后一层得到AL太返回, 一般定义一个辅助函数, 该辅助函数计算特定一层的输出值, 并在循环中调用该函数
    • 如:
      • linear_activation_forward: 辅助函数
      • L_model_forward: 主函数
    • 分辅助函数的好处:
      • 降低编码的复杂度
      • 可以方便为每个层定义定义不同的(activate function)
  5. 计算Cost
  6. 计算(dAL), 目的是初始化反向传播的起点
  7. 反向传播, 主要目的是计算出grads
    • 与第4点一样, 我们一般定义一个辅助函数, 该辅助函数计算特定一层的梯度, 并在循环中调用该函数
    • 如:
      • linear_activation_backward: 辅助函数
      • L_model_backward: 主函数
    • 分辅助函数的好处:
      • 降低编码的复杂度
      • 可以方便为每个层定义定义不同的(activate function)
  8. 更新参数
  9. 达到了指定的迭代次数, 退出循环

附加操作

正则化

  • L2正则化:

    • 影响cost和back propagation
    • 在训练集和测试集中都会使用
  • Dropout正则化:

    • 影响forward propagation和back propagation
    • 只能在训练集中使用
    • 原理
      • 在前向传播的时候, 设定一个keep_prob参数, 当keep_prob为1表示保留, 在0-1之间表示有特定的概率被保留, 如果被删除, 也只是将我们原来得到的激活函数的值变为0
      • 在反向传播的时候, 依据前向传播, 得到的dA1等也要对应的为0或者其他
    • 应用: 在计算机视觉中十分常见

    激活函数选择

  • hidden layer中不会使用(sigmoid function), 但是在output layer, 如果是一个二分类问题, 使用(sigmoid function)

  • 一般地, 在hidden layer使用ReLU或者tanh

  • ReLU的导数: np.int64(relu(Z) > 0)

Optimization Methods

Mini-Batch

  • mini-batch size指的是一个mini-batch中含有的样本数量

  • 如果mini-batch size=m, 则为梯度下降, 当m很大的时候, 效率低

  • 如果mini-batch size=1, 则为随机梯度下降, 在下降的过程中有很多噪音; 会失去向量化的加速效果

  • 选择:

    • mini-batch size一般为64-512, 离散来讲为(2^6), (2^7), (2^8)
    • 如果数据量较小, 则直接使用batch梯度下降

核对矩阵的维度

  • 参考:

    • (A^{[l]})(n_l imes m)维的矩阵
    • (W^{[l]}, W^{[l + 1]})都是矩阵
    • (X^{[l]})(n_x imes m)维的矩阵
  • 在向量公式中, 如果是一个列向量, 则在转为矩阵的时候将他们按照axis=1的方向堆积

  • 在向量公式中, 如果是一个行向量, 则在转为矩阵的时候将他们按照axis=0的方向堆积

全连接神经网络公式

  • 前向传播
  • 反向传播
    • (dA^{[L]}=-({Yover{A^{[L]}}} - {{1 - Y}over{1 - A^{[L]}}})), 进行反向传播初始化, 这个是必须的, 这里是(sigmoid)函数的对(A^{[L]})的梯度
    • 现在假设共2层, 1层hidden layer, 1层output layer
    • (dZ^{[2]}=dA^{[2]}.*g'(Z^{[2]})=A^{[2]}-Y)
    • (dW^{[2]}={1over m}dZ^{[2]}(A^{[1]})^T)
    • (db^{[2]}={1over m}dZ^{[2]})
    • (dZ^{[1]}=dA^{[1]}.*g'(Z^{[1]}))
    • (dW^{[1]}={1over m}dZ^{[1]}X^T)
    • (db^{[1]}={1over m}dZ^{[1]})
    • 发现, 在公式中出去第一个公式, 凡是出现(A)的, 它的层数与公式中的其他层数少一

梯度检测

  • 使用传统的方法, 也就是导数的定义计算出梯度, 与反向传播计算的梯度相减, 如果在阈值内则合法
原文地址:https://www.cnblogs.com/megachen/p/11154777.html