关于LSTMs的理解

前言

最近看了一些关于RNN及LSTMs网络的文章,因此,在这里记录一点笔记。主要参考了一篇英文的blog。我把原文的部分内容的翻译加上自己的理解写在下面,内容上有一定的删节和提炼。原文和完整的中文翻译的地址在下面。


英文原文 http://colah.github.io/posts/2015-08-Understanding-LSTMs/
以及对应的中文翻译 http://www.jianshu.com/p/9dc9f41f0b29
引文来自微信公众号机器之心的博文http://mp.weixin.qq.com/s/ORLpqqV8pOv-pIagi8yS1A

Recurrent Neural Networks

人类不是时刻凭空思考的,是具有持续性的。当读者阅读这篇文章时,对每一个单词的理解是建立在以前的单词之上的。
传统的神经网络是不能完成这个功能的,因为它们没有“记忆性”。
Recurrent Neural Networks (RNNs)可以完成这个功能。RNNs网络结构中有环路以使得信息可以传递下去。
关于LSTMs的理解
在上面的网络节点A中,输入为xt,输出为ht。一个环路结构使得信息可以从网络的一个阶段传递到下一个。
我们把上面的网络结构展开如下。一个RNN网络可以看作是同样记忆块的不断重复。每一个记忆块都把信息传到后面。这样的链状结构自然地表明RNNs适合处理序列和列表数据。

Long Short Term Memory (LSTMs) Networks

长期依赖问题(The Problem of Long-Term Dependencies)

RNNs可以记录之前的网络信息,但是范围是有限的。对于下图这种,当前信息和需要信息间隔较远的情况下(例如,ht+1需要x0x1的信息),RNNs网络就不能发挥作用。
关于LSTMs的理解

这个长期依赖问题被Hochreiter & Schmidhuber(1997)提出的LSTMs网络解决。

标准的RNNs模型

标准的RNN模型网络结构非常简单,每一个记忆块中只有一个tanh层。
关于LSTMs的理解

LSTMs的网络结构

LSTMs网络是设计用来解决长期依赖问题的。记住长期的信息是网络设计结构决定的。LSTMs的链状结构中的每一个记忆块有更复杂的设计,如下图。
关于LSTMs的理解

其中各种图标表示的含义如下图。粉色的圆点表示对应点的操作,比如向量相加;黄色的矩形表示网络层。
关于LSTMs的理解

LSTMs的工作原理

LSTMs的关键就是单元状态(cell state),就是下图中穿过框图顶部的黑色线。单元状态就像是传送带一样,穿过整条的网络链路,并且只与经过的节点有很少的线性的互动。信息可以很容易的在不加改变的情况下穿过这条通路。
LSTMs网络通过叫做门(gates)的结构来控制单元状态(记忆块状态)。门是由sigmoid层和点相称运算组成的。sigmoid层的输出在0到1之间。0表示不允许通过,1表示允许全部的信息通过。

LSTM单元一般会输出两个单元到下一个单元,即单元状态和隐藏状态。记忆块负责记忆各个隐藏状态或前面时间步的事件,这种记忆方式一般是通过三个门控机制实现,即输入门、遗忘门和输出门。

1. 遗忘门

LSTMs网络的第一步是决定哪些信息可以通过单元状态。这个决定是通过组成遗忘门的sigmod层决定的。遗忘门的输入是上一个记忆单元的隐藏状态ht1和当前单元的输入xt,输出为0到1的值,作用于单元状态Ct上。输出1表示让全部的信息通过,输出0表示不允许任何信息通过。
关于LSTMs的理解

2. 输入门
LSTMs网络的第二个步是决定哪些信息需要被存储的。这个过程是由输入门决定的。

输入门负责将信息添加到单元状态,这一添加信息的过程主要分为三个步骤。
- 通过 Sigmoid 函数来调节需要添加到单元状态的值,这与遗忘门非常相似,它起到的作用就是作为一个滤波器过滤来自ht1xt 的信息。
- 创建一个包含所有可能值的向量,它可以被添加到单元状态中。该过程通过使用 tanh 函数实现,输出值为-1 到 1.
- 将调节滤波器的值(Sigmoid 门控)乘以创建的向量(tanh 函数),然后将这些有用的信息添加到单元状态中。

在完成这三个步骤后,我们基本上确保了添加到单元状态的信息都是重要的,且不是冗余的。 关于LSTMs的理解

3. 输出门

在确定最终的输出之前,我们要先更新单元状态Ct。我们用计算出的遗忘门输出ft乘以上一个单元状态Ct1,然后与it×C~t相加。这样就得到了新的单元状态。
接下来,我们要决定最后的输出。
输出门的功能可再次分为三个步骤:

  • 把 tanh 函数应用到单元状态之后创建一个向量,从而将值缩放在-1 到+1 之间。
  • 使用 ht1xt 的值生成一个过滤器,以便它可以调节需要从上述创建的向量中输出的值。这个过滤器再次使用一个 sigmoid 函数。
  • 将此调节过滤器的值乘以在步骤 1 中创建的向量,并将其作为输出发送出去,并发送到下个单元的隐藏态。

关于LSTMs的理解

4. LSTM整体过程

以上我们具体了解了 LSTM 的各个部分,但读者可能对 LSTM 的整体过程仍然不是太了解,下面我们简要地向读者介绍 LSTM
单元选择记忆或遗忘的具体处理流程。

以下是 LSTM 单元的详细结构,其中 Z 为输入部分,ZiZoZf分别为控制三个门的值,即它们会通过**函数 f 对输入信息进行筛选。一般**函数可以选择为 Sigmoid 函数,因为它的输出值为 0
到 1,即表示这三个门被打开的程度。

关于LSTMs的理解

若我们输入Z,那么该输入向量通过**函数得到的 g(Z) 和输入门 f(Zi)的乘积g(Z)f(Zi)就表示输入数据经筛选后所保留的信息。Zf控制的遗忘门将控制以前记忆的信息到底需要保留多少,保留的记忆可以用方程 cfzf表示。以前保留的信息加上当前输入有意义的信息将会保留至下一个 LSTM 单元,即我们可以用c=g(Z)f(Zi)+cf(Zf) 表示更新的记忆,更新的记忆 c也表示前面与当前所保留的全部有用信息。我们再取这一更新记忆的**值 h(c)作为可能的输出,一般可以选择 tanh**函数。最后剩下的就是由 Zo所控制的输出门,它决定当前记忆所**的输出到底哪些是有用的。因此最终 LSTM 的输出就可以表示为 a=h(c)f(Zo)

LSTMs网络的一些变种

Gers & Schmidhuber (2000) add the “peephole connections”。
关于LSTMs的理解

Cho, et al. (2014), Gated Recurrent Unit (GRU)
关于LSTMs的理解

结语

写了将近一周,终于把这篇写完了。今天实验室电脑坏掉了,师兄说是我每日让它跑程序还不看着它导致的。

Jed’s PC : 让你每天让我跑程序还不看着人家,我死给你看。
Jed:sad~ ::>_<:: ~sad。

以上。