文章目录

  • RNN 梯度消失&梯度爆炸
  • 1. 深层网络角度解释梯度消失和梯度爆炸
  • 2. 激活函数角度解释梯度消失和梯度爆炸
  • 3. RNN中的梯度消失和CNN的梯度消失有区别
  • 4. 梯度消失、爆炸的解决方案
  • 4.1 梯度爆炸的解决方案
  • 4.2 梯度消失的解决方案
  • 4.2.1 选择relu、leakrelu、elu等激活函数
  • 4.2.2 使用Batchnorm(batch normalization,简称BN):
  • 4.2.3 残差结构:
  • 4.2.4 LSTM:
  • 5. 参考


RNN 梯度消失&梯度爆炸

参考:https://zhuanlan.zhihu.com/p/33006526?from_voters_page=true

梯度消失和梯度爆炸本质是同一种情况。梯度消失经常出现的原因:一是使用深层网络;二是采用不合适的损失函数,如Sigmoid。梯度爆炸一般出现的场景:一是深层网络;二是权值初始化太大。

1. 深层网络角度解释梯度消失和梯度爆炸

深层网络由许多非线性层堆叠而来,每一层网络激活后的输出为RNN网络的梯度弥散1_深度学习,其中RNN网络的梯度弥散1_RNN网络的梯度弥散1_02为第RNN网络的梯度弥散1_RNN网络的梯度弥散1_02层,RNN网络的梯度弥散1_神经网络_04是第RNN网络的梯度弥散1_RNN网络的梯度弥散1_02层的输入,即第RNN网络的梯度弥散1_人工智能_06层的输出,RNN网络的梯度弥散1_网络_07是激活函数,整个深层网络可视为一个复合的非线性多元函数:
RNN网络的梯度弥散1_人工智能_08
目的是多元函数RNN网络的梯度弥散1_深度学习_09完成输入到输出的映射,假设不同的输入,输出的最优解是g(x),则优化深层网络就是为了找到合适的权值,满足RNN网络的梯度弥散1_神经网络_10取得极小值。

BP 算法基于梯度下降策略,以负梯度方向对参数进行调整,参数更新:
RNN网络的梯度弥散1_RNN网络的梯度弥散1_11
RNN网络的梯度弥散1_人工智能_12即对激活函数求导,如果此部分大于1,随着层数增加,梯度更新将以指数形式增加,即发生梯度爆炸;如果此部分小于1,随着层数增加,梯度更新将以指数形式衰减,即发生梯度消失。

梯度消失、爆炸,其根本原因在于反向传播训练法则,链式求导次数太多。

2. 激活函数角度解释梯度消失和梯度爆炸

计算权值更新信息,需要计算前层偏导信息,因此激活函数选择不合适,比如Sigmoid,梯度消失会更明显。
RNN网络的梯度弥散1_网络_13
如果使用sigmoid作为损失函数,其梯度是不可能超过0.25的,这样经过链式求导之后,很容易发生梯度消失。

RNN网络的梯度弥散1_深度学习_14

tanh作为损失函数,它的导数图如下,可以看出,tanh比sigmoid要好一些,但是它的导数仍然是小于1的。

RNN网络的梯度弥散1_人工智能_15

RNN网络的梯度弥散1_RNN网络的梯度弥散1_16

由于sigmoid和tanh存在上述的缺点,因此relu激活函数成为了大多数神经网络的默认选择。relu函数的导数在正数部分是恒等于1,因此在深层网络中就不存在梯度消失/爆炸的问题,每层网络都可以得到相同的更新速度。另外计算方便,计算速度快,加速网络的训练。

但是relu也存在缺点:即在RNN网络的梯度弥散1_神经网络_04小于0时,导数为0,导致一些神经元无法激活。输出不是以0为中心的。因此引申出下面的leaky relu函数,但是实际上leaky relu使用的并不多。

RNN网络的梯度弥散1_人工智能_18

RNN网络的梯度弥散1_深度学习_19

RNN网络的梯度弥散1_深度学习_20

3. RNN中的梯度消失和CNN的梯度消失有区别

RNN中的梯度消失/爆炸和MLP/CNN中的梯度消失/爆炸含义不同:MLP/CNN中不同的层有不同的参数,各是各的梯度;而 RNN 中同样的权重在各个时间步共享,最终的梯度 g 等于各个时间步的梯度 RNN网络的梯度弥散1_人工智能_21

  • RNN中的总的梯度不会消失。即便梯度越传越弱,那也只是远距离的梯度消失,由于近距离的梯度不会消失,所有梯度之和并不会消失。RNN 所谓梯度消失的真正含义是,梯度被近距离梯度主导,导致模型难以学到远距离的依赖关系。

RNN前向传导过程:
RNN网络的梯度弥散1_网络_22

