大模型 · 注意力机制

从 MHA 到 CSA:大模型注意力的十年压缩战

每一次注意力换代,都在回答同一个问题:能不能在不把模型变笨的前提下,少存一点 KV、少算一点注意力。

2026-10-04技术解读 · 十年路线约 16 分钟

引言:从一组数字说起

DeepSeek-V4 发布时,有一组数字被反复引用:1M 上下文下,单 token 推理的 FLOPs 只有 V3.2 的 27%,KV 缓存只有 10%。

翻译一下就是:相同的上下文长度,用不到三分之一的算力和十分之一的显存,把 token 一个个吐出来。

这不是某一个算子优化的功劳。也不是某一种"新注意力"的功劳。它是一连串被显存和带宽账单逼出来的压缩——从 2017 年 MHA 诞生起,每一代注意力机制都在同一个问题上挤水分:

能不能在不把模型变笨的前提下,少存一点 KV、少算一点注意力。

这是一场持续了快十年的压缩战。路线不止一条,解法也不止一种,但代价一直都在。

这篇文章用六个问题把路线拆开:为什么 MHA 撑不住长上下文、少存几组 KV 行不行、换个存法行不行、不压缓存改算哪些行不行、干脆不存 KV 行不行,以及三条路都走通之后,最终该怎么选。

01MHA 明明好用,为什么撑不住长上下文?

先算一笔账:一个 7B 模型在 128k 上下文下,KV 缓存要占多少显存?

MHA,Multi-Head Attention,2017 年随 Transformer 一起登场。每个 Query 头都有自己的 K 投影和 V 投影,注意力分数各算各的,最后拼起来。结构干净,效果也好。

问题出在长度。

注意力矩阵是 N × N 的,计算复杂度 O(N²)。N 一上去,预填充阶段的算力直接爆掉。这还只是算的问题。

真正卡住推理的,是 KV 缓存。

解码阶段每生成一个 token,要把这个 token 的 K 和 V 存下来,下一轮所有 Query 都要和所有历史 K 算一遍。对于一个有 h 个头、每个头维度 d_h、共 L 层的模型,每存一个 token,就要存 2 · L · h · d_h 个元素。

拿 Llama 2 7B 算一下:32 层、32 个头、头维 128。每 token 每层 8192 个元素,乘上 32 层,一个 token 要存 262,144 个数。用 BF16 就是 512KB。

上下文拉到 128k 呢?

64 GB。单卡 H100 才 80GB,装完缓存就没剩多少给权重了。

这还不是最坏的消息。最坏的消息是——显存不够可以分片,但解码时每一步都要把整段 KV 从显存读进计算单元,带宽才是真正的瓶颈。上下文越长,每个 token 生成时要搬运的数据量越大,吞吐掉得越厉害。

一个朴素但准确的判断:长上下文的核心矛盾从来不是"放不下",而是"搬不动"。显存可以堆,带宽很难提。

所以压缩战的第一枪,就打在 KV 缓存上。

02能不能少存几组 KV?

MQA 把 32 组 KV 压成 1 组。GQA 分成 G 组。中间差了一个"质量会不会崩"的问题。

第一个思路很直接:Query 头很多,但 KV 头不一定需要那么多。能不能让几个 Query 头共享一组 KV?

MQA(Multi-Query Attention)走了极端。所有 Query 头共用一套 K、V 投影,KV 缓存直接降到原来的 1/h。32 个头就省 32 倍,128 个头就省 128 倍。

省是真省。掉也是真掉。

PaLM 团队当年把 MQA 加进去的时候,观察很明确:MQA 续训不足的情况下,质量会明显下降。所以才有了后面的折中方案。

GQA(Grouped-Query Attention),Google 在 2023 年正式提出。把 h 个 Query 头分成 G 组,每组内共享一套 KV。GQA-1 就是 MQA,GQA-h 就是 MHA。中间可以自由调。

Query 头到缓存 KV 的映射关系

