1 、什么是梯度消失和梯度爆炸
在反向传播过程中需要对激活函数进行求导,如果导数大于1,那么随着网络层数的增加梯度更新将会朝着指数爆炸的方式增加这就是梯度爆炸。同样如果导数小于1,那么随着网络层数的增加梯度更新信息会朝着指数衰减的方式减少这就是梯度消失。因此,梯度消失、爆炸,其根本原因在于反向传播训练法则,属于先天不足。
2、梯度消失、爆炸导致原因
2.1、从BP(反向传播原理)解释梯度消失和梯度爆炸
举例,一个简单的深层网络如下:
图中是一个四层的全连接网络,假设每一层网络激活后的输出为 fi(x) ,其中,fi(x) 代表第 i 层, 第i-1层的输出代表第 i 层的输入,也就是说第 fi-1 输出, f 是激活函数,那么 fi+1=f(fi*wi+1+bi+1) ,简答计为: fi+1=f(fi*wi+1) 。
BP(反向传播算法)就是基于梯度下降策略,以目标的负梯度方向对参数进行调整,参数的更新为 ,给定学习率
,得出
。如果更新第二层隐层的权值信息,根据链式求导法则,更新梯度信息为:
,即第二隐藏层的输入。
就是对激活函数进行求导,如果此部分大于1,那么层数增多的时候,最终的求出的梯度更新将以指数形式增加,即发生梯度爆炸,如果此部分小于1,那么随着层数增多,求出的梯度更新信息将会以指数形式衰减,即发生了梯度消失。
2.2、从激活函数角度分析梯度消失
其实也注意到了,上文中提到计算权值更新信息的时候需要计算前层偏导信息,因此如果激活函数选择不合适,比如使用sigmoid,梯度消失就会很明显了,原因看下图,左图是sigmoid的损失函数图,右边是其导数的图像,如果使用sigmoid作为损失函数,其梯度是不可能超过0.25的,这样经过链式求导之后,很容易发生梯度消失,sigmoid函数数学表达式为:
同理,tanh作为激活函数,它的导数图如下,可以看出,tanh比sigmoid要好一些,但是它的导数仍然是小于1的。tanh数学表达为:
3 梯度消失、爆炸的解决方案
3.1、预训练加微调
为了解决梯度的问题,采取无监督逐层训练方法,其基本思想是每次训练一层隐节点,训练时将上一层隐节点的输出作为输入,而本层隐节点的输出作为下一层隐节点的输入,此过程是逐层“预训练”(pre-training);在预训练完成后,再对整个网络进行“微调”(fine-tunning)。此思想相当于是先寻找局部最优,然后整合起来寻找全局最优,此方法有一定的好处,但是目前应用的不是很多了。
3.2、梯度剪切及正则化解决梯度爆炸
梯度剪切这个方案主要是针对梯度爆炸提出的,其思想是设置一个梯度剪切阈值,然后更新梯度的时候,如果梯度超过这个阈值,那么就将其强制限制在这个范围之内。这可以防止梯度爆炸。
另外一种解决梯度爆炸的手段是采用权重正则化(weithts regularization)。
正则化是通过对网络权重做正则限制过拟合,仔细看正则项在损失函数的形式:
其中, 是指正则项系数,因此,如果发生梯度爆炸,权值的范数就会变的非常大,通过正则化项,可以部分限制梯度爆炸的发生。但在深度模型中,梯度消失更常见一些。
3.3、relu、leakrelu、elu等激活函数
3.3.1、Relu激活函数
Relu:思想也很简单,如果激活函数的导数为1,那么就不存在梯度消失爆炸的问题了,每层的网络都可以得到相同的更新速度。Relu目前使用最多的激活函数
3.3.2、Relu激活函数优缺点
relu的优点:
-
解决了梯度消失、爆炸的问题
- 计算方便,计算速度快
- 加速了网络的训练
relu的缺点:
- 由于负数部分恒为0,会导致一些神经元无法激活(可通过设置小学习率部分解决)
- 输出不是以0为中心的
3.3.3、leakrelu
leakrelu就是为了解决relu的0区间带来的影响,其数学表达为:
leakrelu=max(k∗x,x)
其中k是leak系数,一般选择0.01或者0.02,或者通过学习而来
3.3.4、elu
elu激活函数也是为了解决relu的0区间带来的影响,其数学表达为:
相较于上面两个激活函数,elu计算更耗时一些
3.4、batch normalization
Batchnorm是深度学习发展以来提出的最重要的成果之一了,目前已经被广泛的应用到了各大网络中,具有加速网络收敛速度,提升训练稳定性的效果,Batchnorm本质上是解决反向传播过程中的梯度问题。batchnorm全名是batch normalization,简称BN,即批规范化,通过规范化操作将输出信号x规范化到均值为0,方差为1保证网络的稳定性。
batchnorm解决梯度的问题上,即反向传播中,经过每一层的梯度会乘以该层的权重,举个简单例子:
正向传播中f2=f1(wT∗x+b),那么反向传播中
反向传播式子中有x的存在,所以x的大小影响了梯度的消失和爆炸,batchnorm就是通过对每一层的输出规范为均值和方差一致的方法,消除了x带来的放大缩小的影响,进而解决梯度消失和爆炸的问题。
3.5、 残差结构
3.5.1、深度网络的退化问题
从经验来看,网络的深度对模型的性能至关重要,当增加网络层数后,网络可以进行更加复杂的特征模式的提取,所以当模型更深时理论上可以取得更好的结果,从下图中也可以看出网络越深而效果越好的一个实践证据。但是更深的网络其性能一定会更好吗?实验发现深度网络出现了退化问题(Degradation problem):网络深度增加时,网络准确度出现饱和,甚至出现下降。这个现象可以在图3中直观看出来:56层的网络比20层网络效果还要差。这不会是过拟合问题,因为56层网络的训练误差同样高。我们知道深层网络存在着梯度消失或者爆炸的问题,这使得深度学习模型很难训练。但是现在已经存在一些技术手段如BatchNorm来缓解这个问题。因此,出现深度网络的退化问题是非常令人诧异的。
3.5.2、残差学习
对于一个堆积层结构(几层堆积而成)当输入为 X 时其学习到的特征记为 H(x) ,现在我们希望其可以学习到残差 F(X)=H(X)-X ,这样其实原始的学习特征是 F(X)+X 。之所以这样是因为残差学习相比原始特征直接学习更容易。当残差为0时,此时堆积层仅仅做了恒等映射,至少网络性能不会下降,实际上残差不会为0,这也会使得堆积层在输入特征基础上学习到新的特征,从而拥有更好的性能。残差学习的结构如下图所示。这有点类似与电路中的“短路”,所以是一种短路连接(shortcut connection)。
为什么残差学习相对更容易,从直观上看残差学习需要学习的内容少,因为残差一般会比较小,学习难度小点。不过我们可以从数学的角度来分析这个问题,首先残差单元可以表示为:
其中 xl 和 xl+1 分别表示的是第 l 个残差单元的输入和输出,注意每个残差单元一般包含多层结构。 F是残差函数,表示学习到的残差,而 h(x)=x 表示恒等映射, f 是ReLU激活函数。基于上式,我们求得从浅层 l 到深层 L 的学习特征为:
利用链式规则,可以求得反向过程的梯度:
式子的第一个因子 表示的损失函数到达 L 的梯度,小括号中的1表明短路机制可以无损地传播梯度,而另外一项残差梯度则需要经过带有weights的层,梯度不是直接传递过来的。残差梯度不会那么巧全为-1,而且就算其比较小,有1的存在也不会导致梯度消失。所以残差学习会更容易。要注意上面的推导并不是严格的证明。
3.6、LSTM
循环神经网络RNN;
在上面的示例图中,神经网络的模块A,正在读取某个输入xi ,并输出一个值 hi。循环可以使得信息可以从当前步传递到下一步。RNN 的关键点之一就是他们可以用来连接先前的信息到当前的任务上,例如使用过去的视频段来推测对当前段的理解。在间隔不断增大时,RNN 会丧失学习到连接如此远的信息的能力。所有 RNN 都具有一种重复神经网络模块的链式的形式。在标准的 RNN 中,这个重复的模块只有一个非常简单的结构,例如一个 tanh
层。
LSTM 通过刻意的设计来避免长期依赖问题。LSTM 不同于RNN单一神经网络层,这里是有四个,以一种非常特殊的方式进行交互。
图中使用的各种元素的图标
LSTM 的关键就是细胞状态,水平线在图上方贯穿运行。
细胞状态类似于传送带。直接在整个链上运行,只有一些少量的线性交互。信息在上面流传保持不变会很容易。
LSTM 有通过精心设计的称作为“门”的结构来去除或者增加信息到细胞状态的能力。门是一种让信息选择式通过的方法。他们包含一个 sigmoid
神经网络层和一个按位的乘法操作。
Sigmoid 层输出 0 到 1之间的数值,描述每个部分有多少量可以通过。 0代表“不许任何量通过”,1 就指“允许任意量通过”!
使用一个合适激活函数,它的梯度在一个合理的范围。LSTM使用gate function,有选择的让一部分信息通过。gate是由一个sigmoid单元和一个逐点乘积操作组成,sigmoid单元输出1或0,用来判断通过还是阻止,然后训练这些gate的组合。所以,当gate是打开的(梯度接近于1),梯度就不会vanish。并且sigmoid不超过1,那么梯度也不会explode。
参考网址:
https://blog.csdn.net/qq_25737169/article/details/78847691 (梯度爆炸及消失详解)
https://zhuanlan.zhihu.com/p/51490163 (梯度爆炸与梯度消失的介绍,考虑角度-反向传播 )
https://blog.csdn.net/qq_25737169/article/details/79048516 (batchnorm详解)
https://cloud.tencent.com/developer/article/1374163 (梯度消失和爆炸详解)
https://zhuanlan.zhihu.com/p/31852747 (残差结构详解)
https://www.zhihu.com/question/44895610/answer/154565425 (LSTM梯度弥散问题解释)
https://www.jianshu.com/p/9dc9f41f0b29 (LSTM原理详解)
https://zhuanlan.zhihu.com/p/32085405 (从几个门角度来详解LSTM的输入输出)