当前位置: 首页 > news >正文

Attention Is All Your Need论文翻译

0.摘要

这个统治序列转换模型是基于复杂循环或者卷积神经网络,它包含编码器和解码器。表现最好的模型也通过注意力机制来连接编码器和解码器。我们提出了一个新的简单网络架构——Transformer,它仅仅是是基于注意力机制,完全免去递推和卷积。在两个机器翻译任务的实验表明,这些模型在质量上更好,同时更好的并行性和需要的训练时间显著减少。我们的模型在WMT 2014英翻德的任务上实现了28.4 BLEU,比现有的最好的结果(包括ensembles)提高了2 BLEU。在WMT 2014英翻法任务中,我们的模型在8个GPU上训练了3.5天后,建立了一个新的单模型最新BLEU分数为41.8,这是文献中最好模型的训练成本的一小部分。我们通过成功地应用Transformer到英语选区用大量有限地训练数据分析,发现Transformer可以很好地泛化到其他任务上。

1.引言

循环神经网络、特别是长短期记忆和门控神经网络,已经被稳定地建立在序列模型和转换问题(比如语言模型和机器翻译)的最新方法中。此后,大量的精力继续推动循环语言模型和编码-解码架构的界限。

循环模型通常沿着把输入和输出序列的符号位置进行计算。将位置和计算时间中的步骤进行对其,它们产生一系列隐藏状态ht,作为前一个隐藏状态ht-1和位置t输入的一个函数。这个固有的顺序性质阻止训练样本中的并行性,这在更长的序列长度上是至关重要的,因为内存限制限制了样本间的批处理。最近工作通过因数分解技巧和条件计算在计算效率上已经实现了显著的进步,与此同时提升了后者的模型性能。但是,根本的顺序计算限制仍然存在。

注意力机制已经成为各种任务中引人入胜的序列建模和转换模型的一个必要的部分,允许依赖建模,而不考虑它们在输入输出序列上的距离。但是,除了一些例子中,这样的注意力机制被用来与一个循环网络结合。

在这项工作中,我们提出了Transformer,这是一个回避循环并且完全依赖注意力机制去绘制输入和输出间的全局依赖关系的模型架构。Transformer允许显著的更多并行性并且在8块P100GPU上被训练只要12小时就可以在翻译质量上达到一个最先进的水平。

2.背景

减少序列化计算的目标也是为可扩展神经元GPU——ByteNet和ConvS2S奠定基础,它们都使用卷积神经网络作为基本构建块,并行计算所有输入输出位置的隐藏表示。在这些模块中,被要求关联两个任意输入或输出位置的信号的操作数量随着位置间距离的增长而增长,对于ConvS2S是线性增长而对于ByteNet是对数增长。这使得去学习两个远距离位置的依赖关系更加困难。在Transformer中,这被减少到一个恒定的操作数量,尽管其代价是由于平均注意力加权位置而减少有效分辨率,我们在3.2节中描述用一个多头注意力来抵消的影响。

自我注意力有时又叫内部注意力,这是一个注意力机制,是将单个序列不同位置联系起来以计算一个序列表示的注意力机制。自我注意力已经被成功地运用到不同地任务中,包括阅读理解,抽象总结,文本蕴含和学习任务无关的句子表示。

端到端的记忆网络是基于一个循环注意力机制而不是序列对齐递归,并且在简单语言问答和语言模型任务中表现很好。

但是,据我们所知,Transformer是第一个完全依赖自注意力去计算它的输入输出表示的转换模型,而没有使用序列对齐RNN或者卷积。在接下来的小结中,我们会描述Transformer,激励自我注意力和讨论它相对于[17]、[18]、[9]的优势。

3.模型架构

大部分竞争的神经序列转换模型有编码-解码结构。这里,编码器映射了一个符号表示的输入序列(x1,x2,x3,…,xn)到一个持续表示序列z=(z1,z2,…,zn)。给定向量z,解码器然后会产生一个符号输出序列(y1,y2,….,ym),每次一个元素。每一步这个模型是自动回归的,当产生下一个时,将之前生成的符号作为额外的输出。

图片1:Transformer的模型架构

Transformer遵循这个整体架构,对编码器和解码器使用堆叠自关注和逐点、全连接层,分别出现在图片1的左右两部分。

3.1编码器和解码器堆栈