MHA 8 组 KV GQA 2 组 KV MQA 1 组 KV MLA 1 个隐向量

MHA 是一对一,GQA 是多对一(按组),MQA 是全部对一,MLA 则不是"共享 KV 头"而是"存一个低秩隐向量再还原"。后两者在图上看形状接近,数学上完全不同。

GQA 能成为行业默认,不只是因为中间值好调。还有一个工程上的关键原因:它能从现成的 MHA 检查点低成本转换过去。

做法是把同一组内的 K、V 投影权重做均值池化,拼成 G 组的权重,然后再用少量数据续训一下。Google 论文里的结论很干脆:GQA 在转换后即使不续训,质量也接近 MHA;MQA 不续训就会崩。

这是 GQA 真正的护城河。它不只是"比 MQA 质量好",而是"转换成本极低"——你不用从头训一个模型,把已有检查点改一改、续训几天就能用。

所以 Llama 2 70B、Llama 3、Mistral 7B,这些主流开源模型清一色用 GQA。不是因为它最先进,而是因为它最省事。

03缓存数量降不动了,能不能换个存法?

MQA 的缓存已经最小了,但质量也最差。有没有办法用比 MQA 略大一点的缓存,换回比 MHA 还高的质量?

GQA 把 KV 头的数量从 h 降到 G。但每一组 KV 本身的维度没变,还是 d_h。再往下压,就得换思路。

MLA(Multi-Head Latent Attention),DeepSeek-V2 在 2024 年提出。思路是:KV 头之间本来就有大量冗余,为什么不把它们联合压成一个低秩隐向量,推理时再按头还原回来?

具体做法分两步。

第一步是 低秩联合压缩。隐状态 h_t 通过一个下行投影 W_DKV 压成 512 维的隐向量 c_t^KV,这就是真正被缓存的东西。注意力计算时,再用两个上行投影 W_UK 和 W_UV 把它还原成各头的 K 和 V。

第二步是 解耦 RoPE。位置编码是和每个头的相对位置绑定的,没法折叠进低秩投影里。所以单独拎出一个 64 维的 RoPE 键 k_t^R,所有头共享,最后拼回 K 上。

账是这样算的。DeepSeek-V2 是 128 个 Query 头、头维 128:

方案每 token 每层缓存相对 MHA质量
MHA32,768 元素100%基准
GQA(8 组)2,048 元素6.3%接近 MHA
MLA576 元素(512 + 64)1.8%超过 MHA
MQA256 元素0.8%下降

MQA 的缓存比 MLA 还小一半多,但质量会掉。MLA 真正厉害的是——缓存不到 MHA 的 2%,质量反而超过 MHA。

DeepSeek-V2 论文里给的数字是:KV 缓存比 DeepSeek 67B 降低 93.3%。这个数字后来被反复引用,但有一个前提经常被忽略——它是和 67B 的 MHA 比,不是和同尺寸的 GQA 比。即便如此,这个降幅依然惊人。

MLA 不是在"共享 KV 头"这条线上继续抠。它直接换了存法——不再存 K 和 V,存的是 K 和 V 的"压缩原材料"。 —— DeepSeek-V2 论文里把它叫"low-rank joint compression of keys and values"

但 MLA 有它的边界。它省的是 KV 缓存,不是计算量。注意力矩阵该算多少还是多少,预填充阶段的 O(N²) 并没有被绕过去。

所以到了 V3 和 V4,DeepSeek 在 MLA 之上又叠了另一层压缩:稀疏。

04不压缓存本身,改"算哪些"行不行?

一个 Query 真的需要看所有历史 token 吗?只看最重要的那几千个,质量会不会掉?

KV 缓存的问题解决了,接下来是算力的问题。

注意力是 O(N²) 的。N 从 4k 拉到 128k,计算量翻了 1024 倍。缓存再省,也算不过来。

稀疏注意力的思路是:不把注意力矩阵填满,只算最重要的那些格子。

