理解LSTMs (Long Short Term Memory Networks)
阅读原文时间:2021年04月25日阅读:1

Understanding LSTMs Model

本文主要参考了大神 Christopher Olah,关于LSTMs论述的博客(Ref[1]),同时加入了自己的理解,最终得以形成了这篇博文。

在读了LSTMs(Ref[1])之后,我又阅读 Olah 大神的其他博客,受益匪浅!

以后,如果有时间允许的情况下,我会陆续对 Olah’s Blog 进行解读并且附上自己的理解!

不过,

一千个人的眼中有一千个哈姆雷特。

所以,还是推荐大家阅读原文,你一定会受益匪浅!

这里,再次膜拜Olah大神👍👍👍。

首先,在开始介绍LSTM之前,我们先来回顾下RNN(Recurrent Neural Network):

一个传统的RNN如下图所示:
从RNN的结构我们可以看出,RNN更适合处理序列模型,如视频、音频等具有顺序的数据:

“人不会从零开始思考任何一件事,人会通过结合之前的知识、记忆和经验,来处理当前正在发生的事。”

这是因为,你的思想会在你的大脑中保留(persistence);而传统神经网络(DNN)则不会结合之前的信息来对当前的信息进行处理。
RNN的出现主要是为了解决这一问题(issue),即结合之前(previous)的信息来理解并处理当前(present)的任务(task)。

对于语言模型(Language Model) 来说,RNN可以基于之前的词对下一个词进行预测
例如,
\qquad\qquad\qquad\qquad\qquad\qquad "Fish lives in ____."

我们不需要过多了解上下文,即可知道, "Fish lives in water."
当与问题相关联的信息与所需要填写的词的 距离(gap) 相对较近的时候,RNN可以很容易 (easy) 的学习使用 之前的(previous) 知识来 预测(predict) 接下来的 (next) 答案。

下图为RNN的应对这类问题的基础网络结构:

但,在很多情况下,我们需要观察更多的 上下文(context) 才能够准确的预测目标问题的答案。
例如,
\qquad\qquad\qquad\qquad “I grew up in China … I can speak fluent ____.”

根据空位附近的信息显示,我们需要填写一门语言(language),但是空位附近的信息不足以预测出空位应该填写哪种语言,所以我们需要考察更长距离、更大范围的上下文(context) ,以便更加准确的,更有依据的 预测(predict) 答案。

但,对于需要依靠较大范围的上下文(context) 信息才能精准 预测(predict) 答案的问题,RNN的表现就不尽如人意了;并且,随着 距离(gap) 的增加,RNN会逐渐丧失学习连接上下文(context) 信息的能力,模型表现也会越来越差 (worst)

虽然,在理论上,RNN完全有能力处理这样的 长期依赖(long-term dependencies);人们可以通过细心的调整 参数(parameters) 以解决这种形式的问题 (toy problems)

但,事实上,RNN看起来并不能很好的解决 长期依赖(long-term dependencies) 的问题。产生这个问题的 根本原因 可以参考Ref[2] 和 Ref[3] 这两篇论文。

幸运的是,LSTMs成功解决了这个问题。

LSTM Networks:

LSTM自提出以来,在很多问题上,取得了非常好的效果,并被大量广泛使用。

对于LSTMs来说,学习长期依赖(long-term dependencies) 已经成为了它们的固有能力。

在研究LSTMs的内部结构之前,首先,先来看下RNN的内部结构,可以是简单的single tanh layer

LSTMs同样具有如RNN一般的链式结构,但具体的内部结构却完全不同:


在对内部结构做具体分析前,首先明确网络结构中的各个部分的含义:

解析LSTMs的核心思想

0. Cell State

首先引入LSTMs的 关键(key) 概念 —— 细胞状态(cell state)。

细胞状态(cell state)像一条传送带一样贯穿RNN架构的每一个模块(module),在每个模块中,细胞状态 (cell state) 只做一些简单的线性变换。

细胞状态 (cell state),如下图所示:


LSTMs可以通过 门控单元(gates unit) 向细胞状态中添加 信息(information) 或从细胞状态中移除 信息(information)

门控单元(gates unit) 由一个 sigmoid 神经网络层和一个 逐元素乘积(pointwise) 操作组成。

门控单元(gates unit) 结构如下:


门控单元(gates unit) 决定是否允许 信息(information) 通过。

0 ≤ s i g m o i d l a y e r o u t p u t ≤ 1 0 \leq sigmoid\quad layer \quad output \leq 1 0≤sigmoidlayeroutput≤1
描述了一个组件应该通过多少,0表示禁止通过1表示完全通过

一个LSTMs Module中,有三个 门控单元(gates unit) 来保护和控制细胞状态(cell state)

1. Forget(遗忘):

首先,LSTM需要决定哪些 **信息(information)需要从 ** 细胞状态(Cell State) 中移除,这是由 Forget Gate Layer(sigmoid) 完成的。