编码器:编码器是由6个相同层的堆栈组成。每一层有两个自层。第一个子层是一个多头自关注机制,并且第二个子层是一个简单的,逐点的,全连接前向网络。我们在两个子层周围采用残差连接,然后进行层归一化。那就是,每个子层的输出是LayerNorm(x+Sublayer(x)), 其中Sublayer(x)是子层本身实现的函数。为了促进这些残差连接,模型中的所有子层和嵌入层,都会产生维度为d=512的输出。

解码器:这个解码器也是有6个相同层的堆栈组成。除了每个编码层中两个子层,解码器插入第三层,它在编码器堆栈的结果上执行多头注意力。与编码器类似,我们在每个子层周围采用残差连接,然后进行层归一化。我们也在解码器堆栈上修改自注意子层,以防止位置关注后续位置。这种掩蔽与输出嵌入偏移一个位置的事实相结合,确保对于位置i的预测仅仅依赖于小于i位置的已知输出。

3.2注意力

注意力函数可以被描述为将查询和一组键值对映射到输出,这里的查询,键,值和输出都是向量。输出被计算为值的加权和,其中赋每个值的权重是由查询相应键的兼容性函数计算的。

图片2:(左边)缩放的点积注意力,(右边)多头注意力由多个并行运行的注意力层组成

3.2.1 缩放点积注意力

我们称我们特别注意力为“缩放点积注意力”(如图2)。这个输入包含了维度为dk的查询和键,和维度为dv的值。我们使用所有的键计算查询的点积,将每个键除以根号dk,然后应用softmax函数去获得值上的权重。

事实上,我们同时计算一组查询上的注意力函数,并将它们打包成一个矩阵Q。键和值也被一起打包到矩阵K和V中。我们计算输出矩阵为:

两个最常用的注意力函数是加性注意力和点积(乘法)注意力。点积注意力和我们算法相同,除了缩放因子1/根号dk。附加注意力使用具有一个单隐藏层的前向反馈网络计算兼容性函数。尽管这两个在理论复杂度上相似,点积注意力事实上更快更节省空间,因为它可以使用高度的矩阵乘法代码实现。

尽管对于较小值的dk,两个机制地表现相似,附加注意力优于点积注意力,而无需针对较大的dk值进行缩放。我们怀疑,对于较大的dk值,点积的幅度会增大,从而推动softmax函数到它极小的梯度区域中。为了抵消这种音响,我们将点积缩放1/根号dk。

3.2.2多头注意力

我们发现使用不同的学习线性投影到dk,dk和dv维度h次是有益的,而不是用dmodel维度的键,值和查询来执行单个注意力函数。然后,我们对于这些查询,键和值的投影版本的每一个并行地执行注意力函数,产生dv维度的输出值。它们被连接并且再次投影,导致最终的值,如图2所示。

多头注意力允许这个模型共同关注来自不同地点不同表示子空间的信息。对于单注意力头,平均会抑制这种情况。

其中投影是参数矩阵

在这个工作中,我们使用了h=8的并行注意力层或者头。对于这些中每一个,我们使用dk = dv = dmodel / h = 64。由于每个头减少的维度,这个总的计算成本与使用全维度的单头注意力是相似的。

3.2.3注意力在我们模型中的应用

Transformer在三个方面使用多头注意力:

在“编码-解码注意”层中,这个查询来自之前的解码层,并且内存键和值来自编码器的输出。这允许解码器中的每个位置去参与输入序列的所有位置。这模仿序列到序列模型中典型的编码-解码注意力机制,如。

编码器包含自我注意力层。在一个自我注意力层中,所有的键、值和查实训来自同一个地方,在这个例子中,是编码器先前层的输出。编码器的每个位置可以关注编码器上一层的所有位置。

相似地,解码器中自注意力层允许解码器中每个位置关注解码器中达到并包含该位置的所有位置。我们需要去防止解码器中的左向信息流,以保留自回归属性。我们通过屏蔽(设置负无穷)softmax输入中所有与非法连接相对应的值来实现缩放点积注意力的内部。如图2。

3.3位置式前反馈网络

除了注意力子层,在我们编码-解码器中的每一层包含了一个全连接前向反馈网络,这被分别且相同地应用到每个位置。这是由两个线性变换组成,中间有一个ReLu激活。

尽管不同位置的线性变换是相同的,它们从一层到另一层用不同的参数。另一个描述这个的方式是内核大小为1的两个卷积。输入输出的维度是dmodel=512,并且内部层有dff=2048的维度。

3.4嵌入和softmax

