回顾
注意力机制
自注意力机制
自注意力机制中同样包含QKV,但它们是同源(Q≈K≈V),也就是来自相同的输入数据X,X可以分为
(
x
1
,
x
2
,
.
.
,
x
n
)
(x_1,x_2,..,x_n)
(x1,x2,..,xn)。
而通过输入嵌入层(input embedding),
(
x
1
,
x
2
,
.
.
,
x
n
)
(x_1,x_2,..,x_n)
(x1,x2,..,xn)变为
(
a
1
,
a
2
,
.
.
,
a
n
)
(a_1,a_2,..,a_n)
(a1,a2,..,an)这些向量,通过X来寻找X中的关键点。
而对于每个
a
i
a_i
ai都会有对应
q
i
,
k
i
,
v
i
q_i,k_i,v_i
qi,ki,vi,Q不再是共用的。
Q
=
{
q
1
,
q
2
,
.
.
.
,
q
n
}
;
K
=
{
k
1
,
k
2
,
.
.
.
,
k
n
}
;
V
=
{
v
1
,
v
2
,
.
.
.
,
v
n
}
Q = \{q_1,q_2,...,q_n\};K = \{k_1,k_2,...,k_n\};V = \{v_1,v_2,...,v_n\}
Q={q1,q2,...,qn};K={k1,k2,...,kn};V={v1,v2,...,vn}
在自注意力机制中,以输入数据X自身中的 x i x_i xi作为查询对象(注意力机制中的Q),自身的其他 x x x作为被查询对象V。也就是自己作为查询与被查询对象。
计算过程
① 计算QKV:
要得到QKV,则需要使用三个参数
W
Q
,
W
K
,
W
V
W_Q,W_K,W_V
WQ,WK,WV,这三个参数都是可训练的,而且所有
a
a
a共享。
公式:
q
i
=
a
i
∗
W
Q
q_i = a_i*W_Q
qi=ai∗WQ
k
i
=
a
i
∗
W
K
k_i = a_i*W_K
ki=ai∗WK
v
i
=
a
i
∗
W
V
v_i = a_i*W_V
vi=ai∗WV
而这个计算过程可以写为矩阵乘法,实现并行计算。
② 计算Q与K相似度(概率):
每个
q
i
q_i
qi都有一次作为查询对象,所有的
k
k
k计算与其的相似度(与它相同的概率)。
计算相似度的方法与注意力机制是相同,都是q与k进行点乘与scale得到相似度,其中
d
k
d_k
dk为k的尺寸,也就是向量
k
k
k包含多少个数据。
计算过程如图所示,每个
q
i
q_i
qi都计算与所有
k
k
k的相似度。
计算过程也可以表示为矩阵运算
③ 汇总权重,得到包含注意力信息的结果
计算出Q与K的相似度,也就是得到了对于
q
i
q_i
qi,各个
v
i
v_i
vi的权重。
最后将得到的权重
a
^
\widehat{a}
a
与每个
v
i
v_i
vi进行点乘运算再将结果相加,就可以得到包含了对于
q
i
q_i
qil来说哪些重要与不重要的数据
b
i
b_i
bi,然后用
b
i
b_i
bi来代替
a
i
a_i
ai
计算过程也可以转换为矩阵运算
与注意力机制的不同
注意力机制是一个很宽泛(宏大)的一个概念,QKV 相乘就是注意力,但是他没有规定 QKV是怎么来的,他只规定 QKV 怎么做。
Q 可以是任何一个东西,V 也是任何一个东西, K往往是等同于 V 的(同源),K和 V 不同源不相等可不可以。
而自注意力机制,特别狭隘,属于注意力机制的,注意力机制包括自注意力机制的,他不仅规定了 QKV 同源,而且固定了 QKV 的做法,规定了QKV是如何得到的。
总结
自注意力机制是规定了数据自身来作为查询对象与被查询对象。