LSTM与梯度消失

1. 标准RNN中处理序列数据的方法是将上一个state的信息传到下一个state中,表示成数学公式为st=f(W*(st-1,xt)+b),其中f为激活函数。在反向传播中,根据求导的链式法则,这种形式求得的梯度为一个矩阵W与激活函数导数的乘积。如果进行n次反向传播,梯度变化将会变为(W*f”)的n次方累乘。

(1)如果乘积大于1,则梯度会随着反向传播层数n的增加而成指数增长,导致梯度爆炸;

(2)如果乘积小于1,经过多层传播后,小于1的数累乘后结果趋近于0,导致梯度消失。

2. 现在的lstm主要用来缓解梯度消失问题,其中,St主要由两部分组成,表示过去信息的St-1和表示现在信息St(~),数学公式为St = ft*St-1+it*f(St-1)

其中第二input部分与标准RNN类似,在反向传播中可能会逐渐消失,而第一forget部分经过多次传播之后,会出现ft*ft-1*ft-2……这样的累乘,ft的大小是可选的,可以有效减轻梯度消失。

3. 梯度爆炸一般靠裁剪后的优化算法即可解决,比如gradient clipping(如果梯度的范数大于某个给定值,将梯度同比收缩)。

4. 关于lstm中的forget gate的理解:

(1)原始的lstm是没有forget gate的,或者说相当于forget gate恒为1,所以不存在梯度消失问题

(2)现在的lstm被引入了forget gate,但是lstm的一个初始化技巧就是将forget gate的bias置为正数(例如1或5,这点可以查看各大框架代码),这样模型刚开始训练时forget gate的值接近于1,不回发生梯度消失

(3)随着训练过程的进行,forget gate就不再恒为1了。不过对于一个已经训练好的模型,需要选择性地记住或者遗忘某些信息,所以forget gate要么是1,要么是0,很少有类似0.5这样的中间值,相当于一个二元的开关。例如在某个序列里,forget gate全为1,那么梯度不会消失;否则,若某一个forget gate是0,这时候虽然会导致梯度消失,但是体现了模型的选择性,刻意遗忘某些信息。

综上,lstm可以缓解梯度消失问题,但不能彻底避免。

 

 

 

 

 

 

 

你可能感兴趣的:(RNN)