RNN推导参考:http://www.wildml.com/2015/10/recurrent-neural-networks-tutorial-part-3-backpropagation-through-time-and-vanishing-gradients/
说明:对于RNN为什么会学不到长距离信息,可以说是RNN会遇到梯度消失的问题,梯度消失的问题,
本质上还是使用BP算法导致的,也是激活函数的导数小于1导致的。正如上述所讲的,使用RNN时,在每次输入进行优化计算梯度的时候,会侧重于考虑最近的几次输入,以此让损失减小,而比较远的输入,其实对于计算当前输入的梯度已经不起作用了
。
RNN可以等价于去调整参数,拟合最近的一些序列,比如说输入的是t时刻,那么可能当前的参数就调整为拟合t到t-p时刻的序列,并且p会比较小
,
也即RNN的学习不会兼顾到很久以前的输入,
就学习不到长距离信息
。
说明:
1、
对于RNN这种递归模型的训练而言,其样本应该是一句话。而不是说是将所有的句子拼起来,形成一个长文本。
2、RNN对每次输入要计算一次梯度,需要用到链式法则,如果输入的序列非常长,会非常耗时。
说明:如果一个序列太长,那么每次输入的话,计算在该输入下的梯度的计算量非常大。所以,有时候就使用截断的BPTT,比如说20个词,使用的step越长,计算量就越大。
3、
对于RNN的一次权重迭代过程的描述,比如说文本的一句话。首先,对于每个词都输入网络,计算在该网络参数下计算得到的梯度。然后,等最后一个词输入完毕后,再将梯度进行平均,最后进行权重的更新。
只有在最后一个词进去之后,再进行权重的更新。而不是说每输入一个词,就进行一次权值的更新。
4、
RNN梯度消失的原因,还是跟激活函数有关系,因为激活函数的导数小于1。
解决方案:使用RELU激活函数来替代sigmoid函数。
5、
搞清楚RNN的输入是一个样本对应于一个序列。
6、LSTM
这个模型本身就不存在梯度消失的问题,也即它是可以对任意长度的序列进行建模的,对任意长的序列进行建模是LSTM的默认行为,跟CNN对图片建模其实是一样的,只是LSTM建模的对象是序列,序列是LSTM的一个样本。
可以参考一下
http://blog.csdn.net/a635661820/article/details/45390671,
讲述的是LSTM的设计理念,本身就是来克服梯度消失问题的。也即当输入为T时刻时,
计算梯度也即优化的目标是在对t=0及到t =T的序列建模。而不是像RNN一样,在输入为T时刻时,只能对t=t-p到t=T的序列进行建模,因为t=0到t=t-p的输入已经对当前的梯度计算不起作用了。