本文提出了一种新的简单的网络结构——Transformer,它完全基于注意机制,而不需要递归(RNN)和卷积(CNN)。
文章链接:Attention Is All You Need
代码链接:Transformer
一、文章引入
主流的Seq-Seq的模型通常采用RNN或者是CNN,一般在网络结构中都会用到encoder和decoder, 效果比较好的模型会通过attention(注意力机制)连接encoder和decoder。但是这种网络结构也存在一些问题:
递归模型通常沿输入和输出序列的符号位置进行因子计算。将位置与计算时间中的步骤对齐,它们生成隐藏状态ht的序列,作为先前隐藏状态ht-1和位置t的输入的函数。这种固有的序列性质使得其难以并行化;缺乏对全局信息的理解, 尤其是长距离和层级化的依赖关系难以建立。
注意机制已成为各种任务中引人注目的序列建模和转导模型不可或缺的一部分,允许对依赖项进行建模,而无需考虑它们在输入或输出序列中的距离。但在大多数情况下,注意力机制仍然需要和递归网络结合使用。
本文提出的Transformer不需要任何递归网络,而完全依赖于注意机制来绘制输入和输出之间的全局依赖关系。
二、Background
1、在先前提出的模型中,关联来自两个任意输入或输出位置的信号所需的操作数在随着位置间距离的增加而增加,这使得学习远距离之间的依赖关系变得更加困难。 在Transform中,此操作被减少为恒定的操作次数,尽管由于平均注意力加权位置而导致有效分辨率降低,但作者使用了多头注意力来抵消这种效果。
2、Self-attention将单个序列的不同位置联系起来,以计算序列的表示。自注意在阅读理解、抽象概括、语篇蕴涵和学习任务无关的句子表征等任务中得到了成功的运用。
3、End-to-end memory networks 基于递归注意机制,而不是序列对齐的递归,并且已被证明在简单语言问答和语言建模任务中表现良好。
三、Model Architecture
大多数竞争性神经序列转导模型都具有编码器-解码器( encoder-decoder)结构。编码器将字符表示的输入序列(x1,…,xn)映射到连续表示的序列z=(z1,…,zn)。给定z,解码器一次生成一个字符的输出序列(y1,…,ym)。每一步模型都是自回归的,在生成下一步时,将先前生成的标签作为附加输入。
Transform遵循这种总体架构,对编码器和解码器使用堆叠式自注意力和逐点,全连接层,分别如图1的左半部分和右半部分所示。
图一:Transform模型架构
3.1 Encoder and Decoder Stacks
Encoder:编码器由N = 6个相同层的堆栈组成。 每层都有两个子层。 第一个是多头自注意机制,第二个是简单的位置全连接的前馈网络。在两个子层的每一层周围采用残差连接,然后进行层归一化。 也就是说,每个子层的输出是LayerNorm(x + Sublayer(x)),其中Sublayer(x)是由子层本身实现的功能。 为了促进这些残差连接,模型中的所有子层以及嵌入层均产生尺寸为dmodel = 512的输出。
Decoder:解码器同样是由N = 6个相同层的堆栈组成。 除了每个编码器层中的两个子层之外,解码器还插入第三子层,该第三子层对编码器堆栈的输出执行多头关注。 与编码器类似,在每个子层周围采用残差连接,然后进行层归一化。 还修改了解码器堆栈中的自注意子层,以防止位置关注后续位置。 这种掩盖,加上输出嵌入偏移一个位置,确保了对位置i的预测只能依赖于小于i位置的已知输出。
第一级decoder的key, query, value均来自前一层decoder的输出,但加入了Mask操作,即我们只能attend到前面已经翻译过的输出的词语,因为翻译过程我们当前还并不知道下一个输出词语,这是我们之后才会推测到的。而第二级decoder也被称作encoder-decoder attention layer,即它的query来自于之前一级的decoder层的输出,但其key和value来自于encoder的输出,这使得decoder的每一个位置都可以attend到输入序列的每一个位置。
3.2 Attention
注意力函数可以描述为将查询和一组键值对映射到输出,其中查询,键,值和输出都是向量。 输出计算为值的加权总和,其中分配给每个值的权重是通过查询与相应键的兼容性函数来计算的。
图二:(左)缩放点积注意。(右)由几个平行运行的注意层组成的多头注意力。
假如我们要翻译一个词组Thinking Machines,其中Thinking的输入的embedding vector用 x1 表示,Machines的embedding vector用 x2 表示。
当我们处理Thinking这个词时,我们需要计算句子中所有词与它的Attention Score,这就像将当前词作为搜索的query,去和句子中所有词(包含该词本身)的key去匹配,看看相关度有多高。我们用 q1 代表Thinking对应的query vector,k1 及 k2 分别代表Thinking以及Machines对应的key vector,则计算Thinking的attention score的时候我们需要计算 q1 与 k1,k2 的点乘,同理,我们计算Machines的attention score的时候需要计算q2 与 k1,k2 的点乘。如上图中所示我们分别得到了 q1 与 k1,k2 的点乘积,然后我们进行尺度缩放与softmax归一化,如下图所示:
显然,当前单词与其自身的attention score一般最大,其他单词根据与当前单词重要程度有相应的score。然后我们在用这些attention score与value vector相乘,得到加权的向量。
3.2.1 Scaled Dot-Product Attention
输入包括维度为dk的查询和键以及维度为dv的值。使用所有键计算查询的点积,每个键都除以√dk,然后应用softmax函数获得值的权重。
在实际应用中,同时计算一组查询的注意函数,将它们组合成一个矩阵Q,并将键和值组合成矩阵K和V。将输出矩阵计算为:
3.2.2 Multi-Head Attention
与使用dmodel维的键,值和查询执行单个注意功能相比,我们发现使用不同的、可学习的线性投影将查询、键和值分别投影到dk、dk和dv维度h次是有益的。 然后,在每一个查询,键和值的投影上,并行执行注意函数,从而产生dv维的输出值。 将它们连接起来并再次投影,得到最终值,如图2所示。
3.2.3 Applications of Attention in our Model
Transform以三种不同的方式使用多头注意:
1、在“编码-解码器注意”层中,查询来自上一个解码器层,而内存键和值来自编码器的输出。这使得解码器中的每个位置都可以参与输入序列中的所有位置。
2、编码器包含自注意层。 在自注意层中,所有键,值和查询都来自同一位置,在本文中,是编码器中上一层的输出。 编码器中的每个位置都可以注意编码器上一层中的所有位置。
3、类似地,解码器中的自注意层允许解码器中的每个位置关注直到并包括该位置的解码器中的所有位置。 我们需要防止解码器中向左流动信息,以保留自回归属性。 通过屏蔽(设置为-∞)softmax输入中与非法连接相对应的所有值,从而在点积乘积内实现了这一目标。 参见图2。
3.3 Position-wise Feed-Forward Networks
除了注意力子层,编码器和解码器中的每一层都包含一个全连接的前馈网络,该前馈网络分别独立的应用于每个位置。包括两个线性转换,中间有一个ReLU激活。
虽然不同位置的线性变换是相同的,但它们在不同的层之间使用不同的参数。另一种描述方法是核大小为1的两个卷积。输入输出的维数为dmodel=512,内层的维数为dff=2048。
3.4 Embeddings and Softmax
与其他序列转导模型类似,使用学习的嵌入将输入标记和输出标记转换为dmodel维的向量。 还使用学习到的线性变换和softmax函数将解码器输出转换为预测的下一个字符概率。 在本文的模型中,在两个嵌入层和pre-softmax线性变换之间共享相同的权重矩阵。 在嵌入层中,将这些权重乘以√dmodel。
3.5 Positional Encoding
由于我们的模型不包含递归和卷积,为了使模型能够利用序列的顺序,必须注入一些关于字符在序列中的相对或绝对位置的信息。为此,将“位置编码”添加到编码器和解码器堆栈底部的输入嵌入中。位置编码与嵌入具有相同的维度dmodel,因此可以将两者相加。
在这项工作中,我们使用不同频率的正弦和余弦函数:
其中pos是位置,i是维度。也就是说,位置编码的每个维度对应于一个正弦。
四、实验结果
五、结论
• 区别于主导序列转导模型基于包括编码器和解码器的复杂递归或卷积神经网络,Transformer完全基于Attention机制,避免了重复和卷积,使得并行化成为可能,提高了时间性能。
• 本文提出用attention做翻译,不用RNN和CNN,attention计算快,并行度高,而且任何两个词的距离都是1,擅长抓长距离依赖。