神经网络深层网络实现
步骤
- 随机初始化数据
- 对于权重(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)))
- 确定迭代次数
- 进入迭代循环
- 前向传播, 主要目的是计算出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 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]}))
- (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]})
梯度检测
- 使用传统的方法, 也就是导数的定义计算出梯度, 与反向传播计算的梯度相减, 如果在阈值内则合法