[论文翻译]Attention Is All You Need
引言
今天带来神作Attention Is All You Need的翻译,该作提出了Transformer模型。很牛逼的模型像PLATO-2和GPT-3都是基于Transformer。
经典论文翻译系列
摘要
现在主导的序列转导(transduction)模型不是基于复杂的循环网络或就是基于卷积网络,它们都包含一个编码器和一个解码器。表现最好的模型也是通过一个注意力机制来连接编码器和解码器。我们提出一个新的简单的网络架构,Transformer,仅基于注意力机制,完全抛弃了循环和卷积网络。在两个机器翻译任务上的实验表面该模型在质量上更加优越,更易于并行训练从而训练时间大大减少。我们的模型在WMT2014英-德翻译任务上达到28.4BLEU得分,超过了现有最好的结果2分,包括通过集成学习实现的模型。在WMT2014英-法翻译任务上,我们的模型建立了一个新的单一模型最好的BLEU得分——41.8分,在8个GPU上训练了3.5天,这个训练时间只是目前记载的最好的模型训练成本的一小部分。基于有限的训练集或大的训练集,我们的模型成功的应用到英语选区分析(constituency parsing)任务上,说明Transformer模型能很好的推广到其他任务中。
1 简介
循环神经网络,尤其是LSTM和GRU,一直以来都在序列建模和转导问题(比如语言模型和机器翻译)上保持统治地位。此后,人们不断努力提升循环网络语言模型和编码器-解码器结构的瓶颈。
循环模型通常是对输入和输出序列的符号位置进行因子计算。在计算期间对齐位置和时间步,基于前一时间步的隐藏状态和当前时间步的输入,循环生成了一系列隐藏状态。这种固有的顺序特性排除了训练的并行化,这在更长的序列中成为重要问题,因为有限的内存限制了长样本的批次化。虽然最近有学者通过因子分解和条件计算技巧重大的提升了计算效率,同时提升了模型的表现。但是序列计算的基本限制仍然存在。
注意力机制已经变成了序列建模和各种任务中的转导模型的必备成分,允许为依赖建模而不必考虑输入和输出序列中的距离远近。除了少数情况外,这种注意力机制都与循环神经网路结合使用。
本文我们提出了Transformer,一个移除循环网络、完全基于注意力机制来为输入和输出的全局依赖建模的模型。Transformer 允许更多的并行化,并且翻译质量可以达到最牛逼水平,只需要在8个P100 GPU上训练12个小时。
2 背景
减少序列计算的目标形成了扩展的神经网络GPU、ByteNet和ConvS2S的基础,但是它们都是基于CNN,CNN可以为所有的输入和输出并行地计算隐藏状态。在这些模型中,连接来自两个任意输入或输出位置的信号所需的操作数随着位置之间的距离增加而增加,在ConvS2S中是线性增加,在ByteNet中是对数增加。这使得很难学到远距离依赖。在我们提出的Transformer模型中,这种操作减少到固定的次数,尽管由于注意力加权位置平均化而降低了效果,但我们用多头注意力(Multi-Head Attention)抵消这种影响。
自注意(Self-attention),有时被称为intra-attention,是一种关联序列的不同位置计算序列表示的注意力机制。自注意已经被成功地应用于各种任务,包括阅读理解、摘要抽取、文本蕴含和学习与任务无关的句子表征。端到端内存网络基于循环注意机制,而不是序列对齐的循环,已被证明在简单语言的问题回答和语言建模任务中表现良好。
基于循环注意力机制而不是序列对齐循环结构的端到端内存网络,被证明在简单语言问答和语言建模任务中表现良好。
然而,据我们所知,Transformer是第一个完全依靠自注意而没有使用序列对齐的RNN或卷积网络去计算输入和输出表示的转导模型。下面,我们会描述Transformer、(motivate)自注意,然后讨论它的优势。
3 模型架构
大部分有竞争力的神经网络序列转导模型都有一个编码器-解码器(Encoder-Decoder)结构。编码器映射一个用符号表示的输入序列到一个连续的序列表示。给定,解码器生成符号的一个输出序列,一次生成一个元素。在每个时间步,模型是自回归(auto-regressive)的,在生成下个输出时消耗上一次生成的符号作为附加的输入。
Transformer沿用该结构并在编码器和解码器中都使用叠加的自注意和基于位置的全连接网络,分别对应图1左半部和右半部。
图1:Transformer模型架构3.1 编码器和解码器栈
编码器: 编码器是由个相同的层(参数独立)堆叠而成的。每层都有两个子层(sub-layer),第一个子层是多头注意力层,第二个是简单的基于位置的全连接前馈神经网络。我们在两个子层周围先进行残差连接,然后进行层归一化(Layer Normalization)。这样,我们每个子层的输出是,其中是子层自己实现的函数。为了利用残差连接,该模型中的所有子层和嵌入层,输出的维度都统一为。
解码器: 解码器也是由个相同的层堆叠而成。解码器和编码器类似,除了编码器中的两个子层外,解码器增加了第三个子层,它对编码器栈输出进行多头注意力计算。我们也应用残差连接在每个子层的周围,然后是层归一化。我们还修改了解码器栈中的自注意子层,以防止当前位置注意到后面的位置。这种屏蔽(masking),加上输出嵌入向量偏移一个位置的事实,确保了对位置的预测只能依赖于位置小于的已知输出。
3.2 注意力
注意力函数可以说是匹配一个query和一系列key-value对到一个输出的函数。其中的query,key,value和输出都是向量。value的加权和得到输出,每个value的权重是通过一个query和相应key的某个函数计算。
图2:(左边)缩放点乘注意力 (右边)包含几个并行计算注意力层的多头注意力3.2.1 缩放点乘注意力
我们称我们这种特定的注意力为缩放点乘注意力(上图左边)。输入query和key的维度是,value的维度是。我们计算query和所有key的点乘结果,然后除以,最后应用一个softmax函数就得到value的相应权重。
在实践中,我们同时计算一组query的注意力函数,这一组query被压缩到一个矩阵,key和value也分别被压缩到矩阵和。我们通过下面的公式计算输出矩阵:
最常用的注意力函数是Bahdanau注意力,和点乘注意力。点乘注意力除了没有通过缩放外,和我们算法中的注意力函数相同。Bahdanau注意力通过一个单隐藏层的全连接网络计算。尽管这两个函数的复杂度都是相似的,但是点乘注意力在实际中更快、更节省空间。因为它能通过高度优化的矩阵乘法实现。
尽管在值不大的情况下,两者性能差不多,Bahdanau注意力超过没有对大的值缩放的点乘注意力,我们认为,对于大的值,点乘的结果也变得非常大,导致softmax函数到极其小梯度的区域,为了防止这点,我们缩放点积结果到。
3.2.2 多头注意力
我们发现将query、key和value分别用不同的、学到的线性映射倍到、和维效果更好,而不是用维的query、key和value执行单个attention函数。 基于每个映射版本的query、key和value,我们并行执行attention函数,产生维输出值。 将它们连接并再次映射,产生最终值,如图2(右边)所示。
多头注意力允许模型能对齐不同表示子空间信息到不同的位置。而普通的只有一个头的注意力会因为求平均而抑制了这一点。
其中
参数矩阵, , and 。
在本文中,我们设置个并行的注意力层,或注意力头。每个头中的,由于每个头维度的减少,总的计算量和正常维度的单头注意力差不多()。
3.2.3 注意力在我们模型中的应用
Transformer以三种方式使用多头注意力:
- 在编码器-解码器注意力层,query来自前一个解码器层,key和value来编码器输出。这允许解码器中每个位置能注意到输入序列中所有位置。这模仿了seq2seq模型中的典型的编码器-解码器的注意力机制。
- 编码器中的自注意层。在自注意层中,所有的key,value和query都来自同一个地方,在这里是编码器中前一层的输出,编码器中每个位置都能注意到编码器前一层的所有位置。
- 类似地,解码器中的自注意层允许解码器中的每个位置注意解码器中直到并包括该位置的所有位置。我们需要防止解码器中的左向信息流以保持自回归(auto-regressive)属性。我们在缩放点乘注意力中实现这点,通过屏蔽(mask)softmax的输入中所有不合法连接的值(设置为)。
3.3 基于位置的前馈网络
除了注意力子层,我们编码器和解码器中每个层都包含一个全连接前馈网络,它单独且相同地应用于每个位置。它包含了两个线性变换,其中有一个ReLU激活。
尽管线性变换对于不同位置来说是相同的,但它们使用层与层之间的不同参数。还可以说是两个内核大小为1的卷积层。该前馈网络中输入和输出的维度是,内部层的维度。
FFN引入了非线性,变换了注意力输出的空间, 从而增加了模型的表现能力。
3.4 嵌入层和Softmax
与其他序列转导模型类似,我们使用学习的嵌入层去转换输入和输出单词到维的词向量。我们也使用常用的线性转换和softmax函数来预测下一个单词的概率。在我们的模型中,我们在两个嵌入层之间和pre-softmax线性转换之间共享同样的权重矩阵。在嵌入层中,我们把它的权重乘了。
3.5 位置编码
因为我们的模型不包含循环和卷积,为了使用序列顺序信息,我们必须接入一些关于序列中单词相对或绝对位置的信息 。为此,我们将位置编码添加到编码器和解码器栈底部的输入词嵌入中。位置编码和词嵌入有相同的维度,所以它们可以求和。有多种位置编码可以选择,例如通过学习得到的和固定的位置编码。
本文中,我们使用不同频率的正弦和余弦函数来表示位置编码:
其中表示位置,表示维度。也就是说,位置编码的每个维度都对应一个正弦曲线。波长形成一个从到的等比数列。我们之所以选择这个函数,是因为我们假设这个函数可以让模型很容易地学到相对位置的注意力,因为对于任何固定的偏移量,都能表示为的一个线性函数。
我们也实验了学过的位置嵌入,然后发现这两种方式产生了几乎同样的结果(见下表3 行)。我们选择正弦版本是因为允许模型推断比训练期间遇到的更长的序列。
4 为什么选择自注意
在本节中,我们将自注意层的各个方面和通常用于映射一个变长序列的符号表示到另一个同样长度的序列的循环层和卷积层进行比较,其中,例如在典型的序列转导编码器或解码器中的一个隐藏层。我们使用自注意是考虑到满足三个需求。
一个是每层的计算复杂度。另一个是能并行的计算量,通过所需的最小顺序操作数来衡量。
第三个是网络中长距离依赖的路径长度。学习长距离依赖是很多序列转导任务的核心挑战。一个影响学习长距离依赖的关键因素是信号在网络中前向与反向传播的路径长度。计算输入和输出序列任意组合位置的路径越短,就越容易学到长距离依赖。因此我们也比较了由不同类型层组成的网络中任意两个输入和输出位置的最大路径长度。
表1:最大路径长度,对于不同类型层来说每层复杂度和最小顺序操作数。是序列长度,是表示向量的维度,是卷积层的核大小,是受限自注意层中邻域的大小。
image-20210806134215646如表1所示,自注意层通过一个常数大小的序列执行操作次数连接了所有的位置,而一个循环网络需要的序列操作。就计算复杂度来说,当序列长度小于表示维度时,自注意层比循环层更快,这是机器翻译中最先进模型常用的句子表示方式,比如单词(word-piece)表示法和字节对(byte-pair)表示法。为了提升涉及很长序列的计算性能,自注意能被限制到只考在输入序列以各自的输出位置为中心邻域大小为的范围。这能增加最大路径长度到。我们计划未来研究这种方法。
一个核宽度的单卷积层没有连接到输入和输出对的所有位置,为了达到这种效果,在邻近核(contiguous kernel)的情况下需要堆叠个卷积层,或在扩展卷积(dialated convolution)的情况下需要个。通常卷积层比循环层开销更大,与大小有关。然而,可分卷积(separable convolution)大幅减少复杂度到。然而,即使,可分卷积的复杂度等于组合一个自注意层和一个基于位置的前馈层,即我们模型中采用的方法。
间接的好处是自注意能产生可解释性更强的模型。我们研究了我们模型中注意力的分布,然后在附录中展示。独立的多头注意力可以清楚地学到执行不同的任务,许多似乎学到了句法结构以及句子的语义结构。
5 训练
本节描述了我们模型的训练方法。
5.1 训练数据和批次
我们对标准的 WMT2014英-德数据集进行了训练,该数据集由大约450万个句子对组成。句子是使用字节对编码,这种编码具有约37000个标记的共享源-目标词汇表。对于英语-法语,我们使用了更大的 WMT 2014英-法数据集,包括3600万个句子和分隔成32000个word-piece词汇表。句长相近的语句对被归为一个批次。每个训练批次由一组语句对组成,其中包含约25000个源单词和25000个目标单词。
5.2 硬件和安排
我们在一台有8个 NVIDIA P100 gpu 的机器上训练我们的模型。对于我们的基本模型,使用本文中描述的超参数,每个训练步大约需要0.4秒。我们训练基础模型总共100,000步或12小时。对于我们的大型模型,训练步时间是1.0秒。这些大模型被训练了30万步(3.5天)。
5.3 优化器
我们使用Adam优化器,和。我们根据这个公式在训练过程中改变学习率:
即在第一个训练步骤中线性地增加学习率,然后按照步数的逆平方根的比例减小。我们使用的。
5.4 正则化
我们在训练期间应用了三种正则化方法:
残差丢弃 我们应用dropout(丢弃)到每个子层的输出,在它被加到子层的输入(残差连接)和层归一化之前。此外,我们将dropout应用于编码器和解码器栈中的嵌入和位置编码的和。对于基本模型,我们使用dropout比率为。
上面说了两个方法:残差连接和Dropout
标签平滑
在训练期间,我们应用的标签平滑(label smoothing),这会影响困惑度(perplexity),因为模型学到的东西更加不确定,但是提升了准确率和BLEU得分。
6 结果
暂略
真的,后面会补上
7 总结
本文中,我们提出了Transformer,第一个完全基于注意力的序列转导模型,用多头注意力取代了编码器-解码器架构中最常用的循环层。
对于翻译任务,Transformer可以比基于循环或卷积层的体系结构训练更快。 在WMT 2014英-德和WMT 2014英-法翻译任务中,我们取得了最好的结果。 在前面的任务中,我们最好的模型甚至超过以前报道过的所有的集成模型。
我们对基于注意力的模型的未来感到兴奋。我们计划将Transformer扩展到除文本之外的涉及输入和输出模式的问题,并研究局部的、受限的注意力机制以有效处理大规模的输入和输出,如图像、音频和视频。 让生成具有更少的顺序性是我们的另一个研究目标。
我们用于训练和评估模型的代码可以在https://github.com/tensorflow/tensor2tensor上找到。