19. 什么是 KV 共享和 Cross-Attention?在哪些架构中会用到?

整理 KV 共享与 Cross-Attention 的概念、用途与典型架构。

简单回答

KV 共享指的是多个 attention head 共用同一套 K 和 V,典型代表是 MQA 和 GQA,目的是减少 KV Cache 大小、降低推理显存和带宽开销。Cross-Attention 是 Q 来自一个序列、K 和 V 来自另一个序列的注意力机制,主要用在 Encoder-Decoder 架构(如翻译、语音)和多模态模型(视觉 token 作为 KV,文本 token 作为 Q)中。

详细解释

KV 共享:从 MHA 到 MQA 到 GQA

标准 MHA(Multi-Head Attention)中,每个 head 有独立的 Q、K、V 投影。如果有 32 个 head,KV Cache 就要存 32 份 K 和 32 份 V。

MQA(Multi-Query Attention)是极端的共享:所有 head 共用一套 K 和一套 V,只有 Q 是每个 head 独立的。这把 KV Cache 压缩到了 1/32,推理效率大幅提升,但因为所有 head 看到的 K、V 一样,表达能力有损失。

GQA(Grouped Query Attention)是折中方案:把 32 个 head 分成若干组(比如 8 组),每组共用一套 K、V。KV Cache 压缩到了 1/4(8/32),表达能力比 MQA 好,效率比 MHA 高。LLaMA 2/3、Mistral 等模型都用 GQA。

DeepSeek 的 MLA(Multi-head Latent Attention)是另一种思路:不是让多个 head 共用 K、V,而是把 K、V 联合压缩到一个低维 latent 向量,从这个 latent 向量解压还原出各 head 的 KV。缓存的是 latent 向量而不是完整 KV,压缩比更高。

Cross-Attention

标准 Self-Attention 中 Q、K、V 来自同一个序列。Cross-Attention 中 Q 来自一个序列,K 和 V 来自另一个序列。

用在哪里?第一,Encoder-Decoder 架构中,Decoder 的 Cross-Attention 层用 Decoder 的 hidden state 做 Q,用 Encoder 的输出做 K、V,这让 Decoder 可以"看到"输入序列的信息。T5、BART、Whisper 都有这个结构。

第二,多模态模型中,常见的做法是用文本 token 做 Q,用视觉 token 做 K、V,通过 Cross-Attention 让语言模型"看到"图像信息。Flamingo 就是用 gated cross-attention 来融合视觉和语言。

第三,还有一些架构在 Decoder-Only 模型中也用 Cross-Attention,比如一些 RAG 系统中让模型 attend 到检索到的文档。

两者的联系

KV 共享和 Cross-Attention 本质上都涉及"K 和 V 从哪来、有几套"这个问题。KV 共享是在同一个 Self-Attention 里多个 head 共享 KV,Cross-Attention 是 KV 来自完全不同的序列。

面试时可以这样答

KV 共享和 Cross-Attention 是两个不同层面的概念。

KV 共享是指在 Self-Attention 中,多个 head 共用同一套 K 和 V。核心动机是减少 KV Cache。标准 MHA 每个 head 都有独立的 KV,MQA 走极端让所有 head 共用一套 KV,压缩到 1/n,但表达能力有损。GQA 做了折中,分组共享,是目前主流选择。DeepSeek 的 MLA 走了另一条路,用低维 latent 向量来联合压缩 KV,压缩比更高但实现更复杂。

Cross-Attention 解决的是不同模态或不同序列之间的信息交互。Q 来自一个序列,KV 来自另一个序列。典型应用是 Encoder-Decoder 架构里 Decoder 对 Encoder 输出的 attend,以及多模态模型中文本 token 对视觉 token 的 attend。

两者本质上都涉及"KV 从哪来"的问题,但一个是同源共享(优化效率),一个是异源引入(融合信息)。

常见追问

  1. MLA 和 GQA 相比,在工程实现上有哪些额外的复杂度?
  2. 为什么 Decoder-Only 模型不需要 Cross-Attention 也能处理好各种任务?
  3. 多模态模型中,Cross-Attention 方案和直接把视觉 token 拼接到输入序列中相比,各有什么优劣?