学习笔记:梯度爆炸和梯度消失

这篇博客是我个人学习深度学习的学习笔记也是本人第一篇博客,请各位大佬多多关照,网上关于梯度爆炸和梯度消失的资料很多,这里我结合个人观点总结下(知识的搬运工- -)

一、梯度爆炸和梯度消失

层数比较多的神经网络模型在训练时会出现梯度不稳定问题,前面层中的梯度或会消失,或会爆炸称为梯度消失问题(gradient vanishing problem)和梯度爆炸问题(gradient exploding problem)。梯度不稳定问题一般随着网络层数的增加会变得越来越明显。
根本原因在于前面层上的梯度是来自于后面层上梯度的乘积。当存在过多的层次时,就出现了内在本质上的不稳定场景。

1.什么是梯度爆炸

梯度爆炸的意思是,靠近输入层的网络层比后面层梯度变化更快(更陡),经过链式偏导后的值极其大,更新后W(权值)变成一个很大的数(爆炸)。即我们初始化的w是很大的数,w大到乘以激活函数的导数都大于1,那么经过连乘后,可能会导致求导的结果很大,形成梯度爆炸。简单的说就是一个数大于1经过多次重复相乘导致指数级增长

2.什么是梯度消失

靠近输出层的网络层的权值更新相对正常,但靠近输入层的网络层权值会变的很慢,导致前面层的权值几乎不变,仍接近初始的权值。简单的说就是一个0-1之间的数,经过链式偏导(连乘),会变得越来越小,最后趋于0.

二、梯度爆炸和梯度消失的原因

以下图所示的含有3个隐藏层的神经网络为例

上文说过梯度消失会导致前面层(可以看成hidden layer1)的权值更新很慢,使前面层权值几乎不变,导致hidden layer1相当于一个映射层,对输入层(input layer)做了一个复制,这样此深层网络的学习就等价于只有后几层的浅层网络的学习了。
而这种问题为何会产生呢?以下图的反向传播为例(假设每一层只有一个神经元且对于每一层   y i = σ ( z i ) = σ ( w i x i + b i ) \,y_i=σ(z_i)=σ(w_ix_i+b_i) yi=σ(zi)=σ(wixi+bi).,其中σ为sigmoid函数

在这里插入图片描述
可以推出
在这里插入图片描述
而sigmoid导数   σ ‘ ( x ) \,σ^`(x) σ(x)如下图.
在这里插入图片描述
可见   σ ‘ ( x ) \,σ^`(x) σ(x)的最大值为1/4,而我们初始化的网络权值   ∣ w ∣ \,|w| w通常为1,因此   ∣ σ ‘ ( x ) w ∣ < = 1 / 4 \,|σ^`(x)w|<=1/4 σ(x)w<=1/4,因此对于上面的链式求导,层数越多,求导结果越小,因而导致梯度消失的情况出现。
同理梯度爆炸问题的出现,即   ∣ σ ‘ ( x ) w ∣ > 1 \,|σ^`(x)w|>1 σ(x)w>1,也就是   w \,w w比较大,如大于4,从而   ∣ σ ‘ ( x ) w ∣ > 1 \,|σ^`(x)w|>1 σ(x)w>1,再经过链式求导,层数越多,结果越大。
下图为训练时梯度爆炸的显示(由于训练麻烦,网上找了张- -),nan为无穷大此图利用

总的来说梯度爆炸和梯度消失问题都是因为网络太深,网络权值更新不稳定造成的,本质上是因为梯度反向传播中的连乘效应。

三、解决方法

(1) pre-training+fine-tunning

此方法来自Hinton在2006年发表的一篇论文,Hinton为了解决梯度的问题,提出采取无监督逐层训练方法,其基本思想是每次训练一层隐节点,训练时将上一层隐节点的输出作为输入,而本层隐节点的输出作为下一层隐节点的输入,此过程就是逐层“预训练”(pre-training);在预训练完成后,再对整个网络进行“微调”(fine-tunning)。此思想相当于是先寻找局部最优,然后整合起来寻找全局最优,此方法有一定的好处,但是目前应用的不是很多了。

(2)梯度剪切:对梯度设定阈值

梯度剪切这个方案主要是针对梯度爆炸提出的,其思想是设置一个梯度剪切阈值,然后更新梯度的时候,如果梯度超过这个阈值,那么就将其强制限制在这个范围之内。这可以防止梯度爆炸。

(3)权重正则化

另外一种解决梯度爆炸的手段是采用权重正则化(weithts regularization),正则化主要是通过对网络权重做正则来限制过拟合。如果发生梯度爆炸,那么权值就会变的非常大,反过来,通过正则化项来限制权重的大小,也可以在一定程度上防止梯度爆炸的发生。比较常见的是 L1 正则和 L2 正则,在各个深度框架中都有相应的API可以使用正则化。

(4)其他

还有其他的方法这里就不一一罗列了,有兴趣的可以看这篇文章(点我).

四、参考资料

链接:

  1. https://zhuanlan.zhihu.com/p/25631496.
  2. https://ziyubiti.github.io/2016/11/06/gradvanish/.
  3. https://blog.csdn.net/qq_40765537/article/details/106063941.
  4. https://zhuanlan.zhihu.com/p/72589432/.

猜你喜欢

转载自blog.csdn.net/kushe123/article/details/113740799