【Transformer】Attention Is All You Need

news2024/11/15 5:39:42

Abstract

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

1 Introduction

递归神经网络,特别是长短期记忆[13]和门控递归神经网络[7],已经被牢固地确立为序列建模和转导问题(如语言建模和机器翻译)的最新方法[35,2,5]。从那以后,大量的努力继续推动循环语言模型和编码器-解码器架构的边界[38,24,15]。

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

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

在这项工作中,我们提出了Transformer,这是一种避免重复的模型架构,而是完全依赖于注意机制来绘制输入和输出之间的全局依赖关系。

Transformer允许显着更多的并行化,并且在8个P100 gpu上经过12小时的培训后,可以达到翻译质量的新状态。

2 Background

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

自我注意,有时被称为内注意,是一种将单个序列的不同位置联系起来以计算该序列的表示的注意机制。自注意已经成功地应用于阅读理解、抽象总结、文本蕴涵和学习任务无关的句子表征等多种任务中[4,27,28,22]。

端到端记忆网络基于循环注意机制,而不是顺序排列的递归,并且在简单语言问答和语言建模任务中表现良好[34]。

然而,据我们所知,Transformer是第一个完全依赖于自关注来计算其输入和输出表示的转导模型,而不使用序列对齐rnn或卷积。在下面的部分中,我们将描述Transformer,激励自我关注,并讨论它相对于[17,18]和[9]等模型的优势。

3 Model Architecture

大多数竞争性神经序列转导模型具有编码器-解码器结构[5,2,35]。

这里,编码器映射符号表示(x1,…, xn)的输入序列。到连续表示序列z = (z1,…,zn)。给定z,解码器然后生成输出序列(y1,…, ym)符号,一次一个元素。在每一步中,模型都是自回归的[10],在生成下一个符号时,将之前生成的符号作为额外的输入。

Transformer遵循这个整体架构,使用堆叠的自关注层和点方向层,完全连接编码器和解码器层,分别如图1的左半部分和右半部分所示

3.1 Encoder and Decoder Stacks

编码器:编码器由N = 6个相同层的堆栈组成。每一层有两个子层。第一种是多头自注意机制,第二种是简单的、位置完全连接的前馈网络。我们在每一个子层周围使用残差连接[11],然后进行层归一化[1]。也就是说,每个子层的输出是LayerNorm(x + Sublayer(x)),其中Sublayer(x)是子层本身实现的函数。为了方便这些残差连接,模型中的所有子层以及嵌入层产生的输出维度为dmodel = 512。

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

3.2 Attention

图2:(左)缩放点积注意力。(右)多头注意由平行运行的几个注意层组成。

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

3.2.1 Scaled Dot-Product Attention

3.2.2 Multi-Head Attention

3.2.3 Applications of Attention in our Model

Transformer以三种不同的方式使用多头注意:

        •在“编码器-解码器注意”层中,查询来自前一个解码器层,而记忆键和值来自编码器的输出。这允许解码器中的每个位置都参与输入序列中的所有位置。这模仿了序列到序列模型中典型的编码器-解码器注意机制,如[38,2,9]。

        •编码器包含自关注层。在自关注层中,所有的键、值和查询都来自同一个地方,在这种情况下,是编码器中前一层的输出。编码器中的每个位置都可以处理编码器前一层中的所有位置。

        •类似地,解码器中的自关注层允许解码器中的每个位置关注解码器中的所有位置,直至并包括该位置。我们需要防止解码器中的向左信息流以保持自回归特性。我们通过屏蔽(设置为−∞)softmax输入中对应于非法连接的所有值来实现缩放点积注意力。参见图2。

3.3 Position-wise Feed-Forward Networks

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

虽然线性变换在不同位置上是相同的,但它们在每一层之间使用不同的参数。另一种描述它的方式是两个核大小为1的卷积。

输入和输出的维数为dmodel = 512,内层的维数df = 2048。

3.4 Embeddings and Softmax

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

表1:不同层类型的最大路径长度、每层复杂度和最小顺序操作数。N为序列长度,d为表示维数,k为卷积的核大小,r为限制自注意中的邻域大小。

3.5 Positional Encoding

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

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

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

4 Why Self-Attention

在本节中,我们将自注意层的各个方面与通常用于映射一个可变长度符号表示序列(x1,…, xn))的循环层和卷积层进行比较。到另一个等长序列(z1,…, zn),其中xi, zi∈R d,如典型序列转导编码器或解码器中的隐藏层。为了激励我们使用自我关注,我们考虑了三个必要条件

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

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

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

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

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

5 Training

本节描述了我们模型的训练机制。

5.1 Training Data and Batching

我们在标准的WMT 2014英语-德语数据集上进行训练,该数据集由大约450万句对组成。句子使用字节对编码[3]进行编码,该编码具有大约37000个标记的共享源-目标词汇表。对于英语-法语,我们使用了更大的WMT 2014英语-法语数据集,该数据集包含3600万个句子,并将标记分割成32000个单词-词汇表[38]。句子对按近似序列长度进行批处理。每个训练批包含一组句子对,其中包含大约25000个源标记和25000个目标标记。

5.2 Hardware and Schedule

我们在一台带有8个NVIDIA P100 gpu的机器上训练我们的模型。对于使用本文中描述的超参数的基本模型,每个训练步骤大约需要0.4秒。我们对基本模型进行了总共10万步或12小时的训练。对于我们的大型模型(如表3所示),步长为1.0秒。大模型训练了30万步(3.5天)。

5.3 Optimizer

5.4 Regularization

我们在训练中使用三种类型的正则化:

表2:Transformer在英语-德语和英语-法语newstest2014测试中取得了比以前的最先进型号更好的BLEU分数,而培训费用只是其中的一小部分。

残差Dropout:我们将Dropout[33]应用于每个子层的输出,然后将其添加到子层输入并归一化。此外,我们将dropout应用于编码器和解码器堆栈中的嵌入和位置编码之和。对于基本模型,我们使用Pdrop = 0.1的速率。

标签平滑:在训练时,我们使用值ϵls = 0.1的标签平滑[36]。这损害了困惑,因为模型学会了更不确定,但提高了准确性和BLEU分数。

6 Results


6.1 Machine Translation

在WMT 2014英德翻译任务中,大型变压器模型(表2中的transformer (big))比之前报道的最佳模型(包括集成)高出2.0 BLEU以上,建立了新的最先进的BLEU分数28.4。该模型的配置列在表3的底线。训练时间为3.5天,使用的是8个P100图形处理器。甚至我们的基本模型也超过了所有以前发表的模型和集合,而训练成本只是任何竞争模型的一小部分。

在WMT 2014英法翻译任务上,我们的大模型获得了41.0的BLEU分数,优于之前发布的所有单一模型,而训练成本不到之前最先进模型的1/4。训练为英语到法语的Transformer(大)模型使用的辍学率Pdrop = 0.1,而不是0.3。

对于基本模型,我们使用通过平均最后5个检查点获得的单个模型,这些检查点每隔10分钟写入一次。对于大型模型,我们取最后20个检查点的平均值。我们使用束搜索,束大小为4,长度惩罚α = 0.6[38]。这些超参数是在开发集上实验后选择的。我们将推理过程中的最大输出长度设置为输入长度+ 50,但尽可能早地终止[38]。

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

6.2 Model Variations

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

在表3行(A)中,我们在保持计算量不变的情况下,改变注意头的数量以及注意键和值维度,如3.2.2节所述。虽然单头注意力比最佳设置差0.9 BLEU,但过多的头也会降低质量。

在表3行(B)中,我们观察到减小注意键大小dk会损害模型质量。这表明确定兼容性并不容易,一个比点积更复杂的兼容性函数可能是有益的。我们在(C)和(D)行中进一步观察到,正如预期的那样,更大的模型更好,并且dropout对于避免过度拟合非常有帮助。在(E)行中,我们用学习的位置嵌入替换正弦位置编码[9],并观察到与基本模型几乎相同的结果。

表3:Transformer体系结构的变体。未列出的值与基本模型的值相同。newstest2013的所有指标都是基于英语到德语的翻译开发集。根据我们的字节对编码,列出的困惑是每个单词的,不应该与每个单词的困惑进行比较。

6.3 English Constituency Parsing

为了评估Transformer是否可以推广到其他任务,我们对英语选区解析进行了实验。这项任务提出了具体的挑战:输出受到强烈的结构限制,并且比输入长得多。此外,RNN序列到序列模型还不能在小数据体系中获得最先进的结果[37]。

我们在Penn Treebank的Wall Street Journal (WSJ)部分[25]上训练了一个dmodel = 1024的4层转换器,大约训练了40K个句子。我们还在半监督设置中训练它,使用大约17M个句子的更大的高置信度和BerkleyParser语料库[37]。我们仅在WSJ设置中使用了16K代币的词汇表,在半监督设置中使用了32K代币的词汇表。

我们只进行了少量的实验来选择section 22开发集上的dropout、注意力和残差(第5.4节)、学习率和光束大小,所有其他参数从英语到德语的基础翻译模型保持不变。在推理过程中,我们将最大输出长度增加到输入长度+ 300。对于仅WSJ和半监督设置,我们使用了21和α = 0.3的光束大小。

我们在表4中的结果表明,尽管缺乏针对特定任务的调优,我们的模型表现出奇地好,除了递归神经网络语法(Recurrent Neural Network Grammar)[8]外,它的结果比之前报道的所有模型都要好。

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

7 Conclusion

在这项工作中,我们提出了Transformer,这是第一个完全基于注意的序列转导模型,用多头自注意取代了编码器-解码器架构中最常用的循环层。

对于翻译任务,Transformer的训练速度明显快于基于循环层或卷积层的体系结构。在WMT 2014的英语到德语和WMT 2014的英语到法语翻译任务上,我们都达到了一个新的水平。在前一个任务中,我们的最佳模型甚至优于所有先前报道的集成。

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1423071.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Atcoder ABC338 A-D题解

又是一篇姗姗来迟的atcoder题解。 Link:ABC338 Problem A: 妥妥的签到题。 #include <bits/stdc.h> using namespace std; int main(){string str;cin>>str;if(int(str[0])<65 || int(str[0])>90){cout<<"NO"<<endl;return 0;}for…

力扣hot100 买卖股票的最佳时机 贪心 经典题

Problem: 121. 买卖股票的最佳时机 文章目录 思路复杂度Code 思路 假设今天卖出&#xff0c;那怎么样收益最大呢&#xff1f;之前买入价是最低的 复杂度 ⏰ 时间复杂度: &#xff1a; O ( n ) O(n) O(n) &#x1f30e; 空间复杂度: O ( 1 ) O(1) O(1) Code class Solut…

微信小程序(二十七)列表渲染改变量名

注释很详细&#xff0c;直接上代码 上一篇 新增内容&#xff1a; 1.改变默认循环单元item变量名 2.改变默认循环下标index变量名 基础模板有问题可以先看上一篇 源码&#xff1a; index.wxml <view class"students"><view class"item"><te…

快速排序|超详细讲解|入门深入学习排序算法

快速排序介绍 快速排序(Quick Sort)使用分治法策略。 它的基本思想是&#xff1a;选择一个基准数&#xff0c;通过一趟排序将要排序的数据分割成独立的两部分&#xff1b;其中一部分的所有数据都比另外一部分的所有数据都要小。然后&#xff0c;再按此方法对这两部分数据分别进…

Unity 常见的图像压缩格式优缺点

在Unity中&#xff0c;将图像压缩至更小的大小&#xff0c;既可以加快加载速度&#xff0c;也可以减少内存的占用。根据不同的目标平台&#xff0c;Unity提供了以下几种常见的图像压缩格式&#xff1a; 1. RGBA Compressed: 是一种通过压缩的方式来存储RGBA&#xff08;红色、…

Flask框架开发学习笔记《6》前后端不分离基础框架

Flask框架开发学习笔记《6》前后端不分离基础框架 Flask是使用python的后端&#xff0c;由于小程序需要后端开发&#xff0c;遂学习一下后端开发。 主要包含如下文件&#xff1a; static 目录中存储了图片templates 目录中存储了 html 文件utils.py 包含了 log 函数server.p…

开发工具git分支冲突解决

在团队协作的软件开发过程中&#xff0c;Git是一款广泛使用的版本控制系统。然而&#xff0c;当多个开发者同时修改同一文件或代码段时&#xff0c;就会产生分支冲突。解决这些冲突需要仔细的协调和技术知识。本篇博客将介绍Git分支冲突的解决方法&#xff0c;以及开发工具和最…

Android 系统启动过程

当按下电源时&#xff0c;引导芯片代码会从预定义的地方(固化在ROM) 开始执行,加载引导程序BootLoader到RAM,然后执行。 启动内核的第一个进程idle(pid0),idle进程是Linux系统第一个进程&#xff0c;是init进程和kthreadd进程的父进程。 idle的主要作用 初始化进程以及内存管…

Modern C++ std::get<n>(tuple)的原理

1. 前言 前面我们讲过std::tuple的实现原理&#xff0c;但没有讲如何取出数据&#xff0c;本节着重讲讲这点。本节与之前的blog有较大关联&#xff0c;如果您没看&#xff0c;这里有链接&#xff0c;链接已按由浅入深排好序&#xff0c;您可以按顺序阅读。如果时间少可以直接看…

