注意力的动画解析(以机器翻译为例)

本文涉及的产品
文本翻译,文本翻译 100万字符
云解析 DNS,旗舰版 1个月
文档翻译,文档翻译 1千页
简介: 近十年以来,直到神经机器翻译系统的诞生之前,统计机器翻译一直在机器翻译领域占据着主要地位。
TB188IzHmzqK1RjSZFLXXcn2XXa.jpg

本文为 AI 研习社编译的技术博客,原标题 :

Attn: Illustrated Attention

作者 | Raimi Karim

翻译 | yata         校对 | 邓普斯•杰弗

审核 | 酱番梨       整理 | Pita

原文链接:

https://towardsdatascience.com/attn-illustrated-attention-5ec4ad276ee3

TB13lkZHhjaK1RjSZKzXXXVwXXa.jpg

近十年以来,直到神经机器翻译系统的诞生之前,统计机器翻译一直在机器翻译领域占据着主要地位。神经机器翻译模型作为一种新兴的机器翻译方法,其致力于构建并训练出一个可以输入文本并返回翻译文本的大型神经网络。

Kalchbrenner and Blunsom (2013), Sutskever et. al (2014) 和Cho. et. al (2014b)等人,作为先驱首先提出了神经机器翻译框架,之后由Sutskever  等人提出了更广为人知的序列到序列模型。我们这篇文章将基于序列到序列的框架,以及如何在此框架上构建attention机制,来展开讲解。

TB1YKQtHjDpK1RjSZFrXXa78VXa.png

Fig. 0.1: 输入序列长度为4的序列到序列的框架

在序列到序列模型中,其主要的思想在于使用两个循环神经网络构建一个编码器-解码器的结构:首先以其中一个RNN为构成的编码器,按时间顺序一个一个读入输入的文字,之后便可以得到一个固定维度的向量;在这些输入的基础上,由另一个RNN构成的解码器按照时间顺序再进行一个一个的解码,从而得到最后的翻译。我们的解释借鉴了[5]。

TB1yggEHgHqK1RjSZFPXXcwapXa.png

Fig. 0.2: 输入序列长度为64的序列到序列框架

序列到序列模型的主要问题在于,编码器的最后一个隐层状态(见Fig.0.1中的两个红色节点),作为唯一的信息输入到解码器中来。而这最后一个隐层状态向量就好像是全部输入的一个数值汇总。所以当输入的文字很长时(Fig.0.2),仅仅利用一个汇总向量(期望他可以充分的总结输入序列的所有信息),便希望可以输出一个合理的翻译文本,便显得有些不合理,因为汇总向量的表达能力的受限,这必然会导致对输入文本灾难性的“遗忘”。这就好比给你一个由一百多个单词组成的段落,然后希望你可以在阅读完最后一个词之后,立马给出这个段落的翻译,你可以做到吗?

如果我们都做不到,我们也不应该奢求解码器能够做到。那么我们为何不考虑让解码器使用编码器部分每一个时刻的隐层状态,而不是单单只是使用编码器部分最后一个隐层状态,这样子我们应该会得到更好的翻译文本。这就要引入attention机制了。

TB10HUDHa6qK1RjSZFmXXX0PFXa.jpg

Fig 0.3:在编码器和解码器中间加入attention机制。这里,在给出第一个翻译词汇之前,解码器就已经从解码器得到了第一个时间步长的输入信息(初始化状态)。

注意力作为编码器和解码器之间的接口,负责将编码器部分每一个时刻的隐状态提供给解码器(其中不包括在Fig.0.3中的标红的隐状态)。在这样的设定下,模型才有能力去聚焦在输入序列中有用的部分,并且从中学到输入文本与输出翻译文本之间的对齐(alignment)。这对于模型有效的处理长输入句子十分有效。

定义:对齐   

对齐的意思是将原始输入文本中的片段与他们对应输出的翻译文本片段,进行匹配。

TB1jv3KHkvoK1RjSZFwXXciCFXa.jpg

Fig.0.3:法文"la"与输入序列之间的对齐分布在输入序列中各个单词上,但是主要在其中四个单词:"the","European","Economic"和"Area"。连线的颜色越深表示attention的score越大。

在[2]中的介绍我们可以直到,这里有种形式的attention.一种是,使用编码器的所有隐层状态,我们称其为全局attention。相对的,只使用编码器隐层状态的子集来计算attention,我们将其称为局部attention。在这篇文章中,我们讨论的是全局attention。其中提到attention时大家就默认为全局attention.

