参考:https://blog.csdn.net/qq_25737169/article/details/78847691
参考:https://www.cnblogs.com/DLlearning/p/8177273.html
一、梯度消失出现的原因:
在深层网络中,如果激活函数的导数小于1,根据链式求导法则,靠近输入层的参数的梯度因为乘了很多的小于1的数而越来越小,最终就会趋近于0,例如sigmoid函数,其导数f′(x)=f(x)(1−f(x))的值域为(0,1/4),极易发生这种情况。
梯度爆炸出现的原因:
同梯度消失的原因一样,求解损失函数对参数的偏导数时,在梯度的连续乘法中总是遇上很大的绝对值,部分参数的梯度因为乘了很多较大的数而变得非常大,导致模型无法收敛。
二、梯度消失的表现:
模型无法从训练数据中获得更新,损失几乎保持不变。
梯度爆炸的表现:
模型不稳定,更新过程中的损失出现显著变化或者变成 NaN。
三、梯度消失、爆炸的解决方案
梯度爆炸:
(1)重新设置网络结构,减少网络层数,调整学习率(消失增大,爆炸减小)。
(2)预训练加微调:如深度信念网络(Deep Belief Networks)和堆叠自编码器(Stacked Autoencoder)使用的方式一样,先逐层预训练,然后再使用BP算法对网络进行微调。就是相当于是先寻找局部最优,然后整合起来寻找全局最优。
(3)梯度剪切:设置一个梯度剪切阈值,然后更新梯度的时候,如果梯度超过这个阈值,那么就将其强制限制在这个范围之内。(防止梯度爆炸)。
(4)正则化:L1正则化和L2正则化。(防止梯度爆炸)
(5)激活函数不要过多采用sigmoid,可以用relu系列等。(防止梯度消失)
(6)使用batch normalization。
(7)使用残差模块,DESNET模块或LSTM等结构。