本文参考:深度网络梯度爆炸的原因、产生的影响和解决方法(常用激活函数)_凝眸伏笔的博客-CSDN博客
产生原因:
网络层数太深,链式求导时的连乘效应会导致梯度爆炸或梯度消失。
如果梯度值均小于1,则会出现衰减;如果都大于1,则会出现梯度爆炸。
解决方案:
(1)梯度剪切:
在更新梯度时,如果梯度超过某个阈值,则就将其强制限定在某个范围内,防止梯度爆炸。
(2)优化激活函数
使用relu
使用leakrelu,解决relu 0区间神经元死亡的问题。
(3)batchnorm
f2=f1(wT∗x+b)对w求导,得到∂f2/∂w=∂f2/∂f1 * x,反向传播式子中有x存在,所以x的大小影响了梯度。batchnorm通过对每一层的输出统一均值和方差,消除了x放大和缩小的影响,进而解决梯度消失和梯度爆炸。
(4)resnet残差结构
残差中存在的跨层连接结构,使得在传播过程中,不会存在梯度全为0的情况,不会梯度消失
(5)LSTM
在更新时候通过“门”结构来记住前几次训练的残留记忆,这样不会梯度消失。