点击上方“AI公园”,关注公众号,选择加“星标“或“置顶”
导读作者:Raimi Karim
编译:ronghuaiyang
之前分享了几次attention的文章,感觉意犹未尽,这次用GIF来解释Attention机制,让人一看就明白,并解释如何用在Google Translate之类的机器翻译场景中。
几十年来,统计机器翻译一直是占主导地位的翻译模型,直到神经机器翻译 (NMT)的诞生。NMT是一种新兴的机器翻译方法,它试图构建和训练单个大型的神经网络,来读取输入文本并输出对应的翻译。
NMT的先驱是Kalchbrenner and Blunsom (2013), Sutskever et. al (2014)和Cho. et. al (2014b),其中比较熟悉的框架是来自Sutskever et. al.的序列到序列(seq2seq)模型。本文会基于seq2seq框架,并描述如何在此基础上构建注意力机制。
seq2seq的想法是,有两个递归神经网络(RNNs),使用encoder-decoder架构:一个接一个读取输入单词,得到一个固定的维度的向量表示(编码器),而且,以这些输入为条件,使用另一个RNN解码器一个一个地提取输出单词。
seq2seq的问题是,解码器从编码器接收到的唯一信息是编码器的最后隐藏状态(图0.1中的两个红色节点),这是一个向量表示,类似于输入序列的数值摘要。因此,对于长输入文本(图0.2),我们期望解码器只使用这一个 向量表示(希望它“充分描述输入序列”)来输出翻译是不现实的。这可能会导致灾难性的遗忘。这段有100个单词。你能在问号后面把这段话翻译成你知道的另一种语言吗?
如果我们做不到,那么我们就不应该对解码器如此残忍。那么,如果不光给一个向量表示,同时还给解码器一个来自每个编码器时间步长的向量表示,这样它就可以做出具有充足信息的翻译了,这个想法怎么样?让我们进入注意力机制。
注意力机制是编码器和解码器之间的接口,它向解码器提供来自每个编码器隐藏状态的信息(图0.3中红色隐藏状态除外)。通过这个设置,模型能够选择性地关注输入序列的有用部分,从而学习它们之间的“对齐”。这有助于模型有效地处理长输入语句。
定义:对齐
对齐是指将原文的片段与其对应的译文片段进行匹配。
有两种注意类型,使用所有编码器隐藏状态的注意力类型也称为“全局注意力”。相反,“局部注意力”只使用编码器隐藏状态的子集。由于本文的范围是全局attention,因此本文中提到的“attention”均被视为“全局attention”。
本文使用动画来描述注意力的工作原理,这样我们就能不需要数学符号来进行理解。例如,我将分享过去5年设计的4个NMT架构。我还将在这篇文章中加入一些关于一些概念的直觉,所以请注意它们!
在我们了解注意力是如何使用之前,请允许我与你分享使用seq2seq模型进行翻译任务背后的直觉。
直觉:seq2seq
翻译员从头到尾阅读德语文本。一旦完成,他开始逐字逐句地翻译成英语。如果这个句子非常长,他很可能已经忘记了他在前面读到的内容。
这是一个简单的seq2seq模型。我要进行的注意力层的逐步计算是一个seq2seq+attention模型。这里有一个关于这个模型的快速直觉。
直觉: seq2seq + attention
翻译员在从头到尾阅读德语文本的同时写下关键词,然后开始翻译成英语。在翻译每一个德语单词时,他会利用他写下的关键词。
注意力集中在不同的单词上,给每个单词打分。然后,使用softmax之后分数,我们使用编码器隐藏状态的加权和来聚合编码器隐藏状态,得到上下文向量。注意力层的实现可以分为4个步骤。
Step 0: 准备隐藏状态.
我们首先准备第一个解码器的隐藏状态(红色)和所有可用的编码器隐藏状态(绿色)。在我们的示例中,我们有4个编码器隐藏状态和当前解码器隐藏状态。
Step 1: 得到每一个编码器隐藏状态的得分.
score(标量)由score函数(也称为alignment score函数或alignment model)获得。在本例中,score函数是解码器和编码器隐藏状态之间的点积。
请看Appendix A中各种各样的score函数。
在上面的例子中,对于编码器的隐藏状态[5, 0, 1]
,我们获得了较高的注意分值60
。这意味着下一个要翻译的单词将受到这种编码器隐藏状态的严重影响。
Step 2: 把所有的得分送到softmax层跑一下.
我们将分数送到softmax层中,这样softmax之后的分数(标量)加起来等于1。这些softmax的分数代表了注意力分布。
注意,基于softmax之后的分数score^
,注意力的分配仅按预期放在了[5, 0, 1]
上。实际上,这些数字不是二进制的,而是0到1之间的一个浮点数。
Step 3: 用每个编码器的隐藏状态乘以softmax之后的得分.
通过将每个编码器的隐藏状态与其softmax之后的分数(标量)相乘,我们得到对齐向量 或标注向量。这正是对齐产生的机制。
在这里,我们看到除了[5, 0, 1]
外,所有编码器隐藏状态的对齐都被降低到0,这是因为注意力得分较低。这意味着我们可以期望第一个被翻译的单词应该与输入单词使用[5, 0, 1]
嵌入表示的单词匹配。
Step 4: 把所有对齐的向量加起来.
对对齐向量进行求和,生成上下文向量。上下文向量是前一步的对齐向量的聚合信息。
Step 5: 把上下文向量送到解码器中.
这取决于体系结构设计。稍后,我们将在第2a、2b和2c节的示例中看到架构如何使用上下文向量作为解码器。
就是这些了,这就是完整的动画:
直觉: attention到底是怎么工作的?
答案:反向传播,意不意外。反向传播将尽一切努力确保输出接近基本事实。这是通过改变RNNs和score函数(如果有的话)中的权重来实现的。这些权重将影响编码器的隐藏状态和解码器的隐藏状态,从而影响注意力得分。
在前一节中,我们已经看到了seq2seq和seq2seq+attention体系结构。在下一小节中,让我们研究另外3个基于seq2seq的NMT架构,它们实现了注意力。为了完整起见,我还附加了他们的Bilingual Evaluation Understudy(BLEU)分数,这是一个评价生成的句子到参考句子的标准度量。
Neural Machine Translation by Jointly Learning to Align and Translate (Bahdanau et. al, 2015)
这种注意力的实现是注意力的创始者之一。作者在论文 “Neural Machine Translation by Learning to Jointly Align and Translate”的标题中使用了align这个词,意思是在训练模型的同时调整直接负责分数的权重。以下是关于这个架构需要注意的事项:
编码器是一个双向(前向+后向)门控循环单元(BiGRU)。解码器是一个GRU,其初始隐藏状态是由向后编码器GRU的最后一个隐藏状态修改而来的向量(下图中未显示)。
注意层中的score函数是additive/concat。
下一个解码器时间步的输入是前一个解码器时间步(粉红色)的输出与当前时间步(深绿色)的上下文向量之间的拼接。
作者在WMT ' 14 English-to-French数据集上获得了26.75的BLEU评分。
直觉: 使用双向编码器+attention的seq2seq
翻译员A在阅读德语文本的同时写下关键词。翻译员B(他之所以担任高级职位,是因为他有一种额外的能力,可以把一个句子从后往前读)把同一个德语文本从最后一个单词读到第一个单词的同时记下关键词。这两个人定期讨论到目前为止他们读到的每一个单词。阅读完这篇德语文本后,翻译员B的任务是基于他们两人的讨论同时选择的关键字,将德语句子逐字逐句翻译成英语。
翻译员A是前向RNN,翻译员B是后向RNN.
Effective Approaches to Attention-based Neural Machine Translation (Luong et. al, 2015)
"Effective Approaches to Attention-based Neural Machine Translation"一文的作者指出,简化和泛化Bahdanau et. al的体系结构非常重要。方法如下:
编码器是一个两层的长短时记忆(LSTM)网络。解码器也具有相同的结构,其初始隐藏状态是最后一个编码器的隐藏状态。
他们实验过的score函数是(i) additive/concat, (ii) 点积,(iii) location-based,和(iv) “general”。
将当前解码器时间步的输出与当前时间步的上下文向量拼接,输入前向神经网络,得到当前解码器时间步的最终输出(粉红色)。
在WMT ' 15 English-to-German数据集上获得了25.9的BLEU评分。
直觉: 使用2层编码器+attention的seq2seq
翻译员A在阅读德语文本的同时写下关键词。同样地,翻译员B(比译者A更资深)在阅读相同的德语文本时也会记下关键词。注意,初级翻译人员A必须向翻译人员B报告他们读到的每一个单词。一旦阅读完毕,他们就会根据所掌握的关键词,一个词一个词地把句子翻译成英语。
Google’s Neural Machine Translation System: Bridging the Gap between Human and Machine Translation (Wu et. al, 2016)
因为我们大多数人肯定都以这样或那样的方式使用过谷歌翻译,所以我觉得有必要谈谈谷歌在2016年实现的NMT。GNMT是前面两个例子的组合(深受第一个例子的启发)。
编码器由8个LSTMs组成,其中第一个LSTMs是双向的(其输出是拼接起来的),来自连续层(从第3层开始)的输出之间存在残差连接。解码器是8个单向LSTMs的“独立”堆叠。
使用的score函数是additive/concat,类似于第一个例子。
同样,就像第一个例子中一样,下一个解码器时间步的输入是前一个解码器时间步(粉红色)的输出和当前时间步(深绿色)的上下文向量之间的连接。
该模型在WMT ' 14 English-to-French上得到了38.95的BLEU评分,在WMT’14 English-to-German上得到了24.17的BLEU评分。
直觉: GNMT — 使用8个层叠的编码器(+bidirection+residual connections)+ attention的seq2seq
8名翻译员从下到上坐成一列,从翻译员A, B,…,H开始。每个翻译员都阅读相同的德语文本。对于每一个字,翻译员A和翻译员B共享他们之间的发现,然后翻译员B改善这个发现,再和翻译员C共享,重复这个过程,直到翻译员H。此外,阅读德语文本时,翻译员H基于他知道的东西和他收到的信息写下相关的关键字。
一旦所有人都读完了这篇德文文本,翻译员A被要求翻译第一个单词。首先,他试着回忆,然后他与翻译员B分享他的答案,翻译员B改进了答案并与翻译员C分享——重复这个过程,直到轮到翻译员H。翻译员H根据他所写的关键词和他得到的答案写出了第一个翻译单词。重复这一步骤,直到我们得到译文为止
下面是你在本文中看到的所有体系结构的快速总结:
seq2seq + attention
seq2seq with bidirectional encoder + attention
seq2seq with 2-stacked encoder + attention
GNMT — seq2seq with 8-stacked encoder (+bidirection+residual connections) + attention
就这么多了!在下一篇文章中,我将向你介绍自注意力的概念,以及它在谷歌的Transformer和自注意力生成对抗网络(SAGAN)中的应用。
下面是一些由Lilian Weng编辑的评分函数。在这篇文章中提到了Additive/concat和点积。score函数涉及点积运算(点积、余弦相似度等),其思想是度量两个向量之间的相似度。对于前馈神经网络评分函数,其思想是让模型在变换的同时学习对齐权值。
英文原文:https://towardsdatascience.com/attn-illustrated-attention-5ec4ad276ee3
请长按或扫描二维码关注本公众号
喜欢的话,请给我个好看吧!