Attention Is All You Need

时间:2024-03-28 14:03:37

摘要

    目前的序列转化模型都是基于编码器-解码器的复杂CNN和RNN。目前最好的模型就是将编码器与解码器利用注意力机制(attention mechanism)连接起来。本文提出一种简单的模型结构,遗弃了CNN和RNN,仅仅使用注意力机制。在两个机器翻译的任务上,本文模型在性能上比现有模型好。

1.Introduction

    RNN,LSTM以及gated RNN在序列模型中已经得到了广泛的模型,例如语言模型、机器翻译等。目前,依旧有大量的工作在致力于循环语言模型和编码-解码结构。

     循环模型通常按照输入输出序列的位置顺序进行计算。在整个计算过程,会生成一个隐含状态的序列,当step=t时,隐含状态输出ht是上一时刻隐含状态输出ht-1和当前输入xt的函数。这种固有的顺序性限制了训练样本的处理不能并行化。这一点在长度较长的序列上上变得至关重要,因为内存约束限制了样本的批处理。尽管最近的工作通过因式分解(factorization tricks)的技巧和条件计算(conditionalcomputation)显著地提高了计算效率,与此同时,也提高了模型的性能。然而序列计算的主要约束依旧存在。

      注意力机制已经成为众多任务中序列建模和转导模型的一个重要组成部分,他允许对依赖进行建模,而不考虑它们在输入或输出序列的距离(allowing modeling of dependencies without regard to their distance in the input or output sequences)。然而,除了少数例子中,注意力机制用于RNN之间的链接用。

      本文提出一个模型,替代传统的RNN,仅利用注意力机制来关注输入和输出序列的全局依赖,Transformer。Transformer允许并行化,并且在翻译任务上达到了较好的效果与较高的效率。

2.Background

     减少序列计算的目标是并行的计算所有输入和输出位置并行计算。这也构成了Extended Neural GPU[16], ByteNet [18] 和ConvS2S等都使用卷积神经网络作为基本的构建块的应用的基础。

    在这些模型中,将来自两个任意输入或输出位置的信号联系起来的操作数随着位置之间的距离的增加在增加,对于ConvS2S是线性的增加,对ByteNet对数地增加。这使得学习较远距离位置之间的依赖变得困难。在Transformer中,操作的数量将会被减少为常数量级,albeit at the cost of reduced effective resolution due to averaging attention-weighted positions, an effect we counteract with Multi-Head Attention as described in section 3.2.

 

    self-attention,有时被称为intra-attention,是一种仅仅关注单个序列内部不同位置的注意机制,以计算序列的表示。self-attention目前已经成功地应用于各种各样的任务,其中包括阅读理解,摘要总结,文本的暗含和学习任务独立的句子表示[4,27,28,22]

      然而,据我们所知,Transformer是第一个完全依靠self-attention来计算输入和输出表示的转换模型,而不需要使用顺序对齐的RNNs或卷积网络。在下面的部分中,我们将描述Transformer,使用self-attention的原因,并讨论它优于17、18和9等模型的优点。

3.Model

Attention Is All You Need

 

 

     目前效果较好的多数神经网络序列转换模型都有一个编码解码结构[5、2、35]。编码器是将输入序列(x1,...,xn)映射为连续的表示z=(z1,...,zn)。根据输入序列的表示z=(z1,...,zn),解码器将生成输出序列(y1,...,yn)。模型的每一步是自回归的,上一步的输出作为当前的输入。

    Transformer将继续遵循上述的整体架构,编码器和解码器都使用堆叠的self-attention和point-wise,和全连接层。如上图,左边为编码器,右边为解码器。