【新书推荐】4.2节 字符编码规则

本节内容&#xff1a;字符编码规则。 ■字符编码规则&#xff1a;ASCII码、ANSI字符集、Unicode字符集。 ■变形国标码&#xff1a;国标码是16位编码&#xff0c;高8位表示汉字符的区号&#xff0c;低8位表示汉字符的位号。 4.2.1 字符编码规则 计算机只能存储二进制数0和1&a…

API管理协作工具:Apipost

相信无论是前端&#xff0c;还是后端的测试和开发人员&#xff0c;都遇到过这样的困难。不同工具之间数据一致性非常困难、低效。多个系统之间数据不一致&#xff0c;导致协作低效、频繁出问题&#xff0c;开发测试人员痛苦不堪。 API管理的难点在哪&#xff1f; 开发人员在 …

【WPF.NET开发】优化性能:图形呈现层

本文内容 图形硬件呈现层定义其他资源 呈现层为运行 WPF 应用程序的设备定义图形硬件功能和性能级别。 1、图形硬件 对呈现层级别影响最大的图形硬件功能包括&#xff1a; 视频 RAM - 图形硬件中的视频内存量决定了可用于合成图形的缓冲区大小和数量。 像素着色器 - 像素着…

点餐APP开发需要用到的一些源代码

在数字化日益普及的今天&#xff0c;点餐APP已经成为人们日常生活的重要组成部分&#xff0c;从校园食堂到高级餐厅&#xff0c;从快餐外卖到定制化营养餐&#xff0c;点餐APP的多样性和便利性满足了不同用户的需求&#xff0c;本文将深入探讨在开发一款点餐APP时可能用到的源代…

24.Android中的列表--ListView

ListView 1.简单列表--ArrayAdapter <?xml version"1.0" encoding"utf-8"?> <ScrollView xmlns:android"http://schemas.android.com/apk/res/android"xmlns:app"http://schemas.android.com/apk/res-auto"xmlns:tools&qu…

C++ 入门(三)— 函数

文章目录 函数简介函数返回值Void 函数&#xff08;非值返回函数&#xff09;函数参数和参数局部范围函数的声明和定义具有多个代码文件的程序 函数简介 C 程序的方式工作。当程序遇到函数调用时&#xff0c;它将在一个函数内按顺序执行语句。函数调用是告诉 CPU 中断当前函数…

责任链模式在java中的实现

1 总览 2 概念 避免请求发送者与接收者耦合在一起&#xff0c;让多个对象都有可能接收请求&#xff0c;将这些对象连接成一条链&#xff0c;并且沿着这条链传递请求&#xff0c;直到有对象处理它为止。职责链模式是一种对象行为型模式。 3 实现 公共部分&#xff0c;一个系…

法大大入选2023德勤“中国明日之星”

1月30日&#xff0c;德勤审计及鉴定合伙人、华南区上市业务合伙人、资本市场服务部王杰森莅临法大大总部&#xff0c;为法大大颁发“2023德勤中国 高科技高成长 明日之星”奖杯&#xff0c;法大大联合创始人兼首席法务官梅臻代表领奖。 &#xff08;左为王杰森&#xff0c;右为…

海外代理IP推荐:5大最佳Luminati替代方案

在跨境出海业务中&#xff0c;海外代理IP是非常高效的助力工具&#xff0c;因此也衍生了非常多的代理服务商。想必大多数都知道Brightdata&#xff08;原名Luminati&#xff09;&#xff0c;但是&#xff0c;由于代理IP的高需求&#xff0c;慢慢地我们发现除了高价的卢米&#…

Prometheus的promQL语法

时间序列 node_cpu_guest_seconds_total{cpu"0"} #{}外的是监控项(指标数据) #{}内的是标签 #node使用cpu的描述统计&#xff0c;符合标签cpu0的时间序列&#xff0c;查询出的结果 #指标项标签就是Prometheus的时间序列_address_ #双下划线标签是Prometheus系统的默…

【小白学unity记录】使用unity播放声音

1. 示例 unity中播放声音涉及到两个组件。AudioSource和AudioClip。AudioSource可以理解为播放器&#xff0c;AudioClip可以理解为音频片段文件。AudioSource可以通过.clip属性切换音频片段。 using UnityEngine;public class PlayerController : MonoBehaviour {private int…