Attention Is All You Need
一、序言
自从Attention机制在提出之后,加入Attention的Seq2Seq模型在各个任务中都有了提升,所以现在的seq2seq模型指的都是结合RNN和Attention的模型。传统的基于RNN的Seq2Seq模型难以处理长序列的句子,无法实现并行,并且面临对齐的问题。所以,之后这类模型的发展多数从三个方面入手:
- ①input的方向性:单向-->双向
- ②深度:单层-->多层
- ③类型:RNN-->LSTM GRU
但是依旧能受到一些潜在问题的制约,神经网络需要能够将源语句的所有必要的信息压缩成固定长度的向量。这可能使得神经网络难以应付长时间的句子,特别是那些比训练语料库中的句子更长的句子;每个时间步的输出需要依赖于前面时间步的输出,这使得模型没有办法并行,效率低;仍然面临对齐问题。
在然后CNN由计算机视觉也被引入到deep NLP中,CNN不能直接用于处理变长的序列样本但可以是实现并行计算。完全用于处理变长的序列样本但可以实现并行计算。完全基于CNN的Seq2Seq模型虽然可以并行实现,但非常占内存,很多的trick,大数据量上参数调整并不容易。
本文章创新点在于抛弃了之前传统的encoder-decoder模型必须结合CNN或者RNN的固有模式,只用Attention。文章的主要目的在于减少计算量和提高并行效率的同时不损害最终的实验结果。
二、Model
1、整体框架
简化版本:一个Seq2Seq模型,左边一个encoder把输入读进去,右边一个decoder得到输出。
详细的内部结构图:最后一层的Encoder的输出,会和每一层的Decoder进行结合。
取其中一层详细展示:
可以看到,Encoder的每一层有两个操作:Self-Attention 和 Feed Forward 操作;Decoder的每一层有三个操作:Self-Attention、Encoder-Decoder Attention 和 Feed Forward 操作。这里的Self-Attention 和 Encoder-Decoder Attention 都是用的 Multi-Head Attention 机制,这也是本文重点讲解的部分。
2、Attention Mechanism
2.1 Attention 定义
Attention用于计算“相关程度”,例如在翻译过程中,不同的英文对中文的依赖程度不同,Attention通常可以进行如下描述,表示为将query(Q)和key-value pairs映射到输出上,其中query、每个key、每个value都是向量,输出是V中所有values的加权,其中权重是由Query和每个key计算出来的,计算方法分为三步:
第一步:计算比较Q和K的相似度,用f来表示:
第二步:将得到的相似度进行softmax归一化:
第三步:针对计算出来的权重,对所有的values进行加权求和,得到Attention向量:
计算相似度的方法有以下4种:
在本文种,我们计算相似度的方式是第一种,本文提出的Attention机制称为Multi-Head Attention,不过在此之前,先介绍它的简单版本Scaled Dot-Product Attention。
2.2 Scaled Dot-Product Attention
结构图如下所示:
第一步:给一个输入 x ,通过 3 个线性变换得到 Q、K、V
两个单词 Thinking, Machines。首先通过字嵌入,变成两个向量 X1 、X2 ([1, 4]).然后,分别与三个矩阵 Wq、Wk、Wv(【[4, 3])做点乘,得到,{q1, q2}, {k1, k2}, {v1, v2},6个向量([1, 3])
第二步:q1 分别与 K 进行点乘,得到得分
第三步和第四步:先对得分进行规范,除以的平方根,这里的
是 key 的 embedding长度;然后,对得分做 softmax
第五步:用得分比例乘以 [V1, V2]得到一个加权后的值。将这些值加起来得到 z1。
整合以上步骤,用矩阵运算进行表示:
其中,其实就会组成一个word2word的attention map !(加了softmax 之后就是一个 和为1 的权重了)。例如,你的输入是一句话“I have a dream” 总共4个单词,这里就会形成一张 4*4 的注意力机制的图:
注意encoder里面是叫 self-attention,decoder里面是叫 masked self-attention。
这里的masked就是要做 language modelling 的时候,不给模型看到未来的信息。
其中,I是第一个单词,只能又和 I 自己的attention。have作为第二个单词,有和 I、have 两个attention。一次类推。
2.3 Multi-Head Attention
Multi-Head Attention 就是把 Scaled Dot-Product Attention 的过程做 H 次,然后把输出 Z 合起来。论文中,它的结构图如下:
我们还是采用上面的形式来解释。
我们重复记忆 8 次相似的操作,得到 8 个Zi矩阵。
将 8 个矩阵连接起来,为了使得输出和输入结构对标,乘以一个线性 W0 得到最终的 Z。
3 Transformer Architecture
绝大部分的序列处理模型都采用encoder-decoder结构,其中encoder将输入序列 映射到连续表示
。然后,decoder生成一个输出序列
,每个时刻输出一个结果。从框架图中,我们可以指导Transformer模型延续了这个模型。
3.1 Position Embedding
因为模型不包括Recurrence/Convolution,因此无法捕捉到序列顺序信息的,例如将K、V按行进行打乱,那么Attention之后的结果是一样的。但是序列信息非常重要,代表全局的结构,因此必须将序列的分词相对或者绝对position信息利用起来。
这里每个分词的position embedding向量维度也是 然后将原本的input embedding 和 position embedding 加起来组成最终的 embedding 作为 encoder/decoder 的输入。其中 position embedding 的计算公式如下所示:
其中,pos表示位置 index, i 表示dimension index。
3.2 Position-wise Feed-forward Networks
在进行了Attention操作之后,encoder和decoder中的每一层都包含了一个全连接前向网络,对每个position的向量分别进行相同的操作,包括两个线性变换和一个ReLUctant**输出:
其中,每一层的参数都不同
3.3 Encoder
Encoder有N=6层,每层包括两个 sub-layers:
第一个sub-layer 是 multi-head self-attention mechanism,用来计算输入的 self-attention
第二个sub-layer 是 简单的全连接网络
在每个 sub-layer 我们都模拟了残差网络,每个 sub-layer 的输出都是
其中,Sublayer(x) 表示 Sub-layer 对输入 x 做的映射,为确保连接,所有的 sub-layers 和 embedding layer 输出的维度都相同
3.4 Decoder
Decoder也是 N=6 层,每层包括 3 个 sub-layers:
第一个是Masked multi-head self-attention,也是计算输入的 self-attention,但是因为是生成的过程,因此在时刻 i 的时刻,只有小于 i 的时刻有结果,因此需要做 Mask
第二个sub-layer是全连接网络,与 encoder 相同
第三个sub-layer是对encoder的输入进行attention计算。同时Decoder中的self-attention层需要进行修改,因为只能获取到当前时刻之前的输入,因此支队时刻t之前时刻输入进行attention计算,这里也称为Mask操作。
3.5 The Final Linear and Softmax Layer