关于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网络结构中有环路以使得信息可以传递下去。
在上面的网络节点
我们把上面的网络结构展开如下。一个RNN网络可以看作是同样记忆块的不断重复。每一个记忆块都把信息传到后面。这样的链状结构自然地表明RNNs适合处理序列和列表数据。
Long Short Term Memory (LSTMs) Networks
长期依赖问题(The Problem of Long-Term Dependencies)
RNNs可以记录之前的网络信息,但是范围是有限的。对于下图这种,当前信息和需要信息间隔较远的情况下(例如,
这个长期依赖问题被Hochreiter & Schmidhuber(1997)提出的LSTMs网络解决。
标准的RNNs模型
标准的RNN模型网络结构非常简单,每一个记忆块中只有一个tanh层。
LSTMs的网络结构
LSTMs网络是设计用来解决长期依赖问题的。记住长期的信息是网络设计结构决定的。LSTMs的链状结构中的每一个记忆块有更复杂的设计,如下图。
其中各种图标表示的含义如下图。粉色的圆点表示对应点的操作,比如向量相加;黄色的矩形表示网络层。
LSTMs的工作原理
LSTMs的关键就是单元状态(cell state),就是下图中穿过框图顶部的黑色线。单元状态就像是传送带一样,穿过整条的网络链路,并且只与经过的节点有很少的线性的互动。信息可以很容易的在不加改变的情况下穿过这条通路。
LSTMs网络通过叫做门(gates)的结构来控制单元状态(记忆块状态)。门是由sigmoid层和点相称运算组成的。sigmoid层的输出在0到1之间。0表示不允许通过,1表示允许全部的信息通过。
LSTM单元一般会输出两个单元到下一个单元,即单元状态和隐藏状态。记忆块负责记忆各个隐藏状态或前面时间步的事件,这种记忆方式一般是通过三个门控机制实现,即输入门、遗忘门和输出门。
1. 遗忘门
LSTMs网络的第一步是决定哪些信息可以通过单元状态。这个决定是通过组成遗忘门的sigmod层决定的。遗忘门的输入是上一个记忆单元的隐藏状态
2. 输入门
LSTMs网络的第二个步是决定哪些信息需要被存储的。这个过程是由输入门决定的。
输入门负责将信息添加到单元状态,这一添加信息的过程主要分为三个步骤。
- 通过 Sigmoid 函数来调节需要添加到单元状态的值,这与遗忘门非常相似,它起到的作用就是作为一个滤波器过滤来自ht−1 和xt 的信息。
- 创建一个包含所有可能值的向量,它可以被添加到单元状态中。该过程通过使用 tanh 函数实现,输出值为-1 到 1.
- 将调节滤波器的值(Sigmoid 门控)乘以创建的向量(tanh 函数),然后将这些有用的信息添加到单元状态中。
在完成这三个步骤后,我们基本上确保了添加到单元状态的信息都是重要的,且不是冗余的。
3. 输出门
在确定最终的输出之前,我们要先更新单元状态
接下来,我们要决定最后的输出。
输出门的功能可再次分为三个步骤:
- 把 tanh 函数应用到单元状态之后创建一个向量,从而将值缩放在-1 到+1 之间。
- 使用
ht−1 和xt 的值生成一个过滤器,以便它可以调节需要从上述创建的向量中输出的值。这个过滤器再次使用一个 sigmoid 函数。- 将此调节过滤器的值乘以在步骤 1 中创建的向量,并将其作为输出发送出去,并发送到下个单元的隐藏态。
4. LSTM整体过程
以上我们具体了解了 LSTM 的各个部分,但读者可能对 LSTM 的整体过程仍然不是太了解,下面我们简要地向读者介绍 LSTM
单元选择记忆或遗忘的具体处理流程。以下是 LSTM 单元的详细结构,其中
Z 为输入部分,Zi 、Zo 和Zf 分别为控制三个门的值,即它们会通过**函数f 对输入信息进行筛选。一般**函数可以选择为 Sigmoid 函数,因为它的输出值为 0
到 1,即表示这三个门被打开的程度。
若我们输入
Z ,那么该输入向量通过**函数得到的g(Z) 和输入门f(Zi) 的乘积g(Z)f(Zi) 就表示输入数据经筛选后所保留的信息。Zf 控制的遗忘门将控制以前记忆的信息到底需要保留多少,保留的记忆可以用方程c∗f(zf) 表示。以前保留的信息加上当前输入有意义的信息将会保留至下一个 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”。
Cho, et al. (2014), Gated Recurrent Unit (GRU)
结语
写了将近一周,终于把这篇写完了。今天实验室电脑坏掉了,师兄说是我每日让它跑程序还不看着它导致的。
Jed’s PC : 让你每天让我跑程序还不看着人家,我死给你看。
Jed:sad~ ::>_<:: ~sad。
以上。