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

【转载自 https://blog.csdn.net/program_developer/article/details/80032376】html

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

 

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

 

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

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

 

 

 

 

(2)梯度不稳定问题dom

 

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

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


(3)产生梯度消失的根本缘由测试


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

 

 

 

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

 

 

可见,的最大值为,而咱们通常会使用标准方法来初始化网络权重,即便用一个均值为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)如何解决梯度消失和梯度爆炸

梯度消失和梯度爆炸问题都是由于网络太深,网络权值更新不稳定形成的,本质上是由于梯度反向传播中的连乘效应。对于更广泛的梯度消失问题,能够考虑一下三种方案解决:

1.    用ReLU、Leaky-ReLU、P-ReLU、R-ReLU、Maxout等替代sigmoid函数。

2.    用Batch Normalization。

3.    LSTM的结构设计也能够改善RNN中的梯度消失问题。

2、几种激活函数的比较


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


(1)  Sigmoid


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

 

 

 

 

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

 

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

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

 

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

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

 

解释下:当梯度从上层传播下来,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所示:

 

优势:

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

2.因为ReLU线性、非饱和的形式,在SGD中可以快速收敛。

3.计算速度要快不少。ReLU函数只有线性关系,不须要指数计算,无论在前向传播仍是反向传播,计算速度都比sigmoid和tanh快。

 

缺点:

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

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

解释:训练神经网络的时候,一旦学习率没有设置好,第一次更新权重的时候,输入是负值,那么这个含有ReLU的神经节点就会死亡,不再会被激活。由于:ReLU的导数在x>0的时候是1,在x<=0的时候是0。若是x<=0,那么ReLU的输出是0,那么反向传播中梯度也是0,权重就不会被更新,致使神经元再也不学习。

也就是说,这个ReLU激活函数在训练中将不可逆转的死亡,致使了训练数据多样化的丢失。在实际训练中,若是学习率设置的过高,可能会发现网络中40%的神经元都会死掉,且在整个训练集中这些神经元都不会被激活。因此,设置一个合适的较小的学习率,会下降这种状况的发生。为了解决神经元节点死亡的状况,有人提出了Leaky ReLU、P-ReLu、R-ReLU、ELU等激活函数。


(4)  Leaky ReLU


ReLU是将全部的负值设置为0,形成神经元节点死亡状况。相反,Leaky ReLU是给全部负值赋予一个非零的斜率。Leaky ReLU激活函数是在声学模型(2013)中首次提出来的。它的数学表达式如公式8所示。

 

 

Leaky ReLU很好的解决了“dead ReLU”的问题。由于Leaky ReLU保留了x小于0时的梯度,在x小于0时,不会出现神经元死亡的问题。对于Leaky ReLU给出了一个很小的负数梯度值α,这个值是很小的常数。好比:0.01。这样即修正了数据分布,又保留了一些负轴的值,使得负轴信息不会所有丢失。可是这个α一般是经过先验知识人工赋值的。
优势:

1.神经元不会出现死亡的状况。

2.对于全部的输入,无论是大于等于0仍是小于0,神经元不会饱和。

2.因为Leaky ReLU线性、非饱和的形式,在SGD中可以快速收敛。

3.计算速度要快不少。Leaky ReLU函数只有线性关系,不须要指数计算,无论在前向传播仍是反向传播,计算速度都比sigmoid和tanh快。

 

缺点:

1.Leaky ReLU函数中的α,须要经过先验知识人工赋值。

 

扩展材料:

1.Andrew L. Maas, Awni Y. Hannum and Andrew Y. Ng. Rectified NonlinearitiesImprove Neural Network Acoustic Models (PDF). ICML.2013. 该论文提出了Leaky ReLU函数。

2.He K, Zhang X, Ren S, et al. Delving deepinto rectifiers: Surpassing human-level performance on imagenetclassification[C]//Proceedings of the IEEE international conference on computervision. 2015: 1026-1034. 该论文介绍了用Leaky ReLU函数的好处。

 

(5)  PReLU

 