3.1Encoder and Decoder Stacks

        编码器:编码器具有六层。每一层有两部分组成,分别为multi-head self-attention mechanism和位置相关的全连接前馈网络。每层之间(6层之间使用一个残差链接之后normalization,也就是说每层输出为LayerNorm(x+Sublayer(x))。为了使用残差链接,每层的输出维度与输入维度相同。

       解码器:解码器也由一堆N=6相同的层组成。除了编码器每层包含的两个子层之外,解码器还插入第三个子层,它对编码器堆栈的输出执行multi-head self-attention mechanism。与编码器类似,我们在每个子层输出使用残余连接,然后是层标准化。我们还修改了解码器堆栈中的self-attention,以防止位置出现在后续位置。确保了预测位置i的值时只用到已知的输出,即位置索引小于i的值。

3.2 Attention

       attention函数可以被描述为将query和一组key-value对映射到输出,其中query, keys, values和输出都是向量。输出为这些值的加权总和,其中分配给每个值的权重是由query的compatibility函数和相应的key来计算的。

Attention Is All You Need

 

 

3.2.1 Scaled Dot-Product Attention

     我们将我们的特别attention称为“Scaled Dot-Product Attention”(图2)。输入由维度dk的query和key以及维度dv的value的值。我们计算query与所有key的点积,再除以根号dk,然后应用一个softmax函数来获得每一个value的权重。

    实际上,我们同时将一组query组合成一个矩阵Q来计算他们的attention函数。key和value也被打包成矩阵K和V。我们计算输出矩阵为:

Attention Is All You Need

 

      最常用的两种注意力功能是additive attention[2]和dot-product (multiplicative) attention。dot-product (multiplicative) attention与我们的算法是一样的,需要除了根号dk的比例因子。additive attention使用一个单隐藏层的前馈网络计算compatibility函数。虽然这两者在理论复杂性上是相似的,但在实践中,dot-product 注意力要快得多,空间效率也更高,因为它可以使用高度优化的矩阵乘法代码来实现。

      当dk较小时,这两种机制的性能相似,但当dk较大时,additive attention要优于dot-product attention。我们认为,对于dk的大值来说,dot-product 的大小会大大增加,将softmax函数推入具有非常小的梯度的区域。为了抵消这种影响,我们用根号dk的倒数来缩小dot-product。

3.2.2 Multi-Head Attention

      我们没有使用d-model维度key、value和query的单一的attention function,而是将key,value和query分别线性映射h次,得到其维度分别为dk、dk和dv的线性向量,线性地对查询、键和值进行线性规划是有益的。在对query、key和value的每一次映射,我们并行使用attention函数,产生dv-维度输出值。最终这h个值被连接起来再一次投射产生最终的值,上图所示。With a single attention head, averaging inhibits this.

 

 

Attention Is All You Need

3.2.3 Applications of Attention in our Model

  • 在“编码-解码器注意”层中,query来自之前的的解码器层,而key和value来自编码器的输出。这使得decode中的每个位置都可以处理输入序列中所有位置。这模拟了seq2seq模型中典型的encode-decode注意机制,例如[38,2,9]
  • encode包含self-attention。在一个self-attention中,所有的value、key和query都来自encode中前一层的输出。encode中的每个位置都可以处理encode的前一层中的所有位置。
  • 类似地,解码器中的self-attention允许解码器中的当前位置之前的所有位置。我们需要防止解码器中的左向信息流动,以保护自动回归特性(阻止利用当前位置后面的信心)。We implement this inside of scaled dot-product attention by masking out (setting to 负无穷) all values in the input of the softmax which correspond to illegal connections。参见网络结构图

3.3Position-wise Feed-Forward Networks

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

Attention Is All You Need

 

 

3.4 Embeddings and Softmax

      与其他序列转换模型类似,我们使用学习的embedding来将输入词和输出词转换成维度dmodel的向量。我们还需要使用线性变换和softmax函数来将解码器输出转换成预测的位置输出概率。在我们的模型中,我们在两个embedding层和前softmax线性变换之间共享相同的权重矩阵,类似于[30]。在embedding层中,我们将这些权重乘以根号dmodel。

3.5 Positional Encoding

      因为我们的模型不包含递归和卷积,为了让模型能够利用序列的顺序,我们必须在序列中注入一些关于词的相对或绝对位置的信息。为此,我们将“位置编码”添加到输入的embedding中,位于编码器和解码器的最开始。位置编码采用相同的维度dmodel的向量,可以对两者进行求和。位置编码有很多选择,本文中选择使用余弦函数如下。

Attention Is All You Need

      在这里,pos是位置,i是维度。也就是说,位置编码的每一个维度都对应一个正弦信号。波长从2π到10000x2π。我们选择这个函数是因为我们假设它可以让模型很容易地通过相对位置来学习,因为对于任何固定的偏置k,PEpos+k都可以表示成一个线性函数PE pos。

      我们还尝试使用学习的位置嵌入9,并发现这两个版本产生了几乎相同的结果(参见表3行(E))。我们选择了正弦的版本,因为它允许模型推断出序列长度比在训练中遇到的序列长度长。

4 Why Self-Attention

      在本节中,我们将self-attention层的各个方面与经常用于seq2seq的循环网络和卷积层进行比较(x1,...,xn)到另一个相等长度的序列(z1,...,zn),其中xi和zi都是d维向量,例如在典型的序列转换编码器或解码器中的隐藏层。激发我们使用self-attention主要出于以下三点考虑。一个是每层的计算复杂度。另一个是可以并行化的计算量,这是由所需的连续操作的最小数量来度量的。第三个是网络中long-range关系的路径长度。在许多序列转化任务中,学习long-range是一个关键的挑战。网络中的前向传播和反向传播的路径长度将影响模型的学习能力。路径长度越短,越容易学习long-range依赖。因此,我们还比较了由不同的网络层组成的网络中任意两个输入和输出位置之间的最大路径长度

正如表1所指出的,一个self-attention层将使用一系列操作将所有位置连接起来,而一个循环层需要O(n)序列操作。在计算复杂度方面,当序列长度n小于表示维度d时,self-attention层比循环层要快,这通常是在机器翻译中使用最先进的模型的句子表示形式,比如word-piece[38] and byte-pair表示。为了提高包含非常长的序列的任务的计算性能,self-attention可以被限制为只考虑一个以输入序列各自的输出位置为中心的大小为r的社区。这将使最大路径长度增加到O(n=r)。我们计划在未来的工作中进一步研究这种方法。