梯度消失:什么是梯度消失?下图是Bengio等人2012年论文On the difficulty of training recurrent neural networks中提到的说法,当梯度快速的变为0时,使得模型无法学习到远程事件的关联。
以前对梯度消失的理解比较模糊,以为就是梯度变得很小,没有去想是哪里的梯度变小,在什么时候发生的,以及在什么情况下会发生(发生的原因)。上面这句话说的比较明确了,由于神经网络的训练基于反向传播,求梯度时的连乘(激活函数的导数、权重)可能会导致离输出层较远的梯度值很小,使此处的权重无法正常更新,即模型无法学习到远程关联(例如RNN无法学习到句子前面的词语信息,CNN的浅层网络无法起到正常的作用),这类情况就是梯度消失。
梯度消失造成的影响:会造成神经网络中浅层网络的参数无法更新,远程关联缺失。
DNN和RNN中的梯度消失情况并不一样
1、DNN:在求梯度时,会有激活函数的导数连乘的情况出现,而常用的激活函数例如tanh的导数值域(0,1),sigmoid导数值域(0,1/4),这些小于1的值连乘后会使得前面一些层的梯度很小,就可能出现梯度消失的情况。
2、RNN:RNN中神经元的状态值,会出现W或激活函数多次相乘的情况,而在DNN中各层之间的连接权重W基本不会一样,可能有大有小,连乘之后不会产生质变,所以基本不会考虑W带来的梯度消散。当RNN中层数过深时,同一个W的累乘会导致状态值出现极端情况,如下面两幅图中的例子(图片来源)。在反向求梯度时根据BPTT算法,,损失函数对W的导数是各个时刻关于W的导数的和,展开后可以发现对之前时刻W的导数会乘以多个激活函数导数和权重W,导致这些部分导数的值接近0,即较早时刻的信息没有影响到最终的梯度求解,这样模型就无法学习到较早时刻的信息。这里比较微妙,根据公式可以看出,即使较早时刻的倒数都变为0,但临近输出层的部分由于没有乘以那些东东有可能是正常值,这样最后算出来的损失函数关于W的梯度值就并不接近0,如果按照梯度接近0就出现梯度消散的理解在RNN这里就解释不通了,所以正确的梯度消散的理解是开始讲的那种。
总结出来就是DNN的梯度消散是发生在空间上的,RNN的梯度消散发生在时序上。
如何知道网络中是否出现梯度消失?
这个问题还待解决,最直观的就是在训练时打印梯度看一下,DNN可以这样,RNN呢?
如何解决梯度消失问题?
1、正确的初始化
2、设置阈值;
3、选择激活函数;
4、优化方式NAG,RMSprop;
5、RNN变体;
梯度爆炸:
参考: