【论文翻译】Attention Is All You Need

news/2024/11/28 22:35:06/

【论文】Attention is All you Need (neurips.cc)

摘要

主要的序列转换模型是基于复杂的循环或卷积神经网络,其中包括一个编码器和一个解码器。表现最好的模型还通过注意机制连接编码器和解码器。我们提出了一个新的简单的网络架构,Transformer,完全基于注意力机制,完全不使用循环和卷积。在两个机器翻译任务上的实验表明,这些模型在质量上更优越,同时更具有并行性,需要的训练时间也大大减少。我们的模型在WMT 2014英语-德语翻译任务中达到了28.4 BLEU,比现有的最佳结果(包括集合)提高了超过2 BLEU。在WMT 2014英语到法语的翻译任务中,我们的模型在8个gpu上训练3.5天后,建立了一个新的单模型最先进的BLEU评分41.8,这只是文献中最好模型训练成本的一小部分。通过将Transformer成功应用于大量和有限训练数据的英语选区解析,我们表明Transformer可以很好地推广到其他任务。

1. 介绍

        循环神经网络,特别是长短期记忆[13]和门控循环[7]神经网络,已经被确定为序列建模和转换问题(如语言建模和机器翻译)的最先进方法[35,2,5]。自那以后,许多努力继续推动循环语言模型和编码器-解码器架构的边界[38,24,15]。

        循环模型通常沿着输入和输出序列的符号位置进行计算。在计算时间中将位置与步骤对齐,它们生成一个隐藏状态H_{t} 序列,作为前面的隐藏状态 H_{t-1} 和位置 t 的输入的函数。这种固有的连续性质使训练示例中不能并行化处理,这在较长的序列长度中变得至关重要,因为内存限制了跨示例的批处理。最近的工作通过因数分解技巧[21]和条件计算[32]在计算效率上取得了显著的提高,同时也改善了后者的模型性能。然而,顺序计算的基本约束仍然存在。

        在各种任务中,注意力机制已经成为引人注目的序列建模和转换模型的一个组成部分,允许在不考虑它们在输入或输出序列中的距离的情况下建模依赖关系[2,19]。然而,除了少数情况外,这种注意机制都是与循环网络结合使用的。

        在这项工作中,我们提出了Transformer,这是一种不使用循环的模型架构,而是完全依赖于注意机制来绘制输入和输出之间的全局依赖关系。Transformer允许明显更高的并行化,并且在8个P100 gpu上训练12小时后,可以达到翻译质量的新水平。

2. 背景

        减少顺序计算的目标也构成了Extended Neural GPU[16]、ByteNet[18]和ConvS2S[9]的基础,它们都使用卷积神经网络作为基本构建块,为所有输入和输出位置并行计算隐藏表示。在这些模型中,来自两个任意输入或输出位置的信号的关联 所需的操作数量 随着位置之间的距离而增长,ConvS2S为线性增长,ByteNet为对数增长。这使得学习遥远位置之间的依赖关系[12]变得更加困难。在Transformer中,这被减少为一个常数数量的操作,尽管代价是由于平均注意力加权位置而降低了有效分辨率,我们用Multi-Head Attention抵消了这一影响,如3.2节所述。

        自注意力(Self-attention),有时也称为内部注意(intra-attention ),是一种将单个序列的不同位置联系起来的注意机制,以便计算序列的表示。自我注意已成功应用于多种任务,包括阅读理解、抽象总结、文本蕴涵和学习任务无关的句子表征[4,27,28,22]。

        端到端记忆网络基于循环注意力机制,而不是序列对齐的循环,在简单语言问题回答和语言建模任务中表现良好[34]。

        然而,据我们所知,Transformer是第一个完全依靠自注意力来计算输入和输出表示的转换模型,而不使用序列对齐的rnn或卷积。在接下来的章节中,我们将介绍Transformer,使用自注意力,并讨论它相对于[17,18]和[9]等模型的优势。

3 模型架构

        大多数有竞争力的神经序列转导模型有一个编码器-解码器结构[5, 2, 29]。在这些模型中编码器将输入的符号表示序列( x 1 , . . . , x n ) 映射为连续表示序列z = ( z 1 , . . . , z n ) 。给定z后,解码器产生一个输出序列( y 1 , . . . , y n )的符号,每次一个元素。在每一步,该模型都是自动循环的[9],在生成下一步时,消耗先前生成的符号作为额外的输入。

        Transformer遵循这一整体架构,在编码器和解码器中都使用了堆叠式自注意力和点式全连接层,分别在图1的左半部和右半部显示。

 3.1 编码器和解码器堆栈

编码器。编码器是由N=6个相同的层堆叠而成。每层有两个子层。第一层是一个多头的自注意力机制,第二层是一个简单的、位置上的全连接前馈网络。我们在两个子层中采用一个残差连接[10],然后进行层归一化[1]。也就是说,每个子层的输出是LayerNorm(x + Sublayer(x)),其中Sublayer(x)是由子层本身实现的函数。为了方便这些剩余连接,模型中的所有子层以及嵌入层都会产生尺寸为 d_{model}= 512 的输出。

解码器。解码器也是由N=6个相同层的堆栈组成。除了每个编码器层的两个子层之外,解码器还插入了第三个子层,它对编码器堆栈的输出进行多头注意力。与编码器类似,我们在每个子层周围采用残差连接然后进行层归一化。我们还修改了解码器堆栈中的自注意力子层,以防止位置关注后续位置。这种屏蔽,再加上输出嵌入偏移一个位置的事实,确保对位置i的预测只取决于小于i的位置的已知输出。

3.2 注意力

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

3.2.1 缩放点积注意力

我们把我们的特殊关注称为 “缩放点积关注”(图2)。输入包括维度为d_{k}​的queries和keys,以及维度为d_{v}​的values。我们计算queries与所有keys的点积,将每个keys除以\sqrt{d_{k}}​​,并应用softmax函数来获得数值的权重。

 在实践中,我们同时计算一组queries的注意函数,并将其打包成矩阵Q,keys和values也被打包成矩阵K和V。我们计算输出的矩阵为:

 

两种最常用的注意力函数是加法注意力[2],和点乘法(乘法)注意力。除了\frac{1}{\sqrt{d_{k}}}这个比例因子外,点乘法注意力与我们的算法相同。加法注意力使用具有单个隐藏层的前馈网络来计算兼容性函数。虽然两者在理论上的复杂性相似,但点积式注意力在实践中要快得多,而且空间效率更高,因为它可以用高度优化的矩阵乘法代码来实现。

虽然对于d_{k}的小值来说,这两种机制的表现相似,但对于d_{k}的大值来说,加法注意力优于点积注意力,且不存在扩展性[3]。我们怀疑对于大的值来说,点积的幅度很大,把softmax函数推到它的梯度极小的区域。为了抵消这种影响,我们将点积的比例定为\frac{1}{\sqrt{d_{k}}}

 

3.2.2 多头注意力

我们发现,与其用d_{model}维的keys、values和queries来执行一个单一的注意函数,不如用不同的、学习过的线性投影将queries、keys和values分别投影到d_{k}​,d_{k}​和d_{v}​维,这样做是有益的。在这些投射的查询、键和值的每个版本上,我们再平行地执行注意函数,产生d_{v}​维的输出值。这些值被串联起来,并再次进行投影,得到最终的数值,如图2所示。

多头注意允许模型在不同的位置上共同关注来自不同表征子空间的信息。在单头注意的情况下,平均化抑制了这一点。

 在这项工作中,我们采用了h = 8的平行注意层,或称头。对于每个头,我们使用d_{k}=d_{v}=d_{model}/h=64。由于每个头的维度减少,总的计算成本与全维度的单头注意相似。

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

Transformer 以三种不同的方式使用多头关注。
  - 在 "编码器-解码器注意 "层中,queries来自前一个解码器层,而keys和values来自编码器的输出。这允许解码器中的每个位置都关注输入序列中的所有位置。这模仿了序列到序列模型中典型的编码器-解码器注意力机制,如[31, 2, 8]。
  - 编码器包含自注意力层。在自注意力层中,所有的keys、values和queries都来自同一个地方,在这种情况下,就是编码器中前一层的输出。编码器中的每个位置都可以关注到编码器前一层的所有位置。
  - 同样,解码器中的自注意力允许解码器中的每个位置关注解码器中的所有位置,直到并包括该位置。我们需要防止解码器中的信息向左流动,以保持自动回归的特性。我们通过掩盖(设置为-∞)softmax输入中对应于非法连接的所有值,在缩放点积注意力内部实现这一点。见图2。

 3.3 Position-wise Feed-Forward Networks

         除了注意子层之外,我们的编码器和解码器中的每一层都包含一个全连接的前馈网络,该网络分别适用于每个位置,并且完全相同。这包括两个线性变换,中间有一个ReLU激活。

        虽然线性变换在不同的位置上是相同的,但它们在不同的层上使用不同的参数。另一种描述方式是将其作为两个内核大小为1的卷积。输入和输出的维度为d_{model}=512,内层的维度为d_{ff}=2048

3.4 嵌入和Softmax

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

3.5 位置编码

        由于我们的模型不包含递归和卷积,为了使模型能够利用序列的顺序,我们必须注入一些关于序列中标记的相对或绝对位置的信息。为此,我们在编码器和解码器堆栈的底部为输入嵌入添加 “位置编码”。位置编码与嵌入具有相同的维度dmodel,因此这两者可以相加。有很多位置编码的选择,有学习的,也有固定的[8]

        在这项工作中,我们使用不同频率的正弦和余弦函数。

 其中pos是位置,i是维度。也就是说,位置编码的每个维度对应于一个正弦波。波长形成一个从2π到10000·2π的几何级数。我们选择这个函数是因为我们假设它能使模型很容易地学会通过相对位置参加,因为对于任何固定的偏移量k,PE_{pos+k}可以被表示为PE_{pos}​的线性函数。

        我们还试验了用学习的位置嵌入[8]来代替,发现这两个版本产生了几乎相同的结果(见表3行(E))。我们选择了正弦波版本,因为它可能允许模型推断出比训练期间遇到的长度更长的序列。

4 为什么是自注意力

 

        在这一节中,我们将自注意力层的各个方面与通常用于将一个变长的符号表示序列( x 1 , . . . , x n ) 映射到另一个等长的序列( z 1 , . . . , z n ) 的循环和卷积层进行比较,其中x i , z i ∈ \mathbb{R}^{d},如典型序列转换编码器或解码器的隐藏层。我们使用自我关注的动机是考虑到三个方面的问题。

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

        第三是网络中长距离依赖关系之间的路径长度。学习长距离的依赖关系是许多序列转导任务中的一个关键挑战。影响学习这种依赖关系能力的一个关键因素是前向和后向信号在网络中必须穿越的路径的长度。在输入和输出序列的任何位置组合之间的这些路径越短,就越容易学习长距离的依赖关系[11]。因此,我们也比较了由不同层类型组成的网络中任何两个输入和输出位置之间的最大路径长度。

        如表1所示,自注意力层以恒定数量的顺序执行操作连接所有位置,而递归层需要O(n)顺序操作。就计算复杂度而言,当序列长度n小于表示维度d时,自注意层比递归层更快,这在机器翻译中最先进的模型所使用的句子表示中是最常见的情况,如词片[31]和字节对[25]表示。为了提高涉及超长序列的任务的计算性能,自我关注可以被限制为只考虑输入序列中以各自输出位置为中心的大小为r的邻域。这将使最大路径长度增加到O(n/r)。我们计划在未来的工作中进一步研究这种方法。

        一个核宽k < n的卷积层不能连接所有的输入和输出位置对。这样做需要一个O(n/k)的卷积层堆栈,如果是连续的内核,或者O(logk(n))的扩张卷积[18],增加网络中任意两个位置之间的最长路径的长度。卷积层通常比循环层昂贵k倍。然而,可分离卷积[6]大大降低了复杂度,降至O(k·n·d + n·d2)。然而,即使k = n,可分离卷积的复杂性也等于自注意层和点前馈层的组合,这是我们在模型中采用的方法。

        作为附带的好处,自我关注可以产生更多可解释的模型。我们检查了我们的模型的注意力分布,并在附录中介绍和讨论了示例。不仅每个注意头都能清楚地学习执行不同的任务,许多注意头还表现出与句子的句法和语义结构相关的行为。


