ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2022-03-20 18:02:05  阅读:265  来源: 互联网

标签:transformer 简要 0.1 矩阵 encoder 能看懂 注意力 向量


        本人是学视觉对抗学习的,读论文的时候有论文用到了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的话,这个经典图看上去会很晦涩。我们小白把这个经典图抽象成下面这个图,然后再知道这些就好:

  • transformer的编码部分由多层编码器encoder组成;解码部分由多层解码器decoder构成。
  • 6个encoder结构相同,参数各自随机初始化,在训练后,6个encoder的参数就不同了。
  • 6个decoder结构相同,参数各自随机初始化,但是与encoder的结构不同,训练后参数也不同了。
  • encoder和decoder不一定是6层,几层都可以,原论文里采用的是6层。

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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有