这两种现象的触发原因都是由于网络层数比较多,导致梯度在逐层回传的时候累积出了问题。
梯度消失
接近输出层的网络层梯度更新较为正常,而越远(越接近输入层),其权值更新会非常慢,此时对网络的学习相当于等价于只对后几层的学习,而前面层的权重可以认为约等于是固定的保持不变。
诱因 可以发现sigmoid激活函数的导数如下:
可以发现其导数是不会大于0.25的,此时链式求导梯度回传过程中梯度是很可能逐渐变小的(取决于初始化权值的大小),导致最后梯度约等于0,即"消失"。
可以考虑采用如下方法缓解梯度消失问题:
- 将sigmoid替换成ReLU(其导数只为0或1)
- 使用BatchNorm层(约束 x x x的取值从而防止sigmoid导数过小)
- 使用现代化网络设计(如ResNet的残差连接与LSTM的门结构)
- 优化权重初始化方式(如xavier)
梯度爆炸
接近输出层的网络层梯度更新较为正常,而越远(越接近输入层),其权值波动会非常剧烈,此时网络训练不稳定。不过相对于梯度消失而言,梯度爆炸则不那么容易遇到,其解决方案如下:
- 梯度裁切(给梯度设定阈值)
- 权重正则化(L1正则化,L2正则化)
- 上述四种梯度消失的解决办法
推荐阅读
https://zhuanlan.zhihu.com/p/72589432