Abstract
1 Introduction
我们提出了Transformer,一个放弃递归的模型结构,而是完全依靠注意机制来绘制输入和输出之间的全局依赖关系。
2 Background
减少顺序计算的目标也构成了扩展神经GPU[16]、ByteNet[18]和ConvS2S[9]的基础,它们都使用卷积神经网络作为基本构件,并行计算所有输入和输出位置的隐藏表示。在这些模型中,将来自两个任意输入或输出位置的信号联系起来所需的操作数量随着位置之间的距离增长,对于ConvS2S是线性增长,对于ByteNet是对数增长。这使得学习遥远位置之间的依赖关系更加困难[12]。 在Transformer中,这被减少到一个恒定的操作数,尽管其代价是由于注意力加权位置的平均化而降低了有效的分辨率,我们用3.2节中描述的多头注意力来抵消这种影响。自我注意力,有时被称为内部注意力,是一种与单个序列的不同位置相关的注意力机制,以计算该序列的表示。自我注意已被成功地用于各种任务,包括阅读理解、抽象概括、文本的必然性和学习与任务无关的句子表征[4, 27, 28, 22].端到端记忆网络是基于一种递归注意机制而不是序列对齐的递归,并已被证明在简单语言问题回答和语言建模任务中表现良好[34]. 然而,据我们所知,Transformer是第一个完全依靠自我注意来计算其输入和输出的表征而不使用序列对齐的RNNs或卷积的转导模型。在下面的章节中,我们将描述Transformer,激励自我注意,并讨论它与[17, 18]和[9]等模型相比的优势。
3 Model Architecture
编码器将输入的符号表示序列(x1,…,xn)映射到连续表示序列z=(z1,…,zn)。 给定z后,解码器产生一个输出序列(y1,…,ym)的符号,每次一个元素。在每个步骤中,该模型是自动回归的[10],在生成下一个符号时,消耗先前生成的符号作为额外的输入。Transformer遵循这个整体结构,使用堆叠的自注意和点状的、完全连接的层,用于编码器和解码器。
3.1 Encoder and Decoder Stacks
编码器:编码器是由N=6个相同的层组成的。 每层有两个子层。第一层是一个多头的自我注意机制,第二层是一个简单的位置全连接前馈网络。我们在两个子层的每一个周围采用了一个残差连接[11],然后进行层归一化[1]。 也就是说,每个子层的输出是LayerNorm(x+Sublayer(x)),其中Sublayer(x)是由子层本身实现的函数。为了方便这些残差连接,模型中的所有子层以及嵌入层都会产生维度为dmodel=512的输出。
解码器:解码器也是由N=6个相同层的堆栈组成。除了每个编码器层的两个子层之外,解码器还插入了第三个子层,它对编码器堆栈的输出进行多头关注。与编码器类似,我们在每个子层上采用了残差连接,然后进行层的归一化。我们还修改了解码器堆栈中的自我关注子层,以防止位置关注后续位置。 这种屏蔽,再加上输出嵌入偏移一个位置的事实,确保对位置i预测只依赖于小于i的位置的已知输出。
问题:Dropout、残差连接、归一化( Layer Normalization 和Batch Normalization)https://www.yuque.com/xiaoqiangqiang-fhnqc/fxv8fn/efp9fm
3.2 Attention
注意力函数可以被描述为将一个查询和一组键值对映射到一个输出,其中查询Q、键K、值V和输出都是向量。输出被计算为数值的加权和,其中分配给每个数值的权重是由查询Q与相应的键K的兼容函数计算的。
3.2.1 Scaled Dot-Product Attention
我们把我们的特别注意称为 “缩放点积注意”。 输入包括维度为dk的查询和键,以及维度dv的值。我们计算查询与所有键的点积,将每个键除以√dk,并应用一个softmax函数来获得值的权重。
在实践中,我们同时计算一组查询的注意函数,并将其打包成矩阵Q。键和值也被打包成矩阵K和V。我们计算输出的矩阵为。
两个最常用的注意函数是加法注意[2]函数和点乘(多乘)注意函数。点积式注意力与我们的算法相同,除了缩放系数1/√dk。加法注意力使用单隐层的前馈网络来计算兼容性函数。虽然两者在理论上的复杂性相似,但点乘法注意力在实践中要快得多,而且空间效率更高,因为它可以用高度优化的矩阵乘法代码来实现。
虽然对于小的dk来说,这两种机制的表现相似,但对于较大的dk值来说,加法注意力优于点积注意力,而没有缩放[3]。我们怀疑,对于大的dk维度,点积的大小会越来越大,把softmax函数推到它的梯度极小的区域。为了抵消这种影响,我们将点乘的比例定为1√dk。
3.2.2 Multi-Head Attention
我们发现,与其用模型维度的键、值和查询来执行一个单一的注意力函数,不如用不同的、学习过的线性投影来分别对查询、键和值进行线性投影,以达到dk、dk和dv维度。在这些投射的查询、键和值的每个版本上,我们都会并行地执行注意函数,产生dv维的输出值。 这些值被串联起来,并再次进行投影,从而得到最终的数值,如图2所示。
多头注意允许模型在不同的位置上共同关注来自不同表征子空间的信息。在单头注意的情况下,平均化抑制了这一点。
在这项工作中,我们采用了h=8个平行的注意层,或称头。 对于每一个头,我们使用k=dv=/h=64。由于每个头的维度减少,总的计算成本与全维度的单头注意相似。
3.2.3 Applications of Attention in our Model
在 “编码器-解码器注意力 “层中(模型红色框部分),查询来自前一个解码器层,而记忆键和值来自编码器的输出(最后一层)。这使得解码器中的每个位置都能关注到输入序列中的所有位置。这模拟了序列到序列模型中典型的编码器-解码器注意机制。
在自我注意层中,所有的键、值和查询都来自同一个地方,在这种情况下,就是编码器中前一层的输出。编码器中的每个位置都可以关注编码器前一层的所有位置。
类似地,解码器中的自注意力层允许解码器中的每个位置关注解码器中的所有位置,包括该位置。我们需要防止解码器中的信息向左流动以保持自动回归特性。我们通过掩盖(设置为∞)softmax输入中对应于非法连接的所有值,在缩放点乘法注意力中实现这一点。
3.3 Position-wise Feed-Forward Networks
除了注意子层之外,我们的编码器和解码器中的每一层都包含一个完全连接的前馈网络,该网络分别适用于每个位置,并且完全相同。这包括两个线性变换,中间有一个ReLU激活(即max函数)。
虽然线性变换在不同的位置是相同的,但它们在不同的层中使用不同的参数。 输入和输出的维度是dmodel=512,而内层的维度是ydff=2048。
3.4 Embeddings and Softmax
与其他序列转导模型类似,我们使用学习的嵌入来将输入标记和输出标记转换为维度为dmodel的向量。我们还使用通常的学习的线性转换和softmax函数,将解码器的输出转换为预测的下一个标记的概率。在我们的模型中,我们在两个嵌入层和pre-softmax线性转换之间共享相同的权重矩阵,与[30]类似。在嵌入层中,我们将这些权重乘以√dmodel
3.5 Positional Encoding
由于我们的模型不包含递归和卷积,为了使模型利用序列的顺序,我们必须注入一些关于符号在序列中的相对或绝对位置的信息。为此,我们在编码器和解码器堆栈底部的输入嵌入中添加“位置编码”。位置编码具有与嵌入相同的维度模型,因此可以将两者相加。有许多位置编码的选择,学习的和固定的[9]。
在这项工作中,我们使用不同频率的正弦和余弦函数。
其中eposis是位置,i是尺寸。也就是说,位置编码的每个维度对应于一个正弦波。波长形成一个从2π到10000-2π的几何级数。我们之所以选择这个函数,是因为我们假设它能让模型轻易地学会通过相对位置来关注,因为对于任何固定的偏移量k,PEpos+k可以被表示为PEpos的线性函数。
我们还试验了用学习的位置嵌入[9]来代替,发现这两种转换产生了几乎相同的结果(见表3(E)行)。我们选择了正弦波版本,因为它可能允许模型推断出比训练期间遇到的序列长度更长的序列。
Bert使用的是嵌入表示:torch.nn.embedding
4 Why Self-Attention

