摘要

主流的序列转换模型都是基于复杂的循环或卷积神经网络,这个模型包含一个编码器和一个解码器。具有最好性能的模型在编码和解码之间通过一个注意力机制链接编解码器。我们提出了一个新的简单网络结构,Transformer,其仅仅是基于注意力机制,而不完全是循环和卷积。在两个机器翻译任务上的实验表明,该模型具有更好的性能,同时可以进行并行化,并且需要更少的时间进行训练。在WMT 2014英语到德语翻译任务上,我们的模型达到了28.4BLEU,获得了最好的结果。在WMT 2014英语到法语翻译任务上,我们的模型在8个GPU上训练3.5天后,所得到的单个模型获得了41.8BLEU分数,这是文献中最好模型的训练成本的一小部分。我们在大型和有限的训练数据中,通过将其成功应用于英语句法解析,表明了Transformer可以很好地适用于其他任务。

1.介绍

复杂的神经网络,特别是长短期记忆(LSTM)和门控循环神经网络(GRU)已经被作为现有技术中的方法,用于序列建模和转换问题,例如语言建模和机器翻译。自那以后,许多研究都围绕中有RNN构成的编码器-解码器进行。
  循环网络模型通常是考虑了输入和输出序列的中的字符位置的计算。将序列中每位置数据与RNN计算时刻中的步骤对齐,它们将产生一系列隐藏状态hth_tht​,当前时刻隐藏态hth_tht​作为上一时刻隐藏状态ht−1h_{t-1}ht−1​和时刻ttt输入的函数。这种固有的顺序性质排除了训练样本的并行化计算,这在较长的序列长度中变得至关重要,因为内存约束限制了样本的批处理。最近的工作通过分解技巧( factorization tricks)和条件计算(conditional computation)实现了计算效率的显着提高,同时在后者的情况下也提高了模型性能。然而,顺序计算的基本约束仍然存在。
  注意力机制已成为各种任务中引人注目的序列建模和转换模型的组成部分,允许对依赖关系进行建模,而不考虑它们在输入或输出序列中的距离。然而,在大多数情况下,这种注意机制与循环网络一起使用。
  在这项工作中,我们提出了Transformer,一种避免循环的模型架构,它完全依赖于注意机制来构造输入和输出之间的全局依赖关系。Transformer允许进行更多的并行化,并且在8个P100 GPU上经过长达12小时的训练后,可以达到最好的翻译效果。

2.背景

减少顺序计算的目标也构成了扩展神经GPU,ByteNet和ConvS2S的基础,所有这些都使用卷积神经网络作为基本构建块,并行计算所有输入和输出位置的隐藏表示。在这些模型中,关联来自两个任意输入或输出位置的数据所需的操作数量在位置之间随着距离的增长,对于ConvS2S呈线性,对于ByteNet呈对数这使得学习较远位置之间数据的依赖性变得更加困难。在Transformer中,这被减少到常数级的操作次数,尽管由于平均注意力加权位置而导致有效分辨率降低,这是我们在3.2节中描述的Multi-Head注意力的影响。
  Self-attention,有时称为intra-attention,是一种关联单个序列的不同位置以计算序列表示的关联机制。Self-attention已经成功地用于各种任务,包括阅读理解,摘要概括,文本蕴涵和学习任务独立的句子表示。
  端到端的记忆网络基于循环注意机制而不是序列对齐重复,并且已被证明在简单的语言问答和语言建模任务中表现良好。
  然而,据我们所知,Transformer是第一个完全依靠self-attention的转换模型来计算其输入和输出的表示,而不使用序列对齐的RNN或卷积的模型。在接下来的部分中,我们将描述由self-attention驱动的Transformer,并且讨论与其他模型相比,其优势所在。

3.模型架构


  大多数得竞争性神经序列转换模型都具有编码器-解码器结构。这里,编码器将字符表示的输入序列(x1,...,xn)(x_1,...,x_n)(x1​,...,xn​)映射到连续表示序列z=(z1,...,zn)z=(z_1,...,z_n)z=(z1​,...,zn​)。在给定zzz的条件下,解码器然后一次一个元素地生成字符的输出序列(y1,...,ym)(y_1,...,y_m)(y1​,...,ym​)。在每个步骤中,模型都是自动回归的,在生成下一个字符时,将上一时刻生成的字符作为附加输入。
  Transformer遵循这种整体架构,即在编码器和解码器部分使用栈的self-attention和各数据独立的全连接层,分别如图1的左半部分和右半部分所示。

3.1 编码器和解码器栈

(1)编码器
  编码器由N=6N=6N=6个相同层的堆栈组成。每层有两个子层。 第一个子层是multi-head self-attention,第二个子层是简单的、各位置独立的全连接层。我们在两个子层中的每一个周围使用残差连接(residual connection),然后进行层归一化(layer normalization)。也就是说,每个子层的输出是LayerNorm(x+Sublayer(x))LayerNorm(x+Sublayer(x))LayerNorm(x+Sublayer(x)),其中Sublayer(x)Sublayer(x)Sublayer(x)是当前子层的输出。为了提高这些残差连接,模型中的所有子层以及嵌入层产生维度dmodel=512d_{model}=512dmodel​=512的输出
  (2)解码器
  解码器同样由N=6N=6N=6个相同层的堆栈组成。除了每个编码器层中的两个子层之外,解码器还插入第三子层,其对编码器堆栈的输出执行 multi-head attention。与编码器类似,我们在每个子层周围使用残差连接,然后进行层归一化。我们还修改解码器堆栈中的self-attention子层以防止引入当前时刻的后续时刻输入。这种屏蔽与输出嵌入偏移一个位置的事实相结合,确保了位置iii的预测仅依赖于小于iii的位置处的已知输出

3.2 注意力

attention函数可以被描述为将query和一组key-value对映射到输出,其中query,key,value和输出都是向量。输出被计算为值的加权求和,其中分配给每个值的权重由query与对应key的兼容性函数计算。

3.2.1 缩放点积Attention

我们将attention称为“缩放点积Attention”(图2)。输入由维度为dkd_kdk​的query和key以及维度为dvd_vdv​的value组成。我们用所有key计算query的点积,然后将每个点积结果除以dk\sqrt {d_k}dk​​,并应用softmax函数来获得value的权重。
  在实践中,我们同时在一组query上计算attention函数,将它们打包在一起形成矩阵Q。key和value也一起打包成矩阵K和V. 我们计算输出矩阵为:
Attention(Q,K,V)=softmax(QKTdk)V(1)Attention(Q,K,V)=softmax(\frac{QK^T}{\sqrt {d_k}})V\qquad (1)Attention(Q,K,V)=softmax(dk​​QKT​)V(1)
  两个最常用的attention函数是加法attention和点积(乘法)attention。除了缩放因子1dk\frac{1}{\sqrt{d_k}}dk​​1​之外,点积attention与我们的算法相同。加法attention使用具有单个隐藏层的前馈网络来计算兼容性功能。虽然两者在理论上的复杂性相似,但在实践中,点积attention更快,更节省空间,因为它可以使用高度优化的矩阵乘法来实现。

3.2.2 Multi-Head Attention

我们发现,与使用dmodeld_{model}dmodel​维的key,value和query执行单个attention函数相比,将query,key和value线性映射到不同的dkd_kdk​,dkd_kdk​和dvd_vdv​维度h次是有益的。然后,在这些映射版本的query,key和value中,我们并行执行attention函数,产生h分dvd_vdv​维度输出值。将它们连接起来并再次映射,得到最终值,如图2所示。
  Multi-head attention允许模型共同关注来自不同位置的不同表示子空间的信息。只需一个attention head,平均就可以抑制这种情况。
