【看论文】Transformer: Attention Is All You Need
Attention Is All You Need
本文链接: https://arxiv.org/abs/1706.03762
代码仓库: https://github.com/tensorflow/tensor2tensor
0 Abstract 摘要
主流的序列转录模型都是基于复杂的RNN或CNN,包括编码器和解码器。性能最好的模型还通过注意力机制连接编码器和解码器。我们提出了一种新的简单网络架构,Transformer,它完全基于注意力机制,完全不需要递归和卷积。在两个机器翻译任务上的实验表明,这些模型在质量上具有优越性,同时更具并行性,训练时间明显减少。我们的模型在WMT 2014英语到德语翻译任务中达到28.4 BLEU,比现有最佳结果(包括ensembles)提高了2 BLEU以上。在WMT 2014英法翻译任务中,我们的模型在八个GPU上训练了3.5天之后,建立了一个新的单一型最先进的BLEU分数41.8,这只是文献中最佳车型训练成本的一小部分。我们证明Transformer可以很好地推广到其他任务,它成功地应用于英语选区分析,既有大量的训练数据,也有有限的训练数据。
1 Introduction 介绍
RNN(递归神经网络),特别是长短期记忆和门控递归神经网络已被牢固确立为序列建模和转录问题(如语言建模和机器翻译)的最新方法。此后,许多工作都在继续推进递归语言模型和编码器-解码器体系结构的边界。
递归模型通常沿着输入和输出序列的符号位置进行因子计算。将位置与计算时间中的步骤对齐,它们生成一系列隐藏状态ht,作为先前隐藏状态ht-1和位置t的输入的函数。这种固有的顺序性排除了训练示例内的并行化,这在较长的序列长度下变得至关重要,因为内存约束限制了示例之间的批处理。最近的工作通过因子分解技巧和条件计算显著提高了计算效率,同时也提高了后者的模型性能。然而,顺序计算的基本约束仍然存在。
注意力机制已经成为各种任务中引人注目的序列建模和转导模型的组成部分,允许对依赖性进行建模,而不考虑它们在输入或输出序列中的距离。然而,在除少数情况外的所有情况下,这种注意机制都与循环网络一起使用。
在这项工作中,我们提出了Transformer,这是一种避免重复的模型架构,而是完全依赖于注意力机制来绘制输入和输出之间的全局依赖关系。Transformer允许显著提高并行化,并且在8个P100 GPU上训练了12小时后,可以在翻译质量方面达到最新水平。
2 Background 研究背景
减少顺序计算的目标也构成了扩展神经GPU、ByteNet和ConvS2S的基础,所有这些都使用卷积神经网络作为基本构建块,并行计算所有输入和输出位置的隐藏表示。在这些模型中,关联来自两个任意输入或输出位置的信号所需的操作数量随着位置之间的距离而增加,ConvS2S为线性,ByteNet为对数。这使得学习远距离位置之间的相关性变得更加困难。在Transformer中,这被减少到恒定数量的操作,尽管代价是由于平均注意力加权位置而降低了有效分辨率,如第3.2节所述,我们通过多头注意力抵消了这种影响。
自我注意力,有时称为内部注意力,是一种将单个序列的不同位置联系起来以计算序列表示的注意机制。自我注意已成功地应用于各种任务,包括阅读理解、摘要摘要、文本蕴涵和学习任务无关的句子表征。
端到端记忆网络基于循环注意机制,而不是序列对齐的循环,并已被证明在简单的语言问答和语言建模任务中表现良好。
然而,据我们所知,Transformer是第一个完全依靠自我关注来计算其输入和输出表示的转导模型,而不使用序列对齐的RNN或卷积。在接下来的章节中,我们将描述Transformer,激发自我关注,并讨论其相对于[17,18]和[9]等模型的优势。
3 Model Architecture 模型结构
大多数竞争性神经序列转导模型具有编码器-解码器结构。这里,编码器将符号表示的输入序列(x1,…,xn)映射到连续表示的序列z=(z1,…,zn)。给定z,解码器然后一次生成一个元素的符号输出序列(y1,…,ym)。在每一步,模型都是自回归的,在生成下一步时,使用先前生成的符号作为附加输入。
Transformer遵循这种整体架构,为编码器和解码器使用堆叠的自关注和逐点、完全连接的层,分别如图1的左半部分和右半部分所示。
3.1 Encoder and Decoder Stacks 编码器与解码器堆栈
编码器:编码器由N=6个相同层的堆栈组成。每个层有两个子层。第一种是多头自我注意机制,第二种是简单的、位置式的全连接前馈网络。我们在两个子层中的每一个周围使用残差连接,然后进行层规范化。也就是说,每个子层的输出是LayerNorm(x+Sublayer(x)),其中Sublayer(x)是子层本身实现的函数。为了促进这些剩余连接,模型中的所有子层以及嵌入层都产生维度dmodel=512的输出。
解码器:解码器也由N=6个相同层的堆栈组成。除了每个编码器层中的两个子层之外,解码器还插入第三个子层,该子层对编码器堆栈的输出执行多头注意力。与编码器类似,我们在每个子层周围使用残余连接,然后进行层规范化。我们还修改了解码器堆栈中的自注意力子层,以防止位置关注后续位置。这种掩蔽,加上输出嵌入偏移一个位置的事实,确保了位置i的预测只能依赖于小于i的位置处的已知输出。
3.2 Attention 注意力机制
注意力函数可以描述为将查询和一组键值对映射到输出,其中查询、键、值和输出都是向量。输出被计算为值的加权和,其中分配给每个值的权重由查询与对应键的兼容性函数计算。
3.2.1 Scaled Dot-Product Attention 标量点乘注意力机制
我们将我们的特别的注意力机制称为“标量点乘注意力机制”。输入由维度dk的查询和键以及维度dv的值组成。我们使用所有键计算查询的点积,将每个键除以√dk,然后应用softmax函数来获得值的权重。
在实践中,我们同时计算一组查询的注意力函数,并将其打包成矩阵Q。键和值也打包成矩阵K和V。我们将输出矩阵计算为:
最常用的两种注意力函数是加法注意力和点积(乘法)注意力。点积注意力与我们的算法相同,只是比例因子为1/√dk。加法注意力使用具有单个隐藏层的前馈网络来计算兼容性函数。虽然两者在理论复杂度上相似,但由于可以使用高度优化的矩阵乘法代码来实现,因此在实践中,点积注意力速度更快,空间效率更高。虽然对于较小的dk值,这两种机制的表现相似,但在不缩放较大的dk的情况下,加法注意力优于点积注意力。我们怀疑,对于较大的dk值,点积的大小会变大,从而将softmax函数推入其梯度极小的区域。为了抵消这种影响,我们将点积缩放1/√dk。
3.2.2 Multi-Head Attention 多头注意力机制
与使用dmodel维度键、值和查询执行单个注意力功能不同,我们发现将查询、键和值分别以不同的、学习后的线性投影线性投影h次到dk、dk和dv维度是有益的。然后,在查询、键和值的每个投影版本上,我们并行执行注意力函数,生成dv维输出值。这些值被连接起来并再次投影,得到最终值,如图1所示。
多头注意力允许模型在不同位置共同关注来自不同表示子空间的信息。对于某个单注意力头,平均值会抑制这种情况。