梯度消失和梯度爆炸的数学原理及解决方案
作者:互联网
博文原地址:梯度消失和梯度爆炸的数学原理及解决方案,搬来CSDN
欢迎关注我的公众号,微信搜 algorithm_Tian 或者扫下面的二维码~
现在保持每周更新的频率,内容都是机器学习相关内容和读一些论文的笔记,欢迎一起讨论学习~
目录
1.前言
很久没看文章了,但是感觉再不写点什么公众号都要被自己遗忘了。随便写一下神经网络的一些小知识吧,感觉很多大佬把这种小知识写的非常深入浅出,很景仰很佩服。这篇文章主要还是参考了别人的技术博客。希望还算好理解。欢迎一起讨论~
梯度消失或者梯度爆炸是在训练深度网络时常常容易出现的情况,即在根据损失函数计算的误差通过梯度反向传播的方式对深度网络权值进行更新时,得到的梯度值接近0或特别大,也就是消失或爆炸。梯度消失或梯度爆炸在本质原理上其实是一样的。
本博文打算从以下几方面讨论梯度消失或爆炸的原因,以及目前业界的一些解决方法。
-
深度网络对梯度的影响
-
激活函数对梯度的影响
-
一些解决方案
那么下面就开始从这几个方面进行探讨了。
梯度消失与梯度爆炸其实是一种情况,看接下来的文章就知道了。两种情况下梯度消失经常出现,一是在深层网络中,二是采用了不合适的损失函数,比如sigmoid。梯度爆炸一般出现在深层网络和权值初始化值太大的情况下。
https://blog.csdn.net/qq_25737169/article/details/78847691
2.深度网络对梯度的影响
深度神经网络的训练过程,是离不开反向传播和梯度更新这两个词的。
前向传递输入数据到输出产生误差,反向传播误差信息更新权重参数矩阵。
对于多隐层的深度神经网络,输出层可以直接求出误差来更新参数,但是中间隐层的误差是不存在的,因此不能对它直接应用梯度下降,而是先将误差反向传播至隐层,然后再应用梯度下降,其中将误差从末层往前传递的过程需要链式法则(Chain Rule)的帮助,因此反向传播算法可以说是梯度下降在链式法则中的应用。
这里反向传播的具体解释可参考博文:一文搞懂反向传播算法
经过一系列推导可以知道,反向传播是以目标的负梯度方向对参数进行调整,参数的更新为:
给定学习率α,得出:
由于深度网络是多层非线性函数的堆砌,整个深度网络可以视为是一个复合的非线性多元函数(这些非线性多元函数其实就是每层的激活函数),那么对loss function求不同层的权值偏导,相当于应用梯度下降的链式法则,链式法则是一个连乘的形式,所以当层数越深的时候,梯度将以指数传播。
如果接近输出层的激活函数求导后梯度值大于1,那么层数增多的时候,最终求出的梯度很容易指数级增长,也就是梯度爆炸;相反,如果小于1,那么经过链式法则的连乘形式,也会很容易衰减至0,也就是梯度消失。
所以,深度网络中权值更新存在这样一个现象,不同层之间的学习效果或者说速度会差很多,靠近输入层的网络层收敛很慢,靠近输出层的网络层学习情况则很好。所以,梯度消失或爆炸的原因在于网络更新的法则上,也就是反向传播的原理上。
3.激活函数对梯度的影响
上一节可以看到,网络训练离不开反向传播,反向传播的梯度更新链式法则在进行更新权重时,是需要对前层的激活函数有求导,所以,激活函数的选择对梯度的影响非常大。如果激活函数的选择不太合适,那么梯度消失的现象很容易出现。
比如sigmoid激活函数,它的表达式为:
它的梯度为
可以看到,它的梯度不会超过0.25,那么经过多层传播之后很容易出现梯度消失的现象。
tanh激活函数也会有同样的问题,它的表达式为:
所以选择合适的激活函数也是解决梯度消失的方法之一。
4.一些解决方案
(1) pre-training+fine-tunning
(2) 梯度剪切:对梯度设定阈值
(3) 权重正则化
(4) 选择relu等梯度大部分落在为常数上的激活函数
(5) batch normalize
(6) 残差网络的捷径(shortcut)
(7) LSTM的门(gate)
最后再来一波~
欢迎关注我的公众号,微信搜 algorithm_Tian 或者扫下面的二维码~
现在保持每周更新的频率,内容都是机器学习相关内容和读一些论文的笔记,欢迎一起讨论学习~
标签:函数,梯度,消失,传播,反向,数学原理,解决方案,激活 来源: https://blog.csdn.net/ty44111144ty/article/details/99067260