1 梯度消失
梯度消失是神经网络训练中非常致命的一个问题,其本质是由于链式法则的乘法特效导致的。
1.1 Sigmoid函数
1.2 tanh(x)函数
与sigmoid类似,局部梯度特性不利于网络梯度流的反向传递。
sigmoid和tanh局部特性不好,很少用他们,除非作为输出层,不在用作隐层。
2 梯度爆炸
梯度爆炸也是由于链式法则的乘法特性导致的。
- 梯度爆炸:断崖处梯度乘以学习率后会是一个非常大的值,从而“飞”出了合理区域,最终导致算法不收敛;
- 解决方案:把沿梯度方向前进的步长限制在某个值内就可以避免“飞”出了,这个方法也称为梯度裁剪。
3 ReLU函数
4 Leakly ReLU函数
5 激活函数选择总结
尽量选择ReLU函数或者Leakly ReLU函数,相对于Sigmoid/tanh,ReLU函数或者Leakly ReLU函数会让梯度流更加顺畅,训练过程收敛得更快。
6 梯度算法改进
6.1 梯度下降算法存在的问题
- 损失函数特性:一个方向上变化迅速而在另一个方向上变化缓慢。
- 优化目标:从起点处走到底端笑脸处
- 梯度下降算法存在的问题:山壁间震荡,往谷底方向的行进较慢。
- 仅增大步长并不能加快算法收敛速度
6.2 动量法
- 目标:改进梯度下降算法存在的问题,即减少震荡,加速通往谷底
- 改进思想:利用累加历史梯度信息更新梯度
- 效果:累加过程中震荡方向相互抵消,平坦方向得到加强
- 现象:损失函数常具有不太好的局部最小值或鞍点(高维空间非常常见)
- 梯度下降算法存在的问题:局部最小处与鞍点处梯度为0,算法无法通过。
- 动量法的优势:由于动量的存在,算法可以冲出局部最小点以及鞍点,找到更优的解。
6.3 自适应梯度与RMSProp
- 自适应梯度法通过减小震荡方向步长,增大平坦方向步长来减小震荡,加速通往谷底方向;
- 梯度幅度的平方较大的方向是震荡方向;梯度幅度的平方较小的方向是平坦方向。
6.3.1 AdaGrad
- AdaGrad方法是一种自适应梯度方法
6.3.2 RMSProp
- RMSProp方法是一种自适应梯度方法
6.4 Adam
- 同时使用动量与自适应梯度思想
- 修正偏差步骤可以极大缓解算法初期的冷启动问题
6.5 总结
7 权值初始化
7.1 全零初始化
- 建议:采用随机初始化,避免全零初始化
- 全零初始化:网络中不同的神经元有相同的输出,进行同样的参数更新;因此,这些神经元学到的参数都一样,等价于一个神经元。
7.2 随机权值初始化
- 实验结论:初始化时让权值不相等,并不能保证网络能够正常的被训练。
- 有效的初始化方法:使网络各层的激活值和局部梯度的方差在传播过程中尽量保持一致;以保持网络中正向和反向数据流动。
7.3 Xavier初始化
- 一个神经元,其输入为z 1 _{1} 1,z 2 _{2} 2,…z N _{N} N,这N个输入是独立同分布的;其权值为w 1 _{1} 1,…,w N _{N} N,它们也是独立同分布的,且w与z是独立的;其激活函数为f;其最终输出y的表达式:y = f(w 1 _{1} 1 * z 1 _{1} 1 + … + w N _{N} N * z N _{N} N)
- 目标:使网络各层的激活值和局部梯度的方差在传播过程中尽量保持一致,即寻找w的分布使得输出 y 与输入 z 的方差一致
- 假设f为双曲正切函数,w 1 _{1} 1,…,w N _{N} N,独立同分布,z 1 _{1} 1,…z N _{N} N,独立同分布,随机变量wu与z独立,且均值都为0,则有:
- Var(y) = Var( ∑ i = 1 n \sum\limits_{i=1}^{n} i=1∑nw i _{i} iz i _{i} i)= ∑ i = 1 n \sum\limits_{i=1}^{n} i=1∑nVar(w i _{i} iz i _{i} i)=nVar(w i _{i} i)Var(z i _{i} i),当var(w)=1/N时,y的方差与z的方差一致。
- 网络结构:10个隐层,1个输出层,每个隐层包含500个神经元,使用的双曲正切激活函数。
- 随机初始化:权值采样自N(0,1/N)的高斯分布,N为输入神经元个数
- 达到目的:每层神经元激活值的方差基本相同!
7.4HE初始化(MSRA)
- 网络结构:10个隐层,1个输出层,每个隐层包含500个神经元,使用的ReLU激活函数。
- 随机初始化:权值采样自N(0,2/N)的高斯分布,N为输入神经元个数
7.5 权值初始化小结
- 好的初始化方法可以防止前向传播过程中的信息消失,也可以解决反向传递过程中的梯度消失。
- 激活函数选择双曲正切或Sigmoid时,建议使用Xaizer初始化方法;
- 激活函数选择ReLU或Leakly ReLU时,推荐使用He初始化方法。
8 批归一化(也叫BN操作)
- 小批量梯度下降算法回顾:每次迭代时会读入一批数据,比如32个样本;经过当前神经元后会有32个输出值y 1 _{1} 1,…,y 32 _{32} 32。
- 批归一化操作:对这32个输出进行减均值除方差操作;可保证当前神经元的输出值的分布符合0均值1方差。
- 如果每一层的每个神经元进行批归一化,就能解决前向传递过程中的信号消失问题。