NLP之Transformer

NLP之Transformer

总体来看,Transformer这个模型架构还是遵循着Encoder-Decoder的格式。此外,Transformer由注意力机制模块组成,因此在学习Transformer之前有必要对注意力机制有个了解(点这里)。

参考文档:
①Transformer模型的PyTorch实现
②Transformer 模型详解
③Transformer原理解读
③《Attention is All You Need》浅读(简介+代码)

1 Transformer结构

对注意力机制就有初步了解之后,就可以进行Transformer的学习了!

1.1Self-attention

Self-attention,又称自注意力,内部注意力,谷歌的这篇Transformer全是self-attention。自注意力就是Atention%28X%2CX%2CX%29,即在序列内部做注意力,寻找序列内部的联系(从Transformer的成功来看self-attention在NLP上还是很有作用的)。

与self-attention相对的是Context-attention,即发生在Encoder和Decoder之间的注意力,比如之前关于Seq2Seq中引入的注意力机制就是Context-attention。

Note:

  1. 之前的注意力机制中,涉及两个隐藏状态,分别是Encoder端和Decoder端的h_t,即输入序列某个位置的隐藏状态和输出序列某个位置的隐藏状态。而self-attention就是说输出序列就是输入序列,计算自己的attention分数。

1.2 Scaled dot-product attention

NLP之Transformer

在Transformer论文中,注意力函数选择的是缩放乘性注意力——Scaled Dot-Product,其表达式为:
Attention%28Q%2CK%2CV%29%20%3D%20softmax%28%5Cfrac%7BQK%5ET%7D%7B%5Csqrt%7Bd_k%7D%7D%29V.
Note:

  1. d_k表示K矩阵的维数。
  2. 缩放因子%5Cfrac%7B1%7D%7B%5Csqrt%7Bd_k%7D%7D是为了防止分子乘积太大的话,使得结果处于softmax函数梯度很小的地方,造成梯度消失,故缩减因子可以一定程度上减缓它。
  3. 这个注意力分数Attention%28Q%2CK%2CV%29相当于V的加权平均,通过QAttention%28Q%2CK%2CV%29之间的运算得到权重。
  4. QK的计算表示为: NLP之Transformer 最终的运算结果QK%5ET可以表示为词之间的关系。

论文中还给出了相关图表:
NLP之Transformer

Q%E3%80%81K%E3%80%81V 这是什么?
NLP之Transformer
Note:

  1. W%5EQ%E3%80%81W%5EK%E3%80%81W%5EV是线性变换矩阵。
  2. X%E3%80%81Q%E3%80%81K%E3%80%81V的每一行都表示一个Word。

Self-attention:

  1. 对于Encoder部分的第一层,矩阵X是输入通过Embeding和Positional encoding相加的结果,其余层都来自于上一层的输出。
  2. 对于Decoder部分的第一层。矩阵X是输出通过Embeding和Positional encoding相加的结果,其余层都来自于上一层的输出。

Encoder-Decoder-attention:
Q来自于Decoder上一层的输出,K%E3%80%81V来自于Encoder的输出,即编码信息矩阵C:NLP之Transformer
.

Note:

  1. Q%E3%80%81K%E3%80%81V 三者的尺寸相同。

1.3 Multi-head self-attention

NLP之Transformer
如果说上面的scaled dot-product attention是一个人在观察输入,那么Multi-head就是多个人站在不同角度去观察输入,并且不同人所得到的注意力是不同的。
之后Q%E3%80%81K%E3%80%81V通过线性映射分成h份,对每一份使用scaled dot-product attention模块,最后将多个注意力聚合起来,再通过全连接层输出。
Note:

  1. Multi-head attention就相当于聚集了所有人对输入不同的观察力理解,它比单个注意力对输入的理解更加全面。