与其他序列转换模型相似,我们使用学习嵌入去把输入标记和输出标记转换为维度dmodel的向量。我们使用学习嵌入去把输入标记和输出标记转换为维度dmodel的向量。我们还使用常用的学习线性转换和softmax函数去把解码输出转换为预测下一个标记的可能性。在我们的模型中,我们在两个嵌入层和预softmax线性转换之间共享同样的权重矩阵,类似于[30]。在嵌入层中,我们将那些权重乘以根号dmodel。

表格1:对于不同层类型的最大路径长度,每层复杂度和序列操作的最小数量。N是序列长度,d是表示维度,k是卷积核大小并且r是受限自注意力中领域的大小。

3.5位置编码

因为我们的模型不包含递归或卷积,为了使模型利用序列的顺序,我们必须投入一些有关序列中标记的相关或者绝对位置的信息。为此,我们把“位置编码”添加到在编码和解码栈底部的输入嵌入中。这个位置编码有着和嵌入相同的维度dmodel,以至于这两个可以被求和。有许多位置编码的选择,有学习的,有固定的。

在我们工作中,我们使用不同频率的sin和cos函数。

其中,pos是位置,i是维度。那是,位置编码的每个维度对应于正弦函数。波长形成从2Π到1000·2Π的几何级数。我们选择这个函数因为我们假定它会允许模型去轻松学习关注相关位置,因为对于任意固定的偏差k,PEpos+k可以被表示为PEpos的线性函数。

我们还尝试使用学习的位置嵌入,并且发现这两个版本产生几乎相同的结果(看表格3行E)。我们选择正弦版本,因为它可能允许模型去推断比在训练期间遭遇的序列长度更长的序列长度。

4 为什么是自注意力

在这个部分,我们把自注意力层的各种方面与循环层和卷积层进行比较,这些层通常被用于将符号表示的一个可变长度序列(x1,x2,..,xn)映射到另一个等长序列(z1,z2,...,zn),其中 xi, zi ∈ Rd,例如典型序列转换编码器或者解码器中的隐藏层。随着激励我们使用自注意力,我们考虑三个需求。

一是每层的总计算复杂度。另一个是可以并行化的计算量,这是以所需最小顺序操作数量来衡量。

第三个是在网络中远程范围依赖之间的路径长度。学习远程依赖是许多序列转换任务中的关键挑战。一个影响学习这样依赖关系能力的关键因素是前向后向信号必须在网络中传播的路径长度。在输入输出序列中任何位置组合之间的路径越短,那么学习远程依赖关系也就越容易。

如表1所提到的,一个自关注层用一个固定的数量的序列执行操作连接所有位置,而一个循环层需要O(n)的序列操作。就计算复杂度而言,当序列长度n比表示维度d更小时,自注意力层比循环层更快,这通常是机器翻译中最新的模型使用的句子表示的情况,例如word-piece和byte-pair表示。为了提高长序列任务的计算性能,自注意力可能被限制去考虑输入序列中以相关输出位置为中心的大小为r的领域。这会增加最大路径长度到O(n/r)。我们计划在未来的工作中进一步研究这个方法。

一个内核宽度为k<n的单卷积层没有连接所有对的输入输出位置。做这样的事需要连续内核的一堆O(n/k)卷积层,或者在扩张卷积下的O(logk(n)),从而增加网络中任意两个位置之间最长路径的长度。卷积层通常比循环层更加贵k倍。但是,可分离卷积大大降低了复杂度达到O(knd + nd^2)。但是,即使k = n,一个可分离卷积的复杂度与自我注意力层和逐点前反馈层的组合相等,我们的模型中采取了这个方法。

作为附带的好处,自我注意力会产生更多可解释模型。我们检查模型中的注意力分布并且展示和讨论附录中的例子。个人注意力头不仅清晰学习执行不同的任务,而且许多其他注意力头似乎表现出关于句子语法和语义结构的行为。

5 训练

这个部分描述了我们模型的训练制度。

5.1 训练数据和批处理

我们使用标准WMT2014英翻德数据集上训练,该数据集包含大约450万句子对。句子是使用byte-pair编码的,这是一个大约由37000标记的共享源目标词汇。对于英翻法,我们使用包含3600万个句子组成的更大的WMT2014英翻法数据集,并且把标记分隔成32000个单词片段词汇表。

5.2硬件和时间表

我们在一个装有8块NVIDIA P100 GPUs上训练我们的模型。对于我们使用整篇论文中描述的超参数基本模型,每个训练步骤花了0.4s。我们训练这个基本模型花了共计100000步骤或者12h。对于我们的大模型(表3的底线所描述的),步长时间花了1秒。这个大模型被训练了300000步(3.5天)。

