Attention and Augmented Recurrent Neural Networks

循环神经网络是深度学习的重要组成部分之一,使神经网络能够处理诸如文本、音频和视频等序列数据。它们可以用于将一个序列归结为高级理解,对序列进行注释,甚至从头生成新的序列!

rnn x0 y0 x1 y1 x2 y2 x3 y3 One cell... can be used over... and over... and over... x4 y4 again.

基本的RNN设计在处理较长序列时会遇到困难,但一种特殊的变体——“长短期记忆”网络 [1]——甚至可以处理这些。研究发现,这种模型非常强大,在包括翻译、语音识别和图像字幕生成在内的许多任务中取得了显著成果。因此,循环神经网络在过去几年中变得非常普遍。

随着这一现象的发展,我们看到越来越多的尝试在RNNs中增加新的特性。有四个方向特别令人兴奋:

Neural Turing Machines 有可以读写的外部存储器。
Attentional Interfaces 允许RNNs专注于其输入的部分。
Adaptive Computation Time 允许每步有不同的计算量。
Neural Programmers 可以调用函数,随着运行构建程序。

单独来看,这些技术都是RNNs的强大扩展,但真正引人注目的是它们可以结合使用,似乎只是更广泛空间中的一些点。此外,它们都依赖于同一个基础技巧——称为注意力——来工作。

我们猜测,这些“增强RNNs”将在未来几年中在扩展深度学习能力方面发挥重要作用。


Neural Turing Machines

神经图灵机 [2] 将RNN与外部存储库结合起来。由于向量是神经网络的自然语言,存储器是向量数组:

rnn 内存是一个向量数组。 网络A 在每一步从这个内存中读取和写入。 x0 y0 x1 y1 x2 y2 x3 y3

但是读写是如何工作的呢?挑战在于我们希望它们是可微分的。特别是,我们希望它们对我们读取或写入的位置是可微分的,以便我们可以学习在哪里读取和写入。这很棘手,因为内存地址似乎从根本上是离散的。NTMs对此采取了一种非常巧妙的解决方案:每一步,它们在各处读取和写入,只是程度不同。

例如,我们专注于读取。RNN不会指定一个单一的位置,而是输出一个“注意力分布”,描述我们如何分配对不同内存位置的关注量。因此,读取操作的结果是加权和。

rnn attention memory RNN给出一个注意力分布 描述我们如何在不同内存位置 分配我们关心的量。 读取结果是加权和。

同样地,我们在不同程度上同时写入各处。再次,注意力分布描述了我们在每个位置写入的量。我们通过将内存中某位置的新值设为旧内存内容和写入值的凸组合来实现这一点,位置的选择由注意力权重决定。

rnn attention old memory new memory write value RNN给出一个注意力分布,描述我们应该如何将每个内存位置调整为写入值。 我们不是写入一个位置,而是在各处写入,只是程度不同。

但是,NTMs如何决定在内存中将注意力集中在哪些位置呢?它们实际上使用了两种不同方法的组合:基于内容的注意力和基于位置的注意力。基于内容的注意力允许NTMs在内存中搜索并集中在与它们正在寻找的内容相匹配的位置,而基于位置的注意力则允许在内存中进行相对移动,使NTM能够循环。

rnn 首先,控制器给出一个查询 向量,每个内存条目与查询进行相似度评分。 然后,使用softmax将评分 转换为分布。 接下来,我们对上一时间步的注意力进行插值。 我们用一个位移滤波器对注意力进行卷积——这允许控制器移动它的焦点。 最后,我们对注意力分布进行锐化。最终的注意力 分布被送入读取或写入操作。 RNN给出一个注意力分布,描述我们应该如何将每个内存位置调整为写入值。 内存 蓝色表示高相似度,粉色表示高差异性。 插值量 位移滤波器 RNN控制器 注意力机制 查询向量 来自上一时间步的注意力 新的注意力分布

这种读写能力使NTMs能够执行许多之前神经网络无法实现的简单算法。例如,它们可以学会将一个长序列存储在内存中,然后循环读取,反复重复。当它们这样做时,我们可以观察它们的读写位置,以更好地理解它们在做什么:

查看更多实验请参见 [3]。此图基于重复复制实验。

