Attention机制是最近深度学习的趋势。在一次采访中,OpenAI的研究总监Ilya Sutskever表示,attention机制是最令人兴奋的进步之一,已经被广泛使用。听起来很刺激。但是,attention机制究竟是什么?
神经网络的attention机制松散地建立在人类视觉主义机制的基础上。人类视觉主义机制已得到充分研究,并提出了多种不同的模式。所有的模型最终都是根据“高分辨率”关注图片的特定区域,用“低分辨率”识别图像周围区域的模式。然后继续调整焦点。
Attention在神经网络领域有着悠久的历史,尤其是在图像识别领域。相关论文是learning to combine fo veal glimpses with a third-order Boltzmann machine和learning where to attend with deep architectures for image trachine这就是我们这篇文章主要关心的问题。
attention解决了什么问题?
我们以神经机器翻译(NMT)为例来理解attention能为我们做什么。传统的机器翻译系统通常依赖于基于文本统计特性的复杂特征工程。简而言之,这些系统非常复杂,需要投入大量的工程来建设它们。神经机器翻译系统不同。NMT系统将一个句子的意思映射到固定长度的表象向量,然后根据这个向量生成翻译文本。NMT系统生成的译文优于大多数其他方法,因为它不依赖类似的n-gram数,而是捕获更高级别的文本含义。更重要的是,NMT系统的建立和训练过程更加方便,不需要手动进行特征工程。实际上,TensorFlow只需要几百行代码就可以实现简单版本。
大多数NMT系统使用递归神经网络(RNN)将源语句(如德语)编码为矢量,然后使用RNN将其解码为英语句子。
如上图所示,“Echt”、“Dicke”和“Kiste”依次输入编码器中,特殊字符标志输入结束后(图中未显示),解码器开始生成翻译语句。解码器继续逐词生成,直到句子的终止符生成为止。其中H向量表示编码器的内部状态。
仔细观察,可以发现解码器在翻译时仅依赖于编码器的最后隐藏位置(上图中的H3)。H3矢量必须对源句的所有内容进行编码。它必须充分捕捉意义。用专业术语来说,这个矢量是sentence embedding。事实上,用PCA或t-SNE降维后,如果画其他句子的MBERDIN,就会发现意思差不多的句子彼此非常接近。真神奇。
但是,长句中包含的所有信息似乎无法编码为一个矢量。然后解码器只根据这个向量生成完美的翻译。这样的假设没有道理。我们假设原文文章的长度为50个单词。英语译文的第一个词可能与原文第一个词的高度有关。但这意味着解码器必须考虑到50步之前的信息,该信息必须以某种形式编入矢量。众所周知,RNN在处理这些远距离依赖关系时会遇到问题。理论上LSTM这样的结构可以处理这个问题,但实际上远距离依赖性仍然是个问题。例如,研究人员发现,由于以相反顺序(以相反顺序输入编码器)从解码器到编码器相应部分的路径缩短,结果得到了很大改善。同样,输入两次相同的序列有助于互联网更好地记忆。
我认为逆序文章这种方法属于“hack”手段。那是实践证明的方法,不是有理论依据的解决方案。大部分翻译的标准是法语、德语等语言,与英语非常相似。但是一些语言(如日语)句子的最后一个单词在英语译文中对第一个单词很有预言性。那么逆序输入会使结果更糟。还有别的办法吗?这就是附加机制。
使用Attention机制,就不再需要将完整的原文句子编码为固定长度的矢量。相反,我们让解码器在每个阶段输出时“参与”原文的其他部分。特别重要的是,根据输入的句子和已经生成的内容决定是否参与。因此,解码器可以在格式非常相似的语言(如英语和德语)之间按顺序参与。生成第一个英语单词时,参与原文的第一个单词等。这是《neural machine translation by joint ly learning to align and translate》论文的结果,如下图所示。
“ y”是编码器生成的翻译词,“x”是原文的词。上图使用了双向递归网络,但这并不重要,请先忽略反向路径。重点是现在每个解码器输出的单词yt取决于一切
输入状态的一个权重组合,而不只是最后一个状态。a’是决定每个输入状态对输出状态的权重贡献。因此,如果a3,2的值很大,这意味着解码器在生成译文的第三个词语时,会更关注与原文句子的第二个状态。a’求和的结果通常归一化到1(因此它是输入状态的一个分布)。Attention机制的一个主要优势是它让我们能够解释并可视化整个模型。举个例子,通过对attention权重矩阵a的可视化,我们能够理解模型翻译的过程。
我们注意到当从法语译为英语时,网络模型顺序地关注每个输入状态,但有时输出一个词语时会关注两个原文的词语,比如将“la Syrie”翻译为“Syria”。
Attention的成本
如果再仔细观察attention的等式,我们会发现attention机制有一定的成本。我们需要为每个输入输出组合分别计算attention值。50个单词的输入序列和50个单词的输出序列需要计算2500个attention值。这还不算太糟糕,但如果你做字符级别的计算,而且字符序列长达几百个字符,那么attention机制将会变得代价昂贵。
其实它和我们的直觉恰恰相反。人类的注意力是节省计算资源的。当专注于一件事时,我们能忽略其它事情。但这并不是我们上一个模型的作法。我们在决定专注于某个方面之前先仔细观察每件事。直观地说,这相当于输出一个翻译后的词语,然后遍历记忆里所有文本再决定下一个输出什么。这似乎是一种浪费,而且没人会这么干。事实上,它更类似于内存访问,不是attention,在我看来有点儿用词不当(下文会继续讨论)。不过,这并没有阻碍attention机制的流行传播。
attention的另一种替代方法是用强化学习(Reinforcement Learning)来预测关注点的大概位置。这听起来更像是人的注意力,这也是Recurrent Models of Visual Attention文中的作法。然而,强化学习模型不能用反向传播算法端到端训练,因此它在NLP的应用不是很广泛。
机器翻译之外领域的Attention机制
到目前为止,我们已经见识了attention在机器翻译领域的应用。但上述的attention机制同样也能应用于递归模型。让我们再来看几个例子。
在Show,Attend and Tell一文中,作者将attention机制应用于生成图片的描述。他们用卷积神经网络来“编码”图片,并用一个递归神经网络模型和attention机制来生成描述。通过对attention权重值的可视化(就如之前机器翻译的例子一样),在生成词语的同时我们能解释模型正在关注哪个部分。
在Grammar as a Foreign Language论文中,作者用递归神经网络模型和attention机制的来生成语法分析树。可视化的attention矩阵让人深入地了解网络模型如何生成这些树:
在Teaching Machines to Read and Comprehend论文里,作者利用RNN模型读入文本,先读入一个(合成的)问题,然后产生一个答案。通过将attention可视化,我们可以看到网络模型在试图寻找问题答案的时候关注哪些方面:
ATTENTION = (FUZZY) MEMORY?
attention机制解决的根本问题是允许网络返回到输入序列,而不是把所有信息编码成固定长度的向量。正如我在上面提到,我认为使用attention有点儿用词不当。换句话说,attention机制只是简单地让网络模型访问它的内部存储器,也就是编码器的隐藏状态。在这种解释中,网络选择从记忆中检索东西,而不是选择“注意”什么。不同于典型的内存,这里的内存访问机制是弹性的,也就是说模型检索到的是所有内存位置的加权组合,而不是某个独立离散位置的值。弹性的内存访问机制好处在于我们可以很容易地用反向传播算法端到端地训练网络模型(虽然有non-fuzzy的方法,其中的梯度使用抽样方法计算,而不是反向传播)。
记忆机制本身的历史更久远。标准递归网络模型的隐藏状态本身就是一种内部记忆。RNN由于存在梯度消失问题而无法从长距离依赖学习。LSTM通过门控机制对此做了改善,它允许显式的记忆删除和更新。
更复杂的内存结构的趋势还在延续。End-To-End Memory Networks一文中的方法允许网络在输出内容前多次读入相同的序列,每一步都更新记忆内容。举个例子,输入一个故事,在经过多步推理之后回答一个问题。然而,当网络参数的权重以某种特定方式被绑定,端到端记忆网络的记忆机制就和这里所介绍的attention机制一样了,只是它是多跳的记忆(因为它试图整合多个句子信息)。
神经图灵机器使用类似的记忆机制,但有一个更复杂的解决方案,它同时基于内容(如在这里)和位置,使网络模型通过学习模式来执行简单的计算机程序,比如排序算法。
在将来,我们很可能看到记忆机制和attention机制之间有更清晰的区别,也许是沿着Reinforcement Learning Neural Turing Machines,它尝试学习访问模式来处理外部接口。
原文地址:ATTENTION AND MEMORY IN DEEP LEARNING AND NLP(译者/赵屹华 审校/刘翔宇 责编/仲浩)
译者简介:赵屹华,计算广告工程师@搜狗,前生物医学工程师,关注推荐算法、机器学习领域。