论文标题:Attention Is All You Need
论文链接:https://arxiv.org/abs/1706.03762
一 、概述
Transformer是一种新的架构,用来学习输入和输出之间的全局依赖关系。比起以往使用RNN(recurrent neural network)来处理NLP领域中的诸多任务,Transformer是一种全新的架构,其中规避开了recurrence架构,并且相比于RNN,其并行计算的能力更强(more parallelizable)。
二、模型架构
- 模型中的encoder和decoder
- 整体架构
大多数神经序列转导模型都有一个encoder-decoder结构。Encoder将输入映射到,获得后,decoder会在每个时间步产生一个序列中的元素,直至生成整个序列。在每一个时间步,模型都是自回归的,也就是在生成下一个元素时使用先前生成的元素作为附加输入。
Transformer也使用了encoder-decoder架构,其具体架构图如下:
- Encoder
Transformer的encoder由6个相同的层堆叠而成,每一层有两个子层,其中第一个子层是multi-head attention层,第二个子层就是一个简单的前馈网络,在每个子层后面都有一个residual connection和layer normalization,也就是说每个子层的输出可以表示为:
代表每个子层实现的函数。为了促使这些residual connection发挥作用,模型中的所有子层以及下面的embedding层,都会产生维度的输出。
- Decoder
Transformer的decoder也是由6个相同的层堆叠而成,除了encoder中的两种子层,decoder还添加了第三种子层,也就是在encoder的输出上执行multy-head attention的一层。同样的每一层后面都有residual connection和layer normalization。图中decoder最下面的子层会被修改来防止每个位置attend到这个位置后面的元素。
- Attention
- Scaled Dot-Product Attention
Transformer架构中的self-attention机制是将query、key和value映射到输出,query、key和value都是向量,而且query和key维度都是,value维度是。每一个输入的token都对应一个query、key和value,我们将key与每一个query做点积,然后除以,最后再使用一个函数来做归一化。所有token之间的attention都是并行计算的,因此我们使用代表所有的query、key和value,计算公式如下:
该过程用图表示如下:
- additive attention和dot-product attention
最常用的两种attention的机制是additive attention和dot-product attention(multiplicative attention)。其中在上式中如果没有scaling factor ,就是dot-product attention。Additive attention使用具有单个隐藏层的前馈网络来计算兼容性函数,其输入层是两个向量的横向拼接,输出层的激活函数是sigmoid表示二者的相关度,对每一对向量都需要进行一次计算,得到的结果再计算softmax得到attention相关度权重。两种attention在理论上的复杂度相同,但在实践中dot-product attention能使用优化的矩阵乘法运算,所以计算更快,同时由于它没有使用前馈网络,所以占用空间更小,所以transformer选用了dot-product attention。
- 为什么dot-product attention要被scaled
当较小时,两种attention的效果差不多,但如果较大时,dot-product attention相较于additive attention效果就会差一些。论文猜测这是因为当较大时,点积的值就会更大,容易进入函数的饱和区,因此要乘以scaling factor 。简单举个例子来验证上述猜测,假设和是独立且随机的,而且均值为,方差为,则它们的点积的均值为,方差就是。
- Multi-Head Attention
相比于使用维的query、key和value来做一次attention,论文发现,使用不同线性映射分别将输入映射到维度上次效果更好。所有次线性映射都是并行执行的,每次映射都会生成维度为的输出,这些维度的输出会被 concatenate起来然后再做一次线性映射得到最终的输出,concatenate以后再做一次线性变换是为了做一次融合,该过程的计算公式如下:
上式中并且。
通常,我们设置,对于每次attention,我们设置,由于维度变小,所以multi-head attention的总复杂度相对于single-head attention差不多。
下图展示了multi-head attention的过程:
- Transformer中attention的应用
Transformer中主要有三处地方用到了attention机制:
①在架构图decoder的中间部分,query来自于先前的decoder层,而key和value来自于encoder的输出,这样设计允许了decoder中的每一个位置都能attend到输入的序列的任何一个位置。这样的设计模仿了传统的seq-to-seq模型的encoder-decoder attention机制。
②Transformer的encoder使用了attention机制,每一个self-attention层的query、key、value都来自于前一层的输出,每个位置都能attend到前一层的所有位置。
③在架构图decoder的下面的部分,每个位置被允许attend到该位置之前包括该位置的地方,为了保证自回归属性,我们必须避免出现左向信息流。可以通过将不合法连接(当前位置右侧)的 scaled dot-product attention中函数的输入设置为来实现这一操作,这一部分被称为masked multi-head attention。
- Position-wise Feed-Forward Networks
除了attention子层以外,每一层都还包含一个前馈网络层,这个前馈网络层包含两个线性变换,中间有一个ReLU激活,其公式如下:
这个前馈网络的输入和输出的维度都是,中间层的维度为。
- Embeddings and Softmax
使用已经训练好的embeddings来将输入和输出映射成维度为的向量。Decoder的输出会通过一个线性变换和层来被转换成预测下一个token的概率向量,然后再通过embedding层转换为维度的向量。在Transformer中我们在两个embedding层和层之前的线性变换层之间共享参数。在embedding层中,这些weight被乘以。
- Positional Encoding
Transformer中没有循环和卷积结构,我们需要将输入序列的位置信息考虑进来。我们通过给输入embedding加上一个positional encodings来实现这一目的。Positional encodings的维度也是,这样它才可以和input embedding加起来。Positional encodings有很多选择,包括会在训练过程中被学习的和固定的。
在Transformer中选用不同频率的正弦和余弦函数:
上式中是位置,是维度。从上式可以看出,positional encodings的不同的维度对应不同的正弦信号,这些正弦信号的波长是一个几何级数,从到。
选择这个函数的原因是假设这样可以允许模型更容易学习到相对位置的信息,因为对于任意固定的偏移,能够被表示成的线性函数。解释一下这一点,我们知道正余弦函数的和角公式如下:
利用上述公式我们可以得到:
上述正余弦函数的方法是固定的positional encodings,同样地我们也可以使用学习得到的positional embeddings。之所以选择正余弦的方式是因为这种方式可能允许模型推断比训练时遇到的更长的序列。
- 其他
李宏毅老师有关模型架构的讲解:https://www.jianshu.com/p/e305771b1b54
三、为什么选择Self-Attention
在该部分我们将self-attention与循环和卷积网络进行对比。我们对比以下三个指标:
①每层总的计算复杂度;
②可以并行的计算量,通过所需的最小顺序操作数来衡量;
③网络中长程依赖的路径长度。
很多序列转导模型的一个关键任务是学习长程依赖关系。一个影响学习该依赖关系的关键因素是前向和后向信号必须在网络中传播的长度。输入和输出序列中任意位置组合的这些路径越短,越容易学习长程依赖关系,因此选择对比不同层组成的网络中任意两个输入和输出位置之间的最大路径长度。
对比结果如下表所示:
表中为序列长度,为表示的维度,是卷积核的大小,是受限self-attention的邻域大小。在序列长度很长时,可以考虑限制每个位置只能attend到长度为的邻域内,这样可以降低计算复杂度,但会增大最大路径长度。Self-attention有另一个好处就是有更好的可解释性。
四、训练
- 优化器
使用Adam优化器进行训练,设置,另外根据以下公式调整学习率:
利用这个公式可以使得在个trainging step以内,学习率线性增长,随后会将学习率与training step的平方根成比例地缩小。我们使用。
- 正则化
- Residual Dropout
在每个子层的输出与输入相加和做layer normalization之前要被dropout。另外,在encoder和decoder中也会将embeddings与positional encodings的和做dropout。我们设置。
- Label Smoothing
在训练时,我们使用label smoothing的值为。 这让模型不易理解,因为模型学得更加不确定,但提高了准确性和BLEU得分。
五、模型效果
- 机器翻译
对比了Transformer在WMT 2014 English-to-German和WMT 2014 English-to-French两个数据集上与其他模型的效果:
- 模型变种
对比了Transformer的不同架构的效果: