赞
踩
前些时间DDL很多,一鸽就是七个月,目前transformer在计算机视觉中非常火热,在面试过程中,也被面试官询问过相应内容,在此做一个简单的总结
Transformer中的self attention和CV中的attention机制非常近似,都是通过建立一组输入数据之间的联系,来决定哪部分数据更为重要。本节将介绍self attention的具体流程
首先,self attention中存在三个非常重要的vector,分别是key vector、query vector、value vector。针对每个词向量,存在三个矩阵
W
K
、
W
Q
、
W
V
W^K、W^Q、W^V
WK、WQ、WV,将输入数据转换为对应的key vector、query vector、value vector,所有的词向量共用一组矩阵
W
K
、
W
Q
、
W
V
W^K、W^Q、W^V
WK、WQ、WV,流程如下图所示:
上图中,X的每一行表示一个词向量,Q、K、V每一行表示对应的key vector、query vector、value vector。
接着,计算self attention map,具体计算公式为
A
=
s
o
f
t
m
a
x
(
Q
K
T
d
k
)
A=softmax(\frac{QK^T}{\sqrt{d_k}})
A=softmax(dk
QKT)
即每个query vector都与所有的key vector做点乘,印象中点乘前所有的query vector、key vector都需要做L2归一化,此时点乘结果等价于余弦相似度,越趋近于1,相似度越高,
d
k
\sqrt{d_k}
dk
为缩放因子,以此防止进行softmax计算时数值太大,需注意缩放因子不会导致数值之间的相对大小发生改变。接着在行方向做一个softmax计算,即矩阵的每一行的和均为1。
在矩阵A中,第
i
i
i行表示第
i
i
i个词向量的self attention map,数值
a
i
j
a_{ij}
aij表示第
i
i
i个词向量对应的query vector与第
j
j
j个词向量对应的key vector之间的相似度,越接近于1,相似度越大。这里有一个问题,余项相似度已经可以度量第
i
i
i个query vector与第
j
j
j个key vector之间的相似度了,为什么还要在进行softmax计算?softmax并不会改变数值之间的相对大小,这么做可能是引入归一化,从而加速训练拟合速度.
最后,将词向量的self attention map与所有词向量的value vector加权(包括自己)求和,对于词向量A而言,这个步骤相当于依据其他词向量,更好理解词向量A的含义,比如小明喜欢乒乓球,上述步骤可以让模型综合“小明”、“乒乓球”这两个词来更好理解“喜欢”这个词的含义,计算公式如下
s
o
f
t
m
a
x
(
Q
K
T
d
k
)
V
softmax(\frac{QK^T}{\sqrt{d_k}})V
softmax(dk
QKT)V
上述过程为矩阵运算,可能较难理解,我们把它拆解为单个词向量,具体流程如下:
上述流程为
Mutil-Head Attention即针对同一组输入,平行进行多次self attention操作,接着将结果进行concat,乘以一个矩阵
W
O
W^O
WO,如下图所示
transformer由Encoder和Decoder组成,Encoder结构如下
Encoder由N个Encoder Cell堆叠而成,Encoder Cell采用残差结构,上图已经画的很清楚了,在此不做介绍,多个Encoder Cell堆叠可以提高模型的容量,从而构建更复杂的函数映射,这在深度学习中是常见的思路,Encoder的输出会通过两个线性映射,变为K、V两个矩阵,用于decoder解码使用。
Decoder由N个Decoder Cell堆叠组成,结构如下
Decoder由N个Decoder Cell组成,Decoder Cell的结构如上,具体处理步骤为
Decoder的输入为已经翻译的词向量,但是在初始状态,Decoder不存在已经翻译的词向量,此时的输入为一个训练时学习到的词向量
为什么要施加两个Multi-Head Attention?第一个Mutil-Head Attention的K、V矩阵不来源于Encoder,个人认为这是让模型理解已经翻译的词语的含义是什么,第二个Mutil-Head Attention的K、V矩阵来源于Eecoder,个人认为这是让模型理解已经翻译的词语与原文的对应关系是什么,结合目前已翻译词语的含义以及已翻译词语与原文的对应关系来决定下一个应该翻译的内容
Transformer的总体结构如下
翻译的本质就是一个分类任务,即从翻译词字典中选出一个词,所以Decoder的输出经过一个Linear层后,通过softmax输出
由于文本是序列数据,而Transformer不像RNN、LSTM等序列模型,天生具备序列能力(数据的输入是按顺序的),所以Transformer引入了Positional Encoding,Positional Encoding即对每个词向量都给一个位置编码,位置编码为一个vector,其数值特点为:
其中pos表示词语在句子中的位置,
d
m
o
d
e
l
d_{model}
dmodel为Encoder输出的vector的维度,i为位数,比如512维的vector,i=2表示512维vector的第二位的数值。
为什么如此设计Positional Encoding?作者假设这么设计,可以让模型学会词语之间的相对位置,因为
c
o
s
(
(
p
o
s
+
k
)
/
1000
0
2
i
/
d
m
o
d
e
l
)
=
c
o
s
(
p
o
s
/
1000
0
2
i
/
d
m
o
d
e
l
)
c
o
s
(
k
/
1000
0
2
i
/
d
m
o
d
e
l
)
−
s
i
n
(
p
o
s
/
1000
0
2
i
/
d
m
o
d
e
l
)
s
i
n
(
k
/
1000
0
2
i
/
d
m
o
d
e
l
)
s
i
n
(
(
p
o
s
+
k
)
/
1000
0
2
i
/
d
m
o
d
e
l
)
=
s
i
n
(
p
o
s
/
1000
0
2
i
/
d
m
o
d
e
l
)
c
o
s
(
k
/
1000
0
2
i
/
d
m
o
d
e
l
)
+
c
o
s
(
p
o
s
/
1000
0
2
i
/
d
m
o
d
e
l
)
s
i
n
(
k
/
1000
0
2
i
/
d
m
o
d
e
l
)
其中k即为词语之间的相对位置,可能隐藏在Q、K、V矩阵中,这仅仅是一个假设,此外,该位置编码也满足一个特点,即可以体现词语的先后顺序,该位置编码的可视化结果如下:
上图中,横轴表示vector的维度,纵轴表示词向量的位置,上图和二进制编码非常像,而二进制编码也可以用于表示词语的先后顺序,如下所示
从式子的物理含义来解释,Q表示query、K表示key、V表示value,query相当于我们往词库搜索引擎中输入关键字,词库搜索引擎的所有词语都编码成了key-value对,key表示用于检索的关键字,value表示词语的含义,将query与key作比较(做余弦相似度),相似度高,我们就认为query与key对应的词语语义相近或相关(即value近似),self attention最后将self attention map与value做加权求和,其实就是判断当前词向量与其他词向量的相关度或语义近似度是多少
[1] The Illustrated Transformer
[2] transfomer里面self-attention的Q, K, V的含义
[3] Attention Is All You Need
[4] Transformer中的Positional Encoding
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。