这不是一个新想法。从 Longformer 的滑动窗口 + 全局 token、BigBird 的三模式,到 Mistral 的滑动窗口注意力,路线一直在演进。但 2025 年之前的稀疏注意力有两个老问题:

2025 年之后的新一波稀疏,基本都在解决这两个问题。

SWA:最简单的稀疏

滑动窗口注意力(Sliding Window Attention),Mistral 7B 用过。每个 token 只看它前面最近的 w 个 token,窗口大小 4096。32 层叠起来,等效感受野大约 131k——靠"每一层窗口错开一点"堆出来的。

最简单,也最规整。因为访问的是连续内存,GPU 跑得很舒服。

但它有一个天然缺陷:远距离信息传不过来。文档开头的关键句,在几千个 token 之后就被窗口丢掉了。

NSA:三分支,原生可训练

NSA(Native Sparse Attention),2025 年提出。把稀疏做成了三个并行的分支:

分支 1滑动窗口最近 w 个 token,保证局部信息不丢
分支 2块级压缩把远距 KV 按块平均,粗粒度看全局
分支 3细粒度选择用可学习的选择器挑出最重要的 token

NSA 的关键不是三分支本身。是两个词:原生可训练和硬件对齐。稀疏模式不是人手写的,是模型自己学出来的;选择器的实现也专门做了硬件友好的设计,不是跑起来比稠密还慢的那种学术 demo。

DSA:两阶段,先索引再计算

DSA(DeepSeek Sparse Attention),V3.2 引入。思路更直接:先拿一个轻量的 lightning indexer 给所有历史 token 打个分,每个 Query 只挑 top-2048 个 token 参与真正的注意力计算。

两阶段。第一阶段用很少的算力做粗筛,第二阶段只对筛出来的 token 做完整注意力。

四种稀疏模式画在注意力矩阵上,形状完全不一样:

四种稀疏模式的注意力形状

全连接 MHA 全量 O(N²) 滑动窗口 SWA 只看最近 w 个 三分支 NSA 压缩+选择+窗口 细粒度 DSA 索引器选 top-k

全连接填满整个三角。滑动窗口是一条斜带。三分支是斜带加几块压缩的远距块。细粒度选择是斜带加散落的精选点——那些点是索引器算出来的,每个 Query 选的都不一样。

稀疏这条路的好处是:它省的是计算量,不是显存。KV 缓存还是要存的,只是不全都参与计算。在 1M 上下文这种规模下,显存和计算都是问题,所以稀疏通常要和 KV 压缩配合着用。

还有一个反直觉的点。不是所有稀疏都一定更快。如果选择器本身开销很大,或者选出来的 token 地址太分散导致内存访问不规则,稀疏版本可能比稠密版本还慢。所以 NSA 和 DSA 之所以能落地,核心不是"想法对",而是工程实现做得足够硬——索引器够轻、选择够规整、硬件够友好。

05那干脆不存 KV 呢?

KV 缓存再怎么压,它的大小还是跟上下文长度成正比。能不能让它变成一个固定大小的状态?

线性注意力走的是这条路。

标准注意力是 softmax 形式的,复杂度 O(N²),必须存下所有 KV。线性注意力把 softmax 替换成一种可以用结合律重排的形式——用一个固定大小的状态 S 来累积历史信息,每来一个新 token 就更新一下这个状态。

状态大小不随上下文变长而膨胀。复杂度接近 O(N)。

这不是新概念。Performer、Random Feature Attention 这些工作很早就提出过。但过去线性注意力有个老问题:质量打不过 softmax 注意力,尤其是在需要精确检索的任务上。

2025 年开始,线性注意力重新热起来,不是因为公式变了,是因为混合架构走通了。

典型做法是:大部分层用线性注意力(省算力、省显存),每隔几层插一层全局 softmax 注意力(保质量、保召回)。线性层负责把大多数日常的 token 消化掉,全局层负责在关键时刻做精确检索。

