问题引出
在前面,我们介绍了反向传播算法,其最终极的含义就是计算偏导数∂ωjkl∂C和∂bjl∂C,其中∂ωjkl∂C=αkl−1⋅δjl,δl=((ωl+1)Tδl+1)σ′(zl),将∂ω∂C用δl展开,可以想象一下,这会有很多的σ′(z)ω连乘。
其中:σ(z)=1+e−z1,计算得到:
σ′(z)=σ(z)(1−σ(z))
梯度消失
利用google搜索(1/(1+exp(-x)))(1-1/(1+exp(-x)))
得到σ′(z)的图像:

该函数的最大值为41,我们假设ω都是一个合适的数,使∣σ′(z)ω∣<1,可以想象,网络越深,连乘的次数越多,得到的∂ω∂C越小,极端情况下∂ω∂C可能趋近于0,这就是梯度消失。
梯度爆炸
既然梯度消失时令∂ω∂C越来越小,相反的梯度爆炸就是让∂ω∂C可能趋近于0越来越大,只要∣σ′(z)ω∣>1就是有可能的。回忆一下梯度下降算法中ω的更新方法:
ωk→ωk′=ωk−η∂ωk∂C
想想一下,如果η∂ωk∂C比原本的ωk都还要大了,那这个梯度就向反方向更新了,模型无法收敛,这就是梯度爆炸。
总结一下,其实梯度消失和梯度爆炸问题都是因为网络太深,网络权值更新不稳定造成的,本质上是因为梯度反向传播中的连乘效应,越乘越小或越乘越大。
如何解决
规避梯度消失和梯度爆炸的方法有:
- 预训练和微调
- 梯度阈值
主要是针对梯度爆炸,它设置一个梯度剪切阈值,然后更新梯度的时候,如果梯度超过这个阈值,那么就将其强制限制在这个范围之内。
- 正则化
也是针对梯度爆炸的,主要是通过对网络权重做正则来限制过拟合。如果发生梯度爆炸,那么权值就会变的非常大,反过来,通过正则化项来限制权重的大小,也可以在一定程度上防止梯度爆炸的发生,常用的正则化方法有 L1 正则和 L2 正则。
- **函数
通过之前的分析,我们发现梯度问题是由sigmod函数的导数引起的,我们可以选其他的**函数代替sigmod函数,如relu、tanh,其中relu函数在正数部分的导数为1,不会导致梯度问题。
注:tanh′(z)=1−tanh(z)2,其最大值为1,也有可能出现梯度问题。
- BN方法
BN(Batch Normalization)就是通过对每一层的输出规范为均值和方差一致的方法,消除了权重参数放大缩小带来的影响,进而解决梯度消失和爆炸的问题,或者可以理解为BN将输出从饱和区拉倒了非饱和区。
- LSTM
通过各种是遗忘门、输入门和输出门决定需要丢弃和记忆哪些信息。能防止梯度问题。
其他
那深度神经网络难以训练的根本是因为梯度消失或梯度爆炸问题吗?不是,而是因为退化,具体来讲就是权重矩阵的退化,导致模型的有效自由度减少。
感谢阅读。
如果觉得文章对你有所帮助,欢迎打赏哦~