Forget Gate Layer 对输入的 h t − 1 和 x t h_{t - 1}和x_{t} ht−1​和xt​,进行 Forget 操作后,对细胞状态 C t − 1 C_{t - 1} Ct−1​ 中的每个元素,会输出一个介于0 ~ 1之间的值。

1表示全部保留0表示全部 忘记(Forget)

下面举例说明,Forget操作的应用场景:
例:
在一种情境下,Cell State可能包含当前主语的性别(gender),以便可以正确的使用对应的代词。 当我们看到新主语的时候,我们需要忘记原主语的性别(gender)。

Forget 操作如下图所示:

2. Store(存储):

实现了 忘记(Forget) 操作后,接下来,我们需要决定把什么样的信息 存储(Store)Cell State 中,这由两个部分(part)组成:

  1. Input Gate Layer(sigmoid layer),决定哪些值需要被更新。
  2. Tanh Layer,创建能够加入到Cell State的候选向量 C ~ t \tilde{C}_{t} C~t​。

最后,我们要结合这两个部分对Cell State进行更新。

下面举例说明,Store操作的应用场景:
例:
我们希望把新主语的性别(gender)添加到Cell State中,以替换我们正在 Forgetting 的原主语的性别(gender)

Store 操作如下图所示:

3. Update(更新):

在实现了ForgetStore之后,我们接下来要将细胞状态(Cell State)由 C t − 1 C_{t-1} Ct−1​更新为 C t C_{t} Ct​。

下面举例说明,Update操作的应用场景:
例:
实际上,这就是我们**忘记(Forget)关于旧主语的性别(gender)**的信息,并 添加(Store) 新信息的实际操作的过程。

Update操作如下图所示:

4. Output(输出):

完成了对 细胞状态(Cell State)更新(Update) 后,我们需要决定我们将要 Output(输出) 什么。
Output(输出) 将会基于我们的 细胞状态(Cell State),但会是一个 过滤后(filtered) 的版本。
Output(输出) 分为以下几步:

  1. 运行一个Sigmoid Layer,决定输出哪一部分的Cell State
  2. Cell State 通过Tanh(规范值到-1 ~ 1之间),并与 Sigmoid Gate的输出做乘法,以便于我们只 输出(Output) 我们想要输出的部分。

下面举例说明,Output 操作的应用场景:
例:
由于Update操作后,模型只能观察到一个主语,所以模型可能在主语之后**输出(Output)**一个与动词有关的信息。
所以,模型很可能会输出主语是单数形式还是复数形式,以便于我们明确,主语后的动词的具体形式。

Output操作如下图所示:

LSTM Variants:

前面描述是 Normal 形式的 LSTMs;但实际上,LSTMs有很多变体。

其中一个受欢迎的LSTM变种,加入了小孔连接“Peephole Connections” 到所有的 门(Gate)

Peephole这个词,实际上很形象,就是对Cell State这一条传送通道打孔,然后将每个门都连接到Cell State

这意味着我们允许所有的 Gate Layers 都可以查看Cell State

结构如下:

另一个LSTMs的变体是使用耦合的forget和input Gates;取代独立地决定什么应该被遗忘(Forget),我们应该 加入(Input) 哪些新的 信息(Information),而是联合起来决定。

只在输入(Input)的位置遗忘(Forget),只在遗忘(Forget) 旧的值时候 输入(Input) 新的值。

结构如下:

GRU(Gated Recurrent Unit):

一种引人注目的LSTMs 变体被成为GRU,它结合了 Forget GatesInput Gates 到一个单独的 Update Gate ,同时,也合并了Cell StateHidden State,并做出了其他的一些改变。

另外,GRU 比标准 LSTM 更加简洁。

GRU结构如下图所示:

LSTM的变体还有很多,哪种LSTMs的变体更好?它们之间又有什么差异?

对于这些问题,Greff发现,其实所有的LSTMs的变体都是一样的,详情请参考Ref[4];
Ref[5]测试了超过10000种RNN的架构,结果显示在一些特定的任务上,RNN比LSTMs表现得更好。

Conclusion

不可否认,LSTMs的提出是RNNs的巨大进步,并且,LSTMs在绝大多数的任务中已经取得了非常优异的成绩!

“那么,时代的下一个风口在哪?”

毫无疑问!Attention即将拉开下一个时代的序幕!让我们拭目以待吧!

ps:后续会持续更新Attention的基础以及Seq2Seq代码结构,以及对Transformer、BERT和ALBERT等论文的解读,大家如果觉得不错的话,点个赞👍哈。😁

References:

  1. https://colah.github.io/posts/2015-08-Understanding-LSTMs/
  2. http://people.idsia.ch/~juergen/SeppHochreiter1991ThesisAdvisorSchmidhuber.pdf
  3. http://ai.dinfo.unifi.it/paolo//ps/tnn-94-gradient.pdf
  4. https://arxiv.org/pdf/1503.04069.pdf
  5. http://proceedings.mlr.press/v37/jozefowicz15.pdf

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器

你可能感兴趣的文章