1、梯度消失、梯度爆炸产生的缘由html
说白了,对于1.1 1.2,其实就是矩阵的高次幂致使的。在多层神经网络中,影响因素主要是权值和激活函数的偏导数。算法
1.1 前馈网络网络
假设存在一个网络结构如图:函数
其表达式为:优化
若要对于w1求梯度,根据链式求导法则,获得的解为:spa
一般,若使用的激活函数为sigmoid函数,其导数:3d
这样能够看到,若是咱们使用标准化初始w,那么各个层次的相乘都是0-1之间的小数,而激活函数f的导数也是0-1之间的数,其连乘后,结果会变的很小,致使梯度消失。若咱们初始化的w是很大的数,w大到乘以激活函数的导数都大于1,那么连乘后,可能会致使求导的结果很大,造成梯度爆炸。htm
固然,若对于b求偏导的话,其实也是一个道理:blog
推出:get
1.2 RNN
对于RNN的梯度降低方法,是一种基于时间的反向求导算法(BPTT),RNN的表达式:
一般咱们会将一个完整的句子序列视做一个训练样本,所以总偏差即为各时间步(单词)的偏差之和。
而RNN还存在一个权值共享的问题,即这几个w都是一个,假设,存在一个反复与w相乘的路径,t步后,获得向量:
若特征值大于1,则会出现梯度爆炸,若特征值小于1,则会出现梯度消失。所以在必定程度上,RNN对比BP更容易出现梯度问题。主要是由于RNN处理时间步长一旦长了,W求导的路径也变的很长,即便RNN深度不大,也会比较深的BP神经网络的链式求导的过程长很大;另外,对于共享权值w,不一样的wi相乘也在必定程度上能够避免梯度问题。
1.3 悬崖和梯度爆炸
对于目标函数,一般存在梯度变化很大的一个“悬崖”,在此处求梯度,很容易致使求解不稳定的梯度爆炸现象。
3、梯度消失和梯度爆炸哪一种常常出现
事实上,梯度消失更容易出现,由于对于激活函数的求导:
能够看到,当w越大,其wx+b极可能变的很大,而根据上面sigmoid函数导数的图像能够看到,wx+b越大,导数的值也会变的很小。所以,若要出现梯度爆炸,其w既要大还要保证激活函数的导数不要过小。
2、如何解决梯度消失、梯度爆炸
一、对于RNN,能够经过梯度截断,避免梯度爆炸
二、能够经过添加正则项,避免梯度爆炸
三、使用LSTM等自循环和门控制机制,避免梯度消失,参考:http://www.javashuo.com/article/p-hfuqwseq-gv.html
四、优化激活函数,譬如将sigmold改成relu,避免梯度消失