回顾
自注意力机制
多头自注意力机制
多头自注意力机制可以理解为由多个自注意力模块,也就是自注意力头(head)组成。
每个head都有自己的QKV矩阵来进行自注意力计算。
计算过程
① 得到各个head所需的QKV:
计算过程中会将原本的
q
i
,
k
i
,
v
i
q_i,k_i,v_i
qi,ki,vi分为多份,分配到对应的head中,一般会均分QKV的向量,这样每个head有了所需的QKV数据,以此每个head都可以使用自注意力机制。
下图是有2个head的情况,可以看到将
q
,
k
,
v
q,k,v
q,k,v都均分为了2份,变为
q
i
,
j
,
k
i
,
j
,
v
i
,
j
q_{i,j},k_{i,j},v_{i,j}
qi,j,ki,j,vi,j,其中
i
i
i代表属于哪个
a
a
a,
j
j
j代表属于哪个head。
② 各个head执行自注意力操作:
分配完成后,就可以在每个head中执行自注意力机制,就可以得到各个head中
a
a
a的替代
b
i
,
j
b_{i,j}
bi,j,其中
i
i
i代表属于哪个
a
a
a,
j
j
j代表属于哪个head。
③ 拼接各个head的结果:
然后将来自同一个
a
a
a的
B
=
{
b
i
,
1
,
b
i
,
2
,
.
.
.
,
b
i
,
k
}
B=\{b_{i,1},b_{i,2},...,b_{i,k}\}
B={bi,1,bi,2,...,bi,k}进行拼接(Concat)。
④ 融合结果:
将拼接后的结果进行融合得到
b
1
,
b
2
b1,b2
b1,b2。
其中
W
o
Wo
Wo是可训练的参数,其大小为
d
m
o
d
e
l
∗
d
m
o
d
e
l
d_{model}*d_{model}
dmodel∗dmodel,而
d
m
o
d
e
l
d_{model}
dmodel为
q
,
k
,
v
q,k,v
q,k,v原本的尺寸。这里
d
m
o
d
e
l
d_{model}
dmodel=4
为什么要使用多头
- 增加模型的学习能力和表达力:通过多个注意力头,模型可以学习到更丰富的上下文信息,每个头可能关注输入的不同特征,这些特征综合起来可以更全面地理解和处理输入序列。
- 提高模型性能:实验证明,多头注意力机制相较于单头注意力,往往能带来性能提升。这是因为模型可以通过并行处理和集成多个注意力头的结果,从不同角度捕捉数据的多样性,增强了模型对复杂序列任务的理解和泛化能