梯度消失和梯度爆炸
首先我们先说一下DNN中的梯度消失和梯度爆炸。
DNN中的梯度消失和梯度爆炸是由于激活函数引起的,主要是sigmoid函数。
因为在反向传播的过程中我们需要对激活函数进行求导,而sigmoid激活函数的导数如下图:
所以如果网络足够长的话,经过多个激活函数的导数以后就会出现梯度接近于0的情况。
梯度爆炸是由于权重参数初始化太大时,权重参数与激活函数的导数相乘导致梯度爆炸的出现。
解决方案:
1、梯度剪切,也就是设置一个梯度阈值,这样就可以借解决梯度爆炸的问题。
2、正则化是通过对网络权重做正则限制过拟合,仔细看正则项在损失函数的形式:
因此,如果发生梯度爆炸,权值的范数就会变的非常大,通过正则化项,可以部分限制梯度爆炸的发生。
3、跟换激活函数,使用relu系的激活函数。(leakrelu,elu等等)
4、BN避免了梯度消失的问题(但是我觉得也能解决梯度爆炸的问题,有清楚的老哥欢迎给我留言)
5、残差结构shortcut
下面来聊一下RNN的梯度消失:
RNN中的梯度消失跟DNN不太一样。
现在来解释一下,为什么说RNN和DNN的梯度消失问题含义不一样?
一句话概括:RNN的梯度不会消失,RNN的梯度消失指的是当下梯度用不到前面的梯度了,但DNN靠近输入的权重的梯度是真的会消失。具体的你推导一下DNN和RNN的方向传播就知道了。简单的来说就是,DNN方向传播的时候是连乘的形式,但是RNN是累加的形式,所以RNN即使前面的梯度为零了,也不影响后面的梯度。所以RNN 所谓梯度消失的真正含义是,梯度被近距离梯度主导,导致模型难以学到远距离的依赖关系。
LSTM的提出解决了RNN的梯度消失问题
对于现在常用的带遗忘门的 LSTM 来说,6 中的分析依然成立,而 5 分为两种情况:其一是遗忘门接近 1(例如模型初始化时会把 forget bias 设置成较大的正数,让遗忘门饱和),这时候远距离梯度不消失;其二是遗忘门接近 0,但这时模型是故意阻断梯度流的,这不是 bug 而是 feature(例如情感分析任务中有一条样本 “A,但是 B”,模型读到“但是”后选择把遗忘门设置成 0,遗忘掉内容 A,这是合理的)。当然,常常也存在 f 介于 [0, 1] 之间的情况,在这种情况下只能说 LSTM 改善(而非解决)了梯度消失的状况。