LSTM也是一种循环神经网络,他也是只有一个物理LSTM单元,按照时间步骤展开处理时序数据,如图1所示。
LSTM - 图1
图1 LSTM展开图
假设现在有这样一句话:我爱人工智能,分词之后是:[我,爱,人工,智能]。LSTM单元在第1个时刻会处理”我”这个单词,在第2个时刻会处理”爱”这个单词,依次类推。
我们再来看下每个时刻LSTM单元的输入和输出,显然在每个时刻LSTM会接收3种数据,同时输出2种数据。在时刻𝑡tLSTM单元的输入是:单词𝑥𝑡xt (词向量),上一个时刻的状态向量𝑐𝑡−1ct−1 (上边的横线) 和 上一个时刻的隐状态向量ℎ𝑡−1ht−1 (下边的横线);LSTM单元的输出是: 当前时刻的状态向量𝑐𝑡ct和 当前时刻的隐状态向量ℎ𝑡ht 。
LSTM - 图2
图2 LSTM数据处理样例
图2展示了LSTM处理”我爱人工智能”这句话的过程,我们可以看到在第1个时刻,模型输入了单词”我”, 初始的状态向量𝑐0c0和初始的隐状态向量ℎ0h0,模型输出的是状态向量𝑐1c1和隐状态向量ℎ1h1;在第2个时刻,模型输入了单词”爱”,第1个时刻的状态向量 𝑐1c1和ℎ1h1,模型的输出是状态向量𝑐2c2和隐状态向量ℎ2h2,其他的时刻依次类推。这就是LSTM处理时序信息的整体过程。

这里需要注意的是,在LSTM中虽然有两个状态向量𝑐𝑡ct和ℎ𝑡ht,但一般来讲,我们会将𝑐𝑡ct视为能够代表阅读到当前LSTM单元信息的状态(或者说是记忆), 而ℎ𝑡ht是当前LSTM单元对外的输出状态,它是实际的工作状态向量,即一般会利用ℎ𝑡ht来做一些具体的任务。

公式

LSTM - 图3
图3 LSTM单元内部结构
图3展示了LSTM单元内部的结构,里面包含了这样几个重要的组件:

  • 状态向量𝑐𝑡:它控制着整个LSTM单元的状态或者记忆,它会根据每个时刻的输入进行更新,从而实时保持LSTM单元的记忆。
  • 隐状态向量ℎ𝑡:它是当前LSTM单元对外的输出状态,它是实际的工作状态向量,即一般会利用ℎ𝑡来做一些具体的任务。
  • 输入门𝑖𝑡:控制当前时刻的输入信息需要向状态向量𝑐𝑡ct中注入哪些信息。举个例子,当输入信息是一些没有实际意义的词,比如”的”,可能模型不会让这些信息流入到状态向量中,从而保持模型的语义表达。
  • 遗忘门𝑓𝑡:控制前一时刻的状态向量𝑐𝑡−1需要被屏蔽/遗忘哪些信息。举个例子,昨天我去爬了长城,哦不对是前天, 当模型看到”不对,是前天”的时候,可能就会忘记前边的”昨天”。
  • 输出门𝑜𝑡:控制当前时刻的状态向量𝑐𝑡需要对外输出哪些信息,最终输出的信息即为ℎ𝑡。

在了解了这些基本概念后,我们来看下这些组件的具体生成过程,首先来看下这三个门的生成过程,以时刻𝑡为例:
𝑖𝑡=𝑠𝑖𝑔𝑚𝑜𝑖𝑑(𝑊𝑖𝑥𝑡+𝑈𝑖ℎ𝑡−1+𝑏𝑖)
𝑓𝑡=𝑠𝑖𝑔𝑚𝑜𝑖𝑑(𝑊𝑓𝑥𝑡+𝑈𝑓ℎ𝑡−1+𝑏𝑓)
𝑜𝑡=𝑠𝑖𝑔𝑚𝑜𝑖𝑑(𝑊𝑜𝑥𝑡+𝑈𝑜ℎ𝑡−1+𝑏𝑜)
可以看到,这三个门的计算是使用输入数据𝑥𝑡和ℎ𝑡−1进行线性变换后,将结果传递给𝑠𝑖𝑔𝑚𝑜𝑖𝑑函数,因为𝑠𝑖𝑔𝑚𝑜𝑖𝑑函数是值域(0,1)的函数,即它能够将数据映射到这个固定区间,从而控制信息的流动。
接下来我门来计算下当前LSTM单元的待输入信息
𝑎𝑡=𝑡𝑎𝑛ℎ(𝑊𝑎𝑥𝑡+𝑈𝑎ℎ𝑡−1+𝑏𝑎)
同样是对输入数据𝑥𝑡和ℎ𝑡−1进行线性变换,然后将结果传递给𝑡𝑎𝑛ℎ函数,最终的结果即为待向当前LSTM单元的状态向量𝑐𝑡中注入的信息。有了以上这些组件,接下来就可以更新当前LSTM单元的状态向量𝑐𝑡了。
𝑐𝑡=𝑓𝑡⋅𝑐𝑡−1+𝑖𝑡⋅𝑎𝑡
显然,LSTM单元状态𝑐𝑡的更新是对上一个时刻的状态𝑐𝑡−1进行有选择的遗忘,对当前时刻的待输入信息𝑎𝑡将有选择的输入,最后将两者的结果进行相加,表示向当前LSTM单元即融入了以前的状态信息𝑐𝑡−1,同时又注入了当前最新的信息𝑎𝑡。在计算出当前时刻的状态向量𝑐𝑡后,就可以根据该状态向量对外进行输出了。
ℎ𝑡=𝑜𝑡⋅𝑡𝑎𝑛ℎ(𝑐𝑡)
即通过输出门对当前的状态信息𝑐𝑡进行有选择的输出。

缺点

LSTM有三个不同的门,参数较多,训练起来比较困难