首页 > 神经网络梯度消失和梯度爆炸及解决办法_博客

梯度,神经网络梯度消失和梯度爆炸及解决办法_博客

互联网 2021-06-17 10:53:01

一、神经网络梯度消失与梯度爆炸

(1)简介梯度消失与梯度爆炸

层数比较多的神经网络模型在训练的时候会出现梯度消失(gradient vanishing problem)和梯度爆炸(gradient exploding problem)问题。梯度消失问题和梯度爆炸问题一般会随着网络层数的增加变得越来越明显。

例如,对于图1所示的含有3个隐藏层的神经网络,梯度消失问题发生时,靠近输出层的hidden layer 3的权值更新相对正常,但是靠近输入层的hidden layer1的权值更新会变得很慢,导致靠近输入层的隐藏层权值几乎不变,扔接近于初始化的权值。这就导致hidden layer 1 相当于只是一个映射层,对所有的输入做了一个函数映射,这时此深度神经网络的学习就等价于只有后几层的隐藏层网络在学习。梯度爆炸的情况是:当初始的权值过大,靠近输入层的hidden layer 1的权值变化比靠近输出层的hidden layer 3的权值变化更快,就会引起梯度爆炸的问题。

图1:含有3个隐藏层的神经网络

(2)梯度不稳定问题

在深度神经网络中的梯度是不稳定的,在靠近输入层的隐藏层中或会消失,或会爆炸。这种不稳定性才是深度神经网络中基于梯度学习的根本问题。

梯度不稳定的原因:前面层上的梯度是来自后面层上梯度的乘积。当存在过多的层时,就会出现梯度不稳定场景,比如梯度消失和梯度爆炸。

(3)产生梯度消失的根本原因

我们以图2的反向传播为例,假设每一层只有一个神经元且对于每一层都可以用公式1表示,其中σ为sigmoid函数,C表示的是代价函数,前一层的输出和后一层的输入关系如公式1所示。 我们可以推导出公式2。

图2:简单的深度神经网络

而sigmoid函数的导数如图3所示。

图3:sigmoid函数导数图像

可见,的最大值为,而我们一般会使用标准方法来初始化网络权重,即使用一个均值为0标准差为1的高斯分布。因此,初始化的网络权值通常都小于1,从而有。对于2式的链式求导,层数越多,求导结果越小,最终导致梯度消失的情况出现。

图4:梯度变化的链式求导分析

              

对于图4,有共同的求导项。可以看出,前面的网络层比后面的网络层梯度变化更小,故权值变化缓慢,从而引起了梯度消失问题。

(4)产生梯度爆炸的根本原因

,也就是w比较大的情况。则前面的网络层比后面的网络层梯度变化更快,引起了梯度爆炸的问题。

(5)当激活函数为sigmoid时,梯度消失和梯度爆炸哪个更容易发生?

结论:梯度爆炸问题在使用sigmoid激活函数时,出现的情况较少,不容易发生。

量化分析梯度爆炸时x的取值范围:因导数最大为0.25,故>4,才可能出现;按照可计算出x的数值变化范围很窄,仅在公式3范围内,才会出现梯度爆炸。画图如5所示,可见x的数值变化范围很小;最大数值范围也仅仅0.45,当=6.9时出现。因此仅仅在此很窄的范围内会出现梯度爆炸的问题。

图5:x的数值变化范围

(6)如何解决梯度消失和梯度爆炸

梯度消失和梯度爆炸问题都是因为网络太深,网络权值更新不稳定造成的,本质上是因为梯度反向传播中的连乘效应。对于更普遍的梯度消失问题,可以考虑以下三种方案解决:

用ReLU、Leaky ReLU、PReLU、RReLU、Maxout等替代sigmoid函数。用Batch Normalization。LSTM的结构设计也可以改善RNN中的梯度消失问题。

二、几种激活函数的比较

由于使用sigmoid激活函数会造成神经网络的梯度消失和梯度爆炸问题,所以许多人提出了一些改进的激活函数,如:用ReLU、Leaky-ReLU、P-ReLU、R-ReLU、Maxout等替代sigmoid函数。下面我们具体来分析一下这几个激活函数的区别。

(1)  Sigmoid

Sigmoid是常用的非线性的激活函数,它的数学形式如公式4:

(4)

图6:sigmoid函数图像 

 图7:sigmoid导函数图像

Sigmoid函数在历史上曾经非常的常用,输出值范围为[0,1]之间的实数。然而现在它已经不太受欢迎,实际中很少使用。原因是sigmoid存在3个问题:

1.sigmoid函数饱和使梯度消失(Sigmoidsaturate and kill gradients)。

我们从图7可以看到sigmoid的导数都是小于0.25的,那么在进行反向传播的时候,梯度相乘结果会慢慢的趋近于0。这样,几乎就没有梯度信号通过神经元传递到前面层的梯度更新中,因此这时前面层的权值几乎没有更新,这就叫梯度消失。除此之外,为了防止饱和,必须对于权重矩阵的初始化特别留意。如果初始化权重过大,可能很多神经元得到一个比较小的梯度,致使神经元不能很好的更新权重提前饱和,神经网络就几乎不学习。

2.sigmoid函数输出不是“零为中心”(zero-centered)。

一个多层的sigmoid神经网络,如果你的输入x都是正数,那么在反向传播中w的梯度传播到网络的某一处时,权值的变化是要么全正要么全负。

图8:sigmoid输出不是关于原点对称的影响

解释下:当梯度从上层传播下来,w的梯度都是用x乘以f的梯度,因此如果神经元输出的梯度是正的,那么所有w的梯度就会是正的,反之亦然。在这个例子中,我们会得到两种权值,权值范围分别位于图8中一三象限。当输入一个值时,w的梯度要么都是正的要么都是负的,当我们想要输入一三象限区域以外的点时,我们将会得到这种并不理想的曲折路线(zig zag path),图中红色曲折路线。假设最优化的一个w矩阵是在图8中的第四象限,那么要将w优化到最优状态,就必须走“之字形”路线,因为你的w要么只能往下走(负数),要么只能往右走(正的)。优化的时候效率十分低下,模型拟合的过程就会十分缓慢。

如果训练的数据并不是“零为中心”,我们将多个或正或负的梯度结合起来就会使这种情况有所缓解,但是收敛速度会非常缓慢。该问题相对于神经元饱和问题来说还是要好很多。具体可以这样解决,我们可以按batch去训练数据,那么每个batch可能得到不同的信号或正或负,这个批量的梯度加起来后可以缓解这个问题。

3.指数函数的计算是比较消耗计算资源的。

(2) tanh

tanh函数跟sigmoid还是很像的,实际上,tanh是sigmoid的变形如公式5所示。tanh的具体公式如公式6所示。

tanh与sigmoid不同的是,tanh是“零为中心”的。因此,实际应用中,tanh会比sigmoid更好一些。但是在饱和神经元的情况下,还是没有解决梯度消失问题。

优点:

1.tanh解决了sigmoid的输出非“零为中心”的问题。

缺点:

1.依然有sigmoid函数过饱和的问题。

2.依然指数运算。

(3)  ReLU

近年来,ReLU函数变得越来越受欢迎。全称是Rectified Linear Unit,中文名字:修正线性单元。ReLU是Krizhevsky、Hinton等人在2012年《ImageNet Classification with Deep Convolutional Neural Networks》论文中提出的一种线性且不饱和的激活函数。它的数学表达式如7所示:

图9:ReLU函数图像

优点:

1.ReLU解决了梯度消失的问题,至少x在正区间内,神经元不会饱和。

2.由于ReLU线性、非饱和的形式,在SGD中能够快速收敛。

3.计算速度要快很多。ReLU函数只有线性关系,不需要指数计算,不管在前向传播还是反向传播,计算速度都比sigmoid和tanh快。

缺点:

1.ReLU的输出不是“零为中心”(Notzero-centered output)。

2.随着训练的进行,可能会出现神经元死亡,权重无法更新的情况。这种神经元的死亡是不可逆转的死亡。

解释:训练神经网络的时候,一旦学习率没有设置好,第一次更新权重的时候,输入是负值,那么这个含有ReLU的神经节点就会死亡,再也不会被激活。因为:ReLU的导数在x>0的时候是1,在x

免责声明:非本网注明原创的信息,皆为程序自动获取自互联网,目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责;如此页面有侵犯到您的权益,请给站长发送邮件,并提供相关证明(版权证明、身份证正反面、侵权链接),站长将在收到邮件24小时内删除。

相关阅读