其他分享
首页 > 其他分享> > transformer的简要解读(应该都能看懂)

transformer的简要解读(应该都能看懂)

作者:互联网

        本人是学视觉对抗学习的,读论文的时候有论文用到了transformer,所以特地学习一下。博客里没有涉及代码,都是基础理论。个人感觉自己写的应该比较易懂吧,适合小白看。有错误欢迎评论里指出,谢谢。

1. 文中图片、部分文字内容及思路来源

Transformer从零详细解读(可能是你见过最通俗易懂的讲解)_哔哩哔哩_bilibili

10.1. 注意力提示 — 动手学深度学习 2.0.0-beta0 documentation

LN和BN对比 - 光彩照人 - 博客园

Transformer详解(看不懂你来骂我)_数学家是我理想的博客-CSDN博客

Transformer 中的 Positional Encoding

2. 基本知识

2.1 注意力机制是什么?

        transformer就是建立在注意力机制之上的,在学transformer之前首先要理清什么是注意力机制。以及其他文章或者论文在介绍注意力机制的时候,常用的图片都是什么意思。

从文字的角度理解注意力机制:

        人的注意力大概分为两种:一种是下意识的关注度;另一种是带有目的性的关注度。

        比如,你舍友让你去他的果盘里拿一个苹果。他的果盘里有一层苹果,但是果盘中心位置摆了一个西瓜。这时,虽然你脑中的目标物品是“苹果”,但是由于你的大脑受到这个西瓜的大小,花纹,颜色,在果盘中处于显眼位置等特征的影响,下意识的注意力(比如你的眼睛下意识的去看)就会被移到“西瓜”上去;然后你想到了舍友要的是苹果(目的性),这时你的注意力才会转移到那一堆苹果上去。

        把上面这个例子对应到下边图中就是:

:一系列物品(果盘里的一堆苹果和一个西瓜)

:这一系列物品对人下意识的吸引力(比如在上述果盘中,由于西瓜自身的各种特征,它对人下意识的吸引力肯定比苹果要高)

查询:你想要的物品(苹果)