PReLU的英文全称为“Parametric ReLU”,我翻译为“带参数的线性修正单元”。咱们观察Leaky ReLU可知,在神经网络中经过损失函数对α求导数,咱们是能够求得的。那么,咱们可不能够将它做为一个参数进行训练呢?在Kaiming He的论文《Delving deepinto rectifiers: Surpassing human-level performance on imagenet classification》中指出,α不只能够训练,并且效果更好。

 

 


公式9很是简单,,表示还未通过激活函数的神经元输出。论文中指出,使用了Parametric ReLU后,最终效果比不用提升了1.03%。

扩展材料:

He K, Zhang X, Ren S, et al. Delving deepinto rectifiers: Surpassing human-level performance on imagenetclassification[C]//Proceedings of the IEEE international conference on computervision. 2015: 1026-1034. 该论文做者对比了PReLU和ReLU在ImageNet model A的训练效果。

 

(6)  RReLU

 

RReLU的英文全称是“Randomized Leaky ReLU”,中文名字叫“随机修正线性单元”。RReLU是Leaky ReLU的随机版本。它首次是在Kaggle的NDSB比赛中被提出来的。

 

图13:Randomized Leaky ReLU函数图像

RReLU的核心思想是,在训练过程当中,α是从一个高斯分布中随机出来的值,而后再在测试过程当中进行修正。数学表达式如10式所示。

 

在测试阶段,把训练过程当中全部的取个平均值。NDSB冠军的α是从中随机出来的。那么在测试阶段,激活函数就是公式11。

 

特色:

1.RReLU是Leaky ReLU的random版本,在训练过程当中,α是从一个高斯分布中随机出来的,而后再测试过程当中进行修正。

2.数学形式与PReLU相似,但RReLU是一种非肯定性激活函数,其参数是随机的。

 

(7)ReLU、Leaky ReLU、PReLU和RReLU的比较

 

 

图14:ReLU、Leaky ReLU、PReLU、RReLU函数图像

PReLU中的α是根据数据变化的;

Leaky ReLU中的α是固定的;

RReLU中的α是一个在给定范围内随机抽取的值,这个值在测试环节就会固定下来。


扩展材料:

Xu B, Wang N, Chen T, et al. Empiricalevaluation of rectified activations in convolutional network[J]. arXiv preprintarXiv:1505.00853, 2015. 在这篇论文中做者对比了ReLU、LReLU、PReLU、RReLU在CIFAR-十、CIFAR-100、NDSB数据集中的效果。

 

(8)ELU


ELU的英文全称是“Exponential Linear Units”,中文全称是“指数线性单元”。它试图将激活函数的输出平均值接近零,从而加快学习速度。同时,它还能经过正值的标识来避免梯度消失的问题。根据一些研究显示,ELU分类精确度是高于ReLU的。公式如12式所示。

 


图15:ELU与其余几种激活函数的比较图

优势:

ELU包含了ReLU的全部优势。

神经元不会出现死亡的状况。

ELU激活函数的输出均值是接近于零的。

 

缺点:

计算的时候是须要计算指数的,计算效率低的问题。

 

扩展材料:

Clevert D A, Unterthiner T, Hochreiter S. Fastand accurate deep network learning by exponential linear units (elus)[J]. arXivpreprint arXiv:1511.07289, 2015. 这篇论文提出了ELU函数。

 

(9)Maxout

 

Maxout “Neuron” 是由Goodfellow等人在2013年提出的一种颇有特色的神经元,它的激活函数、计算的变量、计算方式和普通的神经元彻底不一样,并有两组权重。先获得两个超平面,再进行最大值计算。激活函数是对ReLU和Leaky ReLU的通常化概括,没有ReLU函数的缺点,不会出现激活函数饱和神经元死亡的状况。Maxout出如今ICML2013上,做者Goodfellow将maxout和dropout结合,称在MNIST,CIFAR-10,CIFAR-100,SVHN这4个数据集上都取得了start-of-art的识别率。Maxout公式如13所示。

 

其中,假设w是2维的,那么咱们能够得出公式14。

 

分析公式14能够注意到,ReLU和Leaky ReLU都是它的一个变形。好比的时候,就是ReLU。Maxout的拟合能力很是强,它能够拟合任意的凸函数。Goodfellow在论文中从数学的角度上也证实了这个结论,只须要2个Maxout节点就能够拟合任意的凸函数,前提是“隐含层”节点的个数足够多。

 

优势:

Maxout具备ReLU的全部优势,线性、不饱和性。

同时没有ReLU的一些缺点。如:神经元的死亡。

 

缺点:

从这个激活函数的公式14中能够看出,每一个neuron将有两组w,那么参数就增长了一倍。这就致使了总体参数的数量激增。

 

扩展材料:

Goodfellow I J, Warde-Farley D, Mirza M, et al.Maxout networks[J]. arXiv preprint arXiv:1302.4389, 2013. Goodfellow的这篇论文提出了Maxout,感兴趣能够了解一下。

 

总结:怎么选择激活函数?

 

关于激活函数的选取,目前还不存在定论,在实践过程当中更多仍是须要结合实际状况,考虑不一样激活函数的优缺点综合使用。我在这里给你们一点在训练模型时候的建议。

1.一般来讲,不会把各类激活函数串起来在一个网络中使用。

2.若是使用ReLU,那么必定要当心设置学习率(learning rate),而且要注意不要让网络中出现不少死亡神经元。若是死亡神经元过多的问题很差解决,能够试试Leaky ReLU、PReLU、或者Maxout。

3.尽可能不要使用sigmoid激活函数,能够试试tanh,不过我的感受tanh的效果会比不上ReLU和Maxout。

 

Reference:


1.Andrew L. Maas, Awni Y. Hannum and Andrew Y. Ng. Rectified NonlinearitiesImprove Neural Network Acoustic Models (PDF). ICML.2013. 该论文提出了Leaky ReLU函数。

 

2.He K, Zhang X, Ren S, et al. Delving deepinto rectifiers: Surpassing human-level performance on imagenetclassification[C]//Proceedings of the IEEE international conference on computervision. 2015: 1026-1034. 该论文介绍了用Leaky ReLU函数的好处。

 

3.He K, Zhang X, Ren S, et al. Delving deepinto rectifiers: Surpassing human-level performance on imagenetclassification[C]//Proceedings of the IEEE international conference on computervision. 2015: 1026-1034. 该论文做者对比了PReLU和ReLU在ImageNet model A的训练效果。

 

4.Xu B, Wang N, Chen T, et al. Empiricalevaluation of rectified activations in convolutional network[J]. arXiv preprintarXiv:1505.00853, 2015. 在这篇论文中做者对比了ReLU、LReLU、PReLU、RReLU在CIFAR-十、CIFAR-100、NDSB数据集中的效果。

 

5.Clevert D A, Unterthiner T, Hochreiter S. Fastand accurate deep network learning by exponential linear units (elus)[J]. arXivpreprint arXiv:1511.07289, 2015. 这篇论文提出了ELU函数。

 

6.Goodfellow I J, Warde-Farley D, Mirza M, et al.Maxout networks[J]. arXiv preprint arXiv:1302.4389, 2013. Goodfellow的这篇论文提出了Maxout,感兴趣能够了解一下。

 


梯度消失和梯度弥散问题:

https://zhuanlan.zhihu.com/p/25631496

https://ziyubiti.github.io/2016/11/06/gradvanish/

https://blog.csdn.net/cppjava_/article/details/68941436

 

激活函数问题:

https://blog.csdn.net/hduxiejun/article/details/70815620

https://blog.csdn.net/cyh_24/article/details/50593400

https://blog.csdn.net/huplion/article/details/79121988

https://blog.csdn.net/bea_tree/article/details/51503258

https://livc.io/blog/176

https://www.cnblogs.com/chamie/p/8665251.html

 

激活函数输出不是“零为中心”出现全正全负理解:https://www.zhihu.com/question/57194292

https://stats.stackexchange.com/questions/237169/why-are-non-zero-centered-activation-functions-a-problem-in-backpropagation

https://blog.csdn.net/heisejiuhuche/article/details/72514790

 

训练的数据须要zero-centered:

1.神经网络的训练中,为何训练的数据若是不是zero-centered,收敛速度会较慢? - 知乎https://www.zhihu.com/question/58582257

2.训练深度神经网络尽可能使用zero-centered数据呢? - 知乎

https://www.zhihu.com/question/57194292--------------------- 做者:Microstrong0305 来源:CSDN 原文:https://blog.csdn.net/program_developer/article/details/80032376