然语言处理七-经典论文-attention is all you need
alttention is all you need 是提出经典模型transformer的论文,作为基础模型transformer,重要性不言而喻,本文引字英文论文,并提炼和总结要点。
论文原文: attentin is all you need
本文按照论文源结构,分部分来讲述该论文
摘要
原文译文
之前流行的转录模型主要是基于具有一个编码器encoder和一个解码器decoder的神经网络,这些神经网络一般是基于复杂的循环神经网络和卷积神经网络,encoder和decoder之间通过注意力机制来关联起来。我们本次提出了一个简单的模型,transformer模型,它只需要基于注意力机制。这个模型在两个机器翻译上的表现比之前的模型都好的多,特别是在并行化以及训练时间方面。我们的模型在WMT 2014 英译德的任务上获得了28.4的BlEU得分,比以往的所有成果还搞上2.0个BLUE得分。在WMT 2014 英译法的翻译任务上,我们的单模型的训练只使用了8 个GPU 训练了3.5天。同时这个模型可以很好的泛化到其他英语类任务上。
小结
开头就介绍自己的模型的显著特征,模型解决的问题,以及模型的厉害之处
1:引言
原文译文
这篇论文之前呢,序列模型和转录问题的解决主要依靠RNN、LSTM和GRU模型,此后,在这上面做了很多努力,不断的突破序列模型和编码器-解码器的能力。
这些递归模型通常沿着输入和输出的位置对计算进行计算。位置与对应于计算中的时间步,它们会生成一系列隐藏状态ht,ht的是由前面的隐藏状态ht−1和位置t输入生成的。这种序列性质从根本上就限制了训练过程中的并行化,并且限制了在处理长序列的输入时又收到了内存的限制。最近也有很多工作,通过一些技巧显著的提高了计算效率和模型的性能。但是顺序计算的这个限制没有从根本上解决。
注意力机制作为序列建模和转换模型的一个组成部分,已经成了比较认可的一部分,它使得模型能够处理出入或者输出中的长依赖。然而,大部分情况下,这种注意力机制还是与循环网络结合使用。
我们本次提出了Transformer模型,这是一种避免循环网络的模型架构,完全依赖注意力机制,并且可以处理整个 输入和输出的全局依赖。
Transformer更加并行化,在8台P100 GPU上接受了12个小时的培训后,翻译的质量已经可以达到不错的水平。
小结
提出一直以来模型的存在问题,序列化,不能并行,memory过短等问题,说明了自己的transfomer模型能够解决该问题,更高的并行性,且效果很不错。
2:背景
原文译文
基于GPU的计算也是以减少顺序计算为目标。ByteNet和ConvS2S,它们都使用卷积神经网络作为基本构建块,并行计算所有输入和输出位置的隐藏表示。在这些模型中,将任意输入或输出位置的信息关联起来所需要的操作,对于ConvS2S来说是线性的,对于ByteNet来说是对数的。这使得学习远距离位置之间的依赖关系更加困难。在transformer中,这是一个常数级的操作作,代价是使用了平均注意力加权位置,我们用多头注意力来抵消这种影响,如第3.2节所述。
自注意,有时也称为内部注意,是一种将序列中不同位置联系起来的注意机制。自注意力机制已经成功地用于各种任务,比如文本摘要等任务。
端到端记忆网络基于递归注意力机制,而不是序列对齐的递归机制。它已经被证明了在一些语言问答类和语言模型类的任务方面表现很好。
据我们所知,Transformer是第一个完全依靠自关注来计算其输入和输出的关系,而不使用序列对齐的RNN或CNN。在下面的部分中,我们将详细描述transformer和自注意力机制的应用,并讨论其相对于其他几个模型的优势。
小结
简单描述了transformer模型的完全使用自注意力实现机制来解决之前模型遇到的问题
3:模型架构
这部分是重点
原文译文
大多数转录模型都具有编码器-解码器结构。这里,编码器输入序列(x1,...,xn),连续输出序列
z=(z1,...,zn)。对于每一个给定的z,解码器一次输出一个元素的符号序列 (y1,...,ym)。在每一步,模型都是自回归的,在生成下一个符号时,将上一个时间步的生成作为下一个时间步的输入。
下面是模型的架构图
Transformer的整体架构,编码器和解码器使用多个堆叠的层,包括自注意力、基于位置的全连接层等,如图1的左半部分和右半部分所示。
小结
给出了一个很清晰的架构图,transformer也是编码器和解码器架构,堆叠了多层,解码器和编码器有连接部分
3.1 编码器和解码器
原文译文
编码器:编码器由N=6个相同块组成。每块有两个子层,第一子层是多头自注意层,第二层是简单的位置全连接前馈网络。
每个子层都有残差连接,又加上层归一化。也就是说,每个子层的输出是LayerNorm(x+Sublayer(x)),其中Sublayer(x)是子层输出。为了简化残差链接的操作,整个模型的层包括embeding层,全部都用了相同的维度 d~model~为512
解码器:解码器也是由N=6个相同块堆叠组成。除了跟编码器相同的两个子层,解码器还有第三个子层,用于执行对编码器的多头注意力。与编码器类似,我们使用残差连接围绕每个子层,然后进行层归一化。我们还修改了自注意力子层,以防止解码器关注后续位置。这种屏蔽,确保了对位置i的预测可以仅取决于在小于i的位置处的已知输出。
小结
总体介绍了编码器和解码器的构造
3.2 注意力
原文译文
注意力函数可以被描述为将查询和一组键值对映射到输出,其中查询、键、值和输出都是矢量。输出是值的加权和,其中的每个加权值都是通过查询和键计算相似度的一个函数获得的。
小结
总体介绍注意力怎么实现的
3.2.1 缩放点积注意力
这段是接上文介绍注意力函数
原文
我们用的是"缩放点积注意力"(图2表示)。输入的查询和键的维度都是dk,以及值的维度dv。我们计算查询和键的内积,然后除以的dk的平方根,并取softmax函数后计算出权重,然后把这些权重 作用于值。
在工程实践中,我们是同时计算一组查询的注意力分数的,这些查询被打包在一起的是Q矩阵,键和值也被打包到矩阵K和V中。我们计算
公式为:
两个最常用的注意函数是加性注意[和点积(多重加性)注意。点积注意力与我们的算法相同,只是我们这多除了个缩放因子根号dk
.加性注意力使用具有一个单隐藏层的前馈网络来计算注意力。虽然两者在理论复杂性上相似,但点积注意力是在实践中速度更快、效率更高,因为它可以使用高度优化的方法来实现矩阵乘法代码。
对于小的dk值,这两种机制的表现相似,dk比较大,又不做缩放处理的时候,加性注意力的表现优于点积注意力。我们怀疑,dk比较大的情况下,点积增长的数量级会很大,在做softmax的时候,又会进一步缩放这种差距(大的值趋近于1,小的值趋近于0),这种情况下,梯度就会很小。同时为了抵消这种影响,我们缩放了一下,除了根号dk
总结
介绍了两种注意力函数,同时说明了论文中使用这种注意力的原因。
3.2.2 多头注意力
原文
我们发现,不使用dmodel维度的键、值和查询来一次性的注意力函数计算,不如线性层学习到的键、值和查询投影到一个到低维度dk和dv上,然后执行h次,效果更好。线性投射出来的多组不同的键、值和查询,并行执行注意力函数,生成dv维度的输出值。这些输出被连接起来并再次投影,从而产生最终输出,如如上面的图2(Figure 2)所示
多头的注意力能够注意到不同位置的不同注意。单头注意力的话是做不到的。
上面就是多头注意力的一个表示,需要学习的参数矩阵就是这些:
我们实际是用了h为8,也就是8个并行的头。其中dk=dv=dmodel/h = 64,由于是降维的操作,所以即便是8个头,也和单个头的计算代价差不多。
小结
说明了使用多头注意力的原因,以及如何使用多头注意力
3.2.3 模型中用到的几种注意力
原文
transformer用了几种不同的注意力:
- encoder-decoder之间层。查询是来自于decoder的上一层的输出,查询和键来自于encoder的输出。这样就使得decoder中每个输出都能够关注到输入中的所有位置。这种encoder-decoder之间的注意力是模仿了经典的注意力。
- encoder中的自注意力层。在这个自注意力层中,查询、键、值都来自于同一个位置的输入,也是上一个层的输出。每一个位置的都可以关注到上一层输出的所有位置的输入。
- 同样的,在decoder中的自注意力层,每隔位置的键、值和查询来自同一个输入,它关注包括其自身在内所有的序列。需要注意的是,decoder应该只让他关注当前输入左侧的信息,在具体实现上,是我们在缩放点积注意力的时候,增添了mask操作,赋值给待处理位置右侧的值一些特别大的负数值(设置成负无穷),这样在softmax的之后,值就趋近于0,避免它产生影响。
总结
介绍了架构图中的三种注意力
3.3 位置前馈网络
原文
除了注意力子层,我们的编码器和解码器中的每个层都包含一个全连接的前馈网络,输入的每个位置的网络都是相同的。这
由两个线性层组成,其间有ReLU激活函数。公式可以表示成下面:
FFN(x)=max(0,xW1+b1)W2+b2
不同位置上全连接是相同的,不同层之间的参数不统。除了线性层,也可以用两个核大小为1的两个卷积层实现。输入和输出的维度dmodel=512,第一个线性层维度dff=2048。
小结
两个线性层,维度变化是这样的,512->2048->512
3.4 嵌入层和softmax
原文
与其他序列转录模型类似,我们使用学习来将输入和输出的token,嵌入到维度为dmodel的向量。我们还使用的线性变换和softmax函数来将解码器输出转换为预测的下一个输出的概率。在在我们的模型中,嵌入层之间和softmax之前的线性层共享相同的权重矩阵,权重乘上√dmodel
下面给出表1:里面给出几种不同的网络模型的对比,最大路径长度、每层复杂性和最小顺序操作数。其中,n是序列长度,d是表示维数,k是卷积核的大小,r是受限自注意中邻域的大小。
总结
模型对比
3.5 位置编码
原文
由于我们的模型不包含递归和卷积,为了使模型能够使用序列的顺序信息,我们必须给token注入一些关于的相对或绝对位置的信息。为此,我们在编码器和解码器的底部加入了位置编码,他们跟embeding层具有相同的维度dmodel以便于他们可以互相加总。位置编码是可以有不同选择的。
在我们的模型中,我们使用正弦和余弦函数完成:
其中pos是位置,i是维度。也就是说,位置编码的每个维度对应于正余弦曲线。波长是从2π到10000·2π的几何级数。我们
选择这个函数,是因为它可以让模型很容易地学会相对位置,**因为对于任何固定偏移k,PEpos+k可以用PEpos的位置编码线性投影去的。**我们还尝试使用可以学习的位置嵌入,并发现两个版本结果基本相同(见表3第(E)行)。我们选择了正弦曲线
因为在训练期间,它可以允许模型外推到比遇到的序列长度更长的序列长度。
小结&补充
上面讲相对位置投影,不太清清楚,下面的公式推导可以看出是如何解决的:
4 什么用自注意力
原文
这个部分从不同的角度讲自注意力层与经常用到从一个变成sequence到另外一个变成sequence的RNN和CNN的对比。使用自注意力主要从三个方面考虑。
一个是每一层的计算复杂度,另一个是计算的并行度,这个指标可以用序列中顺序操作的最小数量级来衡量。第三个在模型中相关依赖的路径长度是关键性的难点问题,前向和后向信号路长度往往是影响学习相关性的关键因素。任意输入和输出序列之间的位置越短,越容易学习到长序列的依赖关系。因此我们第三方面选择对比不同网络中任意输入输出序列位置的最长关联路径。
如表1所示,自关注层以常数级别的量可以连接所有位置,而RNN需要O(n)个顺序操作。在计算复杂度方面,当序列长度n小于表示维度d,注意力比RNN要快的多,最常见的情况是机器翻译中使用的句子表示,如单词片段和字节对表示。为了提高计算性能,在很长的序中,自注意可以被限制为只考虑大小为r的邻域,输入序列以相应的输出位置为中心。这将增加最长路径增长到O(n/r)的路径长度。我们会在未来的工作中进一步研究这种方法。
单卷积核维度为k (k < n)的单卷积层无法实现所有输入和输出位置信息的连接,所以在卷积kernel是连续的情况下,需要O(n/k)个卷积层堆叠,如果是带空洞的,则需要O(logk(n)) 层。卷积层的训练成本通常比RNN层更高。分离卷积可以降低计算复杂度到O(k · n · d + n · d
^2^)。但是即使是k=n,一个分离的卷积层的复杂度,也相当于一个自注意力层加前馈网络层的复杂度。
自注意力层可以产生了更多可解释的模型。我们在模型中检查注意力分布,并且在附录中给出示例和讨论。不仅仅能够学习到不同任务的注意力,甚至可以表现出与语义和语法相关的行为。
小结
对于表1的解释
5 训练
这部分是训练方法的
5.1训练数据和批处理
原文
我们是在标准的WMT2014英语-德语数据集上进行训练的,这个数据集包括大约450万个句子byte-pair对。句子采用字节对编码进行编码,源-目标词汇表中共享大约37000个标记。对于英语-法语,使用了更大的WMT2014英语-法语数据集,由3600万个句子组成,并将标记分割为32000词汇。句子对按近似的序列长度排列在一起。每个训练批都包含一组句子对,其中包含大约25000个源标记和25000个目标标记。
小结&补充
介绍训练数据。
其中byte-pair的分割方法是byte-pair,是指用词根进行切割的方法。
5.2 硬件配置和训练时长
译文
在一台机器上使用8 NVIDIAP100 GPU上训练了模型,使用的超参数在论文中已经介绍过了,每个训练步长大约需要花费0.4秒的时间,基本模型总共训练了10万步或12个小时。对于大模型,步长时间为1.0秒,大模型训练了30万步(3.5天)。
5.3 优化器
译文
我们用了Adam的优化器,参数设置为β1 = 0.9, β2 = 0.98 e是10^-9^,在训练过程中,学习率是根据下面的公式变化的:
对应于第一个warmup_steps训练步长,学习率线性增加,在后续步长中,学习率随着步长的平方根成正比例下降,其中,warmup_steps =4000
5.4 规范化
译文
我们训练中用了三种规范化。
**残差 dropout:**在每个子层的输出都用了dropout,这个操作是放在归一化之前。同时在编码器-解码器的嵌入过程和位置编码加总后也有Dropout机制,我们用的dropout率是0.1
label 平滑 在训练时,我们用了lable smoothing值0.1,这个对于可信度来说是有损害的,虽然模型增加了一些不确定性,但是提高了正确率和BLUE分数
小结&补充
这里的lable smoothing 0.1是指softmax之后,概率为0.1就认为是正确的。
6 训练结果
6.1 机器翻译
译文
在WMT2014英德翻译任务中,Transformer (big)比之前报告的最佳模型(包括集成)高出2.0多个BLEU,获得BLEU分数为28.4。该模型的配置列于表3的底部。在8个P100 GPU 上进行训练需要3.5天。基本模型也超过了所有之前发布的模型和集合,训练成本也大幅度缩减。
在WMT2014年英法翻译任务中Transformer (big)获得了BLEU分值为 41.0分,优于之前发布的所有其它模型,训练成本降低 1/4。
在WMT2014英德翻译任务中,Transformer (big)比之前报告的最佳模型(包括集成)高出2.0多个BLEU,获得BLEU分数为28.4。该模型的配置列于表3 的底部。在8个P100 GPU 上进行训练需要3.5天。甚至基本模型也超过了所有之前发布的模型和集合,训练成本也大幅度缩减。
在WMT2014年英法翻译任务中Transformer (big)获得了BLEU分值为 41.0分,优于之前发布的所有其它模型,训练成本降低 1/4。大模型训练英法翻译任务用到的drop out率是0.1
对于基本模型,我们使用最后5个检查点进行平均而获得的单个模型,每隔10分钟写一次。对于大型模型,我们对最后20个检查点进行了平均。我们用了beam search,集束宽度是4惩罚因子α=0.6,这些超参数是我们在实验后选择的。推理的时候,我们认为输出的最大长度是输入长度+50,有可能终止的话,就提前终止。
6.2 不同的参数模型
译文
为了评估transformer中不同组件的重要性,我们改变了基本模型的参数,并对这些不同的模型在英语到德语的翻译任务上做了评估,这些参数和评估被记录在了表3中
说明下表3:这是Transformer架构的各个不同版本。未列出的值与基本模型的值相同。模型所有指标都在英语到德语翻译开发集newstest2013上测试的。列出来的PPL是根据我们的词片编码计算的,不应该与单个词的词的进行对比。
我们用的beam search的设置在上面已经描述过了,但是没有checkpoint做平均计算。最后的结果记录表3中
表中A这行,是改变了attention的数量,可以看到单个或者过多的头,结果都不如基础模型好
表中B这行,是降低了键的维度,结果更差。这可能也是在提示我们合适的函数,一个比点积更为精密的函数可能更管用。
表中C和D,说明了更大的模型更好一些,更高点的dropout率防止过拟合方面更好些
表中E,我们把位置嵌入从sin函数换成了可以学习的位置嵌入,结果跟基础模型差不多
6.3 英语成分分析
为了评估Transformer是否可以推广到其他任务,我们对英语成分分析这个任务进行了实现。这项任务提出了具体的挑战:输出受制于强大的结构约束,并且比输入要长很多。此外,基于RNN的序列 的模型在小数据的情况下还不能达到最先进的结果。
我们(WSJ)部分(这是中训练语料)训练了一个4层的transformer ,大约4万条训练语句。我们还在半监督环境下对其进行了训练,使用较大的高置信度和BerkleyParser语料库,大约有1700万条语句。在只使用WSJ的情况下,1.6万的词汇,在半监督的情况下3.2万的词汇。
我们只进行了少量的实验,在第22节开发集上,dropout、attention和residual这些参数都跟第5.4节设置的一样、learning rate和beam size,所有其他参数与英译德基础翻译模型保持不变。在推断过程中,我们将最大输出长度增加到输入长度 +300。我们对只有WSJ的和半监督的设置都使用了beam size 21和惩罚因子0.3 。
表4中我们的结果显示,尽管缺少具体的任务微调,模型仍然表现得十分出色,除了RNN外,产生的结果比以前报道的所有模型都好
与RNN sequence-to-sequence模型相比,即使只在WSJ的4万句子训练集上进行训练,Transformer也比BerkeleyParser更出色。
结论
译文
这次的序列转录模型完全基于attention,替代了编码器和解码器架构中的循环神经网络,完全使用了多头的自注意力。
对于翻译任务来说,transformer比之前的架构模型训练都更快。在WMT2014 英语翻译德语和英语翻译法语的任务上,模型的表现很好,超过了之前所有的模型。
我们对基于注意力的模型的未来感到兴奋,并计划将其应用于其他任务。我们计划将Transformer扩展到文本以外的注意力机制,比如有效地处理大量输入和输出的任务,诸如图像、音频和视频处理等。在生成过程中使用更少的顺序 (而非并行)执行是我们的另一个研究目标。
transformer模型的代码在https://github.com/tensorflow/tensor2tensor上,详情可以参考这个
参考资料
本论文是相对简洁,有个老外有详细的解说版,如下: