要理解Transformer,需要先理解注意力机制,下面大部分内容来自台大教授李宏毅老师讲课资料。
之前使用的MLP,CNN,RNN模型可以解决一些简单序列问题,但当序列长度太长容易失去效果,原因是看了新的忘了旧的,网络很难关注到相距很远的 token 之间的联系,于是注意力机制被引入到深度学习中,并且目前已经一招鲜吃遍天了。
注意力的设计可以有很多方式,如下图的两种设计方式。绿色框表示两个token。
目前大部分采用第一种方式,下面来说说自注意力机制。
设想我们要在一大堆文档里面通过关键词快速搜索到最相关的文档,一个较为合理的做法就是首先通过词频-逆文档频率或其他方法得到所有文档对应的特征词语,然后使用关键词和每个文档的特征词之间的相似度,这个分数就叫做attention score
,关键词就是q
,特征词就是k
,如果我们最终是要得到一个特征向量,那么就讲attention score和每个文档特征进行加权求和,当然首先需要对attention score 经过一个softmax层进行归一化。那么这里的文档特征就类似于v
。
如下图这是Attention Score
的计算方式
首先将每个token
(
a
1
,
a
2
,
a
3
,
a
4
)
(a^1,a^2,a^3,a^4)
(a1,a2,a3,a4)经过参数矩阵
W
q
W^q
Wq 计算得到
(
q
1
,
q
2
,
q
3
,
q
4
)
(q^1,q^2,q^3,q^4)
(q1,q2,q3,q4)和参数矩阵
W
k
W^k
Wk 计算得到
(
k
1
,
k
2
,
k
3
,
k
4
)
(k^1,k^2,k^3,k^4)
(k1,k2,k3,k4),然后将每个 q 与 k 进行计算得到 attention score 再经过softmax层进行归一化。
得到注意力特征向量
使用归一化的注意力分数乘以v
再加权求和得到
a
1
a^1
a1 对应的全局特征向量
b
1
b^1
b1,后面的计算方式相似,相继得到
b
2
,
b
3
,
b
4
b^2,b^3,b^4
b2,b3,b4等等。
如果用矩阵来表示就是:
K
=
W
K
A
Q
=
W
Q
A
V
=
W
V
A
B
=
V
s
o
f
t
m
a
x
(
K
T
Q
)
K = W^KA\\ Q = W^QA\\ V=W^VA\\ B = V softmax(K^TQ)
K=WKAQ=WQAV=WVAB=Vsoftmax(KTQ)
其特点是可以并行运行、输入输出长度相同。
多头注意力就是每个词获得多个k,q,v对,这样做的主要目的是每个k,q,v对可能代表不同的侧重点,同时扩充网络参数。
Transformer的Encoder
首先将原始token经过多头注意力注意力层得到注意力特征,然后经过残差加和和层正则化,将正则化结果输入到前馈网络里面再进行残差加和和层正则化。
详细结构
Decoder层和Encoder很类似,如果不看交叉注意力的的话。
交叉注意力,用当前的查询向量q去计算对方的注意力分数。