Multi-head attention公式如下:
MultiHead%28Q%2CK%2CV%29%20%3D%20Concat%28head_1%2C%5Ccdots%2Chead_h%29%5Ccdot%20W%5EO%2C%5C%5C%20%E5%85%B6%E4%B8%AD%2Chead_i%20%3D%20Attention%28QW_i%5EQ%2CKW%5EK_i%2CVW%5EV_i%29
Note:

  1. W_i%5EQ%20%5Cin%5Cmathbb%7BR%7D%5E%7Bd_%7Bmodel%7D%5Ctimes%20d_k%7D%2CW_i%5EK%20%5Cin%5Cmathbb%7BR%7D%5E%7Bd_%7Bmodel%7D%5Ctimes%20d_k%7D%2CW_i%5EV%20%5Cin%5Cmathbb%7BR%7D%5E%7Bd_%7Bmodel%7D%5Ctimes%20d_v%7D%2CW%5EO%5Cin%20%5Cmathbb%7BR%7D%5E%7Bhd_v%5Ctimes%20d_%7Bmodel%7D%7D
  2. 论文中h%3D8d_k%3Dd_v%3Dd_%7Bmodel%7D/h%20%3D%2064。也就是说最后输入的scaled dot-product attention的向量维度是64。
  3. 无论是Encoder还是Decoder,经过Multi-head attention模块之后的输出和输入矩阵是想同维度的
    .

1.4 Residual connection

NLP之Transformer
Transformer结构中存在着残差连接,这起源于何凯明残差网络,残差网络是用于解决网络深度太大导致梯度回传消失的问题,具体的可以参考另一篇中关于残差网络部分。

1.5 Positional Encoding

到目前为止我们发现Transformer似乎没有表达序列位置信息的能力,要知道序列次序信息在NLP中是十分重要的,之前RNN结构可以天然利用次序信息,可放到Transformer里似乎没有办法了,那怎么办呢?
——Positional Encoding

谷歌在文章中又引入了位置编码,positional encoding来缓解Transformer的硬伤——无法对位置信息很好的建模。

具体来说,谷歌使用正弦和余弦来编码位置信息:
PE_%7B%28pos%2Ci%29%7D%20%3D%20%5Cbegin%7Bcases%7D%20sin%28%5Cfrac%7Bpos%7D%7B10000%5E%7Bi/d_%7Bmodel%7D%7D%7D%29%20%26%20if%5C%20n%5C%20is%5C%20even%2C%5C%5C%20cos%28%5Cfrac%7Bpos%7D%7B10000%5E%7B%28i-1%29/d_%7Bmodel%7D%7D%7D%29%20%26if%5C%20n%5C%20is%5C%20odd.%20%5Cend%7Bcases%7D 其中,pos为位置序号,i为维度,i为偶数时,一维用sin编码,否则用cos编码。

Note:

  1. d_%7Bmodel%7D是位置向量的最大长度,和word embeding最大长度保持一致,便于相加。
  2. 使用正余弦编码的原因是它可以
    表示不同位置之间的相对关系
    ,因为三角函数之间存在关系:sin%28%5Calpha%2B%5Cbeta%29%3Dsin%5Calpha%20cos%5Cbeta%20%2B%20cos%5Calpha%20sin%5Cbeta%5C%5Ccos%28%5Calpha%2B%5Cbeta%29%20%3D%20cos%5Calpha%20cos%5Cbeta%20-%20sin%5Calpha%20sin%5Cbeta也就是说,对于单词之间的位置偏移kPE%28pos%2Bk%29可以表示为PE%28pos%29PE%28k%29的组合,这样位置向量就有了表示相对位置的能力。

1.6 Layer Normalization

不同于BN,Layer Normalization做的是层归一化,即对某一层的所有神经元输入进行归一化,或者说每hidden%5C_size个数求平均/方差。它在training和inference时没有区别,只需要对当前隐藏层计算mean and variance就行。不需要保存每层的moving average mean and variance,此外,其增加了gain和bias作为学习的参数。
Pytorch已经有相关实现:nn.LayerNorm

1.7 Masking

