Attention Is All You Need-笔记

主流的序列转录模型 【给一个序列生成另一个序列】 是基于复杂的循环或卷积神经网络,其中包括一个编码器和一个解码器。性能最好的模型还通过注意机制连接编码器和解码器。我们提出了一个新的简单的网络架构Transformer,它完全基于注意机制,完全摒弃了递归和卷积。在两个机器翻译任务上的实验表明,该模型具有更好的并行性parallelizable,训练时间明显缩短。我们的模型在WMT 2014英语-德语翻译任务中达到28.4 BLEU 【机器翻译的一个衡量标准】 ,比现有的最佳结果(包括集成)提高了超过2个BLEU。在WMT 2014英语到法语的翻译任务中,我们的模型在八个gpu上训练3.5天后,建立了一个新的BLEU分数为41.0的单模型,这只是文献中最好模型训练成本的一小部分。

BLEU (其全称为Bilingual Evaluation Understudy), 其意思是双语评估替补。所谓Understudy (替补),意思是代替人进行翻译结果的评估。尽管这项指标是为翻译而发明的,但它可以用于评估一组自然语言处理任务生成的文本。

1.介绍

循环神经网络,特别是长短期记忆和门控循环神经网络,已经成为序列建模和转导问题的最先进方法,如语言建模和机器翻译。从那以后,许多工作继续推动循环语言模型和编码器-解码器体系结构的边界。

循环模型通常是按照输入与输出序列的顺序进行计算。在计算时将位置与步骤进行校准,它们生成一个隐藏状态ht,作为之前的隐藏状态ht-1和当前位置的输入t。(Aligning the positions to steps in computation time, they generate a sequence of hidden states ht, as a function of the previous hidden state ht−1 and the input for position t.)【这样就可将前面学到的历史信息通过ht-1放在当下,和当前的信息进行一些计算得到输出】 这种固定的顺序阻碍了训练样本数据的并行化,这种并行化在长序列文本中是至关重要的,由于内存约束限制了跨示例的批处理。最近的工作通过因式分解技巧[18]和条件计算[26]实现了计算效率的显著提高,同时也提高了后者的模型性能。然而,顺序计算的基本约束仍然存在。

注意机制已经成为各种任务中引人注目的序列建模和转录模型的一个组成部分,允许建模依赖性而不考虑输入或输出序列的距离。然而,除了少数情况外,[22]这种注意机制是与循环网络结合使用的。

在这项工作中,提出了Transformer避免循环的模型架构,模型完全依赖于注意力机制来控制输入和输出之间的依赖关系。Transformer允许并行化,在8个P100GPU上训练12小时,达到了高水平的翻译效果。

2.背景

减少顺序序列计算的目标也形成了扩展神经GPU[20]、ByteNet[15]和ConvS2S[8]的基础,所有这些都使用卷积神经网络作为基础构建块,并行计算所有输入和输出位置的隐藏表示。在这些模型中,将来自两个任意输入或输出位置的信号关联起来所需的操作数量随着位置之间的距离而增加,对于ConvS2S是线性增长的,对于ByteNet是对数增长的。这使得学习遥远位置之间的依赖关系[11]变得更加困难。在Transformer中,这被减少为一个恒定数量的操作,尽管这是以降低有效分辨率为代价的,因为平均注意权重位置,我们用3.2节中描述的Multi-Head Attention消除了这一影响。【Transformer: 提出的Multi-Attention其实是基于卷积神经网络的长处,由于CNN可以做多个输出通道,每一个通道可以识别不一样的模式, Multi-Attention可以模拟卷积神经网络多输出通道的效果。】

自注意,有时也称为内注意,是一种将单个序列的不同位置联系起来的注意机制,目的是计算序列的表示。自注意在阅读理解、摘要生成、文本蕴涵和与学习任务无关的句子表征等多种任务中都得到了成功的应用。【前人已经提出,不是作者的工作】

端到端的记忆网络是基于循环注意力机制,而不是顺序对齐的循环,在简单的语言问询和语言模型任务中表现良好。

然而,据我们所知,Transformer是第一个完全依赖于自注意力来计算输入输出表示的转换模型,而不使用序列对齐的RNN或卷积。在接下来的部分,我们将描述Transformer、自注意力机制和讨论它相比于[14][15][8]等模型的优点。

3.模型架构

大多数相关的神经序列转录模型都有编码和解码结构。在这里,编码器映射一个符号表示的输入序列{x1,…,xn}转变为一个连续表示的序列{z1,…,zn}。给定z,解码器然后生成一个输出序列(y1,…, ym) 的符号一次一个元素。在每个步骤中,模型都是自回归[9],在生成下一个步骤时,使用先前生成的符号作为附加输入。也就是说,上一步的输出依赖于上一步的输入。【auto-regressive:在过去时刻的输出作为当前时刻的输入,即在生成yt时,需要拿到y1,y2,…,yt-1作为输入。】

Transformer遵循这种总体架构,使用堆叠的自注意层和点状的完全连接层,分别用于编码器和解码器,如图1的左半部分和右半部分所示。

3.1 编码器和解码器栈

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

**解码器:**该解码器也由N = 6个相同层的堆栈组成。除了每个编码器的两个子层外,解码器插入了第三个子层,该子层对编码器堆栈的输出执行多头注意机制。(提出的Multi-Attention其实是基于卷积神经网络的长处,由于CNN可以做多个输出通道,每一个通道可以识别不一样的模式, Multi-Attention可以模拟卷积神经网络多输出通道的效果。)与编码器类似,我们在每个子层周围使用残差连接,然后进行层归一化。我们还修改译码器堆栈中的自注意子层,以防止位置注意到后续位置(只能看到当前位置和之前的位置)。这种遮盖,加上输出嵌入被一个位置抵消的事实,确保了对位置i的预测只能依赖于小于i位置的已知输出。 【由于解码器采用自回归,即在过去时刻的输出作为当前时刻的输入,也就是说在预测时无法看到之后的输入输出,但是在注意力机制当中,可以看到完整的输入,为了避免这种情况的发生,在解码器训练时,在预测t时刻的输出时,不应该能看到t时刻以后的输入。做法是:采用带掩码的Masked注意力机制,从而保证在t时刻无法看到t时刻以后的输入,保证训练和预测时的行为一致性】

3.2 注意力机制

注意力函数可以描述为将一个query和一组key-value对映射到一个输出,其中query、key、value和output都是向量。输出是按值的加权和计算的,其中分配给每个值的权重是通过查询的兼容性函数与相应键计算的。【这样可以保证输出的维度和Value的维度一致】

3.2.1 Scaled Dot-Product Attention

将之称为Scaled Dot-Product Attention(图2) (左)Scaled Dot-Product Attention;(右)多头注意力机制由几个平行运行的注意力层组成。 【Mask的作用:避免第t时刻看到以后时间的东西。具体如何做?假设Query和Key都是等长为n,在时间上能对应起来,对于第t时刻的qt,应该只能看到k1…kt-1,而不应该看到t-1时刻之后的东西。但是在注意力机制中能看到所有,qt会和所有的k1…kt1…kn做运算,其实我们可以将其计算出来,但是要保证在输出时将其权重置为一个非常大的负数,这样就可以保证经过softmax函数后其值变为0,这样就保证了前t-1个值有效】 输入由dk维的查询和键以及dv维的值组成,我们计算查询的所有键的点积,每个键除以√dk,然后应用一个softmax函数来获得值的权重。在实际计算中,我们同时计算一组查询的注意力函数,它们被放置到一个矩阵Q中。键和值也被放置到矩阵K和V中。我们计算输出矩阵为: 【其实这里表达的意思是,在实际计算过程中我们不会一个一个的去计算,而是将它放到矩阵当中,进行矩阵乘法。如果有一组key-value对和n个Query,可以通过两次矩阵乘法完成最终的Attention值输出。这样同时也体现了并行计算的特点】

