【李宏毅-机器学习】RNN的梯度消失和梯度爆炸及其解决方案

RNN在使用过程中会出现两种问题,一种是梯度消失,一种是梯度爆炸。

有一个方法可以直观地知道一个gradient的大小是什么样的:
我们把某一个参数做小小的变化,看它对网络输出的变化有多大,你就可以测出这个参数的gradient的大小。

如上图,假设w是我们要学习的参数,我们想要知道当改变w值的时候对网络的输出有多大的影响。假设w=1,y的1000次方等于1,假设w=1.01,y的1000次方约等于20000,所以w有很大的gradient,这就会导致梯度爆炸;而如果让w=0.99,这时候y的1000次方约等于0,w的gradient就很小,导致梯度消失。

当出现梯度爆炸的时候,梯度值会变成NaN,导致程序崩溃,所以梯度爆炸容易发现。对于梯度爆炸的问题可以通过梯度裁剪来缓解,即当梯度的范式大于某个给定值时,对梯度进行等比收缩。

而梯度消失问题相对比较棘手,它不会像梯度爆炸那样明显被发现,同时也比较不好处理。LSTM或者GRU等模型通过加入门控机制,很大程度上弥补了梯度消失所带来的损失。

在RNN中,在每个时间点,memory里面的信息都会被覆盖掉,但是在LSTM里面,它是把原来memory里面的值乘上一个值再把input的值加起来放到cell里面去,所以它的memory和input是相加的。在LSTM中,如果w可以影响到memory里面的值话,一旦发生影响,这个影响会永远都存在(除非forget门开启),不像RNN在每个时间的值都会被覆盖掉。