注意力汇聚:一个网络层,该层的输出结果是一个所有元素的和等于1的权重向量。该层的作用是把想要的物品(目的物品)所对应的权重值变高。这样使用该‘权重向量’乘‘值’后,即使目的物品“下意识的吸引力(即‘值’)”不够高,但是由于它对应的权重高,其他物品对应的权重小,最终选择到目标物品的可能性也会变大。

        果盘的例子不够形象的话,这个短视频应该就可以了(国外男主播挑战男性本能

从公式的角度简单的看注意力机制的具体例子:

  

        为了描述的简单一些,我们假设Query、Key、Value都是一个数字,不是向量。

        用婴儿做Query(Q),图像的四个部分做为Key(K)。首先用Query分别点乘4个Key(点乘是计算两个向量相似度的一种方式,相似度越高,点乘得到的结果越大。判断两个向量相似度的方式有点乘、构建一个新的MLP、计算cos相似度等)得到一个四维向量。比如是[7,1,1,1] ,然后经过一次softmax层得到[0.7,0.1,0.1,0.1],作为注意力权重(注意力权重指的是各个key(即各个物品)与query(即目的物品)的相似程度,即人的目的性关注度)。注意力权重里的这4个数字,越大的数字,说明Query对相应的Key的下意识的关注度越高。然后再用注意力权重[0.7,0.1,0.1,0.1]和4个V(Valuei)相乘(即[v1*0.7,v2*0.1,v3*0.1,v4*0.1]),再相加(即加权和),得到最终的Attention value= v1*0.7+v2*0.1+v3*0.1+v4*0.1(一个数值)

        在transformer结构里,Query、Key、Value不可能仅用一个数字代表,通常是使用多维向量表示。所以得到的Attention value是一个向量(而不是像上一段的Attention value一样,是一个数值)。具体向量形式的下面会介绍。

2.2 位置编码

        对于RNN来说,它所有的时间步(时间步的概念:RNN中的batch_size 和 time_step的直观理解_神鱼来啦的博客-CSDN博客https://blog.csdn.net/lnaruto1234/article/details/99672601?spm=1001.2101.3001.6650.2&utm_medium=distribute.pc_relevant.none-task-blog-2~default~CTRLIST~Rate-2.pc_relevant_aa&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2~default~CTRLIST~Rate-2.pc_relevant_aa&utm_relevant_index=5)采用的是同一套参数,这样就隐含了输入的先后顺序信息。transformer缺少了单词输入的顺序信息,所以需要位置编码来标记各个字之间的时序关系或者位置关系。

        计算位置编码用的是上图中的公式。假设“爱”是当前的pos,“爱”这个字用512维的词向量Embedding表示。d_model等于词向量的维度,即512。i代表的是这512个数字的位置号,每个数字都有自己的位置编码。至于为什么公式里要采用正弦余弦的形式,可以参考以下文章(Transformer 中的 Positional Encodinghttps://wmathor.com/index.php/archives/1453/)。

2.3 其他

       词向量embedding、残差链接这些内容很基础,不再赘述。

3. transformer的总体架构

        在几乎所有关于讲解transformer的文章或者视频里,下面这个图都是必有的:

        如果没学过transformer的话,这个经典图看上去会很晦涩。我们小白把这个经典图抽象成下面这个图,然后再知道这些就好:

4. encoder部分

       encoder包括三个部分:输入、多头注意力、前馈神经网络。

4.1 输入部分:

       将输入单词的embedding词向量,与该单词的位置编码对位相加即可。

       如上图所示, 比如“爱”这个字的embedding是512维向量;它的位置编码也是512维向量。将两者对位相加做为encoder第一层的输出,也即第二层(即注意力机制)的输入。

4.2 注意力机制

       为了好理解,所以在上一部分介绍的注意力机制形式上比较简单。这里开始介绍一般情况下的注意力机制的运算过程,以及多头注意力的概念。

       首先放一张经典的图:

       在解释transformer的时候,很多文章都会用到这张图。这个图用两个词组成的一个短句子做为输入,实际上两个词对初学者理解整个注意力机制的运算过程显的太少了,我并不觉得这个图表述的很清晰。因为两个词的做例子并不具体,三个词就好多了。

假设input是I love you三个词的时候,这张图的运算过程:

input

I

love

you

词向量

计算位置编码(只有第一层transfomer会加位置编码)

词向量和位置编码对位相加得到embedding

embedding乘随机初始化的W^{Q}矩阵得到Queries

embedding乘随机初始化的W^{K}矩阵得到Keys

embedding乘随机初始化的W^{V}矩阵得到Values

 (v1)

  (v2)

  (v3)

计算词I对应的输出Z1:

Score

q1*k1=112

q1*k2=48

q1*k3=48

Divide by 8

14

6

6

Softmax

0.88

0.06

0.06

Softmax后的值*各个词的Values,记为Vi’

0.88*v1=   (v1’)

0.06*v2= (v2’)

0.06*v2= (v3’)

Z1

Z1=v1’+v2’+v3’(对位相加)

计算词love对应的输出Z2:把q1换成q2即可

Score

q2*k1=48

q2*k2=48

q2*k3=112

Divide by 8

6

6

14

Softmax

0.06

0.88

0.06

Softmax后的值*各个词的Values,记为Vi’

0.06*v1=   (v1’)

0.88*v2= (v2’)

0.06*v2= (v3’)

Z2

Z2=v1’+v2’+v3’(对位相加)

计算词you对应的输出Z3:把q1换成q3即可,这里就不重复画表了。

       上面有一步操作是除以根号dk,原因:q*k得到的值可能会很大,softmax在x较大处的梯度是很小的,如下图所示。如果网络层次较深的话,在传播时容易造成梯度消失。除以根号dk让值变小,缓解梯度消失,也让方差变为1。

        在实际操作中,采用矩阵相乘,方便并行提速。X有两行的意思就是,把Thinking和Machines的Embedding叠在一起,做为一个矩阵。Z是最终得到的attention值(两行,每行对应一个词),如下图所示。

 4.3 多头注意力

       transformer里用到的是多头注意力。多头的意思是,有多组不同的W^{Q}W^{K}W^{V}权重矩阵。把同一个句子利用多组不同的Q、K、V权重矩阵相乘,最后把得到的8个Z0~Z7对位相加(或者拼接起来再乘一个权重矩阵W^{0})得到最终的Z,这样可以捕捉到更多的特征信息。

       多头注意力的完整示意如下图所示。

4.4 残差链接

      把得到的两个词的Attention值摞在一起后,将“加入位置编码后的词向量”与“摞在一起的Attention值” 相加。残差链接减小了梯度消失的影响。加入残差链接,就能保证层次很深的模型不会出现梯度消失的现象。残差块是深度学习必学的基础内容,这里写的很简单,不理解的可以找找相关的博客看看。

4.5 Batch Normalization 和 Layer Normalization

       假设每列代表一个样本,每行代表一个特征。BN按照特征进行标准化,将每一个特征都变为标准正态分布。batch_size较小时,BN效果差。因为小批量的均值和方差不能很好的代表整体。

       LN是对每一个样本进行标准化,将每一个样本都变为标准正态分布。在NLP任务中,一般选用的都是LN,不用BN。因为句子长短不一,每个样本的特征数很可能不同,造成很多句子无法对齐,所以不适合用BN。

        二者提出的目的都是为了加快模型收敛,减少训练时间。BN和LN的具体区别可以见BN和LN的区别icon-default.png?t=M276https://www.cnblogs.com/gczr/p/12597344.html)。

4.6 前馈神经网络 Feed Forward

       假设多头注意力部分有两个头,那么输出的两个注意力头Zi分别通过两个Feed Forward(由两个全连接层构成的网络:Linear(ReLU(Linear(Zi​)))),然后接一个残差链接,即Zi和Feed Forward的输出Add对位相加。最后把相加的结果进行一次LN标准化。

       以上介绍的是transformer的encoder的第一层,如果有多层encoder的话,第二层encoder的输入就是第一层encoder的输出(即Z,Z的shape和X的shape是相同的),以此类推。

       最后一层encoder的输出是Zn。Zn的shape和第一层输出的Z1相同。

4.7 encoder的输出如何作为decoder的输入

      根据transformer的整体架构图可以看出,decoder的第二层是一个多头注意力(Multi-Head Attention)。既然是多头注意力了,那么一定会涉及到Q、K、V三个矩阵。从上图中还可以看出,K、V矩阵是由encoder部分的输出作为decoder的输入的。刚才提到,encoder最后一层的输出是Zn。那么如何把Zn这一个矩阵变成K、V两个矩阵呢?很简单,和注意力机制内部一样,初始化一个新的W^{K}W^{V}权重矩阵,用Zn去乘这两个矩阵就可以了。

总结一下,假如该transformer的编码部分有6层encoder,每层encoder有8个“头”,那么编码部分一共初始化了多少个W^{Q}W^{K}W^{V}权重矩阵?

W^{K}W^{V}都是6×8+1个,W^{Q}有6×8个。

5. decoder

       decoder包括三个部分,带掩码的多头注意力、N个普通的多头注意力、前馈网络。

5.1 首先第一层,带masked的多头注意力:

       如果像encoder的注意力机制那里一样没有mask,那么在训练decoder时,如果要生成预测结果you,就需要用到下面整个句子的所有词。但是在真正预测的时候,并看不到未来的信息(即you和now)。

       在预测阶段,预测的第一步生成第一个词I的时候,用起始词<start>做self-attention;预测的第二步生成第二个词love的时候,就做<start>和I两个词的self-attention。预测的每一步在该层都有一个输出Q,Q要送入到中间的Multi-Head Attention层,和encoder部分输出的K,V做attention。

       那么在真正实现的时候,用怎样的技巧实现mask这个步骤?

       举个例子,我们将"<start> I love you"这个句子输入到Decoder中,经过WordEmbedding和Positional Encoding之后,将得到的矩阵去乘随机初始化的老三样(W^{Q}W^{K}W^{V}),得到Q、K、V。然后做self-attention操作。首先通过公式\frac{Q*K^{T}}{\sqrt{d_{k}}},得到矩阵Z,然后要对Z进行Mask。例如,当输入"I"时,模型目前仅知道包括"I"在内之前所有字的信息,即"<start>"和"I"的信息,不应该让其知道"I"之后词的信息。在mask的时候,首先生成一个下三角全0,上三角全为负无穷(-inf)的矩阵,得到MASK_Z,然后将其与Scaled Scores相加即可。

 之后再对结果做softmax,就能将-inf变为0,得到的这个矩阵即为每个字之间的权重。

 5.2 然后是第二层,decoder里的多头注意力机制

       这里的多头注意力的具体细节和encoder是相同的,唯一的区别就是,encoder的多头注意力里的Q、K、V是初始化多个不同的W^{Q}W^{K}W^{V}矩阵得到的。而decoder的K、V是来自于encoder的输出,Q是上层Masked Self-Attention的输出。

       如果解码部分的多头注意力有多层,那么输入到每层多头注意力里的K、V都来自于encoder。除了第一层的Q来自于masked Multi-Head Attention的输出,其余的Q都来自于上层encoder的输出。

5.3 前馈神经网络 Feed Forward

       这一部分和encoder是一样的,即一个两层的、带残差链接的、全连接网络,后边再接一个LN层。

transformer的原论文 https://arxiv.org/pdf/1706.03762.pdf

标签:transformer,简要,0.1,矩阵,encoder,能看懂,注意力,向量
来源: https://blog.csdn.net/qq_40663469/article/details/123609730