注意力机制(attention mechanism)
Attention实质上是一种分配机制,其核心思想是突出对象的某些重要特征。根据Attention对象的重要程度,重新分配资源,即权重,实现核心思想是基于原有的数据找到其之间的关联性,然后突出其某些重要特征。注意力可以被描述为将一个查询和一组键值对映射到一个输出,其中查询、键、值和输出都是向量。输出以加权和的形式计算的兼容性函数计算赋给每个值的权值。
文章《Attention Is All You Need》我们提出了一种新的简单网络结构,完全基于注意力机制,避免重复和全卷积。
传送门:https://proceedings.neurips.cc/paper/2017/file/3f5ee243547dee91fbd053c1c4a845aa-Paper.pdf
自注意力,也被称内部注意力,是一个与单个序列的不同位置相关的注意力机制,目的是计算序列的表达形式,因为解码器的位置不变性,以及在DETR中,每个像素不仅仅包含数值信息,并且每个像素的位置信息也很重要。所有的编码器在结构上都是相同的,但它们没有共享参数。
Self-Attention
Self-Attention是Transformer最核心的内容,可以理解位将队列和一组值与输入对应,即形成querry,key,value向output的映射,output可以看作是value的加权求和,加权值则是由Self-Attention来得出的。
Self_attention的计算过程如下:
将输入单词转化成嵌入向量;根据嵌入向量得到q,k,v三个向量;为每个向量计算一个score:score=q×v;为了梯度的稳定,Transformer使用了score归一化,即除以sqrt(dk);对score施以softmax激活函数;softmax点乘Value值v,得到加权的每个输入向量的评分v;相加之后得到最终的输出结果z。
用三个指标来评估:
1)每一层的计算复杂度
2)能够被并行的计算,用需要的最少的顺序操作的数量来衡量
3)任何输入和输出之间的最长path length。在处理序列信息的任务中很重要的在于学习long-range dependencies。影响学习长距离依赖的关键点在于前向/后向信息需要传播的步长,输入和输出序列中路径越短,那么就越容易学习long-range dependencies。
同时self-attention的模型可解释性更好(interpretable).
Transformer
Transformer 模型结构,模型由6个编码器(Encoder)和6个解码器(Decoder) 组成,输入(Inputs)和输出(Outputs)通过同一个训练好的词嵌入层(Word Embedding)将输入字符转换为维度为d的向量。
Transformer模型结构 Encoder
Transformer对编码器(Encoder)与解码器(Decoder)两端的序列分别添加位置编码(Positional Encoding)。之后,编码经过含有多头自注意力机制(Multi-head Self-Attention)、位置前向传播网络(Position-wise Feed-Forward Network)、残差连接(Residual Connection)和层归一化(Layer Normalization)的计算单元。
Encoder有6层,每层包括两个sub-layers:
第一个sub-layer是multi-head self-attention mechanism,用来计算输入的self-attention第二个sub-layer是简单的全连接网络。
2.2 Decoder
Decoder是6层结构,每层包括3个sub-layers:
第一个是Masked multi-head self-attention,也是计算输入的self-attention,但是因为是生成过程,因此在时刻 的时候,大于 的时刻都没有结果,只有小于 的时刻有结果,因此需要做Mask第二个sub-layer是全连接网络,与Encoder相同第三个sub-layer是对encoder的输入进行attention计算。
那么Scaled Dot-Product Attention的示意图如下所示,Mask是可选的(opt.),如果是能够获取到所有时刻的输入(K, V), 那么就不使用Mask;如果是不能获取到,那么就需要使用Mask。使用了Mask的Transformer模型也被称为Transformer Decoder,不使用Mask的Transformer模型也被称为Transformer Encoder。
Scaled Dot-Product Attention示意图 如果只对Q、K、V做一次这样的权重操作是不够的,这里提出了Multi-Head Attention,操作包括:
首先对Q、K、V做一次线性映射,将输入维度均为 的 矩阵映射到 , , 然后在采用Scaled Dot-Product Attention计算出结果多次进行上述两步操作,然后将得到的结果进行合并将合并的结果进行线性变换
因此输入和输出的矩阵维度相同。这样输出的矩阵,每行的向量都是对向量中每一行的加权,示意图如下所示
Multi-Head Attention机制示意图 在图1的Encoder-Decoder架构中,有三处Multi-head Attention模块,分别是:
Encoder模块的Self-Attention,在Encoder中,每层的Self-Attention的输入 , 都是上一层的输出。Encoder中的每个position都能够获取到前一层的所有位置的输出。Decoder模块的Mask Self-Attention,在Decoder中,每个position只能获取到之前position的信息,因此需要做mask,将其设置为 Encoder-Decoder之间的Attention,其中 来自于之前的Decoder层输出, 来自于encoder的输出,这样decoder的每个位置都能够获取到输入序列的所有位置信息。
Position Embeddin
由于Transformer的计算抛弃了循环结构的递归和卷积,无法模拟文本中的词语位置信息,因而需要人为添加。该过程称为位置编码(Positional Encoding),使用词的位置向量,表示单词在句中的位置与词间的相对位置,在Transformer中与句子的嵌入表示相加,获得模型输入。
Position Embedding本身是一个绝对位置的信息。这表明位置p+k的向量可以表示成位置p的向量的线性变换,这提供了表达相对位置信息的可能性。position embedding,通常是一个训练的向量,但是position embedding只是extra features,有该信息会更好,但是没有性能也不会产生极大下降,因为RNN、CNN本身就能够捕捉到位置信息,但是在Transformer模型中,Position Embedding是位置信息的唯一来源,因此是该模型的核心成分,并非是辅助性质的特征。
也可以采用训练的position embedding,但是试验结果表明相差不大,因此论文选择了sin position embedding,因为
这样可以直接计算embedding而不需要训练,减少了训练参数这样允许模型将position embedding扩展到超过了training set中最长position的position,例如测试集中出现了更大的position,sin position embedding依然可以给出结果,但不存在训练到的embedding。
测试
在英德翻译上开发集评估Transformer性能衡量的变化表现。