LSTM 单元

长短时记忆单元在 1997 年由 S.H. 和 J.S. 首次提出 [3],并在接下来的几年内经过 A.G,H.S [4],W.Z [5] 等数位研究人员的改进逐渐形成。如果把 LSTM 单元看作一个黑盒,从外围看它和基本形式的记忆单元很相似,但 LSTM 单元会比基本单元性能更好,收敛更快,能够感知数据的长时依赖。TensorFlow 中通过BasicLSTMCell实现 LSTM 单元。

[3]: “Long Short-Term Memory,” S.Hochreiter and J.Schmidhuber(1997)

[4]: “Long Short-Term Memory Recurrent Neural Network Architectures for Large Scale Acoustic Modeling,” H.Sak et al.(2014)

[5]: “Recurrent Neural Network Regularization,” W.Zaremba et al.(2015)

  1. lstm_cell = tf.contrib.rnn.BasicLSTMCell(num_units=n_neurons)

LSTM 单元的工作机制是什么呢?在图 14-13 中展示了基本 LSTM 单元的结构。

Figure 14-13

不观察 LSTM 单元内部,除了一些不同外跟常规 RNN 单元极其相似。这些不同包括 LSTM 单元状态分为两个向量:h^{(t)}c^{(t)}c代表 cell)。可以简单认为 h^{(t)} 是短期记忆状态,c^{(t)} 是长期记忆状态。

好,我们来打开盒子。LSTM 单元的核心思想是其能够学习从长期状态中存储什么,忘记什么,读取什么。长期状态 c^{(t-1)} 从左向右在网络中传播,依次经过遗忘门(forget gate)时丢弃一些记忆,之后加法操作增加一些记忆(从输入门中选择一些记忆)。输出 c^{(t)} 不经任何转换直接输出。每个单位时间步长后,都有一些记忆被抛弃,新的记忆被添加进来。另一方面,长时状态经过 tanh 激活函数通过输出门得到短时记忆 h^{(t)},同时它也是这一时刻的单元输出结果 y^{(t)}。接下来讨论一下新的记忆时如何产生的,门的功能是如何实现的。

首先,当前的输入向量 x^{(t)} 和前一时刻的短时状态 h^{(t-1)} 作为输入传给四个全连接层,这四个全连接层有不同的目的:

  • 其中主要的全连接层输出 g^{(t)},它的常规任务就是解析当前的输入 x^{(t)} 和前一时刻的短时状态 h^{(t-1)}。在基本形式的 RNN 单元中,就与这种形式一样,直接输出了 h^{(t)}y^{(t)}。与之不同的是 LSTM 单元会将一部分 g^{(t)} 存储在长时状态中。
  • 其它三个全连接层被称为门控制器(gate controller)。其采用 Logistic 作为激活函数,输出范围在 0 到 1 之间。正如在结构图中所示,这三个层的输出提供给了逐元素乘法操作,当输入为 0 时门关闭,输出为 1 时门打开。分别为:
    • 遗忘门(forget gat)由 f^{(t)} 控制,来决定哪些长期记忆需要被擦除;
    • 输入门(input gate) 由 i^{(t)} 控制,它的作用是处理哪部分 g^{(t)} 应该被添加到长时状态中,也就是为什么被称为部分存储
    • 输出门(output gate)由 o^{(t)} 控制,在这一时刻的输出 h^{(t)}y^{(t)} 就是由输出门控制的,从长时状态中读取的记忆。

简要来说,LSTM 单元能够学习到识别重要输入(输入门作用),存储进长时状态,并保存必要的时间(遗忘门功能),并学会提取当前输出所需要的记忆。

这也解释了 LSTM 单元能够在提取长时序列,长文本,录音等数据中的长期模式的惊人成功的原因。

公式 14-3 总结了如何计算单元的长时状态,短时状态,和单个输入情形时每单位步长的输出(小批量的方程形式与单输入的形式相似)。

Equation 14-3

  • W_{xi}W_{xf}W_{xo}W_{xg} 是四个全连接层关于输入向量 x^{(t)} 的权重。
  • W_{hi}W_{hf}W_{ho}W_{hg} 是四个全连接层关于上一时刻的短时状态 h^{(t-1)} 的权重。
  • b_ib_fb_ob_g 是全连接层的四个偏置项,需要注意的是 TensorFlow 将其初始化为全 1 向量,而非全 0,为了阻止网络初始训练状态下,各个门关闭从而忘记所有记忆。

窥孔连接

基本形式的 LSTM 单元中,门的控制仅有当前的输入 x^{(t)} 和前一时刻的短时状态 h^{(t-1)}。不妨让各个控制门窥视一下长时状态,获取一些上下文信息不失为一种尝试。该想法由 F.G.he J.S. 在 2000 年提出。他们提出的 LSTM 的变体拥有叫做窥孔连接的额外连接:把前一时刻的长时状态 c^{(t-1)} 加入遗忘门和输入门控制的输入,当前时刻的长时状态加入输出门的控制输入。

TensorFLow 中由LSTMCell实现以上变体 LSTM,并设置use_peepholes=True

  1. lstm_cell = tf.contrib.rnn.LSTMCell(num_units=n_neurons, use_peepholes=True)

在众多 LSTM 变体中,一个特别流行的变体就是 GRU 单元。