5.3优化器

我们使用beta1 = 0.9, beta2 = 0.98 和 c = 10e-9的Adam优化器。我们根据公式在训练过程中改变学习率。

这与第一个warmup_steps训练步骤线性地增加学习率相一致,然后与步骤数平方根的倒数成比例地减少。我们使用warmup_steps = 4000。

5.4正则化

我们在训练期间采用三种类型的正则化:

表2:Transformer在英翻德和英翻法newtest2014测试中以小部分训练成本实现了比先前最新的模型更好的BLEU分数

剩余辍学率: 我们应用dropout到每个子层的输出上,在它被添加到子层输入和被标准化之前。此外,我们将dropout应用到编码和解码堆栈中的的嵌入和位置编码综合。对于基准模型,我们使用Pdrop = 0.1的比率。

标签平滑:在训练期间,我们使用了值c = 0.1的标签平滑。这损害了困惑度,随着模型学习变得更加的不确定,但是提升了准确度和BLEU分数。

6结果

6.1机器翻译

在WMT 2014 英翻德的翻译任务上,一个大转换模型(表2Transformer(大)),比之前已报道过最好的模型(包括集成)表现要好2.0BLEU以上,然后建立了一个全新的最新28.4BLEU 分数。该模型的配置列于表3的最后一行。在8块P100GPU上训练了3.5天。甚至我们的基准模型超过了所有之前已经发布的模型和集成,训练成本是任何竞争模型的一小部分。

在WMT2014英法翻译任务中,我们的大模型获得了41.0的BLEU分数,超过了之前所有已发布的单个模型,比之前最新模型的训练成本的1/4还要少。这个被训练英法翻译的Transformer(大)模型使用辍学率Pdrop = 0.1,而不是0.3。

对于基准模型,我们使用通过平均最后5个检查点而获得的单个模型,这些检查点以10分钟的间隔写入。对于大模型,我们对最后20个检查点进行平均。我们使用波束搜索,波束大小为4,长度惩罚alpha = 0.6。这些超参数在开发集上的实验后被选择。我们将推理期间设置最大输出长度为输入长度+50,但是尽可能提前终止。

表2总结了我们的结果,并且把我们翻译质量和训练成本与文献中的其他模型架构进行了比较。我们通过将训练时间、使用的GPU数量以及每块GPU持续的单精度浮点容量的估计相乘来估计用于训练模型的浮点操作数量。

6.2模型变化

为了评估Transformer不同组件的重要性,我们用不同的方式改变了我们的基准模型,测量了在开发集newstest2013上英德翻译性能的变化。我们使用上一届中描述的波束搜索,但是没有平均检查点。我们在表三中呈现这些结果。

表3:Transformer架构上的变化。未列出的价值等同于哪些基准模型。所有指标是在英德翻译开发集newstests2013上。根据我们字节对编码,列出的困惑度是每个单词并且不应该与每个单词困惑度进行比较。

在表3行A中,正如3.2.2描述的,我们改变了注意力头和注意力键值维度的数量,使得计算量恒定。尽管弹头注意力比最好的设置要差0.9BLEU,但是头数过多质量也会下降。

在表3行B,我们观察到,下降的注意力键大小dk损害了模型质量。这里表明,确定兼容性并不容易并且一个更加复杂的兼容性函数与点积相比可能是有益的。我们进一步观察行C和行D发现,正如预期的,更大的模型是更好的,并且辍学是有助于避免过拟合的。在行(E),我们用学习位置嵌入取代我们正弦位置编码,并且观察到几乎与基本模型等同的结果。

6.3英语选区解析

为了评估这个Transformer是否可以泛化到其他任务,我们在英语选取解析上进行实验。这个任务提出了具体的挑战:输出受到强大结构约束并且明显比输入更长。进一步,RNN序列到序列模型不能够在小数据情况下获得最先进的结果。

我们在Penn Treebank的WSJ上,部分训练一个维度dmodel=1024的4层transformer,大约4万个训练句子。我们还在半监督环境中对其进行训练,使用了更大的高置信度和BerkleyParser语料库,其中包含大约1700万个句子。我们仅在WSJ设置中使用了1.6万个标记的词汇表,并且在半监督设置中使用了3.2万个标记的词汇表。

我们执行仅仅一小部分实验区选择dropout、注意力和残差(第5.4节),学习率和波束大小在2.2节开发集,所有其他参数与英语到德语基本翻译模型保持不变。在推理过程中,我们增加最大输出长度到输入长度+300。对于仅WSJ和半监督设置,我们使用大小为21的波束和apha=0.3。

