1.引入

  长短期记忆网络——通常被称为 LSTM,是一种特殊的 RNN,能够学习长期依赖性。由 Hochreiter 和 Schmidhuber(1997)提出的,并且在接下来的工作中被许多人改进和推广。LSTM 在各种各样的问题上表现非常出色,现在被广泛使用。

  LSTM 和通常的 CNN 一样为一个循环单元的结构, 但是与 RNN 仅有一个 tanh 激活层不同, LSTM 中包含了更复杂的四层网络的结构设计, 并且四层网络相互耦合, 如下图所示.

cnnlstm模块 lstm和cnn_运算符

cnnlstm模块 lstm和cnn_网络层_02

  在上面的图中,每行包含一个完整的向量,从一个节点的输出到其他节点的输入。粉色圆圈表示逐元素运算,如向量加法;而黄色框表示学习的神经网络层。行合并表示串联,而分支表示其内容正在被复制,并且副本将转到不同的位置。

2. LSTM的核心思想

C —— 横穿下图顶部的直线。单元状态有点像传送带。它贯穿整个链条,只有一些次要的线性交互作用。信息很容易以不变的方式流过。

cnnlstm模块 lstm和cnn_运算符_03

  LSTM 可以通过门(gate)来控制向单元状态中增加信息或减少信息. 门由一个 sigmoid 函数和一个乘法运算符组成, 如下图所示.

cnnlstm模块 lstm和cnn_特征向量_04

 

 

 

sigmoid 层输出的值在 [0,1] 之间, 控制了信息的通过量。越接近 0, 则表明不允许信息通过(从而形成遗忘);越接近 1, 则表明允许信息全部通过(从而形成记忆).

3. LSTM单元解析

  LSTM 单元在每个时间步需要注意三个向量(长度相同):

  • 输入的特征向量 xt
  • 上一步输出的特征向量 ht1
  • 上一步结束后的单元状态 Ct1

    3.1 遗忘门(forget gate)

ht和当前步的输入 xt 来决定要遗忘掉上一步的什么信息(从单元状态 Ct1 中遗忘). 因此只需要计算一个遗忘系数 f乘到单元状态上即可. 如下图所示, 公式中的方括号表示 concat 操作.

 

cnnlstm模块 lstm和cnn_特征向量_05

 

 

ht和 x的长度均为1000,则 W的维度为(1000,2000),ft 是长度为1000的向量,后面与 Ct-1 进行对应元素相乘。

3.2 输入门(input gate)

ht1 和当前新的输入 xt 我们应该把多少信息储存在单元状态中. 这部分有两步, 首先一个输入门计算要保留哪些信息, 得到过滤系数 i, 然后使用一个全连接层来从上一步的输出 ht1 和当前步的输入 xt 中提取特征 C˜t. 

  如下图所示.

cnnlstm模块 lstm和cnn_网络层_06

 新旧信息合并

Ct1ft∗Ct1it∗C˜t 如下图所示.

 

 

cnnlstm模块 lstm和cnn_特征向量_07

 

 

 

 3.3 输出门(output gate)

  最后我们要决定输出什么信息了. 这需要从当前的单元状态 Ct 来获取要输出的信息. 但显然我们并不会在这一个时间步输出所有记忆的信息, 而是只要输出当前需要的信息, 因此我们用一个输出门来过滤输出的信息, 过滤系数为 ot . 此外我们希望输出的特征的取值能够介于 [−1,1]tanh 函数把单元状态 Ct 映射到相应的范围, 最后乘上过滤系数得到当前步的输出. 如下图所示.

 

 

 

cnnlstm模块 lstm和cnn_网络层_08