在这一节中,我们将自我注意层的各个方面与通常用于将一个可变长度的符号表示序列(x1,…,xn)映射到另一个相同长度的序列(z1,…,zn)的循环层和卷积层进行比较,xi,zi∈Rd,如典型的序列转导编码器或解码器中的隐藏层。我们使用自我注意的动机是考虑到三个方面的问题。
一个是每层的总计算复杂性。另一个是可以并行化的计算量,以所需的最小顺序操作数来衡量。
第三是网络中长程依赖关系之间的路径长度。学习长距离的依赖关系是许多序列转导任务中的一个关键挑战。影响学习这种依赖关系能力的一个关键因素是前向和后向信号在网络中必须穿过的路径长度。在输入和输出序列的任何位置组合之间的这些路径越短,就越容易学习长距离的依赖关系[12]。因此,我们也比较了由不同层类型组成的网络中任何两个输入和输出位置之间的最大路径长度。
如表1所示,自我注意层以恒定数量的顺序执行的操作连接所有的位置,而循环层需要O(n)个顺序操作。 就计算复杂度而言,当序列长度n小于表示维度yd时,自注意层比循环层快,最常见的情况是机器翻译中最先进的模型所使用的句子表示,如词片[38]和字节对[31]表示。为了提高包含很长序列的任务的计算性能,自我关注可以限制为只考虑以各自输出位置为中心的输入序列中大小的一个邻域。这也会增加最大路径长度(n/r)。我们计划在未来的工作中进一步研究这种方法。
一个内核宽度为k
5 Training
5.4 Regularization
Residual Dropout 在每个子层的输出被添加到子层的输入中并被归一化之前,我们对每个子层的输出应用了dropout[33]。此外,我们还对编码器和解码器堆栈中的嵌入和位置编码的总和进行剔除。对于基础模型,我们使用Pdrop=0.1的比率。
Label Smoothing 在训练过程中,我们采用了valuels=0.1的标签平滑法[36]。 这样做会增加困惑,因为模型学会了更多的不确定因素,但是提高了准确性和BLEU得分。