两个最常用的注意函数是加法注意力[2]和点积注意力。点积注意力与我们的算法相同,除了比例因子为1/√dk。加法注意力使用具有单一隐层的前馈网络计算相容性函数。虽然这两者在理论上的复杂性是相似的,但点积注意力在实践中要快得多,空间效率更高,因为它可以使用高度优化的矩阵乘法代码来实现。 当dk值较小时,两种机制表现相似,当dk较大时,无缩放的加法注意力优于点积注意力。我们怀疑,对于dk的大值,点积的量级变大,将softmax函数推到具有极小梯度的区域。为了抵消这种影响,我们将点积乘以1√dk 【这里解释了为什么要除以根号dk:当dk较大时,也就是两个向量较长时,进行点积运算,得到的值可能会很大也可能会很小,在进行softmax运算得到的最终结果要么接近于1,要么接近0,导致梯度消失或者爆炸,因此除以根号dk是一个不错的选择!】

3.2.2 多头注意力机制 我们发现,与使用dmodel维的键、值和查询执行单一的注意力函数不同,将查询、键和值分别线性投影到dk、dk和dv维h次是有益的。在查询、键和值的每个投影版本上,我们并行执行注意力函数,生成dv维输出值。这些被连接起来并再次进行投影,产生最终的值,如图2所示。 【这里之所以要做多头注意力函数:我们发现Scaled Dot-Product Attention当中没有可以学习的参数,有时我们为了去学习不一样的模式,希望有不一样的计算相似度的办法,那么首先投影到低维,投影的权重w是可以学习的,通过h次能学习到不一样的投影方法,使得在投影进去的度量空间里面能够匹配需要的相似函数。】 多头注意力使模型能够联合注意来自不同位置的不同表示子空间的信息。对于单一注意力头,平均会抑制这一点。 为了说明点积变大的原因,假设q和k的分量是均值为0,方差为1的独立随机变量。他们的点积,q·k,均值为0,方差为dk 在这项研究中,我们使用了h = 8个平行注意层,即头部。我们使用dk = dv = dmodel/h = 64。由于每个头的维数降低,其总计算成本与全维单头注意力的计算成本相似。

3.2.3 注意力在模型中的应用 Transformer使用三种不同的注意力机制:

在“编码器-解码器注意”层中,查询来自前面的解码器层,而内存键和值来自编码器的输出。这使得解码器中的每个位置都可以覆盖输入序列中的所有位置。这模仿了序列对序列模型中典型的编码器-解码器注意机制,如[3][2][8]

编码器包含自我注意层。在自我注意层中,所有的键、值和查询都来自同一个地方,在本例中,是编码器中前一层的输出。编码器中的每个位置都可以处理编码器上一层中的所有位置。

同样,解码器中的自注意力层允许解码器中的每个位置注意到解码器中直到并包括该位置的所有位置。我们需要防止解码器中的信息向左流动,以保持自回归特性。我们通过屏蔽(设置为−∞)softmax输入中与非法连接对应的所有值,在缩放点积注意中实现了这一点。

3.3 Position-wise前馈神经网络

除了注意力子层,编码器和解码器中的每一层都包含一个完全连接的前馈网络,该网络分别且相同的应用于每个位置。这包括两个线性变化,中间有一个ReLU激活函数。 虽然线性变换在不同位置上是相同的,但它们在层与层之间使用不同的参数。另一种描述方法是两个内核大小为1的卷积。输入输出维数dmodel= 512,内层维数dff = 2048。

3.4 Embeddings and Softmax

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

3.5 Positional Encoding位置编码

由于模型不包含循环和卷积,为了让模型具有序列的顺序,我们必须注入一些关于序列中标记的相对或绝对位置的信息。为此,我们将“位置编码”添加到输入嵌入层中,在表1:最大路径长度,每层复杂度和不同层类型的最小顺序操作数量。n为序列长度,d为表示维数,k为卷积核的大小,r为限制自注意邻域的大小。 编码器和解码器栈的底部。位置编码具有与嵌入相同的维数模型,因此二者可以求和。位置编码有许多选择,学习的和固定的[8]。在这项工作中,我们使用了不同频率的正弦和余弦函数: 其中pos是位置,i是维度。也就是说,位置编码的每个维度对应一个正弦信号。波长形成一个从2π到10000·2π的几何级数。我们选择这个函数是因为我们假设它可以让模型很容易地学会通过相对位置加入,因为对于任何固定偏移量k, P Epos+k可以表示为P Epos的线性函数。

