Transformer 全⾯详解
Time ries on Transformer
Transformer Input
Transformer输⼊是⼀个序列数据,以"Tom cha Jerry" 翻译成中⽂"汤姆追逐杰瑞"为例:
Encoder 的 inputs就是"Tom cha Jerry" 分词后的词向量。可以是任意形式的词向量,如word2vec,GloVe,one-hot编码。假设上图中每⼀个词向量都是⼀个512维的词向量。
Postions Encoding(PE)
transformer模型的attention机制并没有包含位置信息,即⼀句话中词语在不同的位置时在transformer中是没有区别的,就算打乱⼀句话中词语的位置,每个词还是能与其他词之间计算attention值,就相当于是⼀个功能强⼤的词袋模型,对结果没有任何影响。I like this movie becau it doesn't have an overhead history. Positive
I don't like this movie becau it has an overhead history. Negative.
可以看出,don’t这个单词位置的不同,对整体句⼦的情感判别是完全相反的。
为了使模型能够利⽤序列的顺序,作者在transformer中引⼊了位置编码。在实现⽅式上,分为Facebook版本(《》)和Google版本。作者形容前者为“learned and fixed”,即“Postional Embedding”,它只能表征有限长度内的位置,⽆法对任意位置进⾏建模。后者直接上了公式,改“Embedding”为“Encode”,想要多长就有多长。实验结果表明,两种形式的模型没有效果差别,但毕竟通过公式来计算更简单、参数量也更⼩:
论⽂中给出的Postions Encoding公式如下:
其中, 是输⼊向量的维度; 即 position,意为 token 在句中的位置,设句⼦长度为 ,则; 为向量的某⼀维度,例如 = 512时,。
每个坐标位置的三⾓函数波长是不同的,论⽂中的范围从 。
这⾥**为什么⽤三⾓函数来表征编码位置?**我的理解是
传统的⽅法使⽤单调函数,使得任意后续的字符的位置编码都⼤于前⾯的字,来体现某个字在句⼦中
的绝对位置,在本⽂中,放弃对绝对位置的追求,转⽽要求位置编码仅仅关注⼀定范围内的相对次序关系,那么使⽤⼀个sin/cos函数就是很好的选择,因为sin/cos函数的周期变化规律⾮常稳定,是有界的周期性函数,所以编码具有⼀定的不变性。⾄于为什么要使⽤10000呢,这个就类似于⽞学了,原论⽂中完全没有提。⾄于 的交替使⽤只是为了使编码更「丰富」,在哪些维度上使⽤ ,哪些使⽤ ,不是很重要,都是模型可以调整适应的。
根据三⾓函数:
{PE (pos ,2i )=sin (pos /10000)
2i /d model PE (pos ,2i +1)=cos (pos /10000
)2i /d model d model pos L pos =0,1,...,L −1i d model i =0,1,2,...,2552π−>10000∗2πsinx /cosx sin cos {sin (α+β)=sinαcosβ+cosαsinβcos (α+β)=cosαcosβ−sinαsinβ
可得:万里可横行
平板电脑刷机
当求解的向量时,可表⽰为对上的线性表⽰,因为当每次k=1时就是⼀个固定的值,这样逐步向后推。
[外链图⽚转存失败,源站可能有防盗链机制,建议将图⽚保存下来直接上传(img-KYvNO7i2-1594572521167)
(/Urs/Arithmetic/Library/Application Support/typora-ur-images/image-20200712204515106.png)]
为什么是将positional encoding与词向量相加,⽽不是拼接呢?
拼接相加都可以,只是本⾝词向量的维度512维就已经蛮⼤了,再拼接⼀个512维的位置向量,变成1024维,这样训练起来会相对慢⼀些,影响效率。两者的效果是差不多地,既然效果差不多当然是选择学习习难度较⼩的相加了。
为什么是这个公式?
油皮的做法大全很有可能是作者根据经验⾃⼰造的,⽽且公式也不是唯⼀地,后续Google在bert中的positional encoding也没有再使⽤这种⽅法⽽是通过训练PE。
为什么要⽤10000这个数?
我的理解是取⼀个较⼤的数,⽂本长度超过就会进⼊第⼆个相同的周期,这个编码就会和第⼀个周期的编码有⼀点差异,但不会太⼤,如果让这个周期太⼤的话,也不⾏,⼤部分的编码都会集中在很⼩的区域⾥,相邻位置编码的差异变⼩。
Transformer Model
{PE (pos +k ,2i )=PE (pos ,2i )×PE (k ,2i +1)+PE (pos ,2i +1)×PE (k ,2i )PE (pos +k ,2i +1)=PE (pos ,2i +1)×PE (k ,2i +1)+PE (pos ,2i )×PE (k ,2i )
PE (pos +k ,2i )PE (pos ,2i )PE (k ,2i +1)10000π
食品化验员
Self-Attention
我的小制作作文[外链图⽚转存失败,源站可能有防盗链机制,建议将图⽚保存下来直接上传(img-vaT2FieO-1594572521170)
追击者豆瓣(/Urs/Arithmetic/Library/Application Support/typora-ur-images/image-20200703175043815.png)]
表⽰输⼊序列集合 {}, 表⽰在以为 ⽬标的计算过程中
的权重
决定于 和 的相关性 Score( , ),由于所有 X 都参与
对应的计算,所以使⽤ softmax 来保证所有权值之和等于 1。
lf-attention的输⼊是序列词向量,此处记为。经过⼀个线性变换得到,经过第⼆个线性变换得到, 经过第三个线性变换得到。也就是:key(K) = linear_k(x)query(Q) = linear_q(x)
value(V) = linear_v(x)
注意:这⾥的linear_k, linear_q, linear_v是相互独⽴、权重是不同的
Scaled Dot-Product Attention (SDPA)
X x ,x ,...x 12n w 2i x 2x i w 2i x i x 2x i x 2x 2x x query (Q )x key (K )x value (V )(W ,W ,W )Q K V Attention (Q ,K ,V )=Softmax ()V
d k QK T
d =k d /h =model 512/8
常⽤的attention主要有“Add-相加”和“Mul-相乘”两种:
矩阵加法的计算更简单,但是外⾯套着 和,相当于⼀个完整的隐层。在整体计算复杂度上两者接近,但考虑到矩阵乘法已经有了⾮常成熟的加速算法,Transformer采⽤了Mul形式。
在模型效果上,对不同Attention-Dimension(
)下的Add和Mul进⾏了对⽐,如下图:
可以看到,在 较⼩的时候,Add和Mul相差不⼤;随着 增⼤,Add明显超越了Mul。Transformer 设置 ,虽然不在表格的范围内,但是可以推测Add仍略优于Mul。作者认为(怀疑), 的增⼤将点积结果推向了softmax函数的梯度平缓区,影响了训练的稳定性。
We suspect that for large values of dk, the dot products grow large in magnitude, pushing the softmax function into regions where it has extremely small gr
adients 缩放因⼦缩放因⼦的作⽤是归⼀化
假设⾥的元素的均值为0,⽅差为1,那么 中元素的均值为0,⽅差为. 当变得很⼤时, 中的元素的⽅差也会变得很⼤,如果中的元素⽅差很⼤,那么 的分布会趋于陡峭(分布的⽅差⼤,分布集中在绝对值⼤的区域)。总结⼀下就是的分布会和d有关。因此中每⼀个元素乘上
后,⽅差⼜变为1。这使得 的分布“陡峭”程度与解
耦,从⽽使得训练过程中梯度值保持稳定。Muti-Head-Attention
Multi-head attention allows the model to jointly attend to information from different reprentation subspaces at different positions. With a single attention h ead, averaging inhibits this.
Multi-head Attention的本质是,在参数总量保持不变的情况下,将同样的query, key, value映射到原来的⾼维空间的不同⼦空间中进⾏attention的计算,在最后⼀步再合并不同⼦空间中的attention信息。这样降低了计算每个head的attention时每个向量的维度,在某种意义上防⽌了过拟合;由于Attention在不同⼦空间中有不同的分布,Multi-head Attention实际上是寻找了序列之间不同⾓度的关联关系,并在最后concat这⼀步骤中,将不同⼦空间中捕获到的关联关系再综合起来。
Add & Norm
Add
Add,就是在Z的基础上加了⼀个残差块X,加⼊残差块X的⽬的是为了防⽌在深度神经⽹络训练中发⽣退化问题,退化的意思就是深度神经⽹络通过增加⽹络的层数,Loss逐渐减⼩,然后趋于稳定达到饱和,然后再继续增加⽹络层数,Loss反⽽增⼤。
score (h ,s )=j i <v ,tanh (W h +1j W s )>2i [Add ]
score (h ,s )=j i <W h +1j W s )>2i [Mul ]
tanh v d k d k d k d =k 64d k d k
1
Q ,K A T d d A A softmax (A )softmax (A )A d k 1softmax (A )d
ResNet 残差神经⽹络
X是这⼀层残差块的输⼊,也称作为残差,为输⼊值,是经过第⼀层线性变化并激活后的输出,该图表⽰在残差⽹络中,第⼆层进⾏线性变化之后激活之前,加⼊了这⼀层输⼊值,然后再进⾏激活后输出。在第⼆层输出值激活前加⼊,这条路径称作shortcut连接。
这个时候输出假设为,我们要让,只需要让即可。神经⽹络通过训练变成0是⽐变成容易很多的。并且ReLU能够将负数激活为0,过滤了负数的线性变化,也能够更快的使得F(x)=0。使⽤ResNet的⽹络很⼤程度上解决了学习恒等映射的问题,⽤学习残差F(x)=0更新该冗余层的参数来代替学习更新冗余层的参数。这样当⽹络⾃⾏决定了哪些层为冗余层后,通过学习残差来让该层⽹络恒等映射上⼀层的输⼊,使得有了这些冗余层的⽹络效果与没有这些冗余层的⽹络效果相同,这样很⼤程度上解决了⽹络的退化问题。
Normalize
惧怕的近义词
对数据的归⼀化能够加快训练速度并且提⾼训练的稳定性
*Layer Normalization(LN)是在同⼀个样本中不同神经元之间进⾏归⼀化,⽽Batch Normalization(BN)*是在同⼀个batch中不同样本之
间的同⼀位置的神经元之间进⾏归⼀化
工作简历模板Feed Forward Network
每⼀层经过attention之后,还会有⼀个FFN,这个FFN的作⽤就是空间变换。FFN包含了2层linear transformation层,中间的激活函数是ReLu。
F (X )X F (X )F (X )X X H (X )=F (X )+X H (X )=X F (X )=0X h (x )=x F (x )=0FFN =max (0,xW +1b )W +12b 2