赞
踩
Transformer在做一个什么事情?Transformer可以用在机器翻译中,先不要管TRM(Transformer的缩写)具体做什么,输入是【我爱你】,输出是【I Love You】,
然后再细化TRM,我们把TRM分成2个部分,一个是Encoders(编码),Decoders(解码),
然后再对Encoders(编码),Decoders(解码)进行细化,如下图,需要注意Encoders之间的结构是相同的,Decoders之间的结构也是相同的,虽然Encoders和Decoders之间各自的结构是相同的,但Encoders和Decoders之间的结构是不同的,Encoders和Decoders之间各自的结构是单独训练的,之间的结构相同,但训练之后的参数不同,Encoders和Decoders的数量是超参数,可以自己定义,
Transformer在原论文中的图示如下,左边是Encoders,右边是Decoders,N是相同结构的堆叠次数,
把单个Encoders分成3个部分,分别是1、输入部分,2、注意力机制,3、前馈神经网络,
首先是输入部分,输入经过Embedding,再与位置编码(positional Encoding)相加,再经过多头注意力机制(Multi-Head Attention),通过残差(Add)和Layer Norm(Norm),再经过2层全连接(Feed Forward),再通过残差(Add)和Layer Norm(Norm)后输出,
输入部分分为Embedding和位置嵌入,什么是Embedding呢?
Embedding:
比如输入的词是【我爱你。。。】等12个字,分别将每个字输出为512维度的vector,vector可以使用word2vector,或者随机初始化,如果数据量特别大的话,使用word2vector或者随机初始化差别不大,
位置编码/嵌入:
为什么需要位置编码?如下图是RNN的结构图,RNN共享一套参数,如下图中的U(输入参数),W(隐藏参数),V(输出参数),依次对输入的【我爱你。。。】等字进行处理,对于RNN的所有timestamps都共享一套参数,如下右图, U , W , V 都是一样的 U,W,V都是一样的 U,W,V都是一样的 。
transformer中的multi-head attention是同时对这些字进行处理,好处是加快了速度,缺点是忽略了字与字之间的联系,为了弥补这个缺点,就引入了位置编码,面试题:RNN的梯度消失有什么不同? RNN的梯度是整个梯度之和,它的梯度消失不是变为0,而是总梯度被近距离梯度主导,远距离可忽略不计,
位置编码的公式:
pos是单词或字位置,
2
i
2i
2i是偶数位置,
2
i
+
1
2i+1
2i+1是奇数位置,
d
m
o
d
e
l
d_{model}
dmodel表示隐藏层的维度,
这里pos代表的是每个字符在整个句子中的索引,512是整个句子最大长度,和2i对应的维度512要区分开,
比如对于【爱】而言,pos表示该词在句子中的顺序,而 2i 和 2i+1 则用于计算位置编码向量中的每个维度,
对于【爱】这个词,将字或词向量的512个维度和位置编码的512个维度相加组成transformer的输入,
引申一下,为什么位置编码会有用?
由公式(2)得到公式(3),比如对于 P E ( p o s + k , 2 i ) PE(pos+k,2i) PE(pos+k,2i),pos这个位置表示【我】,k这个位置表示【爱】,pos+k表示【你】,从这个公式可以看出,【你】可以由pos【我】和k【爱】的线性组合,意味着绝对位置向量中蕴含着相对位置信息,但是这种相对位置信息会在注意力机制那里消失,
注意力机制
看下图婴儿在干嘛?我们可能会关注婴儿的脸,以及文字标题信息,颜色越深,关注度就越高,
transformer论文注意力机制公式:
Q
,
K
,
V
Q,K,V
Q,K,V是向量,分别代表Query,Key,Value,
A
t
t
e
n
t
i
o
n
(
Q
,
K
,
V
)
=
s
o
f
t
m
a
x
(
Q
K
T
d
k
)
V
Attention(Q,K,V)=softmax(\frac{QK^T}{\sqrt{d_k}})V
Attention(Q,K,V)=softmax(dk
QKT)V
- 下面来解释这个公式,还是拿上面婴儿的图片举例,首先Query代表的婴儿分别与Key1,Key2,Key3,Key4做点乘,点乘是一个向量在另一个向量投影的长度,它是一个标量,可以反映2个向量之间的相似度,相似度越高,则点乘结果越大,
- Query代表的婴儿分别与左上,左下,右上,右下做点乘,得到Value1,Value2,Value3,Value4,哪个Value最大说明Query和哪个区域相似度最高,距离最近,也就是越关注哪个区域,如下图所示,
- 回到上面的公式,假如 Q Q Q和 K T K^T KT的相乘的结果分别为0.7,0.1,0.1,0.1,做softmax之后,再分别乘以0.7,0.1,0.1,0.1,再相加得到Attention Value,
下面再举一个NLP的例子,Query代表【爱】,分别与Key1,Key2,Key3,Key4代表的【我】,【不】,【爱】,【你】做点乘, V 1 V_1 V1, V 2 V_2 V2, V 3 V_3 V3, V 4 V_4 V4也是【我】,【不】,【爱】,【你】对应的某种向量,具体步骤如下2图,
- 下图接上图的介绍,【爱】,【我】,【不】,【爱】,【你】,分别由各自的向量表示,F(Q,K)可以表示向量之间的点乘,点乘之后得到S1,S2,S3,S4,再分别做SoftMax得到a1,a2,a3,a4,a1+a2+a3+a4=1,
- V 1 V_1 V1, V 2 V_2 V2, V 3 V_3 V3, V 4 V_4 V4也是【我】,【不】,【爱】,【你】对应的某种向量,然后各自分别与a1,a2,a3,a4做点乘再相加求和,
想要得到Attention,需要知道 Q , K , V Q,K,V Q,K,V这3个向量,我们怎么获取这3个向量呢?
A t t e n t i o n ( Q , K , V ) = s o f t m a x ( Q K T d k ) V Attention(Q,K,V)=softmax(\frac{QK^T}{\sqrt{d_k}})V Attention(Q,K,V)=softmax(dk QKT)V
在只有单词向量的情况下,如何获取 Q K V QKV QKV,如下图输入【Thinking】,【Machines】,【Thinking】和【Machines】做Embedding后为4维向量,然后分别与 W Q W^Q WQ, W K W^K WK, W V W^V WV相乘,就得到相应的 Q K V QKV QKV,需要注意 W Q W^Q WQ, W K W^K WK, W V W^V WV是相同的,
如何计算Attention的值呢?由公式可知, q q q和 k k k相乘,然后再除以 d k \sqrt{d_k} dk ,目的是防止梯度消失和控制方差为1,再经过softmax计算,再乘以 v 即可得到最终结果 z,
实际代码使用矩阵,方便并行,
- 多头注意力机制,上图是乘以一套参数( W Q W^Q WQ, W K W^K WK, W V W^V WV),下图是乘以多套参数。
- 作者通过做实验,发现多头比单头的效果要好,因为可以把输入映射到不同的空间,使transformer捕捉到不同空间的子信息,
输入信息通过不同的头输出不同的 z,如下图,把8个不同的 z 合在一起输出,
如下图,将【Thinking】和【Machine】分别通过Embedding转为词向量 X 1 X_1 X1和 X 2 X_2 X2,然后分别与各自的位置编码对位相加,得到新的 X 1 X_1 X1和 X 2 X_2 X2,然后经过自注意机制得到 Z 1 Z_1 Z1和 Z 2 Z_2 Z2, Z 1 Z_1 Z1和 Z 2 Z_2 Z2变成一个矩阵 Z Z Z,新的 X 1 X_1 X1和 X 2 X_2 X2变成一个矩阵 X X X, X X X和 Z Z Z对位相加,
残差结构:
如下图是常见的残差结构,
这里是另一个残差结构,结构和上图类似,A相当于上图中的 X X X,B和C相当于上图中的2个weight layer,D相当于上图中的 F ( X ) + X F(X)+X F(X)+X,
为什么残差结构有用呢?如下公式推导,使用残差结构可以避免梯度消失,因为一般情况下连乘可以使梯度消失,所以使用残差结构的NLP模型可以做的更深,
根据后向传播的链式法则,
- 为什么BN的效果不如LayNorm?
- 答:BN在NLP中的效果很差,所以不用,
- 什么是BN,以及使用场景,BN是针对整个batch样本在同一维度特征中做处理,
- 什么是Feature Scaling?消除量纲的影响,使模型收敛的更快,
每一个列是一个样本,每一行是同一个特征,
BN的优点:
- 第一个就是可以解决内部协变量偏移,
- 第二个优点就是缓解了梯度饱和问题 (如果使用sigmoid激活函数的话),加快收敛。
BN的缺点:
- 第一个,batch_size较小的时候,效果差,因为BN的假设是使用一个batch的均值和方差模拟整个全部数据的均值和方差,
- 第二个缺点就是 BN在RNN中效果比较差。这一点和第一点原因很类似,还有一点解释请看下一点,
- 如下图,batchsize为10,9个样本单词数为5,1个样本单词数为20,前5个单词的均值和方差可以用batchsize算出来,而第6-20个单词的均值和方差只能用第10个样本的均值和方差表示,所以BN在RNN的效果不好,因为RNN的输入是动态的,所以不能有效地地得到整个batch-size的均值和方差,
为什么使用LayNorm?
- 理解:为什么LayerNorm单独对一个样本的所有单词做缩放可以起到效果?
- 如下图,LN是对第10个样本的20个单词做均值和方差,而BN是对每一个样本的同一位次的单词做均值和方差,
- 把BN引申到RNN,BN是对【我】和【今】做均值和方差,【爱】和【天】做均值和方差,但是各个位次的单词没有相似的语义信息,所以在不能把BN引申到RNN,
- 而LN是对每一个样本的所有单词做均值和方差,每一个样本之间有相同的语义信息,
Z 1 Z_1 Z1和 Z 2 Z_2 Z2经过Feed Forward(就是全连接)之后,经过残差和Normalize就是前馈神经网络,
Decoder结构图如下:
需要对当前单词和之后的单词做mask。
- 为什么需要做mask?
- S代表输入的开始,start,如果Decoder没有mask,则会出现如下图的情形,即【you】的输出是由全部的单词(I LOVE YOU NOW)决定,这样训练出来的模型在预测的时候就会出现问题,因为【you】的预测也由you和now决定,所以需要把you和now mask掉,
预测【you】的时候需要把you和now mask掉,
如下图红框处即为交互层,也是一个多头注意力机制,
ENCODER的所有输出和所有的DECODER做交互,
具体的交互过程如下,ENCODER生成K,V矩阵,DECODER生成Q矩阵,交互的时候是由Q,K,V矩阵完成的,
下图由ENCODER发出的虚线代表K,V矩阵的输出,然后K,V矩阵与DECODER生成的Q做交互,也能看到ENCODER的所有输出和所有的DECODER做交互,
参考:
1、哔哩哔哩视频
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。