为了添加一个新信息,RNN需要通过一个函数完全地转换当前的信息。因此信息是以整体为单位进行修改的,模型并没有考虑重要的和不重要的信息。
LSTM 会通过乘法和加法等运算对信息进行局部的修改。因此通过 LSTM,信息流会选择性地通过单元状态,也就是说 LSTM 会选择性地记忆或遗忘某些特征。此外,特定单元状态下的信息共有三种不同的依赖性。
RNN
标准RNN中,这个重复的结构模块只有一个非常简单的结构,例如一个tanh层。
LSTM
LSTM 同样是这样的结构,但是重复的模块拥有一个不同的结构。不同于单一神经网络层,这里是有四个,以一种非常特殊的方式进行交互。
http://colah.github.io/posts/2015-08-Understanding-LSTMs/
gate的作用就是来控制信息的流通,它们的作用分别为:
- input gate,0-1之间,控制信息有多少输入。
- forget gate,0-1之间,控制信息要遗忘多少。(若单元状态==0,那么遗忘门就要求单元状态完全忘记该信息)
- output gate,0-1之间:控制信息输出多少。
这些gate的激活函数f通常为sigmoid函数,它的值为0-1之间,0表示门关闭,信息不流通,1表示门完全打开,信息完全流通。g,h也是激活函数。
这个cell的工作流程
从这个流程可以看到,信息的输入,记忆的输入和信息的输入都是受到严格控制的。
不过,真正的LSTM并不是上面所讲的那样,而是增加了peephole。增加peephole之后实际上改变的只是输入,输入不再只是x,而是增加了隐层的输出h和当前记忆c。(有待于理解啊~)
若我们输入 Z,那么该输入向量通过激活函数得到的 g(Z) 和输入门 f(Z_i ) 的乘积 g(Z) f(Z_i ) 就表示输入数据经筛选后所保留的信息。Z_f 控制的遗忘门将控制以前记忆的信息到底需要保留多少,保留的记忆可以用方程 c*f(z_f)表示。以前保留的信息加上当前输入有意义的信息将会保留至下一个 LSTM 单元,即我们可以用 c' = g(Z)f(Z_i) + cf(z_f) 表示更新的记忆,更新的记忆 c' 也表示前面与当前所保留的全部有用信息。我们再取这一更新记忆的激活值 h(c') 作为可能的输出,一般可以选择 tanh 激活函数。最后剩下的就是由 Z_o 所控制的输出门,它决定当前记忆所激活的输出到底哪些是有用的。因此最终 LSTM 的输出就可以表示为 a = h(c')f(Z_o)。
关于LSTM的一些问题
- lstm为什么能解决梯度消失问题?(阿里)paperweekly
传统RNN因为在时间上参数共享,所以会出现梯度消失/爆炸问题。LSTM/GRU在解决层内梯度消失/爆炸问题时,梯度仍然会在层间衰减,所以LSTM/GRU难以做成多层网络。
解决方案:
- lstm里面的状态更新是怎样的,各个门是怎样的?(阿里)
-
LSTM中input Gate、output Gate、forget Gate、ht、cell更新等的计算公式
更多细节 LSTM模型与前向反向传播算法
GRU
GRU是2014年提出的一种LSTM改进算法。它将忘记门和输入门合并成为一个单一的更新门,同时合并了数据单元状态和隐藏状态,使得模型结构比之于LSTM更为简单。
其各个部分满足关系式如下:
参考: