self-attention and transformer

https://zhuanlan.zhihu.com/p/46990010

1. Attention机制

Attention用于计算"相关程度", 例如在翻译过程中,不同的英文对中文的依赖程度不同,Attention通常可以进行如下描述,表示为将query(Q)和key-value pairs  映射到输出上,其中query、每个key、每个value都是向量,输出是V中所有values的加权,其中权重是由Query和每个key计算出来的,计算方法分为三步:

假设一个句子有两个单词

第一步:计算比较Q和K的相似度,用f来表示

f11 =q 1点积 k1(一个值)

f12=q 1点积 k2(一个值)

f21=q 2点积 k1(一个值)

f22=q 2点积 k2(一个值)

拼接起来f =[[f11,f12],[f21,f22]]

第二步:将得到的相似度进行Softmax操作,进行归一化

f =[[f11,f12],[f21,f22]]

第三步:针对计算出来的权重 [公式] ,对V中所有的values进行加权求和计算,得到Attention向量

z1=f11*v1+f12*v2

z2=f21*v1+f22*v2

z=[z1,z2] (v1=[z11.z12])

通常第一步中计算方法包括以下四种:

  • 点乘 dot product
  • 权重 General
  • 拼接权重 Concat
  • 感知器 Perceptron

 

 


2. Transformer Architecture

绝大部分的序列处理模型都采用encoder-decoder结构,其中encoder将输入序列 [公式] 映射到连续表示 [公式] ,然后decoder生成一个输出序列 [公式] ,每个时刻输出一个结果。Transformer模型延续了这个模型,整体架构如下图1所示。

图1 基于Transformer模型的Encoder-Decoder模型示意图

2.1 Encoder

Encoder有N=6层,每层包括两个sub-layers:

  1. 第一个sub-layer是multi-head self-attention mechanism,用来计算输入的self-attention
  2. 第二个sub-layer是简单的全连接网络。(z1使用一个全连接,z2使用一个全连接)

在每个sub-layer我们都模拟了残差网络,每个sub-layer的输出都是

sub-layer2=layerNomal(x+sub-layer1)

 

2.2 Decoder

Decoder也是N=6层,每层包括3个sub-layers:

  1. 第一个是Masked multi-head self-attention,也是计算输入的self-attention,但是因为是生成过程,因此在时刻 [公式] 的时候,大于 [公式] 的时刻都没有结果,只有小于 [公式] 的时刻有结果,因此需要做Mask
  2. 第二个sub-layer是全连接网络,与Encoder相同
  3. 第三个sub-layer是对encoder的输入进行attention计算。

同时Decoder中的self-attention层需要进行修改,因为只能获取到当前时刻之前的输入,因此只对时刻 [公式] 之前的时刻输入进行attention计算,这也称为Mask操作。

2.3 Attention机制

在Transformer中使用的Attention是Scaled Dot-Product Attention, 是归一化的点乘Attention,假设输入的query [公式] 、key维度为 [公式] ,value维度为 [公式] , 那么就计算query和每个key的点乘操作,并除以 [公式] ,然后应用Softmax函数计算权重。

[公式]

在实践中,将query和keys、values分别处理为矩阵 [公式] , 那么计算输出矩阵为:

[公式]

其中 [公式] , [公式] , [公式] ,输出矩阵维度为 [公式] ,如下所示

[公式]

[公式]

[公式]

那么Scaled Dot-Product Attention的示意图如下所示,Mask是可选的(opt.),如果是能够获取到所有时刻的输入(K, V), 那么就不使用Mask;如果是不能获取到,那么就需要使用Mask。使用了Mask的Transformer模型也被称为Transformer Decoder,不使用Mask的Transformer模型也被称为Transformer Encoder。

图2 Scaled Dot-Product Attention示意图

如果只对Q、K、V做一次这样的权重操作是不够的,这里提出了Multi-Head Attention,操作包括:

  1. 首先对Q、K、V做一次线性映射,将输入维度均为 [公式] 的 [公式] 矩阵映射到[公式] , [公式] , [公式]
  2. 然后在采用Scaled Dot-Product Attention计算出结果
  3. 多次进行上述两步操作,然后将得到的结果进行合并
  4. 将合并的结果进行线性变换

总结来说公示如下所示

[公式]

其中第1步的线性变换参数为 [公式] , [公式] , [公式] , 第4步的线性变化参数为 [公式] . 而第三步计算的次数是 [公式] 。

在论文中取 [公式] 表示每个时刻的输入维度和输出维度, [公式] 表示8次Attention操作,[公式] 表示经过线性变换之后、进行Attention操作之前的维度。那么进行一次Attention之后输出的矩阵维度是 [公式] , 然后进行h = 8次操作合并之后输出的结果是 [公式] ,因此输入和输出的矩阵维度相同。

这样输出的矩阵 [公式] ,每行的向量都是对 [公式] 向量中每一行 [公式] 的加权,示意图如下所示

图3 Multi-Head Attention机制示意图

 

在图1的Encoder-Decoder架构中,有三处Multi-head Attention模块,分别是:

  1. Encoder模块的Self-Attention,在Encoder中,每层的Self-Attention的输入 [公式], 都是上一层的输出。Encoder中的每个position都能够获取到前一层的所有位置的输出。
  2. Decoder模块的Mask Self-Attention,在Decoder中,每个position只能获取到之前position的信息,因此需要做mask,将其设置为 [公式]
  3. Encoder-Decoder之间的Attention,其中 [公式] 来自于之前的Decoder层输出, [公式] 来自于encoder的输出,这样decoder的每个位置都能够获取到输入序列的所有位置信息。

2.4 Position-wise Feed-forward Networks

在进行了Attention操作之后,encoder和decoder中的每一层都包含了一个全连接前向网络,对每个position的向量分别进行相同的操作,包括两个线性变换和一个ReLU激活输出

[公式]

其中每一层的参数都不同。

2.5 Position Embedding

因为模型不包括recurrence/convolution,因此是无法捕捉到序列顺序信息的,例如将K、V按行进行打乱,那么Attention之后的结果是一样的。但是序列信息非常重要,代表着全局的结构,因此必须将序列的token相对或者绝对position信息利用起来。

这里每个token的position embedding 向量维度也是 [公式] 然后将原本的input embedding和position embedding加起来组成最终的embedding作为encoder/decoder的输入。其中position embedding计算公式如下

 

其中 [公式] 表示位置index, [公式] 表示dimension index。

Position Embedding本身是一个绝对位置的信息,但在语言中,相对位置也很重要,Google选择前述的位置向量公式的一个重要原因是:由于我们有

 

这表明位置p+k的向量可以表示成位置p的向量的线性变换,这提供了表达相对位置信息的可能性。

在其他NLP论文中,大家也都看过position embedding,通常是一个训练的向量,但是position embedding只是extra features,有该信息会更好,但是没有性能也不会产生极大下降,因为RNN、CNN本身就能够捕捉到位置信息,但是在Transformer模型中,Position Embedding是位置信息的唯一来源,因此是该模型的核心成分,并非是辅助性质的特征。

也可以采用训练的position embedding,但是试验结果表明相差不大,因此论文选择了sin position embedding,因为

  1. 这样可以直接计算embedding而不需要训练,减少了训练参数
  2. 这样允许模型将position embedding扩展到超过了training set中最长position的position,例如测试集中出现了更大的position,sin position embedding依然可以给出结果,但不存在训练到的embedding。

2.6 Decoder-attention

假设encoder的输出是m,output的输出是x

则q=x*wq,k=m*wk,v=m*wv

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值