在这篇文章中,我们使用动画的形式进行对attention的工作原理进行总结,所以大家再也不用对着论文或者资料里的各种数学表达式发愁了。同时作为例证,我将介绍在过去五年里发表的四种神经机器翻译的框架。并且我将在文章中为对其中的一些概念理论进行直观推断式的讲解,所以大家要注意这些讲解哦。

目录

1.Attention:综述

2.Attention:例子

3.总结

附录:attention分数计算方法

1.Attention:综述

在我们讨论attention如何使用之前,首先允许我使用直观理解的方式,解释如何将序列到序列模型运用到翻译任务上。

直观理解:序列到序列模型

一名翻译员从头到尾的读一段德语文本,一旦他读完这段文本,便开始将其逐词的翻译为英文。当这段文本很长时,他极有可能在翻译过程中已经忘记了这段文本之前的段落。

当然,上面我们说的只是一个简单的序列到序列模型。下面我将带大家厘清在序列到序列+attention模型中attention层中计算的具体步骤。在这之前,让我们首先对模型有一个直观理解。

直观理解:序列到序列+attention

一名翻译员从头到尾去读一段德语文本,只是在读的过程中,会记下来文本中涉及到的关键词。这样在之后翻译工作时,他可以在翻译每个德语单词时借鉴他在之前已经记下的关键词。

attention通过向不同的单词赋予不同的分数来表征 不同的关注程度。之后,将这些得到的分数经过softmax层(从而拿到归一化的权重),这样我们就可以将编码器阶段所有的隐层状态经过加权和得到一个上下文向量。attention层具体的实现可以分解为如下四个步骤。

Step 0:准备隐层状态

我们要首先准备好decoder的(当前)隐层状态(红色)和所有可以拿到的编码器隐层状态(绿色)。在我们的例子中,我们有4个编码器隐层状态和一个当前解码器隐层状态。

TB19i7CHgHqK1RjSZFgXXa7JXXa.gif

Fig.1.0 准备关注

Step 1: 获得对每个编码器隐层状态的分数

分数(标量)可以通过分数函数(或者叫做对齐分数函数[2]或者对齐模型)得到。在这个例子中,我们使用解码器和编码器隐层状态之间的点积作为我们的分数计算函数。

附录A中给了不同的分数计算函数。

TB1vL3KHkvoK1RjSZFwXXciCFXa.gif

Fig. 1.1:分数获得

TB1EmMCHXzqK1RjSZFCXXbbxVXa.jpg

在上面这个例子中,我们在编码器隐层状态[5, 0, 1]中得到了较高的分数,这意味着下一个要翻译的单词将较大的收到这个隐层状态的影响。

Step 2 : 将所有的分数值通过一个softmax层

我们将这些分数通过一个softmax层,这样我们可以得到对应的加起来为1的值。这些经过了softmax层的分数代表了[3,10]的注意力分布。

TB1vL3KHkvoK1RjSZFwXXciCFXa.gif

Fig.1.2   softmaxed 分数

TB1w_IDHhTpK1RjSZFMXXbG_VXa.jpg

我们可以看到,在经过了softmax的分数score^,attention按我们的预期只分布在[5, 0, 1]上。实际上,这些数应该是0到1之间的浮点数而不是0和1的二值数。

Step 3: 将每个编码器隐状态乘以softmax层之后的分数值

通过将每个编码器的隐层状态乘上对应的softmax之后的分数值,我们就可以得到对齐向量[2]或者叫做标注向量[1]。这就是对齐的机制。

TB1HusAHirpK1RjSZFhXXXSdXXa.gif

Fig. 1.3: Get the alignment vectors

TB13aAHHkPoK1RjSZKbXXX1IXXa.jpg

这里我们可以看到除了[5, 0, 1]之外的其他隐层状态都因为其分数小的原因降至0。这意味着我们可以认为第一个被翻译出的单词应该匹配着输入单词中的[5,0,1]编码向量。

Step 4:  将所有的对齐向量相加

将所有的对齐向量相加即可得到最终的上下文向量[1,2]。一个上下文向量相当于是之前所有步骤中的对齐向量的聚合信息。

TB1vJ.NHhYaK1RjSZFnXXa80pXa.gif

Fig. 1.4: Get the context vector

TB1O_IDHhTpK1RjSZFMXXbG_VXa.jpg

