每一次注意力换代,都在回答同一个问题:能不能在不把模型变笨的前提下,少存一点 KV、少算一点注意力。
DeepSeek-V4 发布时,有一组数字被反复引用:1M 上下文下,单 token 推理的 FLOPs 只有 V3.2 的 27%,KV 缓存只有 10%。
翻译一下就是:相同的上下文长度,用不到三分之一的算力和十分之一的显存,把 token 一个个吐出来。
这不是某一个算子优化的功劳。也不是某一种"新注意力"的功劳。它是一连串被显存和带宽账单逼出来的压缩——从 2017 年 MHA 诞生起,每一代注意力机制都在同一个问题上挤水分:
能不能在不把模型变笨的前提下,少存一点 KV、少算一点注意力。
这是一场持续了快十年的压缩战。路线不止一条,解法也不止一种,但代价一直都在。
这篇文章用六个问题把路线拆开:为什么 MHA 撑不住长上下文、少存几组 KV 行不行、换个存法行不行、不压缓存改算哪些行不行、干脆不存 KV 行不行,以及三条路都走通之后,最终该怎么选。
先算一笔账:一个 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 缓存上。
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。中间可以自由调。
MHA 是一对一,GQA 是多对一(按组),MQA 是全部对一,MLA 则不是"共享 KV 头"而是"存一个低秩隐向量再还原"。后两者在图上看形状接近,数学上完全不同。
GQA 能成为行业默认,不只是因为中间值好调。还有一个工程上的关键原因:它能从现成的 MHA 检查点低成本转换过去。
做法是把同一组内的 K、V 投影权重做均值池化,拼成 G 组的权重,然后再用少量数据续训一下。Google 论文里的结论很干脆:GQA 在转换后即使不续训,质量也接近 MHA;MQA 不续训就会崩。
这是 GQA 真正的护城河。它不只是"比 MQA 质量好",而是"转换成本极低"——你不用从头训一个模型,把已有检查点改一改、续训几天就能用。
所以 Llama 2 70B、Llama 3、Mistral 7B,这些主流开源模型清一色用 GQA。不是因为它最先进,而是因为它最省事。
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 | 质量 |
|---|---|---|---|
| MHA | 32,768 元素 | 100% | 基准 |
| GQA(8 组) | 2,048 元素 | 6.3% | 接近 MHA |
| MLA | 576 元素(512 + 64) | 1.8% | 超过 MHA |
| MQA | 256 元素 | 0.8% | 下降 |
MQA 的缓存比 MLA 还小一半多,但质量会掉。MLA 真正厉害的是——缓存不到 MHA 的 2%,质量反而超过 MHA。
DeepSeek-V2 论文里给的数字是:KV 缓存比 DeepSeek 67B 降低 93.3%。这个数字后来被反复引用,但有一个前提经常被忽略——它是和 67B 的 MHA 比,不是和同尺寸的 GQA 比。即便如此,这个降幅依然惊人。
但 MLA 有它的边界。它省的是 KV 缓存,不是计算量。注意力矩阵该算多少还是多少,预填充阶段的 O(N²) 并没有被绕过去。
所以到了 V3 和 V4,DeepSeek 在 MLA 之上又叠了另一层压缩:稀疏。
一个 Query 真的需要看所有历史 token 吗?只看最重要的那几千个,质量会不会掉?
KV 缓存的问题解决了,接下来是算力的问题。
注意力是 O(N²) 的。N 从 4k 拉到 128k,计算量翻了 1024 倍。缓存再省,也算不过来。
稀疏注意力的思路是:不把注意力矩阵填满,只算最重要的那些格子。
这不是一个新想法。从 Longformer 的滑动窗口 + 全局 token、BigBird 的三模式,到 Mistral 的滑动窗口注意力,路线一直在演进。但 2025 年之前的稀疏注意力有两个老问题:
2025 年之后的新一波稀疏,基本都在解决这两个问题。
滑动窗口注意力(Sliding Window Attention),Mistral 7B 用过。每个 token 只看它前面最近的 w 个 token,窗口大小 4096。32 层叠起来,等效感受野大约 131k——靠"每一层窗口错开一点"堆出来的。
最简单,也最规整。因为访问的是连续内存,GPU 跑得很舒服。
但它有一个天然缺陷:远距离信息传不过来。文档开头的关键句,在几千个 token 之后就被窗口丢掉了。
NSA(Native Sparse Attention),2025 年提出。把稀疏做成了三个并行的分支:
NSA 的关键不是三分支本身。是两个词:原生可训练和硬件对齐。稀疏模式不是人手写的,是模型自己学出来的;选择器的实现也专门做了硬件友好的设计,不是跑起来比稠密还慢的那种学术 demo。
DSA(DeepSeek Sparse Attention),V3.2 引入。思路更直接:先拿一个轻量的 lightning indexer 给所有历史 token 打个分,每个 Query 只挑 top-2048 个 token 参与真正的注意力计算。
两阶段。第一阶段用很少的算力做粗筛,第二阶段只对筛出来的 token 做完整注意力。
四种稀疏模式画在注意力矩阵上,形状完全不一样:
全连接填满整个三角。滑动窗口是一条斜带。三分支是斜带加几块压缩的远距块。细粒度选择是斜带加散落的精选点——那些点是索引器算出来的,每个 Query 选的都不一样。
稀疏这条路的好处是:它省的是计算量,不是显存。KV 缓存还是要存的,只是不全都参与计算。在 1M 上下文这种规模下,显存和计算都是问题,所以稀疏通常要和 KV 压缩配合着用。
还有一个反直觉的点。不是所有稀疏都一定更快。如果选择器本身开销很大,或者选出来的 token 地址太分散导致内存访问不规则,稀疏版本可能比稠密版本还慢。所以 NSA 和 DSA 之所以能落地,核心不是"想法对",而是工程实现做得足够硬——索引器够轻、选择够规整、硬件够友好。
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 这类"混合线性+全局注意力"的模型作为一等公民支持。
有一次在技术分享会上,一位做推理框架的工程师被问到"线性注意力能不能完全替代 softmax",他想了几秒说:"如果能替代,我们早把所有层都换了。"
答案已经在行动里了。
共享压缩、低秩压缩、稀疏选择、线性化——四条路各有各的代价。1M 上下文的答案,不是选一条,而是混着来。
DeepSeek-V4 的做法可以看作当前阶段的一个缩影:
近处存完整 KV 保证质量,远处压成低维摘要省显存,稀疏索引负责挑出真正重要的远距 token。三层叠在一起。
这就是 2026 年的现状。没有哪一种单一机制能包打天下,主流答案是分层混合。
如果要给自己的场景选一种注意力方案,可以按这四把尺子来量:
第一个误判:"越稀疏越快"。错的。稀疏带来的不规则访存可能抵消掉省下的计算量。真正能跑赢稠密的稀疏方案,一定在索引器和内存布局上做了大量工程优化,不是算法论文里那个原型。
第二个误判:"线性注意力能完全替代 softmax"。也错。至少到 2026 年为止,量产方案没有一个是纯线性的。线性层负责省成本,全局层负责兜底质量,谁也替不了谁。
从 MHA 到 GQA 到 MLA,是一条竖线——在 KV 缓存上往下压。
从 SWA 到 NSA 到 DSA,是另一条竖线——在计算量上往下砍。
线性注意力试图从根本上换掉 KV 缓存这个概念,但还没完全走通,于是先以混合层的形式落地。
到了 2026 年,三条线在 DeepSeek-V4 这样的模型上汇合:近处存完整 KV、远处压成摘要、重要的 token 再单独挑出来算。不是一种注意力,是一整套注意力体系。
所以"注意力机制"这个词,今天再讲的时候,已经不是指某一种算法了。它指的是一整套分层的压缩策略——在质量、显存、算力三角里找一个你能接受的位置。
压缩战还远没结束。只是从"单一代际更替",变成了"体系化混搭"。
后面真正的问题可能不是"哪种注意力最好",而是——当注意力本身变成一个可配置的多层体系,你的模型架构,准备好了吗?
2·h·d_h 的 KV 缓存,长上下文下显存和带宽双重吃紧。