Reading

Attention


Fanyi Pu

参考了 (Purshow, 2026; Weng, 2023; 苏剑林, 2024)。

Multi-Head Attention

Multi-Head Attention (MHA) (Vaswani et al., 2023) 大概就是把 QKV 分成多组:

O=[O1⋯Oh]WoOt=Attention(XqWq(t),XkWk(t),XvWv(t))

为了压缩 KV cache,Multi-Query Attention (MQA) (Shazeer, 2019) 让 K 和 V 合并成一个 head。但是这样可能导致压缩过猛,所以 Grouped-Query Attention (GQA) (Ainslie et al., 2023) 将 head 分成 g 组,每组 share 同一个 Wk 和 Wv。

相同的 8 个 Query heads自回归推理时缓存的 K/V
MHAMulti-Head Attention
Multi-Head Attention 的 Query 与 Key/Value heads8 个 Query heads,8 个 Key heads 和 8 个 Value heads。每个 Query head 独享一组 K/V。斜线填充的 K/V 在自回归推理时缓存;连线表示各 Query head 使用哪组 K/V。ValuesKeysQueries12345678
每个 Query head 独享一组 K/V
8 组 K/V100%
GQAGrouped-Query Attention
Grouped-Query Attention 的 Query 与 Key/Value heads8 个 Query heads,2 个 Key heads 和 2 个 Value heads。每 4 个 Query heads 共享一组 K/V。斜线填充的 K/V 在自回归推理时缓存;连线表示各 Query head 使用哪组 K/V。ValuesKeysQueries12345678
每 4 个 Query heads 共享一组 K/V
2 组 K/V25%
MQAMulti-Query Attention
Multi-Query Attention 的 Query 与 Key/Value heads8 个 Query heads,1 个 Key heads 和 1 个 Value heads。每 8 个 Query heads 共享一组 K/V。斜线填充的 K/V 在自回归推理时缓存;连线表示各 Query head 使用哪组 K/V。ValuesKeysQueries12345678
每 8 个 Query heads 共享一组 K/V
1 组 K/V12.5%
连线表示各 Query head 使用哪组 K/V;GQA 以 8 个 Query heads 分成 2 组为例。下方比例为相对 MHA 的 KV cache 大小,假设序列长度、每个 head 的维度、层数、batch size 和缓存精度相同。

Multi-Head Latent Attention

Multi-Head Latent Attention (MLA) (DeepSeek-AI et al., 2024) 尝试将 QKV 低秩压缩。

首先将 X 压缩成 Cq∈Rsq×dc(q) 和 Ckv∈Rskv×dc(kv) 两个低秩矩阵。这样子的话

Wq∈Rdc(q)×dqk,Wk∈Rdc(kv)×dqk,Wv∈Rdc(kv)×dv

然后考虑

QK⊤=CqWq(CkvWk)⊤=CqWqWk⊤Ckv⊤

因为 CqWqWk⊤ 计算比较简单,我们把这部分合并,cache Ckv 即可。

但问题是,我们之前因为需要得到 K=CkvWk 然后 apply RoPE (Su et al., 2023),现在 CqWqWk⊤ 合并了,无法在中间插入 rope。解决方案是给 Q 和 K 单独加一个 RoPE 分支:Q 的 RoPE 分支从 Cq 投影得到,K 的 RoPE 分支直接从 X 投影得到,并在所有 heads 间共享一个 K。

下面沿用上文的矩阵记号展开 MLA 的结构:

Query 分支K/V 内容分支RoPE 分支推理时缓存
从下往上读 · 横向滑动查看完整结构 →
MLA:共享压缩 K/V 与独立 RoPE 分支从下往上读。沿用文章的矩阵记号,输入 X 分别压缩成 C_q 和共享的 C_kv。 内容分支为 Q = C_q W_q、K = C_kv W_k、V = C_kv W_v。C_q 还生成各 head 的 RoPE Query Q_R;另一条独立分支从 X 直接投影并应用 RoPE,得到所有 heads 共享的 RoPE Key K_R。Q 与 Q_R、K 与 K_R 分别沿特征维度拼接,与 V 一起完成多头 attention,拼接各 head 并乘 W_o 得到 O。斜线仅标在 C_kv 和 K_R 上: 每层的 KV cache 保存这两项随历史 token 累积的行。输入序列
X
Query latent
Cq
CACHE共享 KV latent
Ckv
内容 Query · 各 head
Q
RoPE Query · 各 head
QR
CACHE共享 RoPE Key
KR
内容 Key · 各 head
K
Value · 各 head
V
Query · 拼接内容与位置
[QQR]
Key · 拼接内容与位置
[KKR]
Multi-Head Attention输出
O
降维投影降维投影展开投影 + RoPE投影 + RoPE展开 K / V
每层的 KV cacheCkv 和 KR
从下往上读,沿用上文的矩阵记号:内容分支为 Q=CqWq、K=CkvWk、V=CkvWv。下标 R 表示额外的 RoPE 分支,其中 KR 在所有 heads 间共享;方括号表示沿特征维度拼接。图中展开 K/V 是为了展示结构;推理时可将Wk 吸收到 Query 侧,将 Wv 吸收到输出投影 Wo 中, 无需缓存展开后的多头 K/V。

References

Ainslie, J., Lee-Thorp, J., de Jong, M., Zemlyanskiy, Y., Lebrón, F., & Sanghai, S. (2023). GQA: Training Generalized Multi-Query Transformer Models from Multi-Head Checkpoints. arxiv.org
DeepSeek-AI, Liu, A., Feng, B., Wang, B., Wang, B., Liu, B., Zhao, C., Dengr, C., Ruan, C., Dai, D., Guo, D., Yang, D., Chen, D., Ji, D., Li, E., Lin, F., Luo, F., Hao, G., Chen, G., … Xie, Z. (2024). DeepSeek-V2: A Strong, Economical, and Efficient Mixture-of-Experts Language Model. arxiv.org
Purshow. (2026). Attention Architecture Notes. github.com
Shazeer, N. (2019). Fast Transformer Decoding: One Write-Head is All You Need. arxiv.org
Su, J., Lu, Y., Pan, S., Murtadha, A., Wen, B., & Liu, Y. (2023). RoFormer: Enhanced Transformer with Rotary Position Embedding. arxiv.org
Vaswani, A., Shazeer, N., Parmar, N., Uszkoreit, J., Jones, L., Gomez, A. N., Kaiser, L., & Polosukhin, I. (2023). Attention Is All You Need. arxiv.org
Weng, L. (2023). The Transformer Family Version 2.0. Lilianweng.Github.Io. lilianweng.github.io
苏剑林. (2024, May). 缓存与效果的极限拉扯:从MHA、MQA、GQA到MLA. spaces.ac.cn

Cite this post

@misc{pu2026mlmlrevisitattention,
  author = {Pu, Fanyi},
  title  = {Attention},
  year   = {2026},
  month  = {9},
  url    = {https://pufanyi.com/blog/ml/ml-revisit/attention}
}