长短期记忆(英语:Long Short-Term Memory,LSTM)
是一种时间循环神经网络(RNN)[1],论文首次发表于1997年。由于独特的设计结构,LSTM适合于处理和预测时间序列中间隔和延迟非常长的重要事件。 摘自:长短期记忆,维基百科
RNN
我们往往会根据之前发生的事情,预测到后面的事,RNN就模拟了这种有记忆的网络,是有状态的,图中的回路表现了这个状态的保留。
如果将回路展开,就是RNN结构图经常看到的形式:
RNN可以根据上下文推测出下文,但是对于待预测的下文距离可以提供背景的上文特别远,RNN理论上可行但是实践中却有问题。
短距离预测:天空中有朵(云)
长距离预测:我从小在法国长大,……,我可以流利的说(法语)
于是就有了LSTM
传统RNN链式结构
这里每个单元的向右的一条线路表示了一个回路,就是保存的一种状态(隐藏状态)。
LSTM 链式结构
这里每个单元向右多了一条线路,在原图就是回路,表示多了一个状态(单元状态)
前向计算
1、遗忘门
根据输入x 和上一次的隐藏状态ht-1,得到ft,从而决定上一时刻的单元状态ct-1有多少可以影响这一时刻。W 为权重,bf为偏置,外面作用一个sigmoid
2、输入门
根据输入xt,和上一时刻隐藏层状态ht-1,结合tanh 计算Ct',it决定这一时刻的状态有多少Ct' 可以影响到单元状态Ct
3、更新单元状态
4、输出门
计算隐藏状态的输出
关于为什么LSTM可以解决RNN的问题(梯度消失问题,梯度爆炸问题LSTM没有解决),可以参考:
里面提到RNN 梯度消失本质是矩阵高次幂,但是LSTM 的梯度公式中看出较低层的sigmoid参数也能很好的保留到当前层。
评论顺便解释了DNN的梯度消失是指误差无法传到浅层,RNN 的梯度消失指较早时间的值,没法对当前时刻有影响,无法做到长期记忆。
参考:LSTM结构理解与python实现 有结构图、推导、python实现