原文:链接
也可以参考:解释的也很清晰
建议先看第一个
一,经典的RNN结构如下图所示:
假设我们的时间序列只有三段, 为给定值,神经元没有激活函数,则RNN最简单的前向传播过程如下:
假设在t=3时刻,损失函数为 。
则对于一次训练任务的损失函数为 ,即每一时刻损失值的累加。
使用随机梯度下降法训练RNN其实就是对 、 、 以及 求偏导,并不断调整它们以使L尽可能达到最小的过程。
二,现在假设我们我们的时间序列只有三段,t1,t2,t3。
我们只对t3时刻的 求偏导(其他时刻类似):
可以看出对于 求偏导并没有长期依赖,但是对于 求偏导,会随着时间序列产生长期依赖。因为 随着时间序列向前传播,而 又是 的函数。
根据上述求偏导的过程,我们可以得出任意时刻对 求偏导的公式:
(觉得k应该从k=1开始)
任意时刻对 求偏导的公式同上。
三,如果加上激活函数, ,
其中tanh' = [0,1]
这里的,其中
激活函数tanh和它的导数图像如下。
1)由上图可以看出 ,对于训练过程大部分情况下tanh的导数是小于1的,只有当 ,此时导数等于1;
2)如果 也是一个大于0小于1的值,则当t很大时,使得tanh' * W_s < 1
就会趋近于0,和 (0.9*0.8)^50趋近与0是一个道理。
3)同理当 很大时,具体指(比如tanh' = 0.1,而=99,则相乘为9.9),使得tanh' * W_s > 1
就会趋近于无穷,这就是RNN中梯度消失和爆炸的原因。
至于怎么避免这种现象,让我在看看 梯度消失和爆炸的根本原因就是 这一坨,要消除这种情况就需要把这一坨在求偏导的过程中去掉,至于怎么去掉,一种办法就是使 另一种办法就是使 。其实这就是LSTM做的事情,至于细节问题我在LSTM如何解决梯度消失问题这篇文章中给出了介绍。
总结:
梯度消失:一句话,RNN梯度消失是因为激活函数tanh函数的倒数在0到1之间,反向传播时更新前面时刻的参数时,当参数W初始化为小于1的数,则多个(tanh函数’ * W)相乘,将导致求得的偏导极小(小于1的数连乘),从而导致梯度消失。
梯度爆炸:当参数初始化为足够大,使得tanh函数的倒数乘以W大于1,则将导致偏导极大(大于1的数连乘),从而导致梯度爆炸。