多图详解attention和mask。从循环神经网络transformer到GPT2,我悟了

Posted 神洛华

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多图详解attention和mask。从循环神经网络transformer到GPT2,我悟了相关的知识,希望对你有一定的参考价值。

transformaer原理

文章目录


说明:
  本文主要来自datawhale的开源教程 《基于transformers的自然语言处理(NLP)入门》,此项目也发布在 github。部分内容(章节2.1-2.5,3.1-3.2,4.1-4.2)来自北大博士后卢菁老师的《速通机器学习》一书,这只是我的一个读书笔记,进行一般性总结,所以有些地方进行了简写(比如代码部分,不要喷我。有误请反馈)。想要了解更详细内容可以参考datawhale教程(有更多的图片描述、部分动图和详细的代码)和《速通》一书。
   另外篇幅有限(可也能是水平有限),关于多头注意力的encoder-decoder attention模块进行运算的更详细内容可以参考 《Transformer概览总结》。从attention到transformer的API实现和自编程代码实现,可以查阅 《Task02 学习Attention和Transformer》(这篇文章排版很好,干净简洁,看着非常舒服,非常推荐)

1. Transformer的兴起

   2017年,《Attention Is All You Need》论文首次提出了Transformer模型结构并在机器翻译任务上取得了The State of the Art(SOTA, 最好)的效果。2018年,《BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding》使用Transformer模型结构进行大规模语言模型(language model)预训练(Pre-train),再在多个NLP下游(downstream)任务中进行微调(Finetune),一举刷新了各大NLP任务的榜单最高分,轰动一时。2019年-2021年,研究人员将Transformer这种模型结构和预训练+微调这种训练方式相结合,提出了一系列Transformer模型结构、训练方式的改进(比如transformer-xl,XLnet,Roberta等等)。如下图所示,各类Transformer的改进不断涌现。

  图片来自复旦大学邱锡鹏教授:NLP预训练模型综述《A Survey of Transformers》。中文翻译可以参考:https://blog.csdn.net/Raina_qing/article/details/106374584
https://blog.csdn.net/weixin_42691585/article/details/105950385
  另外,由于Transformer优异的模型结构,使得其参数量可以非常庞大从而容纳更多的信息,因此Transformer模型的能力随着预训练不断提升,随着近几年计算能力的提升,越来越大的预训练模型以及效果越来越好的Transformers不断涌现。
  本教程也将基于HuggingFace/Transformers, 48.9k Star进行具体编程和解决方案实现。
  NLP中的预训练+微调的训练方式推荐阅读知乎的两篇文章 《2021年如何科学的“微调”预训练模型?》《从Word Embedding到Bert模型—自然语言处理中的预训练技术发展史》。

2. 图解Attention

2.1 seq2seq

  seq2seq模型是由编码器(Encoder)和解码器(Decoder)组成的。其中,编码器会处理输入序列中的每个元素,把这些信息转换为一个向量(称为上下文context)。当我们处理完整个输入序列后,编码器把上下文(context)发送给解码器,解码器开始逐项生成输出序列中的元素。上下文向量的长度,基于编码器 RNN 的隐藏层神经元的数量
  如何把每个单词都转化为一个向量呢?我们使用一类称为 “word embedding” 的方法。这类方法把单词转换到一个向量空间,这种表示能够捕捉大量单词之间的语义信息。(word2vec)通常embedding 向量大小是 200 或者 300。
  在机器翻译任务中,上下文(context)是一个向量(基本上是一个数字数组)。编码器和解码器在Transformer出现之前一般采用的是循环神经网络。上下文context向量是这类模型的瓶颈。以两个具有不同参数的LSTM分别作为encoder和decoder处理机器翻译为例,结构如下:

  LSTM1为编码器,在最后时刻的上下文信息 C 包含中文“我爱你”的完整信息,传给给解码器LSTM2,作为翻译阶段,LSTM2的起始状态start。之后每时刻的预测结果作为下一时刻的输入,翻译顺序进行直到终止符停止翻译。

2.2 循环神经网络的不足:

循环神经网络的处理此类任务存在一些不足:
   1.机器翻译中,使用LSTM的encoder只输出最后时刻的上下文信息C,而这两个模型都存在长距离衰减问题,使得C的描述能力有限。当编码句子较长时,句子靠前部分对C的影响会降低;
   2.解码阶段,随着序列的推移,编码信息C对翻译的影响越来越弱。因此,越靠后的内容,翻译效果越差。(其实也是因为长距离衰减问题)
   3.解码阶段缺乏对编码阶段各个词的直接利用。简单说就是:机器翻译领域,解码阶段的词和编码阶段的词有很强的映射关系,比如“爱”和“love”。但是seq2seq模型无法再译“love”时直接使用“爱”这个词的信息,因为在编码阶段只能使用全局信息C。(attention在这点做得很好)
  在 2014——2015年提出并改进了一种叫做注意力attetion的技术,它极大地提高了机器翻译的质量。注意力使得模型可以根据需要,关注到输入序列的相关部分。

2.3 attention的引出(重点内容)

基于上面第3点,需要对模型进行改造。(图不是很好,将就看看)

  编码阶段和前面的模型没有区别,保留了各时刻LSTM1的输出向量v。解码阶段,模型预测的方法有了变化,比如在t=1时刻,预测方式为:
   1.计算LSTM2在t=1时刻的输出q1,以及v1、v2、v3的相似度,即对q1和v1、v2、v3求内积:
s1=<q1,v1>
s2=<q1,v2>
s3=<q1,v3>
   2.s1、s2、s3可以理解为未归一化的相似度,通过softmax函数对其归一化,得到a1、a2、a3。满足a1+a2+a3=1。a1、a2、a3就是相似度得分attention score。用于表示解码阶段t=1时刻和编码阶段各个词之间的关系。

   例如解码器在第一个时刻,翻译的词是“I”,它和编码阶段的“我”这个词关系最近, a 我 a_我 a的分数最高(比如0.95)。由此达到让输出对输入进行聚焦的能力,找到此时刻解码时最该注意的词,这就是注意力机制。比起循环神经网络有更好的效果。
   (attention score只表示注意力强度,是一个标量,一个系数,不是向量,不含有上下文信息,所以还不是最终输出结果。在此回答一些小伙伴的疑问

   3.根据相似度得分对v1、v2、v3进行加权求和,即 h 1 = a 1 v 1 + a 2 v 2 + a 3 v 3 h_{1}=a_{1}v_{1}+a_{2}v_{2}+a_{3}v_{3} h1=a1v1+a2v2+a3v3
   4.向量h1经过softmax函数来预测单词“I”。可以看出,此时的h1由最受关注的向量 v 我 v_我 v主导。因为 a 我 a_我 a最高。

  上述模型就是注意力(Attention)模型)(这里没有用Self-Attention代替LSTM,主要还是讲attention机制是基于什么原因引出的。好的建议可以反馈给我)。(此处的模型没有key向量,是做了简化,即向量 K = V K=V K=V)

  注意力模型和人类翻译的行为更为相似。人类进行翻译时,会先通读“我爱你”这句话,从而获得整体语义(LSTM1的输出C)。而在翻译阶段,除了考虑整体语义,还会考虑各个输入词(“我”、“爱”、“你”)和当前待翻译词之间的映射关系(权重a1、a2、a3来聚焦注意力)

  一个注意力模型不同于经典的(seq2seq)模型,主要体现在 2 个方面:
  1.编码器会把更多的数据传递给解码器。编码器把所有时间步的 hidden state(隐藏层状态)传递给解码器,而非只传递最后一个 hidden state。
  2.解码器在产生输出之前,做了一个额外的处理。把注意力集中在与该时间步相关的输入部分:
a. 查看所有接收到的编码器的 hidden state(隐藏层状态)。其中,编码器中每个 hidden state(隐藏层状态)都对应到输入句子中一个单词。
b. 给每个 hidden state(隐藏层状态)一个分数(attention score)。
c. 将每个 hidden state(隐藏层状态)乘以经过 softmax 的对应的分数,分数的高低代表了注意力的强度。分数更大的hidden state更会被关注。

Tips:上面计算相似度s=<q,k>时,s要除以 ( d k e y ) \\sqrt(d_{key}) ( dkey)(Key 向量的长度)。原因是:
  求相似度时,如果特征维度过高(如词向量embedding维度),就会导致计算出来的相似度s过大。s值的过大会导致归一化函数softmax饱和(softmax在s值很大的区域输出几乎不变化)使得归一化后计算出来的结果a要么趋近于1要么趋近于0。即加权求和退化成胜者全拿,则解码时只关注注意力最高的(attention模型还是希望别的词也有权重)而且softmax函数的饱和区导数趋近于0,梯度消失。所以对公式s=<q,k>进行优化:
