27、梯度消失与梯度爆炸
梯度消失经常出现在:深层网络、采用了不合适的损失函数,比如sigmoid。
梯度爆炸一般出现在:深层网络、权值初始化值太大的情况下。
1、梯度消失、梯度爆炸的原因:
对激活函数进行求导,如果求导的每个部分部分小于1,那么随着层数增多,求出的梯度更新信息将会以指数形式衰减,即发生了梯度消失。
如果此部分大于1,那么层数增多的时候,最终的求出的梯度更新将以指数形式增加,即发生梯度爆炸。
2、梯度爆炸的原因:
当我们将w初始化为一个较大的值时,例如>10的值,那么从输出层到输入层每一层都会有一个s‘(zn)*wn的增倍,当s‘(zn)为0.25时s‘(zn)*wn>2.5,同梯度消失类似,当神经网络很深时,梯度呈指数级增长,最后到输入时,梯度将会非常大,我们会得到一个非常大的权重更新,这就是梯度爆炸的问题,在循环神经网络中最为常见。
总结:从深层网络角度来讲,不同的层学习的速度差异很大,表现为网络中靠近输出的层学习的情况很好,靠近输入的层学习的很慢,有时甚至训练了很久,前几层的权值和刚开始随机初始化的值差不多。因此,梯度消失、爆炸,其根本原因在于反向传播训练法则,属于先天不足。
3、解决方案
梯度消失:
非饱和的激活函数(如 ReLU)
批量规范化(Batch Normalization)
LSTM
残差结构
梯度爆炸:
梯度剪切、正则
非饱和的激活函数(如 ReLU)
批量规范化(Batch Normalization)
梯度截断(Gradient Clipping)
好的参数初始化方式,如He初始化