神经网络深层网络实现

时间:2022-03-10 09:13:52

神经网络深层网络实现

步骤

  1. 随机初始化数据
    • 对于权重\(W^{[l]}\), 一般采用\(np.random.randn(l, l - 1) * \sqrt{{1\over{dimension\ of\ previous\ layer}}}\)
    • 如果当前的\(l\)层的激活函数为\(ReLU\), 则使用\(He\ initialization\), 也就是\(np.random.randn(l, l - 1) * \sqrt{{2\over{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 \times m\)维的矩阵
    • \(W^{[l]}, W^{[l + 1]}\)都是矩阵
    • \(X^{[l]}\)\(n_x \times m\)维的矩阵
  • 在向量公式中, 如果是一个列向量, 则在转为矩阵的时候将他们按照axis=1的方向堆积
  • 在向量公式中, 如果是一个行向量, 则在转为矩阵的时候将他们按照axis=0的方向堆积

全连接神经网络公式

  • 前向传播
  • 反向传播
    • \(dA^{[L]}=-({Y\over{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]})\)
    • \(dW^{[2]}={1\over m}dZ^{[2]}(A^{[1]})^T\)
    • \(db^{[2]}={1\over m}dZ^{[2]}\)
    • \(dZ^{[1]}=dA^{[1]}.*g'(Z^{[1]})\)
    • \(dW^{[1]}={1\over m}dZ^{[1]}X^T\)
    • \(db^{[1]}={1\over m}dZ^{[1]}\)

梯度检测

  • 使用传统的方法, 也就是导数的定义计算出梯度, 与反向传播计算的梯度相减, 如果在阈值内则合法