神经网络深层网络实现
步骤
- 随机初始化数据
- 对于权重\(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))\)
- 确定迭代次数
- 进入迭代循环
- 前向传播, 主要目的是计算出AL
- 在神经网络中会有很多层, 如果要通过一个函数直接前向传播到最后一层得到AL太返回, 一般定义一个辅助函数, 该辅助函数计算特定一层的输出值, 并在循环中调用该函数
- 如:
-
linear_activation_forward
: 辅助函数 -
L_model_forward
: 主函数
-
- 分辅助函数的好处:
- 降低编码的复杂度
- 可以方便为每个层定义定义不同的\(activate function\)
- 计算Cost
- 计算\(dAL\), 目的是初始化反向传播的起点
- 反向传播, 主要目的是计算出grads
- 与第4点一样, 我们一般定义一个辅助函数, 该辅助函数计算特定一层的梯度, 并在循环中调用该函数
- 如:
-
linear_activation_backward
: 辅助函数 -
L_model_backward
: 主函数
-
- 分辅助函数的好处:
- 降低编码的复杂度
- 可以方便为每个层定义定义不同的\(activate function\)
- 更新参数
- 达到了指定的迭代次数, 退出循环
附加操作
正则化
- 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]}\)
梯度检测
- 使用传统的方法, 也就是导数的定义计算出梯度, 与反向传播计算的梯度相减, 如果在阈值内则合法