• transformer论文翻译Attention Is All You Need注意力机制


      注意:本翻译参考过有道翻译,由于是首次翻译论文,花费了三天时间(英语不好,没过四级,大家在阅读过程中若有遇到翻译不正确还望指正),望能帮助正在学习AI的你。

      这是一篇经典的注意力机制的论文,原文名称就是《Attention Is All You Need》,也建议大家看原文。

      鉴于文章中的公式对不上word中的,可以从这里下载这对应的pdf:

      https://pan.baidu.com/s/1HphRFw2_qXN1SveYfZ74-g

      提取码doaa

    《Attention Is All You Need》

    摘要

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

    1.引言

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

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

        在各种任务中,注意力机制已经成为序列建模和转导模型中令人信服且不可分割的组成部分,它允许在不考虑输入或输出序列距离的情况下对依赖性进行建模[2,19]。然而,在除了少数情况下[27],这种注意机制是与循环网络结合使用的。

    在本工作中,我们提出了Transformer,它是一种避开递归得模型架构,而且是完全依赖注意力机制来描述输入和输出之间的全局依赖关系。Transformer显然支持更多的并行化,在8个P100 GPUs上经过12个小时的训练后,可以在翻译质量上达到一个新的水平。

    2.背景

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

        自注意力,有时也被称为内部注意,是一种将单个序列的不同位置联系起来以计算序列的表示形式的注意力机制。自注意已成功应用于各种任务,包括阅读理解、抽象摘要、文本概括和学习任务独立的句子表征[4,27,28,22]。

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

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

    3.模型结构

    最具竞争力的神经序列转导模型都有一个编码器-解码器结构[5,2,35]。在这里,编码器将一个符号表示的输入序列(x1,…,xn)映射为连续表示的序列z=(z1,…,zn)。对于给定的z,解码器一次生成一个符号的输出序列(y1,…,ym)作为某个时间点的元素。模型在每一个步骤中都是自回归的[10],在生成下一个序列时,使用之前生成的符号作为额外输入。

        Transformer遵循使用堆叠的自注意力层和逐点这种整体架构,编码器和解码器使用全连接层,分别如图1的左、右两部分所示

     

    图1:Transformer模型架构。

    3.1编码器和解码器堆叠

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

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

    3.2注意力

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

          尺度点积注意力                        多头注意力

          

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

    3.2.1尺度点积注意力

      我们把我们特别的注意力称为“Scaled Dot-Product attention”(图2)。输入由查询、键的dk维度、和值的dv维度组成。我们计算这种查询与所有键的点积,再每个点积结果除以,,并应用softmax函数来获取的权重值。

      在实践中,我们同时计算一组查询的注意函数,这些查询打包成一个矩阵Q。键和值也打包成矩阵K和V。我们计算输出的矩阵为: 

                                    

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

        当值较小时,两种机制表现相似,当值较大时,不需缩放的加性注意优于点积注意[3]。我们猜想,当dk值较大时,点积的增长幅度会变大,从而使softmax函数进入其梯度极小的区域。为了抵消这种影响,我们用来缩放点积。

    3.2.2多头注意力

      我们发现,将查询、键和值分别用不同的、学习过的线性投影h次地线性投影到dk、dk和dv维上,比用维度的键、值和查询执行单一的注意函数更为有效。然后,在查询、键和值的每一个版本上,我们并行执行注意力函数,产生dv维的输出值。这些被连接起来并再次投影,最终得到图2所示的值。 

      4为了说明为什么点积会变大,假设q和k的分量是均值为0,方差为1的独立随机变量。那么它们的点积,q·k =,其均值为0,方差为dk。

      多头注意使得模型能够联合地注意不同位置上不同表示子空间的信息。如果只集中注意力,平均就会抑制这一点。

          

      其中,预测的是参数矩阵 

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

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

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

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

      •编码器包含自注意力层。在自注意力层中,所有的键、值和查询都来自同一个地方,在本例中,即编码器中前一层的输出。所述编码器中的每个位置可以注意到所述编码器的前一层中的所有位置。

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

    3.3 Position-wise前馈网络

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

                    (2)

      虽然在不同的位置上线性转换是相同的,但它们在不同的层中使用不同的参数。这种方法的另一种说法是两个卷积,内核大小为1。输入输出维数为= 512,内层维数为= 2048。

    3.4 Embeddings 层和 Softmax激活函数

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

    3.5 位置编码(Positional Encoding)

      由于我们的模型不包含递归和卷积,为了让模型利用序列的顺序,我们必须注入一些关于序列中记号的相对或绝对位置的信息。为此,我们将“位置编码”添加到编码器和解码器堆栈底部的Embedding层中。位置编码与Embedding层具有相同的维数模型,因此可以将两者相加。这里有许多位置编码的选择,基于学习和固定的[9]。

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

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

     

      其中pos是位置,i是维度。也就是说,位置编码的每个维度都对应一个正弦信号。波长从2π到10000·2π呈几何级数。我们选择这个函数是因为我们假设它可以让模型很容易通过相对位置学习到注意力,因为对于任何固定偏移量k, 可以表示为一个线性函数。

      我们还使用学习过的positional Embedding层[9]进行了实验,发现两个版本产生了几乎相同的结果(见表3行(E))。 我们选择正弦版本是因为它可以让模型外推到比训练中遇到的序列更长的序列长度。 

    4 为什么使用self-attention

        在本节中, 我们将自我注意层的各个方面与循环和卷积层进行比较,这些层通常用于映射一个可变长度的符号表示序列(x1,…,Xn)到另一个等长序列(z1,…,zn),xi和zi都属于,例如一个隐藏层在一个典型的序列转导编解码器中。激励我们使用self-attention,我们考虑三个需求。

        一是每一层的总计算复杂度。另一个是可以并行化的计算量,由所需的最小顺序操作次数来衡量。第三点是网络中远程依赖关系之间的路径长度。在许多序列转换任务中,学习长期依赖是一个关键的挑战。影响学习这种依赖关系的能力的一个关键因素是信号在网络中必须通过的前向和后向路径的长度。输入和输出序列中任意位置组合之间的路径越短,学习远程依赖关系[12]就越容易。因此,我们也比较了由不同层类型组成的网络中任意两个输入和输出位置之间的最大路径长度。

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

        核的宽k<n的单卷积层不连接所有的输入输出位置。这样做,在相邻核的情况下需要一个O(n/k)卷积层的堆栈,或在空洞卷积[18]的情况下需要O((n)),并会增加网络中任意两个位置之间的最长路径的长度。卷积层通常比循环层代价更高,这按照k的系数计算。然而,可分离卷积[6]大大降低了复杂度,达到O(k·n·d + n·)。然而,即使在k = n的情况下,可分离卷积的复杂度也等价于self-attention层和点向前馈层(point-wise feed-forward layer)的结合,这是我们在模型中采用的方法。

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

    5 训练

        本节描述了我们模型的训练方法。

    5.1训练数据和批处理

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

    5.2 硬件和进度

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

    5.3 优化器

        我们使用了Adam优化器[20], = 0.9,= 0.98和= 10−9。我们根据以下公式改变了学习率:

          (3)

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

    5.4 正则化

      在训练过程中,我们采用了三种正则化方法:

        残差丢弃

    我们对每个子层的输出应用dropout[33],然后将其添加到子层输入并进行规范化。此外,我们在编码器和解码器堆栈中对嵌入和位置编码的和应用了dropout。对于基础模型,我们使用的速率为= 0.1。

        表2:transformer在英语-德语和英语-法国newstest2014一小部分训练代价测试中比之前的最先进的型号更,。

     

        标签平滑

        在训练过程中,我们使用了 = 0.1[36]值的标签平滑。 这会影响perplexity,因为模型学习了更多的不确定性,但提高了准确性和BLEU得分。

    6 结果

    6.1机器翻译

    在WMT 2014英->德的翻译任务中,大的transformer模型(表2中的Transformer (big))比之前已公开的最好的模型(包括全部)的表现超过2.0 BLEU,创造了新的最先进的BLEU评分28.4。该模型的配置列于表3的底部。在8个P100 GPU上的训练时间为3.5天。甚至我们的基础模型超过了所有以前发表的模型和集合,而训练成本只是任何竞争模型的一小部分。

    在WMT 2014英->法翻译任务中,我们的大模型的BLEU得分为41.0,超过了之前所有发表过的单个模型,而且训练成本还不到之前最先进的模型的1/4。Transformer(big)模型的英->法训练使用的丢弃率 = 0.1,而不是0.3。

    对于基础模型,我们使用了通过获取最后5个检查点(checkpoints)平均值的单个模型,这些检查点每10分钟编写一次。对于大型模型,我们计算了最后20个检查点的平均值。我们使用了波束(beam)大小为4,惩罚长度α = 0.6[38]的定向搜索(beam search)。这些超参数是在开发台上经过实验后选定的。在推理期间,我们将最大输出长度设置为输入长度+ 50,但在可能的情况下提前终止[38]。

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

    6.2 模型变体

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

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

      5我们分别使用2.8、3.7、6.0和9.5作为K80、K40、M40和P100的TFLOPS。

        表3:Transformer架构的变化。未列出的值与基础模型相同。所有指标都在英德翻译开发集newstest2013上测试的。根据我们的字节对编码,perplexities是逐字片(per-wordpiece)的,不应该与逐字(per-word)的perplexities相比较。

     

        表4:Transformer很好地概括了英语选区解析(English constituency parsing)(结果见WSJ第23节)

     

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

    6.3 English Constituency Parsing英语选区解析

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

        我们在《华尔街日报》(WSJ)中的宾夕法尼亚树银行部分训练了一个 = 1024的4层transformer [25],大约有40K个训练句子。我们还在半监督环境中用包含大约17M个句子的更大的高置信度和BerkleyParser语料库[37] 训练它。我们在《华尔街日报》的设置中使用了16K个标记词汇表,在半监督设置中使用了32K个标记词汇表。

        我们都只进行了少量的实验,选择注意和残差中的丢弃(dropout) (第5.4节)、第22节的学习率和波束尺寸、所有其他参数从英语到德语的基础翻译模型保持不变。在推理过程中,我们将最大输出长度增加到输入长度+ 300。我们使用21和α = 0.3的光束大小的华尔街日报和半监督设置。

        表4中的结果显示,尽管缺少特定于任务的调优,但我们的模型的性能令人惊讶地好,产生的结果比之前公布的所有模型更好,除外Recurrent Neural Network Grammar [8]。

        与的RNN序列到序列模型[37]相比,Transformer甚至在仅使用《华尔街日报》40K句的训练集进行训练时,也比BerkeleyParser[29]表现更好。

    7 结论

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

        对于翻译任务,Transformer的训练速度比基于循环或卷积层的体系结构快得多。在2014年世界WMT英德和2014年世界WMT上英法翻译任务,我们达到了新的艺术境界。在前一个任务中,我们的最佳模型甚至优于所有之前公布的全部。

        我们对基于注意力的模型的未来感到兴奋,并计划将其应用到其他任务中。我们计划将Transformer扩展到涉及文本以外的输入和输出模式的问题,并研究局部受限的注意力机制,以有效地处理图像、音频和视频等大型输入和输出。减少迭代顺序是我们的另一个研究目标。我们用来训练和评估模型的代码可以在https://github.com/tensorflow/tensor2tensor网站获得

    3:在第6层的第5层中,编码器的远距离依赖的注意力机制的一个例子。许多注意力头部集中在动词making的远距离依赖关系上,从而完成词组“making … more diffcult”。这里只展示了“making”这个词。不同的颜色代表不同的头部。最好的视觉效果用颜色标出。

    4: 也在第5层和第6层的两个注意力头部,显然涉及回指解决。上图:注意5号头。底部:将注意力从“its”这个单词中分离出来作为第5和第6层的注意力头部。注意,对这个词的关注非常强烈。

    5:许多注意力头部表现出的行为似乎与句子的结构有关。我们在上面给出了两个这样来自6层的编码器自注意力的两个不同的头部的例子。这些头部显然学会了执行不同的任务。

  • 相关阅读:
    (100%成功超详细图文教程)虚拟机VM ware中centos7无法上网及Xshell配置正确但是连接不上本地虚拟机问题汇总
    react-art 初步
    React-父组件访问子组件内部
    React学习随笔
    关于Git使用的常见问题和命令
    ES6随笔--Module
    ES6随笔--Set和Map
    ES6随笔--Promise
    ES6随笔--Symbol
    ES6随笔--各数据类型的扩展(3)--函数
  • 原文地址:https://www.cnblogs.com/2020zxc/p/15792676.html
Copyright © 2020-2023  润新知