Step 5: 将上下文向量输入解码器部分

(输入解码器的)方式由我们的框架设计所决定。之后我们将在Section 2a,2b,和2c中通过例子介绍这些框架如何在解码器部分使用上下文向量信息。

TB1TywXX_Zmx1VjSZFGXXax2XXa.gif

Fig. 1.5: Feed the context vector to decoder

下面是整个动态的过程。

TB1CrQCHmzqK1RjSZFjXXblCFXa.gif

Fig. 1.6: Attention

直观理解:attention到底是如何有效的

答案:反向传播,惊喜吗?反向传播会尽其可能的去让输出接近真实答案。它需要去不断的调整RNN网络中的权值以及对应的函数方程中的权值,如果有需要的话。这些权重会去影响编码器的隐层状态和解码器的隐层状态,从而间接的去影响attention的分数。

2. Attention:例子

我们在之前的章节中已经了解了序列到序列和序列到序列+attention两种框架。在下一小节中,我们将详细的去了解3个在序列到序列基础上运用attention机制的神经机器翻译模型。为了让大家更为完整的了解(他们的具体性能),我将附上他们的双语评估分数(BLEU)——一种在真实序列基础上评价合成序列的指标。

2a. Bahdanau 等(2015)[1]

这种attention的计算实现是基础attention计算的来源之一。作者在论文题目"Neural Machine Translation by Learning to Jointly Align and Translate"中用了"align"(对齐)这和词,以此来表示在训练模型时去调整跟分数直接相关的权重。下面是对此框架的一些要点总结:

    1.编码器是由双向(前向+反向)的门限循环单元(BiGRU)。解码器是由一个单向的GRU组成,它的初始化状态是由编码器的反向GRU的最后一个隐层状态变换而来。(这一点没有在下面的图中体现)

    2.attention层分数的计算方式是 加/串联

    3.机器码器下一个时刻的输入是由上一步解码器的输出(粉色)和当前时刻的上下文向量(深绿)串联。

TB1BQUCHmzqK1RjSZFHXXb3CpXa.jpg

Fig. 2a: NMT from Bahdanau et. al. Encoder is a BiGRU, decoder is a GRU.

作者在WMT14英-法数据集上BLEU值达到了26.75。

直观理解:由双向编码器组成的序列到序列模型+attention机制

译者A像之前我们说的那样边读边写下关键词。译者B(他属于高级译者,有可以从后往前读文章并可以进行翻译的能力)从最后一个词开始从后往前阅读,并且也做关键词的记录。这样两个人会不断的讨论他们阅读到的内容,一旦阅读完整段德语文本,译者B被要求依据他们之前讨论的内容以及他们共同整理的关键词,将德文逐词的翻译为英文。

译者A是前向RNN,译者B是反向RNN。

2b. Luong等(2015)[2]

Effective Approaches to Attention-based Neural Machine Translation的作者将Bahdanau等的框架进行了泛化,并且进行了简化。下面我们看下它的主要结构:

    1.编码器是一个两层的长短时记忆网络(LSTM)。解码器也有着相同的网络框架,同时它的隐状态的初始化来自编码器的最后一个隐层状态。

    2.他们在实验过的分数方程有(i)加/串联,(ii)点乘,(iii)基于位置的 和(iv)一般化的。

    3.当前时刻解码器的最终输出(粉色),由当前时刻解码器部分的输出(译者注:解码器部分LSTM的输出或隐层状态)和当前时刻计算得到的上下文向量进行串联,之后经过一层全连接网络得到。

TB14t.NHhYaK1RjSZFnXXa80pXa.jpg

Fig. 2b: NMT from Luong et. al. Encoder is a 2 layer LSTM, likewise for decoder.

此模型在WMT15 英语-法语数据集上BLEU分数达到了25.9.

直观理解:带有两层(LSTM)堆叠编码器的序列到序列模型 + attention

译者A从前至后阅读德语文本,并写下遇到的关键词。同样的,译者B(比译者A的级别要高)同样阅读这段德语文本,并且记下关键词。注意在这个过程中,译者A每读一个词就向译者A进行汇报。当文本阅读结束后。两位译者会基于他们之前共同得到的关键词进行逐词的翻译。

2c. 谷歌的神经机器翻译模型(GNMT)[9]

