NLP学习—21.自注意力机制(Self-Attention)与Transformer详解



引言

  Transformer同样也是seq2seq模型。在注意力机制诞生后,诞生了多种改进的模型,但是这些模型一般都是把注意力机制与循环神经网络结合(包括一些改良的,如LSTM),但是这些模型有个弊端:RNN由于其顺序结构训练速度常常受到限制,就是并行计算能力不强。既然Attention模型本身可以看到全局的信息, 那么一个自然的疑问是我们能不能去掉RNN结构,仅仅依赖于Attention模型呢,这样我们可以使训练并行化(encoder端并行计算),同时拥有全局信息?为解决这一些问题,论文提出了一种仅基于注意力机制的模型,具有强大的并行计算性以及效果很好。

一、Structure of Transformers

  Transformer模型的模型结构为encoder-decoder,
在这里插入图片描述
如下图,N个Encoder block组成encoder,N个Decoder block组成decoder。基于注意力机制的构造与基于RNN的不同,基于RNN的是在时间步上串联(在每个time step只能输入一个token),而基于注意力机制的是类似于桶状结构(一起将数据输入到模型中去)。
在这里插入图片描述
  那么,在Transformer中encoder中的信息如何传给decoder?
在这里插入图片描述
将encoder的最后一个Block分别传给decoder中的每一个block,然后decoder进行输出生成。

二、Encoder Structure

在这里插入图片描述
以输入为:Thinking Machines为例,Thinking与Machines最开始输入是维度为vocab的one-hot向量,经过embedding层,转换成embedding size大小的向量,输入到self-Attention层中,得到 z z z,经过Feed Forward层将得到 r r r r r r将作为下一个encoder Block的input。
  其中,Self-attention将在后面详细分析,这里介绍FFN。每一层经过attention之后,还会有一个FFN,这个FFN的作用就是空间变换。FFN包含了2层linear transformation层,中间的激活函数是ReLu。FFN的加入引入了非线性(ReLu激活函数),变换了attention output的空间, 从而增加了模型的表现能力。把FFN去掉模型也是可以用的,但是效果差了很多。

三、Self-attention and multi-head self-attention

  Word2vec的基本思想:句子中相近的词之间是有联系的,比如今天后面经常出现上午、下午和晚上。所以Word2vec的基本思想是用词来预测词,skip-gram使用中心词预测周围词,cbow使用周围词预测中心词。那么,一个词的embedding有没有可能关系到周围词外的部分?Self-attention就是自己与自己计算一个相关性(权重),利用自己(句子/文本)内部的表征得到一个更好的表征。
在这里插入图片描述

1.Self-attention

  Self-Attention的基本结构如下:
在这里插入图片描述
MatMul对应 Q K T QK^T QKT,Scale对应 d k \sqrt{d_k} dk Mask是因为每一个batch的数据经过padding后变得等长,在计算attention score时,不希望padding部分参与softmax计算,此时,需要Mask使得padding部分权重为0(padding部分的得分为 − i n f -inf inf)。第二个MatMul对应权重与vector标的的计算。

  下面展示Self-attention内部是如何计算的
在这里插入图片描述
Q Q Q:标的
K K K:和别人计算的标的
V V V:加权的vector标的
对于self-attention来讲, Q ( Q u e r y ) , K ( K e y ) , V ( V a l u e ) Q(Query), K(Key), V(Value) Q(Query),K(Key),V(Value)三个矩阵均来自同一输入(Q、K、V来自embedding的线性变化),首先我们要计算 Q Q Q K K K之间的点乘,然后为了防止其结果过大,会除以一个尺度标度 d k \sqrt{d_k} dk ,其中 d k \sqrt{d_k} dk 为一个query和key向量的维度。再利用Softmax操作将其结果归一化为概率分布,然后再乘以矩阵 V V V就得到权重求和的表示。
举个例子:
假如我们要翻译一个词组Thinking Machines,其中Thinking的输入的embedding vector用 x 1 x_1 x1表示,Machines的embedding vector用 x 2 x_2 x2表示。
在这里插入图片描述
当我们处理Thinking这个词时,我们需要计算句子中所有词与它的Attention Score,这就像将当前词作为搜索的query,去和句子中所有词(包含该词本身)的key去匹配,看看相关度有多高。我们用 q 1 q_1 q1代表Thinking对应的query vector, k 1 k_1 k1 k 2 k_2 k2分别代表Thinking以及Machines对应的key vector,则计算Thinking的attention score的时候我们需要计算 q 1 q_1 q1 k 1 , k 2 k_1,k_2 k1,k2的点乘,同理,我们计算Machines的attention score的时候需要计算 q 2 q_2 q2 k 1 , k 2 k_1,k_2 k1,k2的点乘。我们分别得到了 q 1 q_1 q1 k 1 , k 2 k_1,k_2 k1,k2的点乘积,然后我们进行尺度缩放与softmax归一化,如下图所示:
在这里插入图片描述
显然,当前单词与其自身的attention score一般最大,其他单词根据与当前单词重要程度有相应的score。然后我们在用这些attention score与value vector相乘,得到加权的向量。
在这里插入图片描述
如果将输入的所有向量合并为矩阵形式,则所有query, key, value向量也可以合并为矩阵形式表示
在这里插入图片描述
其中, W Q , W K , W V W^Q,W^K,W^V WQ,WK,WV是我们模型训练过程中学习到的合适参数,上述公式可以简化为矩阵计算:
在这里插入图片描述

