在介绍LSTM之前,先介绍一下RNN,方便对比理解。

一、循环神经网络(Recurrent Neural Network,RNN)

循环神经网络(Recurrent Neural Network,RNN)相比一般的神经网络来说,他能够处理序列变化的数据。比如某个单词的意思会因为上文提到的内容不同而有不同的含义,那么RNN就能解决这类问题。来看一个简单的例子,对于RNN来说,对于输入的一句话,它的每一个单词输入完已有会存到一个记忆单元里面(图中蓝色的方框)参与下一个单词的输入,需要注意的是这是同一个神经网络,只不过是在三个不同的时间点被使用了三次。

(注:以下图片来自李宏毅老师的ppt)

如何显示lstm神经网络参数 神经网络 lstm_人工智能


那么我们其实就可以发现,这种网络结构,前一个单词会影响后一个单词的输出,比如下面的例子,leave Taipei和arrive Taipei,同样都是Taipei,但是一个是到达,一个是离开,所以两个Taipei的输出是不同的。

如何显示lstm神经网络参数 神经网络 lstm_lstm_02


RNN当然可以有多层结构,如图:

如何显示lstm神经网络参数 神经网络 lstm_深度学习_03


同时,还有RNN的变体,比如刚才我们介绍的普通RNN就是Elman Network,那么还有Jordan Network,把上一个时间点的输出值在下一个时间点读进来,如图:

如何显示lstm神经网络参数 神经网络 lstm_循环神经网络_04


还有双向RNN,读取方向可以是正向和逆向两个network,把它们接到同一个output,这种双向的好处就是可以看到整个句子的信息,而不仅仅是句子的前面。

如何显示lstm神经网络参数 神经网络 lstm_人工智能_05

二、长短期记忆(Long short-term memory, LSTM)

LSTM就是一种特殊的RNN,它可以解决梯度消失的问题(第三部分介绍原因),但是不会解决梯度爆炸的问题。我们来看一下它的结构,在下图中,如果想要输入到memory cell中值,那么不一定输入的进去,因为有输入门input gate控制,同时还有输出门output gate,控制是否输出,遗忘门forget gate控制的是什么时候memory cell要把过去记得的东西忘掉,该不该忘掉这是LSTM自己学到的。

如何显示lstm神经网络参数 神经网络 lstm_lstm_06


那么,存在记忆单元memory cell中的值怎么计算呢,请看下图,这里假设在四个输入之前记忆单元中存的值是c。我们发现如果控制输入门的f(zi)=0,那么输入就是0,是1,那么输入就是原来的输入;假设f(zf)是1,也就是遗忘门开启的时候,c会直接通过,相当于会记得之前存的值c,如果f(zf)=0,就不会记得之前的值(其实这里会发现和我们正常的思考相反的奇怪事情,遗忘门打开,会记得,关闭会忘记,可能叫记忆门更好一些==),同样,f(z0)如果是0,那么输出也就是0,也就不能通过输出门。

如何显示lstm神经网络参数 神经网络 lstm_lstm_07


那么四个输入z、zi、zf、zo是什么的,其实都是向量,如下图:

如何显示lstm神经网络参数 神经网络 lstm_人工智能_08


这四个向量怎么来的呢?都是经过x向量转换得到的,得到这四个向量以后的整个实现过程如下图,左边就是我们通常看到的LSTM的结构(蓝色的球代表相乘,粉色的代表相加),c^t-1表示上一次memory cell中的内容,其实就是对右边图的一个解释和形象化的表达。

如何显示lstm神经网络参数 神经网络 lstm_如何显示lstm神经网络参数_09


那么上一个时间点接下一个时间点的输出的结构如下图所示,一般来说,对于下一次的输入其实不仅要考虑当前的输入,还要把上一时刻的的ht和ct拿过来,把它们并起来作为新的时间点的输入。

如何显示lstm神经网络参数 神经网络 lstm_如何显示lstm神经网络参数_10

三、LSTM和RNN相比为什么能够解决梯度消失的问题

对于RNN来说,对于每一个时间点,memory里的信息都会别覆盖掉,但是LSTM里不一样,它是把原来memory里面的值乘上一个值在加上input的值放到cell里面,它的memory和input是相加的,所以不像RNN在每个时间点都会被覆盖掉,只要前一时刻的信息一被format掉,影响就消失了,但是在LSTM里的影响一直会存在,除非遗忘门Forget Gate把memory里的信息清洗掉。

如何显示lstm神经网络参数 神经网络 lstm_深度学习_11


相关网址:

李宏毅老师主页:

http://speech.ee.ntu.edu.tw/~tlkagk/courses.html