MultiHead(Q,K,V)=Concat(head1,...,headh)WOMultiHead(Q, K, V ) = Concat(head_1, ..., head_h)W^OMultiHead(Q,K,V)=Concat(head1​,...,headh​)WO
whereheadi=Attention(QWiQ,KWiK,VWiV)where\quad head_i = Attention(QW^Q_i, KW^K_i, VW^V_i)whereheadi​=Attention(QWiQ​,KWiK​,VWiV​)
  其中映射由矩阵完成:WiQ∈Rdmodel×dkW^Q_i\in \mathbb R^{d_{model}×d_k}WiQ​∈Rdmodel​×dk​,WiK∈Rdmodel×dkW^K_i\in \mathbb R^{d_{model}×d_k}WiK​∈Rdmodel​×dk​,WiV∈Rdmodel×dvW^V_i\in \mathbb R^{d_{model}×d_v}WiV​∈Rdmodel​×dv​,WO∈Rhdv×dmodelW^O\in \mathbb R^{hd_v×d_{model}}WO∈Rhdv​×dmodel​。
  在这项工作中,我们采用h=8h=8h=8个平行attention层或head。 对于这些中的每一个,我们使用dk=dv=dmodel/h=64d_k=d_v=d_{model} / h = 64dk​=dv​=dmodel​/h=64.由于每个head的维度减小,总计算成本与具有全维度的单head注意力相似。

3.2.3 模型中Attention的应用

Transformer中用了三种不同的方式使用multi-head attention:

  • 在“编码器-解码器attention”层中,query来自上一个解码器层,并且存储的key和value来自编码器的输出。这允许解码器中的每个位置数据都加入了输入序列中的所有位置数据。这模仿了Seq2Seq模型中的典型编码器-解码器注意机制。
  • 编码器包含self-attention层。在self-attention层中,所有key,value和query来自相同的位置数据,是编码器中前一层的输出。在这种情况下,编码器中当前层的每个位置数据都可以处理编码器前一层中的所有位置数据。
  • 类似地,解码器中的self-attention层允许解码器中的每个位置数据参与解码器中的所有位置直到并包括该位置。我们需要防止解码器中的向左信息流以保持自回归属性。我们通过屏蔽(设置为-∞)softmax输入中与非法连接相对应的所有值来实现缩放点积Attention。 见图2。

3.2 位置前馈网络

除了attention子层之外,我们的编码器和解码器中的每个层都包含一个完全连接的前馈网络,该网络分别相同地应用于每个位置。 该前馈网络包括两个线性变换,并在第一个的最后使用ReLU激活函数。
FFN(x)=max(0,xW1+b1)W2+b2(2)FFN(x)=max(0,xW_1+b_1)W_2+b_2\qquad (2)FFN(x)=max(0,xW1​+b1​)W2​+b2​(2)
  虽然线性变换在不同位置上是相同的,但它们在层与层之间使用不同的参数。描述这种情况的另一种方式是两个内核大小为1的卷积。输入和输出的维度是dmodel=512d_{model}=512dmodel​=512,内层的维度dff=2048d_{ff}=2048dff​=2048。

3.3 词嵌入和softmax

与其他序列转换模型类似,我们使用学习道德词嵌入将输入符号和输出符号转换为维度dmodeld_{model}dmodel​的向量。我们同样使用通常学习的线性变换和softmax函数将解码器输出转换为预测的下一个字符的概率。在我们的模型中,我们在两个嵌入层和pre-softmax线性变换之间共享相同的权重矩阵。在嵌入层中,我们将这些权重乘以dmodel\sqrt{d_{model}}dmodel​​。

3.4 位置编码


  由于我们的模型不包含循环网络,也没有卷积网络,为了使模型能够利用序列中每一个数据的位置信息,我们必须加入关于序列中字符的相对或绝对位置的一些信息。为此,我们将“位置编码”添加到编码器和解码器堆栈底部的输入嵌入中。位置编码具有与嵌入相同的维度dmodeld_{model}dmodel​,因此可以将两者相加。对于位置编码(学习的,固有的),有许多选择。
  在这项工作中,我们使用不同频率的正弦和余弦函数:
