循环神经网络--LSTM(Long-Short Term Memory)与GRU(Gated Recurrent Unit )

LSTM

为了解决 Gradient Vanish 的问题,Hochreiter&Schmidhuber 在论文“Long short-term memory, 1997”中提出了 LSTM(Long Short-Term Memory)。原始的 LSTM 只有 Input Gate、Output Gate。而咱们现在常说的 LSTM 还有 Forget Gate,是由 Gers 在”Learning to Forget: Continual Prediction with LSTM, 2000”中提出的改进版本。后来,在”LSTM Recurrent Networks Learn Simple Context Free and Context Sensitive Languages, 2001”中 Gers 又加入了 Peephole Connection 的概念。同时,现在常用的深度学习框架 Tensorflow、Pytorch 等在实现 LSTM 上也有一些细微的区别。以上所说的虽然本质都是 LSTM,但结构上还是有所区别,在使用时需要注意一下。

下文介绍的 LSTM 是”Traditional LSTM with Forget Gates”版本。


循环神经网络--LSTM(Long-Short Term Memory)与GRU(Gated Recurrent Unit )_第1张图片

LSTM结构图

LSTM 其实就是将 RNN 中 Hidden Layer 的一个神经元,用一个更加复杂的结构替换,称为 Memory Block。单个 Memory Block 的结构如下(图中的虚线为 Peephole Connection,忽略即可)

先对其中结构进行简要介绍:

  1. Input Gate, Output Gate, Forget Gate:这三个 Gate 本质上就是权值,形象点则类似电路中用于控制电流的开关。当值为1,表示开关闭合,流量无损耗流过;当值为0,表示开关打开,完全阻塞流量;当值介于(0,1),则表示流量通过的程度。而这种[0,1]的取值,其实就是通过 Sigmoid 函数实现的;
  2. Cell:Cell 表示当前 Memory Block 的状态,对应于原始 RNN 中的 Hidden Layer 的神经元;
  3. Activation Function:图中多处出现了 Activation Function(小圆圈+ sigmoid 曲线的图案),对这些 Activation Function 的选择有一个通用的标准。一般,对 Input Gate, Output Gate, Forget Gate,使用的 Activation Function 是 sigmoid 函数;对于 Input 和 Cell, Activation Function 使用 tanh 函数。

其具体公式如下:


循环神经网络--LSTM(Long-Short Term Memory)与GRU(Gated Recurrent Unit )_第2张图片

其中, it i t , ot o t , ft f t 分别表示 Input Gate, Output Gate, Forget Gate; gt g t 表示 Input; ht h t 表示 Output; ct c t 表示 Cell 在时刻t的状态; 表示向量的点乘。

LSTM 是为了解决 RNN 的 Gradient Vanish 的问题所提出的。下面简要解释一下为什么 LSTM 能有效避免 Gradient Vanish。

对于 LSTM,有如下公式

ct=ftct1+itgt(1) (1) c t = f t ⊙ c t − 1 + i t ⊙ g t

我们对 LSTM 计算 δk1=Ct/ck1 δ k − 1 = ∂ C t / ∂ c k − 1 ,有

δk1=Ctck1=Ctckckck1=δkckck1=δk(ft+...)(2)(3)(4)(5) (2) δ k − 1 = ∂ C t ∂ c k − 1 (3) = ∂ C t ∂ c k ∂ c k ∂ c k − 1 (4) = δ k ∂ c k ∂ c k − 1 (5) = δ k ( f t + . . . )

公式里其余的项不重要,这里就用省略号代替了。可以看出当 ft f t = 1时,就算其余项很小,梯度仍然可以很好地传导到上一个时刻,此时即使层数较深也不会发生 Gradient Vanish 的问题;当 ft f t = 0时,即上一时刻的信号不影响到当前时刻,则此项也会为0; ft f t 在这里控制着梯度传导到上一时刻的衰减程度,与它 Forget Gate 的功能一致。

普通RNN与LSTM的比较

下面为了加深理解循环神经网络的核心,比较一下普通RNN和LSTM的区别。

  • 比较公式:最大的区别是多了三个神经网络(gates)来控制数据的流通。
    • 普通RNN ht=tanh(Wxhxt+Whhht1+b) h t = t a n h ( W x h ⋅ x t + W h h ⋅ h t − 1 + b )
    • LSTM ht=ottanh(ftct1+ittanh(Wxcxt+Whcht1+bc)) h t = o t ⊙ t a n h ( f t ⊙ c t − 1 + i t ⊙ t a n h ( W x c x t + W h c h t − 1 + b c ) )
    • 比较:二者的信息来源都是 tanh(Wxhxt+Whhht1+b) t a n h ( W x h ⋅ x t + W h h ⋅ h t − 1 + b ) 不同的是LSTM靠3个gates将信息的积累建立在线性自连接的memory cell之上,并靠其作为中间物来计算当前 ht h t
  • 示图比较:图片来自Understanding LSTM,强烈建议一并阅读。

    • 普通RNN


      循环神经网络--LSTM(Long-Short Term Memory)与GRU(Gated Recurrent Unit )_第3张图片

      普通RNN

    • LSTM:加号圆圈表示线性相加,乘号圆圈表示用gate来过滤信息。


      循环神经网络--LSTM(Long-Short Term Memory)与GRU(Gated Recurrent Unit )_第4张图片

      LSTM

    • 比较:新信息从黄色的tanh处,线性累积到memory cell之中后,又从红色的tanh处加入非线性并返回到了隐藏状态h_t的计算中。

GRU

GRU(Gated Recurrent Unit) 是由 K.Cho 在”Learning Phrase Representations using RNN Encoder–Decoder for Statistical Machine Translation, 2014”中提出的。它是 LSTM 的简化版本,但在大多数任务中其表现与 LSTM 不相伯仲,因此也成为了常用的 RNN 算法之一。

GRU 的具体结构与对应的公式如下:


循环神经网络--LSTM(Long-Short Term Memory)与GRU(Gated Recurrent Unit )_第5张图片

GRU结构图

这里写图片描述

其中,r,z分别被称为 Reset Gate 和 Update Gate。可以看出,GRU 与 LSTM 有一定的相似性,而区别主要在于:

  1. LSTM 有三个 Gate,而 GRU 仅两个;
  2. GRU 没有 LSTM 中的 Cell,而是直接计算输出;
  3. GRU 中的 Update Gate 类似于 LSTM 中 Input Gate 和 Forget Gate 的融合;而观察它们结构中与上一时刻相连的 Gate,就能看出 LSTM 中的 Forget Gate 其实分裂成了 GRU 中的 Update Gate 和 Reset Gate。

很多实验都表明 GRU 跟 LSTM 的效果差不多,而 GRU 有更少的参数,因此相对容易训练且过拟合的问题要轻一点,在训练数据较少时可以试试。

参考文献:

  1. 当我们在谈论 Deep Learning:RNN 其常见架构
  2. YJango的循环神经网络——实现LSTM
  3. Recurrent Neural Networks Tutorial, Part 1 – Introduction to RNNs
  4. Understanding LSTM Networks
  5. [译] 理解 LSTM 网络
  6. Keras Recurrent Layers 解析

你可能感兴趣的:(深度学习)