本文是对《Attention Is All You Need》一文的浅显翻译与理解,如有侵权即刻删除。
Title
《Attention Is All You Need》
——NIPS2017
Author: Ashish Vaswani
总结
参考文章:
https://www.zhihu.com/question/61077555
https://zhuanlan.zhihu.com/p/63191028
https://zhuanlan.zhihu.com/p/48508221
https://zhuanlan.zhihu.com/p/46990010
文章提出了Transformer算法,抛弃传统机器翻译通过CNN或RNN构建的编码解码器模型,而是完全使用注意力机制构建。前人文章分析已经到位,在此主要梳理一下框架,并非完全按照文章结构进行介绍。
1 位置编码
首先,给出一段文本序列x,由于注意力机制无法捕获相对或绝对位置的信息,因此文章采用了位置编码的思想,对这段文本序列进行初始化为嵌入z。
使用sin和cos函数进行编码的含义,主要源自于这一定义:
这意味着p+k位置的向量可以表示成位置p向量的线性变换,提供了表达相对位置信息的可能性。
2 编码器和多头注意力机制
在对文本序列进行初始化后,就要送入编码器进行编码。编码器和解码器的结构是机器翻译中常见的经典结构,即给出数据序列,通过编码首先进行封装,换算后再解码成预期结果:
编码器层数设定为6,每一层又分为两个子层,首先进行注意力机制的加权计算,其次设置全连接层得到输出。注意到,在底层也就是第一层的输入是上述通过位置编码得到的嵌入向量,而之后的每一层的输入都是前一层的输出。
在层与层之间,文章还引入了残差连接的方法来预防梯度消失。由于网络变深后,不断求偏导会导致梯度消失的隐患增大,模型性能会不升反降。因此,残差连接允许低层的原始信息直接传递作为附加信息到后续高层,那么高层网络求偏导时,就会多出一个常数项,从而避免了梯度消失。
所谓注意力机制,其思想源自于信息检索领域,人们在搜索引擎中输入的查询内容即Query,系统为其匹配的关键字即Key,而最终搜索得到的结果即Value。因此,注意力机制事实上是一种对同一序列不同位置的向量进行加权重组的过程。通过计算每个位置Query和Key得到的分数,进行归一化后作为权重附加到实际的Value上,就完成了加权的过程,即:
事实上,在计算QK得分的时候,有多种方法:
以上即自注意力机制的计算过程,文章在此基础上加入了多头注意力。由于Q、K、V都是根据同一列向量按照不同参数矩阵生成的,为了捕捉各个位置上的权重多样性,多头注意力即采用多组参数矩阵来生成多组QKV,最终将它们拼接在一起,即:
因此在维度方面,有:
在实际设置中,d_model=512,表示每个时刻的输入和输出维度,h=8表示注意力头数,d_k=d_v=d_model/h=64,表示经过线性变换后,进行attentioin之前的维度。这样每一次attention生成维度为64的向量,8次拼接就又得回了512维的向量。
对全连接层,是由内部的Relu函数和外部的线性激活函数构成,即:
3 解码器和位置掩码
解码器同样六层,每一层除包含注意力子层和全连接子层外,还有一个将编码器输入的嵌入解码化的子层。相比于关注于解码器内部当前层输出与前一层输出间关系的自注意力层,编码解码子层关注编码器给出的特征向量和当前层输出的关系。
注意到文章在此提出了位置掩码的概念(mask),在transformer中有两种mask,即在所有注意力层中都用到的padding mask和只用在解码器中的sequence mask。
对padding mask,指的是文本序列的输出长度往往不同,通常做法是为短的序列用0来补足。但事实上这些填充的位置是没有意义的,因此文章在进行注意力计算前,将这些原本要补0的位置设置为负无穷,这样经过softmax之后,这些位置的数值就会倾向于0,在注意力计算中不起作用。
对sequence mask,如果将每个单词视为一个时刻的信息,那么在t时刻时,解码器应当只能得到t-1及其之前时刻的信息,而不能得到之后的信息。具体做法是,产生一个上三角矩阵,上三角的值全为0,这样在读取矩阵信息的时候,就会有效控制对未来时刻信息的掩盖。
对解码器而言,同时需要padding mask和sequence mask,则需要将两个mask的值进行相加。而在其他情况下,attention mask一律视为padding mask。
4 为什么选择注意力
文章通过与RNN、CNN在三个方面进行比较,阐述了选择注意力机制的原因:
(1)每一层的计算复杂度;(2)能够并行的计算,用所需最少操作数来衡量;(3)长距离依赖的路径长度,即前向/后向传播所需的步长。