s = < q , k > d k e y s=\\frac{<q,k>}{\\sqrt{d_{key}}} s=dkey <q,k>
  q和k求内积,所以其实key和q的向量长度一样。

2.4 从机器翻译推广到attention的一般模式

(本来不想写的,想到一个问题,还是把这节补了)
  Attention不止是用来做机器翻译,甚至是不止用在NLP领域。换一个更一般点的例子,来说明Attention的一般模式。
  比如有一个场景是家长带小孩取玩具店买玩具,用模型预测最后玩具是否会被购买。每个玩具有两类特征,1-形状颜色功能等,用来吸引孩子;第二类特征是加个、安全、益智性等,用来决定家长是否购买。
  假设孩子喜好用特征向量q表示,玩具第一类特征用向量k表示,第二类特征用向量v表示,模型结果如下:

  首先计算q和k的相似度 s 1 − s n s_{1}-s_{n} s1sn,并归一化到 a 1 − a n a_{1}-a_{n} a1an,a反映了孩子对玩具的喜好程度(权重)。接下来a对特征v进行加权求和(家长角度考虑),得到向量h。最后家长是否购买玩具是由向量h决定的。
  上述过程就是Attention的标准操作流程。Attention模型三要素是 q 、 K 、 V q、K、 V qKV K 、 V K、 V KV矩阵分别对应向量序列 k 1 k_1 k1 k n k_n kn v 1 v_1 v1 v n v_n vn。由于中间涉及到加权求和,所以这两个序列长度一致,而且元素都是对应的。即 k j k_j kj对应 v j v_j vj。但是k和v分别表示两类特征,所以向量长度可以不一致。
  为了运算方便,可以将Attention操作计算为: h = A t t e n t i o n ( q 、 K 、 V ) h=Attention(q、K、 V) h=AttentionqKV。q也可以是一个向量序列Q(对应机器翻译中输入多个单词),此时输出也是一个向量序列H。Attention通用标准公式为: H = A t t e n t i o n ( Q , K , V ) = [ A t t e n t i o n ( q 1 , K , V ) . . . A t t e n t i o n ( q m , K , V ) ] H=Attention(Q,K,V)=\\begin{bmatrix} Attention(q_{1},K,V)\\\\ ...\\\\ Attention(q_{m},K,V)\\end{bmatrix} H=Attention(Q,K,V)=Attention(q1,K,V)...Attention(qm,K,V)
  这里, Q 、 K 、 V 、 H Q、K、 V、H QKVH均为矩阵(向量序列)。其中, H H H Q Q Q序列长度一致,各行一一对应(一个输入对应一个输出), K K K V V V序列长度一致,各行一一对应。

2.5 Attention模型的改进形式

Attention模型计算相似度,除了直接求内积<q,k>,还有很多其它形式。
s = A T T a n h ( q W + k U ) s=A^{T}Tanh(qW+kU) s=ATTanhqW+kU)
  多层感知机, A 、 W 、 U A 、 W 、 U AWU都是待学习参数。这种方法不仅避开了求内积时 q 和 k 的向量长度必须一致的限制,还可以进行不同空间的向量匹配。例如,在进行图文匹配时, q 和 k 分别来自文字空间和图像空间,可以先分别通过 W 、 U W 、 U WU将它们转换至同一空间,再求相似度。
  上面式子中, W 、 U W 、U WU是矩阵参数,相乘后可以使q和k的维度一致。比如机器翻译中,中文一词多义情况比较多,中文向量q维度可以设置长一点,英文中一词多义少,k的维度可以设置短一点。 q W + k U qW+kU Attention 机制

为何Transformer论文作者声称“Attention is all you need”?

RNN神经网络- 吴恩达Andrew Ng 循环神经网络 语音识别Sequence Models and the Attention Mechanism Week3 知识总结

Transformer最全解析(attention is all you need)

使用/指定 attention_mask 使用 Trainer 和 TrainingArguments 训练 GPT2

多图预警! Multi-Head Attention | 多头注意力 #51CTO博主之星评选#