全连接神经网络(中)
6. 再看激活函数
梯度消失
梯度消失是神经网络训练中非常致命的一个问题。其本质是由于链式法则的乘法特性导致的
梯度爆炸
梯度爆炸是由于链式法则的乘法特性导致的
断崖处梯度乘以学习率后会是一个非常大的值,从而‘飞‘出了合理区域,最终导致算法不收敛。
解决方案:把沿梯度方向前进的步长限制在某个值内就可以避免’飞‘出了,这个方法也叫做梯度裁剪。
尽量选择ReLU函数或者Leakly ReLU函数,相对于sigmoid/tanh,ReLU函数或者Leakly ReLU函数会让梯度流更加顺畅,训练过程收敛过快。
7. 动量法与自适应梯度
梯度算法改进:
-
梯度下降算法存在的问题
损失函数特性:一个方向上变化迅速而在另一个方向上变化缓慢。
优化目标:从起点处走到笑脸处。
问题:山壁间震荡,往谷底方向行进缓慢。
仅增长步长并不能加快算法收敛速度
-
动量法
改进梯度下降算法存在的问题,即减少震荡,加速通往谷底。
改进思想:利用累加历史梯度信息来更新梯度。
为何有效:
累加过程中震荡方向相互抵消,平坦方向的到加强。
动量法还有什么效果:
现象:损失函数通常具有不大好的局部最小值或鞍点(高维空间非常常见)
梯度算法存在的问题:局部最小处与鞍点处梯度为0,算法无法通过。
动量法的优势:由于动量的存在,算法可以冲出局部最小点以及鞍点,找到更优的解。
- 自适应梯度法
自适应梯度法是通过减小震荡方向步长,增大平坦方向步长来减小震荡,加速通往谷底方向。
如何区分震荡方向与平坦方向?
梯度幅度的平方较大的方向是震荡方向,梯度幅度的平方较小的方向是平坦方向。
AdaGrad
AdaGrad方法是一种自适应梯度方法
RMSprop
RMSprop方法是一种自适应梯度方法
- Adam
同时使用动量与自适应梯度思想
修正偏差步骤可以极大缓解算法初期的冷启动问题。
8. 权值初始化
采用随机初始化,避免全零初始化。
全零初始化:网络中不同神经元有相同的输出,进行同样的参数更新;因此,这些神经原学到的参数都一样,等价与一个神经元。
随机权值初始化
网络结构:10个隐层,1个输出层,每个隐层包含500个神经元,使用的双曲正切激活函数。
随机初始化:全职采样于N(0,1)的高斯分布
实验结论:初始化时让权值不相等,并不也能保证网络能够正常的被训练。
有效的初始化方法:使网络各层的激活值和局部梯度的方差在传播过程中保持尽量一致;以保证网络中正向和反向数据流动。
Xavier初始化
权值初始化小结
- 好的初始化方法可以防止前向传播过程中的信息小时,也可以解决反向传递过程中的梯度消失。
- 激活函数选择双曲正切Sigmoid时,建议使用Xaizer初始化方法;
- 激活函数选择ReLU或者Leakly ReLU时,推荐使用He初始化方法。
9. 批归一化
批归一化和全职初始化都是为了让信息流正反向都通畅,从而有效训练。