它们还可以学习模拟查找表,甚至学习排序数字(虽然它们有点作弊)!另一方面,它们仍然不能做许多基本的事情,比如加法或乘法。

自原始NTM论文以来,已经有一些令人兴奋的论文探索了类似的方向。神经GPU [4] 克服了NTM在加法和乘法方面的不足。 Zaremba & Sutskever [5] 使用强化学习训练NTMs,而不是原始论文中使用的可微分读写操作。神经随机访问机器 [6] 基于指针工作。一些论文探讨了可微分的数据结构,如栈和队列 [7, 8]。还有记忆网络 [9, 10] 是解决类似问题的另一种方法。

在某些客观意义上,这些模型能够执行的许多任务——例如学习如何加法——并不算特别困难。传统的程序合成社区可以轻松应对。但神经网络能够做很多其他事情,像神经图灵机这样的模型似乎打破了它们能力的一个非常深刻的限制。

代码

有许多开源实现这些模型的代码。神经图灵机的开源实现包括 Taehoon Kim的(TensorFlow)、Shawn Tan的(Theano)、Fumin的(Go)、Kai Sheng Tai的(Torch)和 Snip的(Lasagne)。神经GPU出版物的代码已开源并放在 TensorFlow Models库中。记忆网络的开源实现包括 Facebook的(Torch/Matlab)、YerevaNN的(Theano)和 Taehoon Kim的(TensorFlow)。


注意力接口

当我翻译一个句子时,我特别注意我正在翻译的词。当我转录一个音频录音时,我仔细听我正在书写的段落。如果你让我描述我坐的房间,我会在描述时环顾四周。

神经网络可以使用 注意力 实现相同的行为,集中在它们所给信息的一个子集的部分。例如,一个RNN可以关注另一个RNN的输出。在每个时间步骤,它专注于另一个RNN中的不同位置。

我们希望注意力是可微分的,以便我们可以学习在哪里集中。为此,我们使用神经图灵机所使用的相同技巧:我们在各处集中,只是程度不同。

rnn 网络B在每一步集中于网络A的不同 信息。

注意力分布通常是通过基于内容的注意力生成的。注意的RNN生成一个查询,描述它想要关注的内容。每个项目与查询进行点积运算,产生一个分数,描述它与查询的匹配程度。这些分数会被输入到softmax中,生成注意力分布。

rnn 注意的RNN生成一个描述它想要关注的内容的查询。 每个项目与查询进行点积运算,产生一个分数,描述它与查询的匹配程度。分数会被输入到softmax中生成注意力分布。

RNN之间使用注意力的一个常见的例子是翻译 [11]。传统的序列到序列模型必须将整个输入压缩成一个单一的向量,然后再将其展开。注意力通过允许处理输入的RNN传递有关每个单词的信息,并让生成输出的RNN在单词变得相关时进行关注,从而避免了这个问题。

Diagram derived from Fig. 3 of Bahdanau, et al. 2014

这种RNN之间的注意力还有许多其他应用。例如,它可以用于语音识别 [12],使一个RNN处理音频,然后让另一个RNN在生成转录时浏览音频,关注相关部分。

output text network B network A input audio
Figure derived from Chan, et al. 2015

这种注意力的其他应用包括文本解析 [13],它允许模型在生成解析树时查看单词,以及对话建模 [14],它使模型在生成回应时能够关注对话的先前部分。

注意力也可以用于卷积神经网络(CNN)和RNN之间的接口。这使得RNN能够在每一步查看图像的不同位置。一种流行的应用是图像描述生成。首先,卷积网络处理图像,提取高层次的特征。然后RNN运行,生成图像的描述。在生成描述中的每个词时,RNN会关注卷积网络对图像相关部分的解释。我们可以明确地可视化这一过程:

Figure from [3]

更广泛地说,注意力接口可以用于任何需要与具有重复结构输出的神经网络进行接口的场景。

注意力接口被发现是一种非常通用和强大的技术,正变得越来越普及。


自适应计算时间

标准的RNN在每个时间步都进行相同量的计算。这似乎不太直观。显然,当情况困难时,人们应该更多地思考?这也限制了RNN在长度为n的列表上进行 O(n) 操作。