http://www.ppmy.cn/news/19006.html

相关文章

js unicode编码相关

ASCII码 在计算机种中&#xff0c;1 字节对应 8 位二进制数&#xff0c;而每位二进制数有 0、1 两种状态&#xff0c;因此 1 字节可以组合出 256 种状态。如果这 256 中状态每一个都对应一个符号&#xff0c;就能通过 1 字节的数据表示 256 个字符。ASCII就是用于描述英语中的…

Liunx相关服务无法启动,带你一步一步找出问题和解决问题

liunx服务无法开启的原因有各种各样&#xff0c;首先我们需要找到我们究竟是为什么不能能够开启这个服务&#xff0c;这里我们先要去考虑到的一个非常重要的问题就是我们的防火墙有没有启动&#xff0c;防火墙有没有把我们的要开启相关服务的端口给封禁掉。这个是无论如何都要第…

【Unity Shader 赛博小人01】UV准备 SD制作特效贴图

写在前面 Unity 卡通渲染 程序化天空盒提到了——“再整个uv1将云片平铺&#xff0c;将uv1对应到世界坐标x轴旋转角、y轴旋转角&#xff0c;消散信息放到顶点色。”&#xff0c;就是这句话&#xff01;我又遇到了几个问题&#xff08;本菜鸡不知道的东西太多太多了&#xff09…

结构型模式-装饰器模式

1.概述 快餐店有炒面、炒饭这些快餐&#xff0c;可以额外附加鸡蛋、火腿、培根这些配菜&#xff0c;当然加配菜需要额外加钱&#xff0c;每个配菜的价钱通常不太一样&#xff0c;那么计算总价就会显得比较麻烦。 使用继承的方式存在的问题&#xff1a; 扩展性不好 如果要再加…

【Leetcode每日一题】35.搜素插入位置|二分查找数组下标

&#x1f331;博主简介&#xff1a;大一计科生&#xff0c;努力学习Java中!热爱写博客~预备程序媛 &#x1f4dc;所属专栏&#xff1a;LeetCode每日一题–进击大厂 ✈往期博文回顾: 【JavaSE】保姆级教程|1万字10张图学会类与对象–建议收藏 &#x1f575;️‍♂️近期目标&…

MySQL 数据库 数据完整性

什么是数据完整性&#xff1a;数据的完整性是指数据的精确性和可靠性&#xff0c;它的目的是为了防止数据库中存在不符合予以规定的数据或者因错误信息的输入而造成无效的操作。数据完整性的分类&#xff1a;实体完整性&#xff1a;每一行记录在表中是唯一的——主键约束Primar…

expect实现无交互操作

Expect 主要应用于自动化交互式操作场景&#xff0c;它是基于tcl语言的。expect有独自的语法、变量。 在使用expect之前需要安装一下 yum -y install expect安装好后&#xff0c;它一般放在/usr/bin下 使用expect创建脚本的方式 1.定义脚本执行的shell #!/usr/bin/expect 或…

【回望2022,走向2023】一个双非二本非科班的学生的旅途

目录 1.自我介绍 2.高考与暑假 梦想 幻灭 决心 暑假 3.大一上学期 4.奋进之路 5.展望未来 1.自我介绍 我是一个双非本科的大一学生&#xff0c;在2023年的新春之际&#xff0c;借着CSDN的这次年度总结活动&#xff0c;来好好回顾一下&#xff0c;2022这个平凡却又不乏…