PE(pos,2i)=sin(pos/100002i/dmodel)PE_{(pos,2i)}=sin(pos/10000^{2i/d_{model}})PE(pos,2i)​=sin(pos/100002i/dmodel​)
PE(pos,2i+1)=cos(pos/100002i/dmodel)PE_{(pos,2i+1)}=cos(pos/10000^{2i/d_{model}})PE(pos,2i+1)​=cos(pos/100002i/dmodel​)
其中,pospospos是位置,iii是维度。也就是说,位置编码的每个维度对应于正弦曲线。波长形成从2π2π2π到10000⋅2π10000·2π10000⋅2π的几何级数。我们选择了这个函数,因为我们假设它允许模型容易地学习相对位置,因为对于任何固定偏移kkk,PEpos+kPE_{pos+k}PEpos+k​可以表示为$PE_{pos}的线性函数。
  我们还尝试使用学习的位置嵌入,并发现两个版本产生了几乎相同的结果(参见表3第(E)行)。我们选择了正弦曲线版本,因为它可以允许模型外推到比训练期间遇到的序列长度更长的序列长度

4.Why Self-Attention

在本节中,我们将self-attention层的各个方面与通常用于将一个可变长度字符表示序列(x1,...,xn)(x_1,...,x_n)(x1​,...,xn​)映射到另一个相同长度的序列(z1,...,zn)(z_1,...,z_n)(z1​,...,zn​)的循环和卷积层进行比较,其中xi,zi∈Rdx_i, z_i\in R^dxi​,zi​∈Rd,例如典型序列转换编码器或解码器中的隐藏层。 激励我们使用self-attention的原因,主要是以下三个:
  (1)一个是每层的总计算复杂度。
  (2)另一个是可以并行化的计算,通过所需的最小顺序操作数来衡量。
  (3)第三个是网络中远程依赖之间的路径长度。学习远程依赖性是许多序列转换任务中的关键挑战。影响学习这种依赖性的能力的一个关键因素是前向和后向信号必须在网络中传播的路径的长度。输入和输出序列中任何位置组合之间的这些路径越短,学习远程依赖性就越容易。因此,我们还比较了由不同类型层组成的网络中任意两个输入和输出位置之间的最大路径长度。
  如表1所示,self-attention层使用恒定数量的顺序执行的操作连接所有位置,而循环层需要O(n)O(n)O(n)个顺序操作。就计算复杂度而言,当序列长度nnn小于表示维度ddd时,自注意层比复现层更快,这通常是机器翻译中最先进模型使用的句子表示的情况,例如word-piece和 byte-pair表示。为了提高涉及非常长序列的任务的计算性能,可以将self-attention限制为仅考虑以相应输出位置为中心的输入序列中的大小为rrr的邻域。这会将最大路径长度增加到O(n/r)O(n /r)O(n/r)。我们计划在未来的工作中进一步研究这种方法。
  卷积核宽度为k&lt;nk&lt;nk<n的单个卷积层不会连接所有输入和输出位置对。这样做需要在连续核的情况下堆叠O(n/k)O(n/k)O(n/k)卷积层,或者在扩张卷积的情况下,在网络中增加任意两个位置之间的最长路径的长度,而这需要O(logk(n))O(log_k(n))O(logk​(n))。卷积层通常比循环层更昂贵,为k倍。然而,可分离的卷积大大降低了复杂度O(k⋅n⋅d+n⋅d2)O(k·n·d+n·d^2)O(k⋅n⋅d+n⋅d2)。然而,即使k=nk=nk=n,可分离卷积的复杂性也等于self-attention和前馈网络层的组合(即我们在模型中采用的方法)。
  作为attention附带的好处,self-attention可以产生更多可解释的模型。我们测试模型中的注意力分布,并在附录中展示和讨论示例。个别attention head不仅清楚地学会执行不同的任务,许多head似乎表现出与句子的句法和语义结构相关的行为。