自适应计算时间 [15] 是一种让RNN在每个时间步进行不同数量计算的方法。总体思路很简单:允许RNN在每个时间步执行多个计算步骤。

为了使网络能够学习执行多少步骤,我们希望步骤数量是可微的。我们通过之前使用的相同技巧来实现这一点:我们不是决定运行固定数量的步骤,而是对需要运行的步骤数量使用注意力分布。输出是每个步骤输出的加权组合。

rnn 对于每个时间步,RNN 可以进行多个计算步骤。 输出是计算步骤输出的加权组合。 这个过程在每个时间步重复。 一个特殊的标志位被设置,以标记第一次计算步骤。

还有一些细节在之前的图中被省略了。这是一个包含三个计算步骤的时间步的完整图示。

rnn

这有点复杂,所以我们一步一步来分析。从高层次来看,我们仍然是在运行RNN,并输出状态的加权组合:

rnn

每一步的权重由一个“停止神经元”决定。它是一个sigmoid神经元,查看RNN状态并给出一个停止权重,我们可以将其视为在该步骤停止的概率。

rnn halting neuron

```html

我们为停止权重总共分配了1的预算,因此我们在顶部跟踪该预算。当它小于epsilon时,我们停止。

```

rnn

当我们停止时,可能会有一些剩余的停止预算,因为我们是在预算小于epsilon时停止的。那么我们应该怎么处理这些剩余的预算呢?从技术上讲,这些预算被分配给了未来的步骤,但我们不想计算这些步骤,因此我们将其归属到最后一步。

rnn

在训练自适应计算时间模型时,会在成本函数中添加一个“思考成本”项。这项成本会惩罚模型所使用的计算量。你增加这个项的值,模型将更倾向于在牺牲性能的情况下减少计算时间。

自适应计算时间是一个非常新的想法,但我们相信,它以及类似的想法将会变得非常重要。

代码

目前唯一的开源自适应计算时间实现似乎是 Mark Neumann’s (TensorFlow)。


Neural Programmer

神经网络在许多任务上表现出色,但在一些基本任务如算术运算上却表现不佳,这在传统计算方法中是微不足道的。能够将神经网络与传统编程结合起来,获得两者的优点,将是非常有用的。

神经程序员 [16] 是一种方法。它学习生成程序以解决任务。事实上,它学习生成这样的程序 而不需要正确程序的示例。它发现如何生成程序作为完成某项任务的手段。

论文中的实际模型通过生成类似SQL的程序来查询表格,从而回答有关表格的问题。然而,这里有一些细节使得这个模型有点复杂,所以我们先从一个稍微简单的模型开始:给定一个算术表达式并生成一个程序来计算它。

生成的程序是一系列操作。每个操作被定义为对过去操作的输出进行操作。所以一个操作可能是“将2步前的操作输出与1步前的操作输出相加”。这更像是Unix管道,而不是一个具有变量分配和读取的程序。

rnn

程序由一个控制器RNN一次生成一个操作。每一步,控制器RNN 输出一个概率分布,用于决定下一个操作是什么。例如,我们可能在第一步时比较确定要执行加法,然后在第二步时很难决定是乘法还是除法,以此类推……

rnn 在每一步,控制器RNN 输出一个概率分布。

生成的操作分布现在可以被评估。我们不再在每一步运行单个操作,而是使用通常的注意力技巧,运行所有操作,然后将输出加权平均在一起,权重由我们运行该操作的概率决定。

rnn 在每一步,控制RNN输出一个概率分布。 我们运行所有操作,并将输出加权平均在一起。