4.自注意力机制

在本节中,我们将自注意层的各个方面与循环层和卷积层进行比较,这些层通常用于映射一个可变长度的符号表示序列(x1,…, xn)到另一个长度相等的序列(z1,…, zn),与xi, zi∈Rd,如典型序列转变编码器或解码器中的隐藏层。激发我们使用自注意的机制,我们认为有三个需求。

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

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

如表1所示,自我注意层用固定数量的顺序执行操作连接所有位置,而循环层需要O(n)个顺序操作。在计算复杂度方面,当序列长度n小于表示维数d时,自注意层比循环层更快,这是机器翻译中最先进的模型所使用的句子表示的最常见情况,如词块[31]和字节对[25]表示。

为了提高包含非常长的序列的任务的计算性能,自我注意可以被限制到只考虑输入序列中以各自输出位置为中心的大小为r的邻域。这将使最大路径长度增加到O(n/r)。我们计划在未来的工作中进一步研究这种方法。

一个核宽k < n的卷积层并不连接所有的输入和输出位置对。在连续核的情况下,这样做需要一个O(n/k)个卷积层的堆栈,在扩展卷积[15]的情况下,需要O(logk(n))个卷积层,增加网络中任意两个位置之间的最长路径的长度。卷积层通常比循环层的成本高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英语-法语数据集,其中包含36M个句子,并将标记拆分为32000个单词-片词汇[31]。句子对按大致的序列长度分批排列在一起。每个训练批包含一组句子对,其中包含大约25000个源指令和25000个目标指令。

5.2 Hardware and Schedule硬件和进度

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

5.3 Optimizer

我们使用Adam优化[17]β1 = 0.9, β2 = 0.98和ε= 10−9。在整个训练过程中,我们根据公式改变学习率: 这对应于对第一个warmup_steps训练步骤线性增加学习速率,然后按步数的倒数平方根比例减少学习速率。我们使用了warmup_steps = 4000。

5.4 Regularization正则化

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

Residual Dropout

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

表2:在英语-德语和英语-法语最新的2014年测试中,Transformer比之前的最先进的方法获得了更好的BLEU分数,而训练成本只是它的一小部分。 Label Smoothing

在训练过程中,我们使用值εls = 0.1[30]的标签平滑。这导致困惑度,因为模型学会了更多的不确定,但提高了准确性和BLEU得分。

6 Results

6.1 机器翻译

在WMT 2014英语到德语的翻译任务中,big transformer模型(表2中的transformer (big))比之前报告的最佳模型(包括集成)的表现高出2.0 BLEU以上,建立了28.4的最新BLEU分数。该模型的配置列在表3的底部。训练时间为3.5天,使用8个 P100 gpu。甚至我们的基础模型也超过了所有之前发表的模型和集成,而训练成本仅为任何竞争模型的一小部分。

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

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

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

6.2 模型评估

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

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

表3:Transformer体系结构的变化。未列出的值与基本模型的值相同。所有指标都在英语-德语翻译开发集,newstest2013。根据我们的字节对编码,列出的困惑是按字计算的,不应该与按字计算的困惑相比。 在表3行(B)中,我们观察到减少注意键大小dk会损害模型质量。这表明确定相容性并不容易,一个比点积更复杂的相容性函数可能是有益的。我们在©和(D)行中进一步观察到,正如预期的那样,越大的模型越好,dropout对于避免过拟合非常有帮助。在(E)行中,我们将正弦位置编码替换为学习过的位置嵌入[8],并观察到与基本模型几乎相同的结果。

7. 结论

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

对于翻译任务,训练Transformer比基于循环层或卷积层的体系结构要快得多。在WMT 2014英语到德语和WMT 2014英语到法语的翻译任务中,我们实现了一个新的艺术状态。在前一个任务中,我们的最佳模型甚至超过了所有以前报告的集合。

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

查看原文