Attention Is All You Need翻译相关推荐

  1. “Attention is All You Need 翻译

    <p><img src="output_0_0.png" alt="png"></p> "Attention is ...

  2. Diversity Regularized Spatiotemporal Attention for Video-based Person Re-identification 翻译

    基于视频的人体再识别的时间规整化时空注意 项目地址:https://github.com/ShuangLI59/Diversity-Regularized-Spatiotemporal-Attenti ...

  3. Transformer新内核Synthesizer:低复杂度的attention代替点乘式的注意力机制

    论文链接:https://arxiv.org/pdf/2005.00743.pdf 参考文档:https://mp.weixin.qq.com/s/e2Cor8amz7GiFfBGdLXULg 导读 ...

  4. 语言模型(五)—— Seq2Seq、Attention、Transformer学习笔记

    按:三个月前的一篇笔记,先发出来,后面还会有第二次学习的笔记,两者结合起来看,更加爽口. 本篇笔记5000余字,可细嚼,亦可跳阅. 机器翻译 本篇笔记中要开始介绍的Encoder-Decoder模型最 ...

  5. 基于attention机制的中英文机器翻译

    前言 为了准备3月中旬的复试,今天回顾整理一下大三下学期做的机器学习课程设计,当时做的是基于attention机制的中英文机器翻译.参考的资料是pytorch官网的英法文间的机器翻译.pytorch参 ...

  6. 基于pytorch+python实现一个中文到英文的神经网络的翻译模型

    资源下载地址:https://download.csdn.net/download/sheziqiong/85980607 资源下载地址:https://download.csdn.net/downl ...

  7. PaddlePaddle深度学习实战——英法文翻译机

    51CTO技术栈 " 自然语言处理[1]是计算机科学领域与人工智能领域中的另一个重要方向,其中很重要的一点就是语音识别(speech recognition).机器翻译.智能机器人. 与语言 ...

  8. attention加权机制

    attention 1.在模型举例在机器翻译的任务当中,翻译得到的每个y的时候,更加关注于某个x,当翻译am的时候,就应该更关注输入当中的 是,让机器也具备这种关注的能力. 2.怎么关注?当翻译y1的 ...

  9. Attention Is All You Need 论文笔记

    Attention Is All You Need 论文笔记 文章目录 Attention Is All You Need 论文笔记 背景 Tansformer模型简介 Attention & ...

最新文章

  1. 粒子耗尽 粒子滤波_如何使用粒子的强大蓝牙API
  2. GirdView的文本属性对象省略溢出标记设置
  3. 计算机网络技能专项训练一:基础配置
  4. android 快应用原理,快应用初探——写一个快应用练练手。
  5. 数据结构第5章例题 若矩阵Am×n中存在某个元素aij满足:aij是第i行中的最小值且是第j列中的最大值,则称该元素为矩阵A的一个鞍点。试编写一个算法,找出A中的所有鞍点。
  6. 【STM32】窗口看门狗
  7. python 学习笔记一
  8. LeetCode算法入门- Multiply Strings -day18
  9. 18 岁少年盗取价值 90 万元加密货币,交易所被迫关停!
  10. [Bzoj2120]数颜色
  11. Struts2之OGNL表达式与值栈对象及常用标签的使用
  12. 阶段2 JavaWeb+黑马旅游网_15-Maven基础_第5节 使用骨架创建maven的java工程_18maven的java工程取mysql数据库...
  13. python多条件求和_数据的多条件求和
  14. python fun函数输入某年某月_Python编程实现输入某年某月某日计算出这一天是该年第几天的方法...
  15. mysql数据库出现2003-Can‘t connect to MySQL server on ‘localhost‘ (10061)的解决方法
  16. python编写简易木马程序_python简易木马编写
  17. 关于mvn repository的one more step人机验证问题的解决
  18. 如何画好软件架构图?为什么说我们需要软件架构图?
  19. 大数据开发之安装mysql
  20. Microsoft Office Word 2010-2016中公式不能自动斜体的解决方法

热门文章

  1. 【新手教程】51Sim-One Cloud 2.0 构建标准案例2.0场景
  2. 文本压缩算法的对比和选择
  3. HTML学习9 JS 数字和字符串 变量的类型 运算符和表达式 布尔值和关系运算符、逻辑运算符
  4. Python 实现“人生重开模拟器“
  5. 深圳软件测试培训:软件测试的工资高还是开发者工资高?
  6. 2018年全球大数据公司全景画像汇总
  7. 深海打捞计划——VapourSynth学习笔记(一)
  8. 使用GoogleTranslateIpCheck查找适用谷歌翻译服务器ip,解决谷歌浏览器无法翻译问题
  9. 一站式SCI投稿大全(感谢pennhmp116版主的整理)
  10. C++STL标准库学习笔记(一)sort