```html

只要我们能通过操作定义导数,程序的输出就可以相对于概率进行微分。然后我们可以定义一个损失函数,训练神经网络生成能够给出正确答案的程序。通过这种方式,神经程序员可以在没有正确程序示例的情况下学习生成程序。唯一的监督就是程序应该产生的答案。

这就是神经程序员的核心思想,但论文中的版本回答了关于表格的问题,而不是算术表达式。这里有一些额外的有趣技巧:

神经程序员并不是唯一一种让神经网络生成程序的方法。另一种有趣的方法是神经程序员-解释器 [18],它可以完成许多非常有趣的任务,但需要正确程序的监督。

我们认为这个通用领域,即弥合传统编程和神经网络之间的差距,是非常重要的。虽然神经程序员显然不是最终解决方案,但我们认为它提供了许多重要的经验教训。

代码

最近的神经程序员版本用于 问答,其作者已经开源,并作为 TensorFlow模型提供。还有一个由 Ken Morishita(Keras)实现的神经程序员-解释器。


宏观视角

一个拥有纸张的人,在某种意义上,比没有纸张的人要聪明得多。一个拥有数学符号的人可以解决他们否则无法解决的问题。计算机的访问使我们能够完成本来超出我们能力的惊人壮举。

通常,许多有趣的智能形式都是人类的创造性启发直觉与某种更精确和小心的媒介(如语言或方程式)之间的互动。有时,这种媒介是物理存在的,能够为我们存储信息、防止我们犯错误或进行计算密集的工作。在其他情况下,媒介是我们头脑中的模型,我们对其进行操作。无论哪种方式,它似乎都对智能至关重要。

最近的机器学习结果开始具有这种特点,将神经网络的直觉与其他东西结合起来。一种方法是可以称之为“启发式搜索”。例如,AlphaGo [19]拥有一个关于围棋的模型,并通过神经网络直觉探索游戏的可能走法。类似地,DeepMath [20] 使用神经网络作为操纵数学表达式的直觉。我们在本文中讨论的“增强RNN”是一种方法,我们将RNN连接到工程化的媒介,以扩展其通用能力。

与媒介的互动自然涉及一系列动作、观察和更多动作。这带来了一个主要挑战:我们如何学习采取哪些行动?这听起来像是一个强化学习问题,我们当然可以采取这种方法。但强化学习文献确实解决了这个问题的最困难版本,其解决方案很难使用。注意力的奇妙之处在于,它通过部分采取所有动作来为我们提供一个更简单的解决办法。这是因为我们可以设计媒介——比如NTM内存——以允许分数动作并且可微分。强化学习要求我们选择一条路径,并尝试从中学习。注意力在分叉处采取每个方向,然后将路径重新合并在一起。

注意力的一个主要弱点是我们必须在每一步都采取每个“动作”。这导致计算成本随着诸如增加神经图灵机内存的操作而线性增长。你可以想象做的事情是让你的注意力变得稀疏,这样你只需触及一些记忆。然而,这仍然很具挑战性,因为你可能想要让你的注意力依赖于记忆的内容,而这会迫使你逐一查看每个记忆。我们已经看到一些初步尝试解决这个问题,例如 [21],但似乎还有很多工作要做。如果我们真的能使这种子线性时间的注意力有效,那将是非常强大的!

增强的递归神经网络及其背后的注意力技术非常令人兴奋。我们期待看到接下来会发生什么!

```

Acknowledgments

Thank you to Maithra Raghu, Dario Amodei, Cassandra Xia, Luke Vilnis, Anna Goldie, Jesse Engel, Dan Mané, Natasha Jaques, Emma Pierson and Ian Goodfellow for their feedback and encouragement. We’re also very grateful to our team, Google Brain, for being extremely supportive of our project.