我们中的大多数应该都曾经以各种形式使用过谷歌翻译,所以我觉得十分有必要来讨论2016年实现的谷歌神经机器翻译系统。GNMT是我们看到的前两个例子的结合(深受第一个例子[1]的启发)。

    1.编码器部分由八层LSTM堆叠而成,其中第一层是双向的(双向的输出进行串联),并且从第三层开始会进行连续的残差连接。解码器部分由8层单向的LSTM堆叠而组成。

    2.分数计算函数使用的 加/串联,和文献[1]一样。

    3.同样的,和文献[1]相同,解码器当前时刻的输入由上一个时刻解码器的输出(粉色)和当前时刻的上下文向量(深绿)串联而得。

TB1VxcZHhnaK1RjSZFBXXcW7VXa.jpg

Fig. 2c: Google’s NMT for Google Translate. Skip connections are denoted by curved arrows. *Note that the LSTM cells only show the hidden state and input; it does not show the cell state input.

该模型在WMT14英-法数据库上BLEU分数达到了38.95,在WMT14英-德数据库上BLEU的值达到了24.17.

直观理解:GNMT——有八层LSTM堆叠而成编码器的序列到序列模型(+双向+残差连接)+attention

八个译者依次坐好,顺序是从A到B直到H。每个译者都读着相同的德语文本。在每个词上,译者A向译者B分享他的发现,译者B会改善得到的信息并将它分享给译者C,重复这样的过程直到告诉译者H。同样的,译者H会在读这段德文文本时,基于它获得的信息写下相关的关键词。

一旦每个人都读完了这段德文文本,译者A会被告知去翻译第一个词。首先他开始回想,然后他将他的答案分享给B,B改进答案后分享给C,重复这个过程直到传递给了H。然后译者H会基于他得到的答案和之前记录下的关键词,写下第一个翻译出来的单词。他会重复这个过程直到整个翻译内容结束。

3. 总结

这里我们对你在这篇文章里见过的所有架构做一个快速的总结。

序列到序列模型

序列到序列模型 +  attention

有双向编码器的序列到序列模型 +  attention

有两层(lstm)堆叠编码器的序列到序列模型 + attention

GNMT-有八层堆叠编码器的序列到序列模型(+ 双向 + 残差)+attention。

以上就是所有的内容。在下一篇博客中,我将为你讲述什么是self-attention,并且讲述它是怎样应用到谷歌的Transformer和self-Attention对抗神经网络模型上的。请密切关注我的空间!

附录:分数函数

下面是Lilian Weng编辑的分数函数中的一部分。加/串联 和 点乘在这篇文章中已经被提及。其中包含了点乘操作(点乘,余弦距离等)的分数函数,其主旨是为了度量两个向量之间的相似性。对于使用前馈神经网络的分数函数,其主旨是对翻译译文的对齐权重进行建模。

TB1ypADHcbpK1RjSZFyXXX_qFXa.jpg

Fig. A0: Summary of score functions

TB1wH3DHa6qK1RjSZFmXXX0PFXa.jpg

Fig. A1: Summary of score functions. (Image source)

References

[1] Neural Machine Translation by Jointly Learning to Align and Translate (Bahdanau et. al, 2015)

[2] Effective Approaches to Attention-based Neural Machine Translation (Luong et. al, 2015)

[3] Attention Is All You Need (Vaswani et. al, 2017)

[4] Self-Attention GAN (Zhang et. al, 2018)

[5] Sequence to Sequence Learning with Neural Networks (Sutskever et. al, 2014)

[6] TensorFlow’s seq2seq Tutorial with Attention (Tutorial on seq2seq+attention)

[7] Lilian Weng’s Blog on Attention (Great start to attention)

[8] Jay Alammar’s Blog on Seq2Seq with Attention (Great illustrations and worked example on seq2seq+attention)

[9] Google’s Neural Machine Translation System: Bridging the Gap between Human and Machine Translation (Wu et. al, 2016)

Related Articles on Deep Learning

Animated RNN, LSTM and GRU

Line-by-Line Word2Vec Implementation (on word embeddings)

Step-by-Step Tutorial on Linear Regression with Stochastic Gradient Descent

10 Gradient Descent Optimisation Algorithms + Cheat Sheet

Counting No. of Parameters in Deep Learning Models

想要继续查看本篇文章相关链接和参考文献?

长按链接点击打开或点击【注意力的动画解析(以机器翻译为例)】:

https://ai.yanxishe.com/page/TextTranslation/1460

AI研习社每日更新精彩内容,观看更多精彩内容:雷锋网雷锋网雷锋网(公众号:雷锋网)

CVPR 2018 最牛逼的十篇论文

深度学习目标检测算法综述

迷你自动驾驶汽车深度学习特征映射的可视化

在2018年用“笨办法”学数据科学体会分享

等你来译:

如何在神经NLP处理中引用语义结构 

(Python)用Mask R-CNN检测空闲车位

高级DQNs:利用深度强化学习玩吃豆人游戏

深度强化学习新趋势:谷歌如何把好奇心引入强化学习智能体 

目录
相关文章
|
3月前
|
图形学 C#
超实用!深度解析Unity引擎,手把手教你从零开始构建精美的2D平面冒险游戏,涵盖资源导入、角色控制与动画、碰撞检测等核心技巧,打造沉浸式游戏体验完全指南
【8月更文挑战第31天】本文是 Unity 2D 游戏开发的全面指南,手把手教你从零开始构建精美的平面冒险游戏。首先,通过 Unity Hub 创建 2D 项目并导入游戏资源。接着,编写 `PlayerController` 脚本来实现角色移动,并添加动画以增强视觉效果。最后,通过 Collider 2D 组件实现碰撞检测等游戏机制。每一步均展示 Unity 在 2D 游戏开发中的强大功能。
159 6
|
3月前
|
前端开发
背景滑动,动感加倍:CSS动画对角线效果全解析!
背景滑动,动感加倍:CSS动画对角线效果全解析!
|
3月前
|
API UED 开发者
超实用技巧大放送:彻底革新你的WinForms应用,从流畅动画到丝滑交互设计,全面解析如何在保证性能的同时大幅提升用户体验,让软件操作变得赏心悦目不再是梦!
【8月更文挑战第31天】在Windows平台上,使用WinForms框架开发应用程序时,如何在保持性能的同时提升用户界面的吸引力和响应性是一个常见挑战。本文探讨了在不牺牲性能的前提下实现流畅动画与交互设计的最佳实践,包括使用BackgroundWorker处理耗时任务、利用Timer控件创建简单动画,以及使用Graphics类绘制自定义图形。通过具体示例代码展示了这些技术的应用,帮助开发者显著改善用户体验,使应用程序更加吸引人和易于使用。
71 0
|
前端开发 UED
CSS 支持动画效果,可以通过关键帧动画或过渡动画实现动态效果。具体案例解析
CSS 支持动画效果,可以通过关键帧动画或过渡动画实现动态效果。具体案例解析
97 1
|
机器学习/深度学习 人工智能 自然语言处理
解码注意力Attention机制:从技术解析到PyTorch实战
解码注意力Attention机制:从技术解析到PyTorch实战
651 0
|
搜索推荐 JavaScript 数据可视化
数据可视化大屏高德地图javascript webAPI开发的智慧治安物联网管理系统实战解析(web GIS、3D视图、个性化地图、标注、涟漪动画、自定义弹窗、3D控件)
数据可视化大屏高德地图javascript webAPI开发的智慧治安物联网管理系统实战解析(web GIS、3D视图、个性化地图、标注、涟漪动画、自定义弹窗、3D控件)
517 0
|
机器学习/深度学习 数据可视化 计算机视觉
注意力机制BAM和CBAM详细解析(附代码)
注意力机制BAM和CBAM详细解析(附代码)
注意力机制BAM和CBAM详细解析(附代码)
|
前端开发 JavaScript
复刻解析一个流光溢彩炫到掉渣的 CSS 动画按钮
最近在看 next.js 官网是被引流到 conf 页面,发现上面有一个炫酷的按钮,按钮的边框色彩不断变动给人感觉是光在随着按钮旋转一般,感觉挺酷的,复刻一下讲解下原理。
|
存储 网络协议 安全
数据原来是这么传输的(结合动画解析)
从1990年,世界上第一个互联网Web网页诞生,到现在2021年,已经过去了30多个年头。
181 0
数据原来是这么传输的(结合动画解析)
|
算法 搜索推荐 Java
十大经典排序算法动画解析和 Java 代码实现【详细全代码】
排序算法可以分为内部排序和外部排序。内部排序是数据记录在内存中进行排序。而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。 常见的内部排序算法有:插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序等。
112 0
十大经典排序算法动画解析和 Java 代码实现【详细全代码】

推荐镜像

更多