深度学习中的梯度消失与梯度爆炸问题及其解决办法

问题引出

在前面,我们介绍了反向传播算法,其最终极的含义就是计算偏导数Cωjkl\frac{\partial C}{\partial\omega_{jk}^{l}}Cbjl\frac{\partial C}{\partial b_{j}^{l}},其中Cωjkl=αkl1δjl\frac{\partial C}{\partial\omega_{jk}^{l}}=\alpha_k^{l-1}\cdot\delta_j^lδl=((ωl+1)Tδl+1)σ(zl)\delta^l=((\omega^{l+1})^T\delta^{l+1})\sigma^{\prime}(z^l),将Cω\frac{\partial C}{\partial\omega}δl\delta^l展开,可以想象一下,这会有很多的σ(z)ω\sigma^{\prime}(z)\omega连乘。
其中:σ(z)=11+ez\sigma(z)=\frac{1}{1+e^{-z}},计算得到:
σ(z)=σ(z)(1σ(z)) \sigma^{\prime}(z)=\sigma(z)(1-\sigma(z))

梯度消失

利用google搜索(1/(1+exp(-x)))(1-1/(1+exp(-x)))得到σ(z)\sigma^{\prime}(z)的图像:
深度学习中的梯度消失与梯度爆炸问题及其解决办法
该函数的最大值为14\frac{1}{4},我们假设ω\omega都是一个合适的数,使σ(z)ω<1|\sigma^{\prime}(z)\omega|\lt 1,可以想象,网络越深,连乘的次数越多,得到的Cω\frac{\partial C}{\partial\omega}越小,极端情况下Cω\frac{\partial C}{\partial\omega}可能趋近于0,这就是梯度消失。

梯度爆炸

既然梯度消失时令Cω\frac{\partial C}{\partial\omega}越来越小,相反的梯度爆炸就是让Cω\frac{\partial C}{\partial\omega}可能趋近于0越来越大,只要σ(z)ω>1|\sigma^{\prime}(z)\omega|\gt 1就是有可能的。回忆一下梯度下降算法中ω\omega的更新方法:
ωkωk=ωkηCωk \omega_k \rightarrow \omega_k^{\prime}=\omega_k-\eta\frac{\partial C}{\partial \omega_k}
想想一下,如果ηCωk\eta\frac{\partial C}{\partial \omega_k}比原本的ωk\omega_k都还要大了,那这个梯度就向反方向更新了,模型无法收敛,这就是梯度爆炸。

总结一下,其实梯度消失和梯度爆炸问题都是因为网络太深,网络权值更新不稳定造成的,本质上是因为梯度反向传播中的连乘效应,越乘越小或越乘越大。

如何解决

规避梯度消失和梯度爆炸的方法有:

  • 预训练和微调
  • 梯度阈值
    主要是针对梯度爆炸,它设置一个梯度剪切阈值,然后更新梯度的时候,如果梯度超过这个阈值,那么就将其强制限制在这个范围之内。
  • 正则化
    也是针对梯度爆炸的,主要是通过对网络权重做正则来限制过拟合。如果发生梯度爆炸,那么权值就会变的非常大,反过来,通过正则化项来限制权重的大小,也可以在一定程度上防止梯度爆炸的发生,常用的正则化方法有 L1 正则和 L2 正则。
  • **函数
    通过之前的分析,我们发现梯度问题是由sigmodsigmod函数的导数引起的,我们可以选其他的**函数代替sigmodsigmod函数,如relurelutanhtanh,其中relurelu函数在正数部分的导数为1,不会导致梯度问题。
    注:tanh(z)=1tanh(z)2tanh^{\prime}(z)=1-tanh(z)^2,其最大值为1,也有可能出现梯度问题。
  • BN方法
    BN(Batch Normalization)就是通过对每一层的输出规范为均值和方差一致的方法,消除了权重参数放大缩小带来的影响,进而解决梯度消失和爆炸的问题,或者可以理解为BN将输出从饱和区拉倒了非饱和区。
  • LSTM
    通过各种是遗忘门、输入门和输出门决定需要丢弃和记忆哪些信息。能防止梯度问题。

其他

那深度神经网络难以训练的根本是因为梯度消失或梯度爆炸问题吗?不是,而是因为退化,具体来讲就是权重矩阵的退化,导致模型的有效*度减少。

感谢阅读。

如果觉得文章对你有所帮助,欢迎打赏哦~
深度学习中的梯度消失与梯度爆炸问题及其解决办法
深度学习中的梯度消失与梯度爆炸问题及其解决办法