当激活函数为tanh,RNN网络的梯度弥散1_深度学习_23

权值梯度:
RNN网络的梯度弥散1_网络_24

  • MLP/CNN 的梯度消失:主要是随着网络加深,浅层网络的梯度越来越小,导致参数无法更新迭代。

4. 梯度消失、爆炸的解决方案

在深度神经网络中,往往是梯度消失出现的更多一些。

4.1 梯度爆炸的解决方案

  1. 梯度裁剪:主要思想是设置一个梯度剪切阈值,然后更新梯度的时候,如果梯度超过这个阈值,那么就将其强制限制在这个范围之内。这可以防止梯度爆炸。
  2. 权值正则化(weithts regularization):正则化是通过对网络权重做正则限制过拟合,如下正则项在损失函数中的形式:
    RNN网络的梯度弥散1_人工智能_25
    常见的是L1正则和L2正则,在各个深度框架中都有相应的API可以使用正则化。
    其中, RNN网络的梯度弥散1_深度学习_26是指正则项系数,因此,如果发生梯度爆炸,权值的范数就会变的非常大,通过正则化项,可以部分限制梯度爆炸的发生。

4.2 梯度消失的解决方案

4.2.1 选择relu、leakrelu、elu等激活函数
  • relu函数的导数在正数部分是恒等于1的,因此在深层网络中不会导致梯度消失和爆炸的问题。relu优点:解决了梯度消失、爆炸的问题,计算速度快,加速网络训练。relu缺点:导数的负数部分恒为0,会导致一些神经元无法激活(可通过设置小学习率部分解决),输出不是以0为中心的。
  • leakrelu就是为了解决relu的0区间带来的影响。数学表达:RNN网络的梯度弥散1_神经网络_27
    其中k是leak系数,一般选择0.1或者0.2,或者通过学习而来。leakrelu解决了0区间带来的影响,而且包含了relu的所有优点。

RNN网络的梯度弥散1_深度学习_28

  • elu也是为了解决relu的0区间带来的影响,其数学表达为:
    RNN网络的梯度弥散1_人工智能_29
    但是elu相对于leakrelu来说,计算要更耗时间一些。
4.2.2 使用Batchnorm(batch normalization,简称BN):

目前已经被广泛的应用到了各大网络中,具有加速网络收敛速度,提升训练稳定性的效果,Batchnorm本质上是解决反向传播过程中的梯度问题。通过规范化操作将输出信号x规范化到均值为0,方差为1保证网络的稳定性。 具体来说就是反向传播中,经过每一层的梯度会乘以该层的权重,举个简单例子: 正向传播中RNN网络的梯度弥散1_网络_30 ,那么反向传播中,RNN网络的梯度弥散1_神经网络_31, 反向传播式子中有RNN网络的梯度弥散1_网络_32 的存在,所以 RNN网络的梯度弥散1_网络_32

4.2.3 残差结构:

残差单元里的shortcut(捷径)部分可以保证在反向传播中梯度不会消失。

RNN网络的梯度弥散1_深度学习_34
式子的第一个因子RNN网络的梯度弥散1_深度学习_35表示的损失函数到达 L 层的梯度,小括号中的1表明短路机制可以无损地传播梯度,而另外一项残差梯度则需要经过带有weights的层,梯度不是直接传递过来的。残差梯度不会那么巧全为-1,而且就算其比较小,有1的存在也不会导致梯度消失。所以残差学习会更容易。

RNN网络的梯度弥散1_人工智能_36

4.2.4 LSTM:

使用LSTM(long-short term memory networks,长短期记忆网络),就不那么容易发生梯度消失,主要原因在于LSTM内部复杂的“门”(gates),如下图,LSTM通过它内部的“门”可以在更新的时候“记住”前几次训练的“残留记忆”,因此,经常用于生成文本中。

RNN网络的梯度弥散1_网络_37

5. 参考

RNN

  • https://zybuluo.com/hanbingtao/note/541458
  • https://colab.research.google.com/drive/1Zfvt9Vfs3PrJwSDF8jMvomz7CzU36RXk

LSTM

  • http://colah.github.io/posts/2015-08-Understanding-LSTMs/
  • https://www.youtube.com/watch?v=9zhrxE5PQgY&feature=youtu.be
  • https://towardsdatascience.com/illustrated-guide-to-lstms-and-gru-s-a-stepby-step-explanation-44e9eb85bf21
  • https://medium.com/datadriveninvestor/how-do-lstm-networks-solve-theproblem-of-vanishing-gradients-a6784971a577

欢迎各位关注我的个人公众号:HsuDan,我将分享更多自己的学习心得、避坑总结、面试经验、AI最新技术资讯。




RNN网络的梯度弥散1_神经网络_38