本文为学习笔记,若有相关交流或者需要补充的评论区欢迎
attention在深度学习之中最初是作为模型中的一个组件 用于提升模型精度,其原理是为了通过一定的计算方式获取信息中强化关注的特征。
attention相关的基础介绍可以参考其他博客中的内容:
一文看懂 Attention
一文读懂Transformer和Attention
本文主要介绍在近几年attention相关的衍生
MHA( Multi-Head Attention)
MQA(Multi-Query Attention)
GQA(Group-Query Attention)
MHA(Multi-Head Attention)
通俗易懂的说就是多个self-attention进行拼接,详细表达如下:
Q
i
=
Q
W
i
Q
,
K
i
=
K
W
i
K
,
V
i
=
V
W
i
V
i
=
1
,
2...8
h
e
a
d
i
=
A
t
t
e
n
t
i
o
n
(
Q
i
,
K
i
,
V
i
)
M
u
l
t
i
H
e
a
d
=
C
o
n
c
a
t
(
h
e
a
d
1
,
h
e
a
d
2
.
.
.
.
h
e
a
d
8
)
\begin{gather} Q_i=QW^Q_i,K_i=KW^K_i,V_i=VW^V_i i=1,2...8\\ head_i = Attention(Q_i,K_i,V_i)\\ MultiHead = Concat(head_1,head_2....head_8) \end{gather}
Qi=QWiQ,Ki=KWiK,Vi=VWiVi=1,2...8headi=Attention(Qi,Ki,Vi)MultiHead=Concat(head1,head2....head8)
MHA是这段时间比较主流的一种attention方法,其优点在于通过使用多head的可以对信息中不同层级的关联性进行提取。有点类似于在中文翻译成英文和中文翻译成法文时需要关注的语法特征会存在差异,但是内容是一致的。
MQA(Multi-Query Attention)
MQA相比较与MHA只对Query进行多head的分层,对于K,与V保留于self-attention一样的性质。采用MQA主要是为了节省缓存的占用消耗。
对于decode的模型来说,没一次的输出都需要把前N次的内容进行重新计算,所以可以采用缓存把前N的结果进行存储,在计算第N+1的时候只需要把之前的计算结果在取出来,重新计算第N+1的k和v
,但是这样会带来内存空间的溢出,为了解决前面step的k和v的存储,采用共享参数的方式,只对query采用head的形式。
GQA((Group-Query Attention)
GQA是MQA和MHA的中间状态,在MQA中,每一层的k和v是共享的,在MHA中每一个head有一个单独的K和V,在GQA中把几个query当成一个group,每个group共享一个k和v。可以保留一定的性能切降低空间消耗,三者对比大致如下
参考文献
详解Transformer中Self-Attention以及Multi-Head Attention
理解Attention:从起源到MHA,MQA和GQA