由于时间紧张,所以对于不影响我阅读代码的理论我暂时不仔细写了,之后有时间再补充。
1 Transformer基础
Transformer最早起源于论文Attention is all your need,用于NLP领域。 这句话似乎是每篇Transformer的文章都会提到的,看得多了就觉得这是介绍它必不可少的一句话,已经成为transformer学习的常识了,所以这里也提一句吧!
1.1 注意力机制
注意力机制(Attention Mechanism) 是让你在某一时刻将注意力放到某些事物上,而忽略另外的一些事物。在深度学习领域,模型往往需要接收和处理大量的数据,然而在特定的某个时刻,往往只有少部分的某些数据是重要的。
1.1.1 Self-Attention
self-Attention是Transformer用来找到并重点关注与当前单词相关的词语的一种方法。
举例:The animal didn’t cross the street because it was too tired.
这里的it究竟是指animal还是street,对于算法来说是不容易判断的,但是self-attention是能够把it和animal联系起来的,达到消歧的目的。
仍以上述例子来说,在这句话的每个词语都是以一个一维向量的形式传入网络的,具体怎么存储先不考虑。
如上图,自注意力机制中有三个重要的输入矩阵(先忽略它们的形状):查询矩阵Q(query)、键矩阵K(key)和值矩阵V(value)。这三个矩阵都是由输入序列经过不同的线性变换得到的, W Q W^Q WQ、 W V W^V WV、 W K W^K WK是三个随机初始化的矩阵。
-
使用查询矩阵Q与键矩阵K的乘积计算Score,表示关注单词的相关程度。
有一个查询矩阵 Q 1 Q_1 Q1存储“it”、键矩阵 K 1 K_1 K1存储“animal”、键矩阵K2存储“street”, Q 1 × K 1 = 112 Q_1×K_1=112 Q1×K1=112, Q 1 × K 2 = 96 Q_1×K_2=96 Q1×K2=96,表示it和animal的相关程度比it和street的相关程度高。 -
Score经过一个softmax函数,得到一个与输入序列长度相同的概率分布,该分布表示每个元素对于查询矩阵Q的重要性。
对于查询矩阵 Q 1 Q_1 Q1,有长度为10的概率序列,分别表示“The”、“animal”、“didn’t”、“cross”、“the”、“street”、“because”、“was”、“too”、“tired”对于“it”的相对重要性。 -
将上述概率分布乘以值矩阵V得到自注意力向量,表示将每个元素的值加权平均后的结果。即通过Q和K的相关性程度来作为某个词的权重,这种方法称为scaled dot-product attention。
V可以理解为是输入矩阵经特征提取后的输出矩阵,若 V 1 V_1 V1表示“animal”的特征向量、 V 2 V_2 V2表示“street”的特征向量,我们已经计算得到 Q 1 Q_1 Q1与 K 1 K_1 K1、 K 2 K_2 K2的相关程度分别为 s m 1 = 0.88 sm_1=0.88 sm1=0.88、 s m 2 = 0.12 sm_2=0.12 sm2=0.12作为V的权重,则 V=sm×V,这样 V 2 V_2 V2的特征(注意力)会被削弱输入到后面的操作中。经wwb同学提醒,我才意识到对于不同的Q,有不同的V,也就是说最终V的数量应该是。单词数×(单词数-1)
提示:softmax处分母 d k \sqrt{d_k} dk, d k d_k dk是K的维度。
- 除以 d k \sqrt{d_k} dk的操作是为了缩放,原始注意力值均聚集在得分最高的那个值,获得的权重为1,缩放后注意力就会分散一些。
- 原始表征 V k V_k Vk是符合均值为0方差为1的正态分布的,与权重矩阵相乘后,结果符合的是均值为0方差为 d k d_k dk的正态分布,为了不改变原始表征的分布,需要除以 d k d_k dk。
1.1.2 Multi-Headed Attention
Multi-Headed Attention(多头注意力)机制是指有多组Q,K,V矩阵,一组Q,K,V矩阵代表一次注意力机制的运算。如下图,8组Q,K,V矩阵计算会得出8个矩阵(所有的V打包成Z),最终我们还需将8个矩阵经过计算后输出为1个矩阵,才能作为最终多注意力层的输出。
可以看到下图,不同的Head在it位置上对于不同词语的关注度是不一样的。
1.1.3 进一步解释
在看代码的过程中,还是不知道
q
、
k
、
v
q、k、v
q、k、v输入的依据,以及他们的实际意义,所以和zrc同学进一步探讨了一下,感觉更清晰了(感谢)。
如上图,输入特征为x,分别经过三个权重
W
K
W^K
WK、
W
Q
W^Q
WQ、
W
V
W^V
WV得到
q
、
k
、
v
q、k、v
q、k、v,权重是需要网络学习和反向传播更新的。
x
、
q
、
k
、
v
x、q、k、v
x、q、k、v的形状对于注意力的理解是很重要的。
对于
x
x
x,每一行代表一个单词。有多少行就有多少个单词,有多少列就说明存储这个单词词向量有多长。以上图为例,表示我们这个句子中有4个单词,每个单词需要6个单元存储。
Q
Q
Q和
V
V
V同理,只是不再简单代表单词的特征了而已,存储方式还是一样的。
用
Q
Q
Q和
K
T
K^T
KT相乘得到的为attention,它的意义就是每两个单词之间的相关联性,一个小单元就表示两个词的关联性,即不再用一个词向量组成一个单词了。比如
Q
K
[
2
,
3
]
T
QK^T_{[2,3]}
QK[2,3]T表示对第2个单词来说,第3个单词和它的关联性。
我是这样理解的,一个单词并不只是和句子里的某一个单词有关,它可能被很多单词影响,可以解释为它还受上下文影响。回归到自然语言处理任务,我们是要根据前文去“编造”下一个单词,用多个单词组成一个句子,在计算机视觉方面,就体现为一个像素和周围像素是相似的。这也就可以解释经过softmax变换,得到的是attention系数(可以结合softmax去理解),代表周围不同像素对它的影响因子。
对于
V
V
V的理解,我把这一系列操作看成一个拼图的过程,一个物体(单词)是由几块最重要的拼图(每个小单元)组成的,物体被抽象成3个拼图,表示该物体三个角度的显著特征。
attention系数
×
V
×V
×V,得到的输出
Z
Z
Z就是我们根据单词之间互相的影响力设计的计算方法得到的新单词,
Z
Z
Z越接近原始输入
X
X
X,说明我们的计算方式越准确、有代表性。
1.2 注意力机制结构
(本来这节的标题是“Transformer结构”,学了很久一直在学习encoder和decoder,偶然才发现实际Transformer不止这些,所以与其说是Transformer结构不如说是Self-Attention结构)
在此之前的模型都是以循环神经网络为基础,从本质上来讲,RNN是以串行的方式来处理数据,对应到NLP任务上,即按照句中词语的先后顺序,每一个时间步处理一个词语。
相较于这种串行模式,Transformer的巨大创新便在于并行化的语言处理:文本中的所有词语都可以在同一时间进行分析,而不是按照序列先后顺序。为了支持这种并行化的处理方式,Transformer依赖于注意力机制。注意力机制可以让模型考虑任意两个词语之间的相互关系,且不受它们在文本序列中位置的影响。通过分析词语之间的两两相互关系,来决定应该对哪些词或短语赋予更多的注意力。
Transformer采用Encoder-Decoder架构,如下图。其中左半部分是encoder,右半部分是decoder。
1.2.1 Input Embedding
Input Embedding的作用是将输入(Input)的语言文字(比如:中文,英语,法语等),输出变成计算机可识别的一组向量。在计算机视觉中,输入定义像素颜色值的图像,输出一个组向量。
由于我们学习的重点不在NLP,所以这里只举一个简单的例子来说明Input Embedding的形状。假设词汇表有“白”、“黑”、“狗”和“猫”,这4个词分别赋予一个唯一的编号1, 2, 3, 4,它们的向量表示分别为: V 白 = [ 1000 ] T V_白=[1000]^T V白=[1000]T、 V 黑 = [ 0100 ] T V_黑=[0100]^T V黑=[0100]T、 V 狗 = [ 0010 ] T V_狗=[0010]^T V狗=[0010]T、 V 猫 = [ 0001 ] T V_猫=[0001]^T V猫=[0001]T。我们可以将文本看成是词的集合,不考虑词序信息,比如“白狗”表示为 V 白狗 = [ 1010 ] T = V 白 + V 狗 V_{白狗}=[1010]^T=V_{白}+V_{狗} V白狗=[1010]T=V白+V狗。即Input Embedding输出一组向量,其中每个向量是一个列向量。
Input Embedding在计算机视觉中体现为Encoder和Decoder层的Patches操作。在将特征输入Transformer主体之前,给定的特征被划分为Patches,每个Patch被视为一个“Word”,展开为一维向量。用p表示patch的大小,patch的数量即patches序列的长度为 N = H W p 2 N=\frac{HW}{p^2} N=p2HW,每个patch的长度为 p 2 × C p^2×C p2×C。Encoder 层作用于 Patches 以生成 Encoded Patches 作为输出,Decoder 层以相同的方式作用于 Encoded Patches 以生成 Decoded Patches。
1.2.2 Positional Encoding
向量positional encoding是可学习的位置编码,它是为了解释输入序列中单词顺序而存在的,维度和embedding的维度一致。这个向量决定了当前词的位置,或者说是在一个句子中不同的词之间的距离。
Transformer模型的位置编码过程包括将词汇转换为向量,然后与位置编码相加,以保持位置信息。
位置编码的具体作用是,对于不同的输入序列成分,赋予其不同的位置标识,确保即使是相同的文本序列也因位置不同而有不同的含义。
位置编码的数学公式用于为每一个位置(即序列中的词素)分配一个独特的编码,以使其能够在不同的上下文中区别对待。每个值都在-1到1之间。下图展示了一个长为 100,宽为 512 的位置编码矩阵的热图。
1.2.3 Encoder
Encoder层中有6个一模一样的层结构,每个层结构包含了两个子层,第一个子层是多头注意力层(Multi-Head Attention,橙色部分),第二个子层是前馈连接层(Feed Forward,浅蓝色部分),除此之外,还有一个残差连接。
1.2.3.1 Multi-Head Attention
Multi-Head Self-Attention 机制将 QKV 矩阵分成多个 Head,使模型能够同时关注输入序列的多个部分。每个 Head 都被训练来关注输入序列不同但有希望是互补的方面。这导致了更加鲁棒和可解释的注意力分布。
1.2.3.2 Layer normalization
Normalize层的目的就是对输入数据进行归一化,将其转化成均值为0方差为1的数据。
1.2.3.3 Feed Forward
全连接层
1.2.4 Decoder
Decoder层中也有6个一模一样的层结构,但是比Encoder层稍微复杂一点,它有三个子层结构,第一个子层结构是遮掩多头注意力层(Masked Multi-Head Attention,橙色部分),第二个子层是多头注意力结构(Multi-Head Attention,橙色部分),第三个子层是前馈连接层(Feed Forward,浅蓝色部分)。
(我通俗的理解,不确定对不对)需要注意的是,并不是Encoder层的输出直接作为Decoder层的输入,而是在中间环节用到了Encoder层的输出,Decoder层其实是有自己的输入,作用是把输入的序列转换想要的结果,比如输入一句英文句子,得到中文翻译。拿卷积类比一下,可以理解为Encoder层是为了训练参数,Decoder层是为利用训练的参数生成结果。
1.2.4.1 Masked Multi-Head Attention
和编码器输入一样,我们嵌入和添加位置编码到这些解码器输入中,以指示每个单词的位置。
实际上Decoder是按照时间步来解码的,每次处理一个词向量。比如第一步得到第一个单词的翻译,第二步得到第二个单词的翻译,以此类推。每次翻译都从头到尾走一遍Decoder。如下图,当第三个时间步,已经有"I" 和"am"被翻译出来,正在进行"a"的翻译。
重复上述步骤,当第5个时间步的时候,生成一个特殊的结束符号,表示解码已经全部完成。
Masked Multi-Head Attention中的mask,它的作用就是防止在训练的时候使用未来的输出的单词。比如训练时,第一个单词是不能参考第二个单词的生成结果的,此时就会将第二个单词及其之后的单词都mask掉。
1.2.4.2 Multi-Head Attention
通过Masked Multi-Head Attention创建查询矩阵后,Encoder-Decoder Attention层从编码器堆栈的输出中获取键
k
k
k和值
v
v
v矩阵,帮助解码器将注意力集中在输入序列中的适当位置。
我的理解:Encoder层关注的重点是上下文的关系,所以得到的输出实际上是与原始的输入相比较,如果输出 z z z与输入 x x x非常接近,说明我们找到了正确的上下文关系,那么该过程中使用的 k k k和 v v v就能作为解释词语间关系的 k k k和 v v v用于解码的过程中。而Decoder层关注的重点是问题的解决,仍以翻译句子为例,我们参考前面得到的 k k k和 v v v来利用上下文关系,而实际如何翻译是要在Decoder层去训练的。
1.2.4.3 Feed Forward
前馈神经网络
1.2.5 Linear & Softmax
在深度学习特别是神经网络模型中,logits是指模型最后一层的输出,通常是未经激活函数的原始预测值或得分。在分类任务中,logits是模型在每个类别上的得分,这些得分未经过Softmax或Sigmoid函数转换为概率。
解码器堆栈输出的向量,通过线性层投影成一个更大的向量,称为logits向量。假设我们的模型知道从训练集数据集中学习到的10000个唯一的英语单词(单词库),logits向量长度即为10000,每个单元格对应一个唯一单词的分数。然后Softmax层将这些分数转换为概率,选择概率最高的单元格,并生成与之关联的单词作为此时间步骤的输出。
补充:
由于模型每次产生一个输出,可以假设模型从概率分布中选择了概率最高的单词,并丢弃其余的单词,这是一种greedy decoding(贪婪解码)的方法。另一种方法是beam search(光束搜索),保留模型概率最高的前几个单词,然后在下一步中分情况讨论,对于上一个位置输出的是单词a或者单词b分两种情况,后面的位置重复此操作。
1.3 Transformer结构解读
光看上面的图,以为这一整个就是Self-Attention,其实只有橙色部分是Attention,将橙色和蓝色部分抽象出来可以得到下图:
Attention块主要是Self Attention,前面已经讲过了,其中的Linear层不改变特征向量的大小。
MLP块就是Feed Forward,第一个全连接先将维度扩大了4倍,然后第二个又还原回去了。
除了注意力子层外,我们的编码器和解码器中的每一层都包含一个全连接的前馈网络,该网络被单独且相同地应用于每个位置。这包括两个线性变换,它们之间有ReLU激活函数。
也就是说上面两个图都是Transformer的总体结构,只不过是从两个不同的角度看的。
参考来源:
Transformer模型(3)- Input Embedding
Transformer讲解以及在CV领域的应用
支持多种底层视觉任务的预训练图像处理Transformer
Transformer进行底层图像处理任务
超分算法IPT:Pre-Trained Image Processing Transformer
Transformer模型详解(图解最完整版)
一文详解Softmax函数
The Illustrated Transformer
Transformer中的位置编码详解
【“Transformers快速入门”学习笔记8】学习中遇到的一些方法和关键字
Transformer详解
深度学习 Transformer 架构详解:代码 + 图示