LSTM即Long Short Term Memory networks
,是一种特殊的RNN网络,可以学习长周期的依赖。一个包含单tanh层的标准RNN网络如下:
LSTM也有一个类似结构的链条,但却有四层
LSTM核心理念
LSTMs的关键是cell state
,即下图中的水平线。
信息可以很方便地不做改变地在这条线上流动,当然也可以在这些旁路作用下改变状态。门是一种选择性地让信息通过的方法,由一个sigmoid层和一个点乘操作组成。
sigmoid层输出的是一个0到1的数字,表示的是每个内容通过的概率。0即所有都不通过,1即所有都通过。
LSTM逐步讲解
C1
LSTM的第一步就是决定从cell state
中抛出什么信息,这个决定由一个叫forget gate layer
的sigmoid层做出,它根据 ht-1 和 xt 为cell state Ct-1 中的每个数输出一个介于0到1的数。1代表全通过,0代表全不通过。
以根据前面的词语判断下一个词为例。在这个问题中,cell state可能包含当前对象的性别,所以正确的代词才能够被使用(he, she之类的)。当我们见到一个新对象时,老对象就应该被忘记。
第二步是决定我们想在cell state中存储什么新信息。这包含两个方面,一是称为input gate layer
的sigmoid层决定了我们要更新哪些值。二是tanh层产生了一个候选值向量,它被添加到state中。下一步中,我们将结合这两方面,向state中写入更新。
在这个语言模型例子中,我们想向cell state中添加新对象的性别,以替换我们想忘记的老对象的性别。
现在是时候把老的cell state Ct-1 更新成新的cell state Ct ,之前的步骤已经决定了要做什么,我们只需要去实行。
用 ft 去乘老状态,忽略掉我们之前决定忽略的东西。然后加上 it * 。这就是新的候选值,按我们想要更新状态值的意愿大小去缩放。
在这个语言模型中,这里就是我们要扔掉旧对象性别信息,添加新信息的地方。
最后,我们要决定打算输出什么信息。这个输出要基于我们的cell state,但是会是一个过滤后的版本。首先,我们要运行一个决定输出哪部分cell state的sigmoid层。然后,我们让cell state通过tanh层(让值变为-1和1之间),并且让它与sigmoid门相乘。这样我们就可以输出我们想输出的那部分。
对于这个语言模型,既然它看见了一个对象,它或许想要输出关于动词的信息。以防那就是接下来的东西。例如,它或许要输出这个对象是单数还是复数。
Long Short Term Memory的变异
以上描述的都是一个正常的LSTM,但并不是所有LSTMs都是像上面那样的。事实上,看起来几乎所有包含LSTMs的论文都用的是略有不同的版本。差异很小,但还是有必要提几个。
一个流行的LSTM异型添加了peephole connections
,这意味着sigmoid门输入考虑到了cell state。
上图对所有门添加了窥视孔(peephole),但很多论文只是添加了一部分。
另一个异型使用了耦合遗忘和输入门。不同于独立地决定去遗忘什么、添加什么,我们同时做 这些决定。只在打算输入信息时遗忘,只在遗忘老信息时向状态中输入新信息。
另一个戏剧性的LSTM异型是GRU(Gated Recurrent Unit)。它将遗忘和输入门合并称为一个单独的update gate
。它也合并了cell state和hidden state,并且做了一些其他的改变,创造了比标准LSTM更简单的模型,正在变得越来越流行。
这只是一部分,其实还有很多。Greff, et al. (2015)对流行的异型做了比较,发现基本都差不多。Jozefowicz, et al. (2015)测试了超过一万种RNN网络,发现在特定任务上有些做的更好。
附录
tanh
双曲函数中的一个,tanh()为双曲正切。定义域:R,值域:(-1,1)。y=tanh x是一个奇函数,其函数图像为过原点并且穿越Ⅰ、Ⅲ象限的严格单调递增曲线,其图像被限制在两水平渐近线y=1和y=-1之间。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。