transformer的简要解读(应该都能看懂)
作者:互联网
本人是学视觉对抗学习的,读论文的时候有论文用到了transformer,所以特地学习一下。博客里没有涉及代码,都是基础理论。个人感觉自己写的应该比较易懂吧,适合小白看。有错误欢迎评论里指出,谢谢。
1. 文中图片、部分文字内容及思路来源
Transformer从零详细解读(可能是你见过最通俗易懂的讲解)_哔哩哔哩_bilibili
10.1. 注意力提示 — 动手学深度学习 2.0.0-beta0 documentation
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乘随机初始化的矩阵得到Queries | |||
embedding乘随机初始化的矩阵得到Keys | |||
embedding乘随机初始化的矩阵得到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里用到的是多头注意力。多头的意思是,有多组不同的、、权重矩阵。把同一个句子利用多组不同的Q、K、V权重矩阵相乘,最后把得到的8个Z0~Z7对位相加(或者拼接起来再乘一个权重矩阵)得到最终的Z,这样可以捕捉到更多的特征信息。
多头注意力的完整示意如下图所示。
4.4 残差链接
把得到的两个词的Attention值摞在一起后,将“加入位置编码后的词向量”与“摞在一起的Attention值” 相加。残差链接减小了梯度消失的影响。加入残差链接,就能保证层次很深的模型不会出现梯度消失的现象。残差块是深度学习必学的基础内容,这里写的很简单,不理解的可以找找相关的博客看看。
4.5 Batch Normalization 和 Layer Normalization
假设每列代表一个样本,每行代表一个特征。BN按照特征进行标准化,将每一个特征都变为标准正态分布。batch_size较小时,BN效果差。因为小批量的均值和方差不能很好的代表整体。
LN是对每一个样本进行标准化,将每一个样本都变为标准正态分布。在NLP任务中,一般选用的都是LN,不用BN。因为句子长短不一,每个样本的特征数很可能不同,造成很多句子无法对齐,所以不适合用BN。
二者提出的目的都是为了加快模型收敛,减少训练时间。BN和LN的具体区别可以见(BN和LN的区别https://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两个矩阵呢?很简单,和注意力机制内部一样,初始化一个新的和权重矩阵,用Zn去乘这两个矩阵就可以了。
总结一下,假如该transformer的编码部分有6层encoder,每层encoder有8个“头”,那么编码部分一共初始化了多少个、、权重矩阵?
、都是6×8+1个,有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之后,将得到的矩阵去乘随机初始化的老三样(、、),得到Q、K、V。然后做self-attention操作。首先通过公式,得到矩阵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是初始化多个不同的,,矩阵得到的。而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