表4:Transformer泛化很好到英语选区解析(结果见WSJ的23节)

表4中我们的结果表明,尽管缺乏特定任务的调整,我们的模型表现出奇的好,比之前报告的所有模型(循环神经网络语法除外)产生了更好的结果。

与 RNN 序列到序列模型 [37] 相比,即使仅在 WSJ 40K 句子训练集上进行训练,Transformer 的性能也优于 BerkeleyParser [29]。

7总结

在这个工作中,我们呈现了Transformer,这是第一个完全基于注意力的序列转导模型,用多头自我注意力取代在编码-解码架构中最常使用的推导层。

我们对基于注意力的模型的未来感到兴奋,并计划将其应用于其他任务。我们计划将 Transformer 扩展到涉及文本以外的输入和输出模式的问题,并研究局部的、受限的注意力机制,以有效地处理图像、音频和视频等大型输入和输出。减少一代的顺序是我们的另一个研究目标。

我们用于训练和评估模型的代码可在 https://github.com/tensorflow/tensor2tensor 上找到。

致谢 我们感谢Nal Kalchbrenner和Stephan Gouws富有成效的评论、更正和启发。

相关文章:

  • 详解CC++内存管理(new和delete)
  • C#面:在.NET中 类 System.Web.UI.Page 可以被继承吗?
  • 解决‘vue‘ 不是内部或外部命令,也不是可运行的程序(设置全局变量)
  • Lua 教程
  • 3 scala集合-Set
  • Hive3.1.2——企业级调优
  • 如何用 npm 运行本地 js 文件
  • 山脉的个数/攀登者
  • 二叉树-------前,中,后序遍历 + 前,中,后序查找+删除节点 (java详解)
  • Stream流学习笔记
  • openJudge | 过滤多余的空格 C语言
  • Leetcode29:两数相除
  • 【python之美】减少人工成本之批量拿取文件名保存_4
  • Rust的Match语句:强大的控制流运算符
  • Gin 中使用 base64Captcha 生成图形验证码
  • 【407天】跃迁之路——程序员高效学习方法论探索系列(实验阶段164-2018.03.19)...
  • Codepen 每日精选(2018-3-25)
  • CSS 提示工具(Tooltip)
  • Java 最常见的 200+ 面试题:面试必备
  • JAVA_NIO系列——Channel和Buffer详解
  • JS基础之数据类型、对象、原型、原型链、继承
  • JS学习笔记——闭包
  • linux学习笔记
  • Objective-C 中关联引用的概念
  • PHP 小技巧
  • Python中eval与exec的使用及区别
  • RxJS 实现摩斯密码(Morse) 【内附脑图】
  • Sequelize 中文文档 v4 - Getting started - 入门
  • supervisor 永不挂掉的进程 安装以及使用
  • 分类模型——Logistics Regression
  • 浮动相关
  • 干货 | 以太坊Mist负责人教你建立无服务器应用
  • 基于web的全景—— Pannellum小试
  • 聊聊flink的BlobWriter
  • 前端代码风格自动化系列(二)之Commitlint
  • 什么是Javascript函数节流?
  • 赢得Docker挑战最佳实践
  • 在electron中实现跨域请求,无需更改服务器端设置
  • 树莓派用上kodexplorer也能玩成私有网盘
  • #Linux(Source Insight安装及工程建立)
  • #QT(串口助手-界面)
  • #在线报价接单​再坚持一下 明天是真的周六.出现货 实单来谈
  • (5)STL算法之复制
  • (附源码)springboot 个人网页的网站 毕业设计031623
  • (附源码)ssm高校运动会管理系统 毕业设计 020419
  • (亲测有效)解决windows11无法使用1500000波特率的问题
  • (四)图像的%2线性拉伸
  • (五)网络优化与超参数选择--九五小庞
  • (转)GCC在C语言中内嵌汇编 asm __volatile__
  • ./mysql.server: 没有那个文件或目录_Linux下安装MySQL出现“ls: /var/lib/mysql/*.pid: 没有那个文件或目录”...
  • .bat批处理(九):替换带有等号=的字符串的子串
  • .net core 微服务_.NET Core 3.0中用 Code-First 方式创建 gRPC 服务与客户端
  • .NET 中什么样的类是可使用 await 异步等待的?
  • .net6解除文件上传限制。Multipart body length limit 16384 exceeded
  • @WebService和@WebMethod注解的用法