2.multi-head self-attention

  multi-head self-attention的基本结构如下:
在这里插入图片描述
  multi-head self-attention 与self-attention 的区别在于可以有多组 W Q , W K , W V W^Q,W^K,W^V WQ,WK,WV,得到不同的 Q 、 K 、 V Q、K、V QKV,最后得到不同的 Z Z Z。我们认为一组线性变化提取的是一个维度的特征,采用多组可以从更高维来提取更多的特征。
在这里插入图片描述
其中,多个self-attention得到的结果 Z i Z_i Zi后续操作如下所示:
在这里插入图片描述
拼接后与矩阵 W o W^o Wo进行线性变化,
在这里插入图片描述

四、Residuals与Layer-Normalization

在这里插入图片描述

  • Residuals:是为了解决多层神经网络训练困难的问题,通过将前一层的信息无差的传递到下一层,可以有效的仅关注差异部分,这一方法之前在图像处理结构如ResNet等中常常用到。 Transformer的层数较多,反向传播时容易出现梯度消失与梯度爆炸,所以添加Residuals,防止信息的丢失与梯度回传的消失
  • Layer Normalization:在每个block中,最后出现的是Layer Normalization。Layer Normalization是一个通用的技术,其本质是规范优化空间,加速收敛。当我们使用梯度下降法做优化时,随着网络深度的增加,数据的分布会不断发生变化,为了保证数据特征分布的稳定性,我们加入Layer Normalization,这样可以加速模型的优化速度。

五、Decoder structure of Transformer

在这里插入图片描述

  这里我们着重介绍Mask self-attention与Encoder-decoder attention

1.Mask self-attention

  训练时,decoder端是一次性输入,但是在测试/生成,是不知道后面的token的,需要一个个预测出来,在每一个时间步,将已经生成的输入到桶里面去。在推理阶段,token是按照从左往右的顺序推理的。也就是说,在推理 t i m e s t e p = T timestep=T timestep=T的token时,decoder只能“看到” t i m e s t e p < T timestep < T timestep<T T − 1 T-1 T1 个Token, 不能和timestep大于它自身的token做attention(因为根本还不知道后面的token是什么)。为了保证训练时和推理时的一致性,所以,训练时要同样防止token与它之后的token去做attention。Decoder端的Mask的功能是为了保证训练阶段和推理阶段的一致性。这里的Mask与encoder端的Mask类似,一个是控制padding部分权重为0;一个是控制后续token部分权重为0。训练的时候需要Mask,预测的时候不需要Mask。

2.Encoder-decoder attention

在这里插入图片描述
  Encoder-decoder attention的输入:它的Q来自于之前一级的decoder层的输出,但K和V来自于encoder的输出,这使得decoder的每一个位置都可以attend到输入序列的每一个位置。
  下面展示Encoder-decoder attention的预测过程:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3. 总结

  decoder的训练过程:decoder端是一次性输入,经过Mask self-attention得到处理后的输入。decoder的预测过程:会将上一时间步decoder的输出输入到下一时间步中,如上面的预测过程。

六、Word Embedding and position encoding

  通过前面encoder部分,我们可以发现:encoder端并行输入,没有了序列信息,此时,就需要position encoding。position encoding只在encoder端和decoder端的embedding之后,第一个block之前出现,它非常重要,没有这部分,Transformer模型就无法用。position encoding是Transformer框架中特有的组成部分,补充了Attention机制本身不能捕捉位置信息的缺陷。为了更好的让模型学习位置信息,所以添加了position encoding并将其叠加在word embedding上。
在这里插入图片描述
该论文中选取了三角函数的encoding方式:
在这里插入图片描述
p o s pos pos表示的是在这句话的第几个位置, i i i表示的是在embedding的第几个维度。所以,通过三角函数,可以计算出这句话的每一个位置的每一个维度的值。这样计算的优势是:使模型轻松学到相对位置,因为对于任意的偏移量 k k k P E p o s + k PE_{pos+k} PEpos+k可以由 P E p o s PE_{pos} PEpos的线性表示,同时,这个模型与可学习到的位置编码相比,可以解决sequence长度更长的位置信息。
在这里插入图片描述
  三角函数可视化结果为:
在这里插入图片描述
注意:position encoding在训练过程中是固定的

七、扩展

  为什么Transformer会work?

  • Transformer做到内部之间的相互attention
  • Transformer能够解决RNN/LSTM模型的长期依赖问题
  • Transformer是大模型,有更多的参数,可以提取更高维的信息,学到更好的表征
  • 利用self attention思想,结合预训练模型,能够产生语言学预训练知识,为后面的预训练模型提供了框架的基础,能方便下游任务做一个快速的finetune。

参考



如果对您有帮助,麻烦点赞关注,这真的对我很重要!!!如果需要互关,请评论或者私信!
在这里插入图片描述


  • 26
    点赞
  • 63
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值