References

  1. Understanding LSTM Networks[link]
    Olah, C., 2015.
  2. Neural Turing Machines[PDF]
    Graves, A., Wayne, G. and Danihelka, I., 2014. CoRR, Vol abs/1410.5401.
  3. Show, attend and tell: Neural image caption generation with visual attention
    Xu, K., Ba, J., Kiros, R., Cho, K., Courville, A., Salakhutdinov, R., Zemel, R.S. and Bengio, Y., 2015. arXiv preprint arXiv:1502.03044, Vol 2(3), pp. 5. CoRR.
  4. Neural GPUs Learn Algorithms[PDF]
    Kaiser, L. and Sutskever, I., 2015. CoRR, Vol abs/1511.08228.
  5. Reinforcement Learning Neural Turing Machines[PDF]
    Zaremba, W. and Sutskever, I., 2015. CoRR, Vol abs/1505.00521.
  6. Neural Random-Access Machines[PDF]
    Kurach, K., Andrychowicz, M. and Sutskever, I., 2015. CoRR, Vol abs/1511.06392.
  7. Learning to Transduce with Unbounded Memory[PDF]
    Grefenstette, E., Hermann, K.M., Suleyman, M. and Blunsom, P., 2015. Advances in Neural Information Processing Systems 28, pp. 1828—1836. Curran Associates, Inc.
  8. Inferring Algorithmic Patterns with Stack-Augmented Recurrent Nets[PDF]
    Joulin, A. and Mikolov, T., 2015. Advances in Neural Information Processing Systems 28, pp. 190—198. Curran Associates, Inc.
  9. Memory Networks[PDF]
    Weston, J., Chopra, S. and Bordes, A., 2014. CoRR, Vol abs/1410.3916.
  10. Ask Me Anything: Dynamic Memory Networks for Natural Language Processing[PDF]
    Kumar, A., Irsoy, O., Su, J., Bradbury, J., English, R., Pierce, B., Ondruska, P., Gulrajani, I. and Socher, R., 2015. CoRR, Vol abs/1506.07285.
  11. Neural machine translation by jointly learning to align and translate
    Bahdanau, D., Cho, K. and Bengio, Y., 2014. arXiv preprint arXiv:1409.0473.
  12. Listen, Attend and Spell[PDF]
    Chan, W., Jaitly, N., Le, Q.V. and Vinyals, O., 2015. CoRR, Vol abs/1508.01211.
  13. Grammar as a foreign language
    Vinyals, O., Kaiser, L., Koo, T., Petrov, S., Sutskever, I. and Hinton, G., 2015. Advances in Neural Information Processing Systems, pp. 2773—2781.
  14. A Neural Conversational Model[PDF]
    Vinyals, O. and Le, Q.V., 2015. CoRR, Vol abs/1506.05869.
  15. Adaptive Computation Time for Recurrent Neural Networks[PDF]
    Graves, A., 2016. CoRR, Vol abs/1603.08983.
  16. Neural Programmer: Inducing Latent Programs with Gradient Descent[PDF]
    Neelakantan, A., Le, Q.V. and Sutskever, I., 2015. CoRR, Vol abs/1511.04834.
  17. Pointer networks
    Vinyals, O., Fortunato, M. and Jaitly, N., 2015. Advances in Neural Information Processing Systems, pp. 2692—2700.
  18. Neural Programmer-Interpreters[PDF]
    Reed, S.E. and Freitas, N.d., 2015. CoRR, Vol abs/1511.06279.
  19. Mastering the game of Go with deep neural networks and tree search[link]
    Silver, D., Huang, A., Maddison, C.J., Guez, A., Sifre, L., Driessche, G.v.d., Schrittwieser, J., Antonoglou, I., Panneershelvam, V., Lanctot, M., Dieleman, S., Grewe, D., Nham, J., Kalchbrenner, N., Sutskever, I., Lillicrap, T., Leach, M., Kavukcuoglu, K., Graepel, T. and Hassabis, D., 2016. Nature, Vol 529(7587), pp. 484—489. Nature Publishing Group. DOI: 10.1038/nature16961
  20. DeepMath - Deep Sequence Models for Premise Selection[PDF]
    Alemi, A.A., Chollet, F., Irving, G., Szegedy, C. and Urban, J., 2016. CoRR, Vol abs/1606.04442.
  21. Learning Efficient Algorithms with Hierarchical Attentive Memory[PDF]
    Andrychowicz, M. and Kurach, K., 2016. CoRR, Vol abs/1602.03218.

Updates and Corrections

View all changes to this article since it was first published. If you see a mistake or want to suggest a change, please create an issue on GitHub.

Citations and Reuse

Diagrams and text are licensed under Creative Commons Attribution CC-BY 2.0, unless noted otherwise, with the source available on GitHub. The figures that have been reused from other sources don't fall under this license and can be recognized by a note in their caption: “Figure from …”.

For attribution in academic contexts, please cite this work as

Olah & Carter, "Attention and Augmented Recurrent Neural Networks", Distill, 2016. http://doi.org/10.23915/distill.00001

BibTeX citation

@article{olah2016attention,
  author = {Olah, Chris and Carter, Shan},
  title = {Attention and Augmented Recurrent Neural Networks},
  journal = {Distill},
  year = {2016},
  url = {http://distill.pub/2016/augmented-rnns},
  doi = {10.23915/distill.00001}
}