MiniMax 在 Kimi K3 里用的 KDA(Kimi Decoupled Attention)就是这个路子:线性层和 Gated MLA 全局层按大约 3:1 交替堆叠,约 75% 的层是线性注意力。官方给的数字是 1M 上下文下解码吞吐最高提升 6 倍多。

类似的还有 Lightning Attention、PowerInfer 团队做的线性注意力加速。vLLM 已经把 Qwen3-Next、Nemotron Nano 2、MiniMax-Text-01、Granite 4.0 这类"混合线性+全局注意力"的模型作为一等公民支持。

线性注意力不是银弹。它在生成型任务上表现好,但在 needle-in-a-haystack 这种精确检索任务上,纯线性版本通常打不过 softmax 注意力。这也是为什么所有量产方案都是混合的,而不是纯线性的。

有一次在技术分享会上,一位做推理框架的工程师被问到"线性注意力能不能完全替代 softmax",他想了几秒说:"如果能替代,我们早把所有层都换了。"

答案已经在行动里了。

06三条路都走通了,最后该怎么选?

共享压缩、低秩压缩、稀疏选择、线性化——四条路各有各的代价。1M 上下文的答案,不是选一条,而是混着来。

DeepSeek-V4 的做法可以看作当前阶段的一个缩影:

近处存完整 KV 保证质量,远处压成低维摘要省显存,稀疏索引负责挑出真正重要的远距 token。三层叠在一起。

这就是 2026 年的现状。没有哪一种单一机制能包打天下,主流答案是分层混合。

选型的四把尺子

如果要给自己的场景选一种注意力方案,可以按这四把尺子来量:

尺子一
上下文有多长?
4k 以内用 MHA 最省心。32k 到 128k 是 GQA 的舒适区。到了 512k、1M 这个量级,不上稀疏或者线性层,成本就压不住了。
尺子二
任务是生成型还是检索型?
生成型任务对注意力精度容忍度高,线性层可以多堆一点。检索型任务(needle、RAG、长文档问答)对漏检敏感,要多留全局注意力层。
尺子三
是从头训还是从现成模型改?
改现成的,GQA 转换成本最低——均值池化组内 KV 头再续训就行。MLA 和 DSA 都要改动结构和训练流程,不是 checkpoint surgery 能搞定的。
尺子四
瓶颈在显存还是在算力?
显存紧,优先压 KV(GQA → MLA)。算力紧,优先压计算(稀疏 → 线性)。两者都紧,混合上。

两个容易误判的地方

第一个误判:"越稀疏越快"。错的。稀疏带来的不规则访存可能抵消掉省下的计算量。真正能跑赢稠密的稀疏方案,一定在索引器和内存布局上做了大量工程优化,不是算法论文里那个原型。

第二个误判:"线性注意力能完全替代 softmax"。也错。至少到 2026 年为止,量产方案没有一个是纯线性的。线性层负责省成本,全局层负责兜底质量,谁也替不了谁。

收束:压缩战还没结束,只是换了打法

从 MHA 到 GQA 到 MLA,是一条竖线——在 KV 缓存上往下压。

从 SWA 到 NSA 到 DSA,是另一条竖线——在计算量上往下砍。

线性注意力试图从根本上换掉 KV 缓存这个概念,但还没完全走通,于是先以混合层的形式落地。

到了 2026 年,三条线在 DeepSeek-V4 这样的模型上汇合:近处存完整 KV、远处压成摘要、重要的 token 再单独挑出来算。不是一种注意力,是一整套注意力体系。

所以"注意力机制"这个词,今天再讲的时候,已经不是指某一种算法了。它指的是一整套分层的压缩策略——在质量、显存、算力三角里找一个你能接受的位置。

压缩战还远没结束。只是从"单一代际更替",变成了"体系化混搭"。

后面真正的问题可能不是"哪种注意力最好",而是——当注意力本身变成一个可配置的多层体系,你的模型架构,准备好了吗?

总结

参考资料