Transformer也需要用到掩码技术(Masking)去对某些值进行掩盖,使其不产生效果。
有2种模式,一种是Padding Mask,其在所有的Scaled Dot-Product Attention里都需要用到;另一种是Sequence Mask,其只在Decoder的Self Attention里用到。

1.7.1 Padding Mask

由于序列的长短不一,因此为了对齐,需要对较短的序列进行填充。在注意力机制中,我们会在缺省的位子上加上一个很大的负数,这样在注意力机制的softmax步骤中就会使得这些位子的注意力权重为0,使得我们的注意力不会放在这些位子上。
相对的Mask张量中,对于需填充位置为False,否则为True。

1.7.2 Sequence Mask

在RNN为原型的Seq2Seq中,我们在t时刻是看不到未来时刻的标签的,但这在Transformer中会出问题,为了让Decoder在解码过程中不会使标签过早的提前暴露,需要对输入进行一些mask。
Masking矩阵是一个和上三角值全为负无穷,下三角全为1的矩阵:
NLP之Transformer

Sequence Mask需要在softmax运算之前使用:
NLP之Transformer
掩码之后对每一行进行softmax,可以从上图看出,在预测第0个单词的时候,单词0对单词1、2、3、4的注意力全为0。

1.8 Position-wise Feed-Forward Networks

Transformer的模型结构中会有Position-wise Feed-Forward Networks的存在,这是一个两层全连接层中间接一个RELU非线性层构造而出的,表达式为:
FFN%28x%29%20%3D%20max%280%2C%20x%5Ccdot%20W_1%2Bb_1%29%5Ccdot%20W_2%20%2B%20b_2.
实际中使用一个1%5Ctimes1的卷积层来代替全连接层。输入输出维度均为512,中间层的维度为2048.具体设置如下:
NLP之Transformer

1.9 Linear&Softmax层

NLP之Transformer
在解码端,输出的注意力矩阵和输入矩阵是想同维度的,Transformer通过一个全连接层将输出进一步映射成(输入维度,词汇表)的格式,然后通过softmax对每一行进行处理,使得每一行概率和为1,每一行最大概率对应的词就是所预测的词。

2 总结

2.1 Transformer模型

下面总结下Transformer整个模型:
NLP之Transformer
Encoder部分:

  1. 输入由添加的词向量和位置编码向量组成。
  2. N%3D6个相同模块串联而成,每个模块由2个子层组成,分别是Multi-Head Attention层(采用自注意力机制),其输出的矩阵和输入矩阵想同纬度;此外还有Feed-Forward层,并且每个层都连接一个LayerNorm层。整个模块由残差结构相连。
  3. 输出是一个编码矩阵C,是给Decoder用的,它和输入矩阵的相同维度的。

Decoder部分:

  1. 输入由添加的词向量和位置编码向量组成。
  2. N%3D6个相同模块串联而成,每个模块由3个子层组成,第一个子层是Masked Multi-Head Attention(采用自注意力机制),其引入了Sequence masking;第二个子层是Multi-Head Attention,和上述不同,它采用的是Context Attention,其K%E3%80%81V来自于Encoder输出的编码信息矩阵C,这样做的好处在于每一位单词都可以利用到Encoder所有单词的信息;第三个子层是Feed-Forward层,每个层都连接一个LayerNorm层,并且都是残差结构。
  3. 输出的注意力矩阵经过线性层和Softmax层输出一个概率。

2.2 Transformer流程

了解整个模型之后,我们再结合图示和具体例子对整体流程有个更深一步的了解,详见Transformer流程详解,这是网上一个博主写的,很清晰详细,点赞!!!

版权声明:本文为博主Ton10原创文章,版权归属原作者,如果侵权,请联系我们删除!

原文链接:https://blog.csdn.net/MR_kdcon/article/details/123363880

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
社会演员多的头像社会演员多普通用户
上一篇 2022年3月11日 下午2:05
下一篇 2022年3月11日

相关推荐