长短记忆模型是建立在RNN基础之上的,理解RNN有助于理解LSTM模型,建议读者阅读《循环神经网络(RNN)原理及BPTT算法》。
在介绍LSTM模型之前,我们先回顾一下RNN,网络结构如图:
将网络结构中每一层都缩成一个圆来表示,就是如下这样的网络结构缩图:
在t时刻,我们向网络中输入数据,将作为RNN循环层的部分输入,另外一部分输入是上一时刻,也就是t-1时刻该循环层的输出。如果序列长度T很大,那么t=T时刻将依赖于初始时刻t=1的输入,这种依赖过长,容易导致梯度消失问题(权重矩阵和偏置项的梯度接近于0)。如果说RNN模型能够记忆住最近的一些信息,同时将更久的信息遗忘掉,这就更好了,长短记忆模型(Long Short Term Memory,简称LSTM)就是基于这样的思想而构建的。那么如何去记忆和遗忘呢?LSTM通过引入细胞状态(cell state)来实现的。下面我们详细介绍LSTM的模型。
我们将RNN的网络结构缩图的循环层(也就是图中绿色实心圆)放大,在里面对输入数据做一系列操作,最后再输出。这样就得到了LSTM的示意图:
图中的矩形A就是对输入做一系列处理,然后输出。矩形A的内部结构如下:
图中绘制了三个时刻的矩形A的处理情况,分别是t-1,t和t+1时刻。我们来看t时刻的矩形A,一眼看去内部处理结构复杂。不要急,我们从左向右,从下而上按照数据流向来看。在最左边有两条线。第一条线,也就是下面的黑色粗箭头:
它就是LSTM模型引入的最重要的东西,称为细胞单元(cell state),它可以理解为存储的是信息量,如图记为,其他与之相连的一些箭头,表示对这个信息中更久的信息进行遗忘,然后加入新的信息,然后得到新的信息量。这条黑色粗实线贯穿整个序列(从t=1到t=T)。那么记录的信息是如何被遗忘和加入新的信息的呢。我们看图的最左边下面的两个输入,是t-1时刻的输出(部分旧信息的来源),是当前时刻输入(新信息的来源)。首先他们会进入如下图进行处理:
处理后输出的,这个处理和我们熟悉的单个神经元是一样的,先是线性加权,然后非线性处理。就是我们熟悉的sigmoid函数,如图:
它将输入的每个分量都压缩到(0,1)之间。经过处理后的有什么特征呢?就是的每个分量都被压缩到了(0,1)内。这有什么用呢?我们再看,输出后面会与汇合,图中表示两个向量的对应分量乘积。比如
注意到的每个分量都在(0,1)之间,这样就能控制的哪个分量会输出,输出多少,的分量越接近1,表示对应分量输出比例越高,甚至全部输出,的分量越接近0,表示对应分量输出比例越低,甚至不输出。这正好控制了存储信息的中哪些信息应该被遗忘,哪些信息应该被保留。我们再继续看,如图:
同样的图中黄色矩形可以看成是两个神经元,第一个神经元使用的激活函数仍然是sigmoid函数,第二个神经元使用的激活函数是tanh,它的图像如下:
如图所示,tanh会将输入规范化到(-1,1)之间。两个神经元相同的是他们的输入都是。输入经过第一个神经元处理后输出为,它的作用和类似。第二个神经元的输出为,它表示存储的新的信息。我们现在需要将它加入到之前处理过的中。但是并不是把全部加入进入,而是选择性的加入,这个正好通过来控制。这个时候就得到细胞单元的输出,如下:
将作为当前矩形A的细胞状态的输出,它有两个输出方向,其中一个是输出到下一个时刻矩形A中。也就是如下图中所示
另外一个是作为如下图的输入(图中tanh):
根据tanh的图像,我们知道经过该函数处理后,实际是将规范化到了(-1,1)之间。图中还有一个黄色方块,同样是一个神经元,它的输入仍然是,经过该神经元处理后输出为,同样,它的作用与之前的和一样,也是选择性对规范化后的输出,也就是:
和一样,也有两个流向,一个是流向下一个时刻(图中有下角),另外一个流向输出层作为t时刻的最终输出。到这里整个LSTM的基本结构介绍完了,现在我们回顾头来看,LSTM模型与RNN不同的是引入了细胞状态,对旧信息和新信息选择性记忆。
文献《Understanding LSTM Networks》