如果你对深度学习稍有些研究的话,相信你一定听说过 LSTM,AI 科技评论此前也编译过 LSTM 之父 Jürgen Schmidhuber 的访谈文章,他与 Sepp Hochreiter 在 1997 年发表的一篇论文中提出了 LSTM 的概念。
LSTM 能够提升神经网络接受输入信息及训练数据的记忆机制,让输出结果得到大幅度的提升。虽然因为当时的硬件限制不那么广为人知,但近年来包括谷歌在内的一系列公司都开始在深度学习中采用 LSTM。
那么 LSTM 到底是什么呢?AI 科技评论今天介绍的这篇文章出自 Google Brain 科学家 Christopher Olah 的博客,AI 科技评论在原文的基础上加入了一些自己的理解,尽量保证这是最简单的入门介绍了,看不懂的话欢迎关注「AI 科技评论」私聊。
在开始 LSTM 的入门前,别急,让我们先了解一下 RNN。如果你有一定的基础,雷锋网建议你直接跳过这一部分。
首先,人们在思考问题的时候,并不会从零开始,而是会凭借自己以往的一些经验与记忆做出判断。最简单的例子,就是你现在正在阅读的过程中,你不会孤立地理解所读的每一个词,而会结合前面所看到的词来理解意义。也就是说,你的思考具备连续性。
传统的神经网络可做不到这一点,而且这俨然是它的一个短板。举个例子,你想要对一部电影里的每个镜头进行分类,判断荧幕上都在演些什么。但是,传统神经网络可能只能孤立地看待每一帧,而无法把上一个镜头串联起下一秒发生的事情。
RNN(循环神经网络)就是为解决这个问题而生的,顾名思义,也就是能够让信息在网络中再次循环的网络。
含有「环」(loop)的循环神经网络
上图是 RNN 的一部分,A 的输入是 xt , 输出为值 ht. 这个循环能够让信息从神经网络中的一步传递到下一步。
这些环看起来让 RNN 变得有些难理解。但是,如果你再想一下,其实它与传统神经网络类似,只不过是把同一个网络多次复制,并将信息传递到下一个网络。如果将这个循环拆开,就能比较容易地理解了:
一个展开的 RNN
像链条一样的网络实际上也体现出 RNN 的一个特点:它与序列或列表有着紧密的联系,而它们是处理此类数据的重要架构(简直就是量身定制的一样!)。
而更重要的是,它们确实得以顺利应用。在过去的几年时间中,RNN 被成功应用于解决各种问题:语音识别、语言建模、机器翻译、为图像起标题等……而且它的应用领域还在不断扩展。它到底有多牛?我就不在这里赘述了。
这些成功的关键在于它们使用了 LSTM。LSTM 是 RNN 的一种特殊形式,而它的普适性比起传统的 RNN 要好得多。几乎所有激动人心的发现都是在 LSTM 上实现的,而这也是雷锋网在接下来的篇幅中所要讨论的内容。
RNN 的一大魅力在于它能够将此前的信息结合到当前的任务中,比如像我们刚才提及的电影例子一样,利用此前的帧信息理解当前的内容。如果 RNN 能实现这一点,那诚然非常有效。但事实是否如愿?不一定。
有时,我们只需要利用近期信息来处理当前任务。比如在一个语言模型中,如果我们尝试根据几个单词来预测下一个单词,像我们要猜出「the clouds are in the _____」,但是因为句义已经非常明显,我们不需要更多的上下文。在这种情况下,相关信息所隔的距离并不远,因此 RNN 能够学会使用此前的信息。
但是,就像我们做完型填空时,可能需要整合全文来填某一个句子,比如「I grew up in France….(此处省略一万字)I speak fluent _ .」。如果网络只知道邻近的几个单词,可能它会知道此处需要填写一门语言,但至于应该填什么,就需要找到更远前的信息,直到 找到 France 才行。这种需要寻找相距很远信息的情况,实际上非常常见。
而糟糕的是,距离增加时,RNN 能将相关信息串联起来的能力也就越弱。正如雷锋网云,世界上最遥远的距离不是生与死,而是明明在同一个段落里,却找不到相关联的词语。
理论上,RNN 是能够处理这种「遥远」的问题的。我们能够人为地挑选出一些参数,解决依赖问题中较为简单的任务。不过在实践中,RNN 并不能自主地处理这些任务。这个问题 Hochreiter (1991) [German] 与 Bengio, et al. (1994) 已经进行过探讨并找到了相关方法。
幸运的是,LSTM 不存在这个问题。
长短期记忆网络——通常也被简称为 LSTMs——是一种特殊类型的 RNN,能够学习长期的依赖关系。这个网络就像雷锋网所说的,由 Sepp Hochreiter 和 Jürgen Schmidhuber 在 1997 年提出,并加以完善与普及,LSTM 在各类任务上表现良好,因此也被广泛使用。
LSTM 就是为了解决长期依赖问题而生,也就是说,对信息的长期记忆是它们的自发行为,而不是刻意去学习的。
所有的 RNN 都具备重复性的链条形式,而在标准的 RNN 中,这个重复模式都有着一个简单的结构,比如单层的 tanh 层。
标准 RNN 的重复模块里都有一个单层网络
LSTM 也有这种结构化的链条,但重复性模块有着不同的结构。与 RNN 不同的是,LSTM 中有一个四层的网络,并以一种特殊的方式进行交互。
LSTM 网络的重复模块包含一个四层的交互网络
然而我们并不需要在意这些细节。接下来,请和雷锋网一起对 LSTM 图进行一步步的梳理。现在,让我们一起熟悉下接下来会用到的一些符号。
在上面所示的图中,
黄块表示神经网络层;
粉圈代表按位操作(pointwise operations),如向量加法;
每条线代表着一整个向量(vector),用来表示从一个节点的输出到另一个节点的输入;
合并的线代表连接(concatenate);
分叉的线表示复制(copy)。
LSTMs 的核心所在是 cell 的状态(cell state),也就是下图这条向右的线。
Cell 的状态就像是传送带,它的状态会沿着整条链条传送,而只有少数地方有一些线性交互。信息如果以这样的方式传递,实际上会保持不变。
LSTM 通过一种名为「门」(gate)的结构控制 cell 的状态,并向其中删减或增加信息。
雷锋网注:你可以把门理解为一种控制信息通过的方式。门由一个 sigmoid 网络层与一个按位乘操作构成。
Sigmoid 层的输出值在 0 到 1 间,表示每个部分所通过的信息。0 表示「对所有信息关上大门」;1 表示「我家大门常打开」。
一个 LSTM 有三个这样的门,控制 cell 的状态。
首先,LSTM 的第一步需要决定我们需要从 cell 中抛弃哪些信息。这个决定是从 sigmoid 中的「遗忘层」来实现的。它的输入是 ht-1 和 xt,输出为一个 0 到 1 之间的数。Ct−1 就是每个在 cell 中所有在 0 和 1 之间的数值,就像我们刚刚所说的,0 代表全抛弃,1 代表全保留。
再拿刚才预测单词的语言模型来举例,cell 的状态可能会需要考虑主语的性别,这样才能找到正确的代词。因此如果我们设定,如果看到了一个新的主语,就「忘记」旧的主语所代表的性别。
下一步,我们需要决定什么样的信息应该被存储起来。这个过程主要分两步。首先是 sigmoid 层(输入门)决定我们需要更新哪些值;随后,tanh 层生成了一个新的候选向量 C`,它能够加入状态中。
最后,我们将这两个值结合起来,并更新 cell 的状态。
在 AI 科技评论方才提及的这个例子中,我们需要将新主语的性别信息加入 cell 的状态中,以替换要忘记的旧信息。
接下来,我们就可以更新 cell 的状态了。将旧状态与 ft 相乘,忘记此前我们想要忘记的内容,然后加上 C`。得到的结果便是新的候选值,依照我们决定的值进行缩放。
在这个语言模型中,这个过程就实现了我们所设想的目标:遇到一个新主语时,就忘记旧语言的性别。
最后,我们需要确定输出的内容。这个输出内容取决于我们的 cell 状态,但这是一个经过过滤的版本。
首先,我们会运行一个 sigmoid 层决定 cell 状态输出哪一部分。
随后,我们把 cell 状态通过 tanh 函数,将输出值保持在-1 到 1 间。
之后,我们再乘以 sigmoid 门的输出值,就可以得到结果了。
对于语言模型的例子,当它只看到一个主语时,就可能会输出与动词相关的信息。比如它会输出主语是单数还是复数。这样的话,如果后面真的出现了动词,我们就可以确定它的形式了。
目前我所提及的 LSTM,只是最最基本的形式,并不是所有的 LSTM 长得都一样一样的。实际上,所有提及 LSTM 的论文都有着小小的改动,这些改进虽然并不明显,但值得在这里一提。
时尚时尚最时尚的 LSTM 变体就是 Gers & Schmidhuber (2000) 提出的「猫眼连接」(peephole connections)的神经网络,也就是说,门连接层能够接收到 cell 的状态。
上图展示了全加上「猫眼」的效果,但实际上论文中并不会加这么多啦。
另一种变体就是采用一对门,分别叫遗忘门(forget)及输入门(input)。与分开决定遗忘及输入的内容不同,现在的变体会将这两个流程一同实现。我们只有在将要输入新信息时才会遗忘,而也只会在忘记信息的同时才会有新的信息输入。
一个比较惹眼的变体为 GRU(Gated Recurrent),由 Cho, et al. (2014) 提出。他将遗忘门与输入门结合在一起,名为「更新门」(update gate),并将 cell 状态与隐藏层状态合并在一起,此外还有一些小的改动。这个模型比起标准 LSTM 模型简单一些,因此也变得更加流行了。
当然,这里所列举的只是一管窥豹,还有很多其它的变体,比如 Yao, et al. (2015) 提出的 Depth Gated RNNs;或是另辟蹊径处理长期依赖问题的 Clockwork RNNs,由 Koutnik, et al. (2014) 提出。
哪个是最好的呢?而这些变化是否真的意义深远?Greff, et al. (2015) 曾经对比较流行的几种变种做过对比,发现它们基本上都差不多;而 Jozefowicz, et al. (2015) 测试了超过一万种 RNN 结构,发现有一些能够在特定任务上超过 LSTMs。
早些时候,我曾经提及很多人用 RNN 取得重要进步,而这些都是基于 LSTM 的网络。它们的确在大多数任务上表现颇佳!
前文贴出了好多公式呀,概念呀,算法呀,搞得 LSTM 好像有点吓人。但是呢,我们希望一步步的解读能让 LSTM 于你而言,不再是一头雾水的一个概念,让它变得更加有人味一些。
LSTM 对于 RNN 来说是一个大的进步。在有了 LSTMs 后,越来越多的任务都可用 RNN 来解决了。那么自然地,我们会想:是否还会有下一个 LSTM 式的飞跃呢?学界普遍的一个答案是,会的!下一步就是 attention 了。Attention 是什么?也就是说,从 RNN 的每一步中提取信息,并形成一个更大的信息集合。比如使用 RNN 产生能描述图片的标题时,它可能只选择图片的一部分进行关注。实际上,Xu, et al. (2015) 就是这样做的——这可能会成为你探索 attention 算法的一个切入口。目前采用 attention 的研究也已经取得了不少进展,可能已经走到了飞跃的十字路口吧……
除了 attention,RNN 领域中还有其它的研究方向,比如 Kalchbrenner, et al. (2015) 的 Grid LSTMs 前景不错,而生成模型中的 RNN 同样也令人印象深刻:比如 Gregor, et al. (2015)、 Chung, et al. (2015) 或是 Bayer & Osendorfer (2015) 的论文。
过去几年间,RNN 可谓是深度学习的宠儿,我也同样相信接下来的数年也会是这样。
【本文来自Google Brain 科学家 Christopher Olah 的博客】