一 什么是梯度消失和梯度爆炸
在深层网络或循环神经网络中,梯度反向传播来更新网络权值,会应用链式法则进行计算,链式法则的本质是连乘,误差梯度可在更新中累积,变成非常大的梯度,然后导致网络权重的大幅更新,在极端情况下,权重的值变得非常大,以至于溢出,导致W为 NaN 值。 梯度消失就是在计算累计之下,梯度更新缓慢,梯度将变为0, 网络权值参数W不更新。
梯度爆炸模型表现:
- 模型不稳定,导致更新过程中的损失(Loss)出现显著变化;
- 训练过程中,打印个别层,权重的值变得非常大,以至于溢出,导致模型损失变成 NaN等。
二 产生梯度消失和梯度爆炸的原因
下面将从这3个角度分析一下产生这两种现象的根本原因:(1)深层网络
在深层网络或循环神经网络中,**梯度反向传播来**更新网络权值,会应用**链式法则**进行计算**,**链式法则的本质是**连乘,**所以当层数越深的时候,梯度将以指数传播。输出层的激活函数求导后梯度值大于1,那么层数增多的时候,最终求出的梯度很容易指数级增长,就会产生**梯度爆炸**;相反,如果小于1,那么经过链式法则的连乘形式,也会很容易衰减至0,就会产生**梯度消失**。
(2)激活函数

z=0,a=1/2, 导数g’(z)=1/4
复习:https://www.yuque.com/dengxiaotian0212/klyctg/txmsao
假设是深层网络:
而我们初始化的网络权值通常都小于1,因此
,因此对于db[1] 网络越深,值越小,梯度越容易消失。
(3)初始化权重的值过大
同上,,梯度爆炸。
三 解决方法
(1) pre-training+fine-tunning
此方法来自Hinton在2006年发表的一篇论文,Hinton为了解决梯度的问题,提出采取无监督逐层训练方法,其基本思想是每次训练一层隐节点,训练时将上一层隐节点的输出作为输入,而本层隐节点的输出作为下一层隐节点的输入,此过程就是逐层“预训练”(pre-training);在预训练完成后,再对整个网络进行“微调”(fine-tunning)。此思想相当于是先寻找局部最优,然后整合起来寻找全局最优,此方法有一定的好处,但是目前应用的不是很多了。
(2) 梯度剪切:对梯度设定阈值
其思想是设置一个梯度剪切阈值,然后更新梯度的时候,如果梯度超过这个阈值,那么就将其强制限制在这个范围之内。这可以防止**梯度爆炸**。
(3) 权重正则化
比较常见的是 L1 正则和 L2 正则,在各个深度框架中都有相应的API可以使用正则化。正则化主要是通过对网络权重做正则来限制过拟合,也可以通过正则化项来限制权重的大小。(4) 选择relu等梯度大部分落在常数上的激活函数
relu函数的导数在正数部分是恒等于1的(5) batch normalization
BN就是通过对每一层的输出规范为均值和方差一致的方法,消除了权重参数放大缩小带来的影响,进而解决梯度消失和爆炸的问题,或者可以理解为BN将输出从饱和区拉倒了非饱和区。(6) 残差网络的捷径(shortcut)
(7) LSTM的“门(gate)”结构
Q:防止梯度爆炸的方法
正则化
梯度裁剪
relu激活函数
batch normalization
权重正则化Q:防止梯度消失的方法
残差网络
relu激活函数
batch normalization
权重正则化
LSTM的门结构
