首先,简单说一下区别:RNN(Recurrent Neural Networks,循环神经网络)不仅学习当前输入的信息,还要依赖之前的信息,如处理由重多词组成的序列。但它并不能很好地处理长的序列。是因为会出现梯度消失和梯度爆炸现象,由此出现了LSTM。LSTM和RNN相同都是利用BPTT传播和随机梯度或者其他优化算法来拟合参数。但是RNN在利用梯度下降算法链式求导时是连乘的形式,而LSTM是相加的形式,这也是最主要的区别。GRU与LSTM相比,少了一个gate,由此就少了一些矩阵乘法,GRU虽与LSTM的效果较近,但却因此在训练中节省了很多时间,在文本类处理中,相比用LSTM,导师更建议用GRU来训练。最小GRU可看最近南大教授的篇论文是用最小GRU来进行计算的,比GRU又少了一个门,这就使计算时间更短了,计算维度降低,占用内存减少。
下面是梯度消失与梯度爆炸的原因:RNN的梯度是多个激活函数偏导乘积的形式来计算,如果这些激活函数的偏导比较小(小于1)或者为0,那么随时间很容易发生梯度消失;相反,如果这些激活函数的偏导比较大(大于1),那么很有可能就会梯度爆炸。
上式的最后括号内是定义为矩阵的模的上界。因为上式是一个指数函数,如果t-k很大的话(也就是向前看很远的时候),会导致对应的误差项的值增长或缩小的非常快,这样就会导致相应的梯度爆炸和梯度消失问题(取决于最后括号内两个数乘积大于1还是小于1)。
例如我们所说的sigmod函数f(x),求导是f(x)*(1-f(x)),又因为我们知道a*b<=((a+b)/2)^2,故可知这是一个小于1/4的值,小于1,如果一直累乘必然会导致梯度消失现象。
RNN的原理:例如:小明是中国人,小明国家的首都是:_____。这时,RNN只需要参考横线前面的词,基本的循环网络、
网上最易懂得结构图:
例如一个简单的RNN内部的结构是:
但,当我们推测如下的:小明很喜欢吃蛋挞,所以小明下班后决定去商店__两个蛋挞。这时,不仅需要参考前面的词,还需要参考后面的词,才能推测出中间横线上的词,最大的概率是买。这就需要双向循环神经网络。如下图:
以及深层双向神经网络:
具体公式实现可参考:https://zybuluo.com/hanbingtao/note/541458
LSTM原理: 这里说一下LSTM的前向运算:LSTM有三个门:遗忘门、输入门、输出门。
遗忘门(forget gate),它决定了上一时刻的单元状态有多少保留到当前时刻;输入门(input gate),它决定了当前时刻网络的输入有多少保存到单元状态。输出门(output gate)来控制单元状态有多少输出到LSTM的当前输出值。
遗忘门:sigmod函数,0代表舍弃,1代表保留。
输入门:决定什么样的新信息被存放在细胞状态中。当前输入的单元状态通过 tanh 进行处理(得到一个在 -1 到 1 之间的值)。
计算当前时刻的单元状态:它是由上一次的单元状态按元素乘以遗忘门,再用当前输入的单元状态按元素乘以输入门,再将两个积加和产生的,
输出门:LSTM最终的输出,是由输出门和单元状态共同确定的:把细胞状态通过 tanh 进行处理(得到一个在 -1 到 1 之间的值)并将它和 sigmoid 门的输出相乘,最终我们仅仅会输出我们确定输出的那部分。
可参考:https://www.zybuluo.com/hanbingtao/note/581764
GRU:省略了一个门,而且余下的两个门是z,1-z的关系。
LSTM为什么可以解决梯度消失问题: