精心设计的 KV 淘汰打分,居然和瞎蒙一样好?

上周刷到一篇让我愣了一下的论文。KV cache 淘汰这个赛道,这几年卷的全是"怎么给缓存里的每个 token 打一个更准的重要性分数"——累积注意力、最近窗口注意力、冗余惩罚、value 模长、位置统计……一篇比一篇精巧。然后 Salesforce AI Research 和 UIUC 的这篇 Random Attention 站出来说:你们打的这些分,基本没用。保住 prompt,剩下的随机扔,效果和最强 baseline 打平,推理吞吐还快 32-43 个点。

我的第一反应是:这不可能。看完之后我觉得,他们是真的把这件事证出来了,而且证明过程比结论本身更有意思。

核心摘要

推理模型的思维链动辄上万 token,KV cache 随生成长度线性膨胀,显存先扛不住。现有淘汰方法共享同一个范式:给每个缓存 token 算一个"未来重要性"分数,留高分的。这篇论文直接检验了这个范式的前提,发现选择信号本身几乎不贡献任何精度。Random Attention 只做两件事——整个 prompt 永久保留,其余位置在每个注意力头内均匀随机淘汰、一分不算——在 4 个模型、6 个推理任务上与最强基线 TriAttention 打平,主表 60 个对比格子里显著领先 31 个,只输 1 个;vLLM 部署下吞吐高出 32-43%。更值钱的是它的机理解释:prompt 是缓存里唯一脆弱的部分,而推理轨迹靠"文本复述 + 多头冗余"自我保护,随机抽样天然就能留下足够多的副本。这不是一篇"提出了新方法"的论文,是一篇"证伪了一个研究方向的前提"的论文。做推理部署的人值得细读,做 KV 压缩研究的人必须读。

论文信息

  • 标题:Random Attention: Rethinking KV Cache Eviction for Efficient Reasoning
  • 作者:Heng Wang, Jielin Qiu, Wenting Zhao, Cheng Qian, Liangwei Yang, Jiawei Han, Heng Ji, Silvio Savarese, Shelby Heinecke, Huan Wang
  • 机构:Salesforce AI Research、University of Illinois Urbana-Champaign
  • 链接:https://arxiv.org/abs/2609.03430 (2026 年 9 月 3 日提交)
  • 代码:https://github.com/SalesforceAIResearch/Random-Attention

🎯 问题动机:淘汰赛道卷错了方向?

先把场景说清楚。一道 200 token 的数学题,推理模型可能写出超过 1 万 token 的思维链。KV cache 随解码线性增长,显存成为硬约束。解决办法是淘汰(eviction):缓存到达预算后,永久丢弃一部分 KV 对,把显存钉死在预算内。

注意区分一件事:这里说的是淘汰,不是稀疏注意力。稀疏注意力每步只 attend 一部分 token,但所有 KV 对都还在显存里,峰值显存照样线性涨。要真正压住显存,只有永久丢弃这一条路。

以往的淘汰方法,区别全在一个打分函数 \(s_i\) 上:

方法 打分思路
H2O 累积注意力,\(s_i=\sum_{t'=i}^{t}\alpha_i^{(t')}\)
SnapKV 只看最近 \(w\) 个 query 的注意力,邻近位置 max-pool
R-KV SnapKV 分数混入冗余惩罚,复述过的内容不留两份
VaSE 按 value 模长(\(\max_j v_{ij}-\min_j v_{ij}\))留一批,剩余按 SnapKV 分数随机采样
TriAttention 按位置打分 \(s_i=f(t-i)\)\(f\) 是逐头校准的三角级数,结合 \(\|k_i\|\)

统一框架很简单:缓存保留 \(K\) 个预算位加 \(r\) 个最近位置的缓冲,每 \(r\) 步触发一次淘汰,候选集合里留分数最高的 \(K\) 个:

\[\mathcal{S}_t = \operatorname{top-}K_{\,i\in\mathcal{C}_t}\; s_i\]

每一篇新论文都在说"我的分数更准"。这篇论文问了一个更根本的问题:这个分数到底买来了什么?

🧠 Random Attention:能写出的最弱选择信号

方法本身三行就能讲完,它刻意把自己做成一个"零假设":

\[s_i = \begin{cases} +\infty, & i \leq \ell_p \quad\text{(prompt 永久保留)} \\ u_i \sim \mathrm{Uniform}(0,1), & \text{其余位置每个 KV 头独立抽随机数} \end{cases}\]

两条结构性规则,背后是同一个直觉——把缓存内容分成两类:

  1. 题目只被陈述一次。prompt(系统提示、模板、问题)一旦被丢,永远找不回来,所以无条件钉死。
  2. 思维链会自我复述。模型边推理边把还在用的中间结论重新写进文本,所以这部分敢随机扔。

每次淘汰的开销就是一次 rand 加一次 topk,每个 KV 头独立抽。伪代码四行:

s = rand(B, H_kv, S)          # 每个位置、每个头独立均匀随机分
s[:, :, :prompt_len] = +inf   # 强制保留题目
keep = topk(s, K)             # 每个头独立留 top-K

作者对这套东西的定位很清醒:它既是一个可直接部署的方法,也是一个零假设——任何打分方法在同等预算、同等 prompt 保护下打不过它,就说明它的信号没提取出可用信息。

📊 主实验:60 个格子,赢 31 输 1

实验配置:Qwen3-4B / 14B / 32B 加 Phi-4-reasoning 共四个模型,任务覆盖 MATH500(500 题)、GPQA-Diamond(198 题)、AIME 2025+2026 合并(60 题)、HMMT(60 题)、LiveCodeBench-v6 medium(383 题,真实执行判 pass@1)。主表压到每个任务约 4 倍压缩(LiveCodeBench 约 3 倍),每个格子都是多次独立采样运行的平均(AIME/HMMT 跑 16 次),显著性用配对 bootstrap 加符号检验双重把关。

图1:4 倍压缩下四个模型的平均准确率与 vLLM 吞吐

图1:(a) 六个推理任务的平均准确率,红色 Random Attention 在每个模型上都贴着最强基线;(b) vLLM 下 32k 生成的服务吞吐,Random Attention 达到 full attention 的 1.58-2.67 倍,比 TriAttention 高 32-43 个点。

核心数字(Table 1,节选 Qwen3-4B 与 Qwen3-32B):

方法 MATH500 (K=1024) GPQA-D (K=2048) AIME (K=4096) HMMT (K=4096) LiveCodeBench (K=3072)
Qwen3-4B Full 0.939 0.562 0.642 0.462 0.807
SnapKV 0.703 0.369 0.418 0.395 0.507
R-KV 0.810 0.482 0.494 0.371 0.712
VaSE 0.809 0.461 0.596 0.421 0.700
TriAttention 0.864 0.533 0.592 0.437 0.755
Random Attention 0.874 0.530 0.610 0.438 0.744
Qwen3-32B Full 0.950 0.703 0.715 0.559 0.886
SnapKV 0.816 0.476 0.541 0.450 0.609
R-KV 0.857 0.638 0.613 0.472 0.779
VaSE 0.868 0.597 0.680 0.524 0.797
TriAttention 0.887 0.683 0.677 0.508 0.834
Random Attention 0.891 0.683 0.664 0.509 0.806

几个值得停顿一秒的观察:

  • 数学和科学任务上,信号什么都没买到。MATH500 和 GPQA-D 上 Random Attention 在每个模型都显著赢 VaSE 和 SnapKV;没有任何打分方法在任何这些格子上显著赢它。TriAttention 在 GPQA-D 两个格子上领先 0.3-0.6 个点,落在噪声里。
  • 竞赛数学上分不出高下。AIME/HMMT 只有 30-60 题,run-to-run 标准差就有 ±5 个点,VaSE 在 32B 上领先的那 1.5-1.7 个点完全是噪声量级。
  • 唯一显著输掉的格子是 LiveCodeBench 上的 Qwen3-32B,落后 TriAttention 约 3 个点。原因不是信号,是 prompt——LiveCodeBench 的 prompt 平均 557 token,是同 tokenizer 下 MATH500 的 6 倍,最长的能吃掉 K=3072 预算的一半。Random Attention 把整个 prompt 钉死,留给随机抽样的预算就被挤小了。

Qwen3-14B 在附录 Table 5 复现了同样的格局(如 MATH500:RA 0.870 vs TriAttention 0.891、VaSE 0.852,LiveCodeBench:RA 0.820 vs TriAttention 0.843)。

加大压缩压力再看一眼:

图2:2 倍到 16 倍压缩下的准确率扫描

图2:Qwen3-4B(上排)与 Phi-4-reasoning(下排)在四个数学科学任务上的压缩扫描,虚线为 full attention。2 倍时大家贴在一起;压缩越狠,Random Attention(红)始终咬住 TriAttention(绿),VaSE(蓝)逐渐掉队——16 倍时 Qwen3-4B MATH500 上 0.65 对 0.39。

压缩越狠,随机法相对打分法的优势反而越大。这已经开始暗示:打分的收益不是"压缩越大越需要精细挑选",恰恰相反。

🔬 机理:为什么分数买不到精度

这是全文最值钱的部分。作者用两个受控实验把"随机为什么够用"拆成了两条可验证的机制。

prompt 才是缓存里脆弱的部分

各个 baseline 对 prompt 的待遇其实不一样:TriAttention 默认保住整个输入,SnapKV / R-KV / VaSE 默认只留 sink token,其余全交给分数。所以跨论文比数字,比的其实是两套不同的保护策略。

作者给所有方法统一加上"保住 prompt"的规则,结果(Table 2,节选):

方法 Qwen3-4B MATH500 单独分数 → 加保护 Phi-4 GPQA-D 单独分数 → 加保护
SnapKV 0.703 → 0.829(涨 12.6 个点) 0.442 → 0.667(涨 22.5 个点)
R-KV 0.810 → 0.812(涨 0.2 个点) 0.636 → 0.655(涨 1.9 个点)
VaSE 0.809 → 0.812(涨 0.3 个点) 0.562 → 0.664(涨 10.2 个点)
纯最近窗口 0.246 → 0.843(涨 59.7 个点) 0.323 → 0.658(涨 33.5 个点)
Random Attention(无保护) 0.459 → 0.874(涨 41.5 个点) 0.434 → 0.678(涨 24.4 个点)

规律干净得漂亮:每个方法从这条规则里赚到的分数,恰好等于它的分数原本弄丢了多少题目。SnapKV 的分数留 prompt 留得最少,所以处处大涨;R-KV 留得最多,几乎不涨。统一保护之后,三个 baseline 在所有设定下互相落在 2.2 个点以内。

两个无信号的行把同一结论从反面又讲了一遍:不加保护时,纯最近窗口在 GPQA-D 上能跌到 0.09;加上保护,它直接追到最强 baseline 两个点以内。丢掉 prompt 是灾难,随机砍思维链不是。

顺带说一句,这也解释了之前一些工作(Liu et al., 2025; Yuan et al., 2026)报告"随机基线被打分方法吊打"的原因——他们的随机基线把 prompt 也一起随机丢了。对比协议里保护策略不一致,结论就没法比。

思维链靠两层冗余自我保护

prompt 之外的部分是模型自己写的推理轨迹,它有两层冗余:

文本层:模型推理时会不断复述还在用的中间结论(R-KV 那篇已经指出过这点),所以重要的值很少只存在一个位置。

跨头层:每个 KV 头各自缓存了每个 token 的一份副本,淘汰是逐头独立决定的。一个 token 只有当所有头碰巧都丢了它,才真正消失。

作者设计了一个"埋针"探针来量化跨头冗余:往真实的 MATH500 推理轨迹里插入一个合成事实(比如 Let zq = 4729,每次换新变量新值),事实埋在问题之前 1536 token 处,中间经历 15 次淘汰,最后问一个需要这个值的问题。控制变量是:这个事实被钉在哪些头里,其余头正常随机淘汰。

图3:埋针探针的三个发现

图3:(a) 事实只留在一个头里几乎读不出来(最好的单头 3%),两个头 60%,三个头 83%,八个头 99%——跨头汇聚是强超加性的;(b) 两个答案都需要的事实分存不同头,一起留的 recall 0.31 超过单独留之和;(c) 真实 MATH500 上把保留内容换成连续块,块长 1 到 64 无损,256 才掉——重要的是每头剩几块,不是块长。

说实话,(a) 那张图让我停了好几秒。单头 3%,两头 60%——这不是线性叠加,是"只要某个头还留着可用副本,模型就能读出来"的池化效应。而逐头独立随机抽样,恰好就是最大化"至少一个头留有副本"概率的策略。这不是巧合,是随机法为什么够用的结构性原因。

(c) 也很有趣:保留的形状根本无所谓。把事实按 token 拆散了分发到不同头(没有任何一个头持有连续可读的片段),retrieval 只从 0.39 微降到 0.33,recall 几乎不动。模型要的是"某处存在可用副本",不在乎是哪个副本、在哪个头、什么形状。

那打分信号还剩什么用?作者用一个极端 case 划出了边界:一个口令只说一次、57 轮压缩之后才问。这时 Random Attention 的 retrieval 是 0.000,R-KV(累积全程注意力的那个)能找回 83.6%,VaSE 找回 34.4%,而只看最近窗口的 SnapKV 和 TriAttention 也几乎全丢(1.6% 和 0.4%)。也就是说,捞"只说过一次的针"是真实存在的 selection 技能,但它和主表强弱既不互推也不相关——最会捞针的 R-KV 主表只赢一个格子,主表最强的 TriAttention 在这里几乎捞不到。真实推理轨迹很少产生"只说一次之后再不提起"的事实,因为模型一直在复述自己还在用的东西。

图4:各策略的预算花在哪个 token 年龄段

图4:缓存中不同年龄 token 的留存比例(log 轴)。Random Attention 随年龄几何衰减,VaSE 会冻结一小撮"老宠儿"长期不放,TriAttention 在 1k-2k 的回望区间留存明显更高。

⚡ 效率:不算分,省下的不只是几分之一毫秒

精度打平之后,效率就是决定性差异。vLLM + PagedAttention、单卡 H200、K=2048、1k prompt + 32k 生成、128 并发:

方法 Qwen3-4B Phi-4-reasoning Qwen3-14B Qwen3-32B
Full 1296(1.00 倍) 780(1.00 倍) 925(1.00 倍) 346(1.00 倍)
TriAttention 1494(1.15 倍) 1212(1.55 倍) 1303(1.41 倍) 700(2.02 倍)
Random Attention 2046(1.58 倍) 1737(2.23 倍) 1819(1.97 倍) 923(2.67 倍)
RA 相对 TriAttention 快 37% 快 43% 快 40% 快 32%

单看一轮淘汰,打分并不贵:Random Attention 一轮 0.30 ms(只做压缩搬移),TriAttention 一轮 1.47-1.64 ms。单流场景下只差几个百分点的解码时间。但服务场景把这个小成本放大了两层——128 个并发请求各自每 64 个 token 压一次,整个负载里压缩发生约 6.2 万次,而且 vLLM 在批步之间的同步点做压缩,一个请求压缩时其余 127 个全在等;paged 环境下打分还要顺着 block table 逐层多扫一遍候选 key。Qwen3-14B 的 32k 运行里,TriAttention 比 Random Attention 多花的 910 秒,摊下来每次压缩约 15 ms 的全批等待,而 Random Attention 不到 1 毫秒。

等显存对比(每方法跑单卡能放下的最大 batch)更直观:

图5:等显存下的解码吞吐对比

图5:等显存 serving,K=3072、32k 生成。Qwen3-4B 上 Random Attention 放下 batch 200、达到 full attention 的 10.0 倍;TriAttention 只有 3.8 倍(注意此处 TriAttention 是未融合的 scorer 重实现,三倍差距反映实现而非方法本身)。14B 上格局相同:8.8 倍对 3.0 倍。更紧的 K=1024 下 RA 能到 28.8 倍。

作者自己也很坦诚:3-10 倍的加速大头来自"小缓存换大 batch",这是所有淘汰方法共享的;Random Attention 真正独占的 margin 是省掉打分pass 换来的那 32-43%。这个数字不夸大。

🤔 我的判断

这篇论文的价值分两层,而且我觉得第二层比第一层大。

作为方法:Random Attention 是一个漂亮的部署默认值。零校准、零超参、零打分pass,同等预算下精度贴着最强基线,vLLM 里吞吐多三成以上。如果你在 serving 推理模型且显存吃紧,这东西几乎没有任何不试的理由。它还顺手成了所有未来打分方法必须迈过的门槛——matched budget、matched prompt protection 打不过随机的,就别发了。

作为科学结论:它把 KV 淘汰研究的优化目标整个挪了位置。这个领域这几年一直在卷排序质量,这篇论文证明了排序几乎不决定精度——精度由你保护什么决定,不由你怎么排剩下的决定。开放问题因此换了一批:长 prompt 怎么预算化(代码任务里 prompt 吃掉一半预算,无脑钉死显然不是终点),以及怎么捞回那些只说一次的稀有事实。

也有几个我会追问的点。其一,LiveCodeBench 上 32B 输的那 3 个点,作者归因于 prompt 长度而非信号,这个归因在 §5.1 的对照实验里支撑得不错,但"更聪明的 prompt 压缩规则"被留给了 future work——而这恰恰可能是下一个真正有价值的方向。其二,随机淘汰带来的 run-to-run 方差在高压缩比下会放大,论文附录里给了标准差数据,但线上服务对尾延迟和尾质量的敏感度,论文没直接回答。其三,所有结论建立在"模型会复述自己还在用的东西"这个行为上——这是当前推理模型的训练产物,不是架构保证;如果未来模型被训练得更"节俭"(比如显式约束不复述),随机法的地基会松动。

但这些都是追问,不是缺陷。一篇把零假设做成 SOTA 基线、又把"为什么零假设成立"拆成两个可复现机制的论文,今年 KV cache 方向我读到现在,这篇是最想推荐给同事的。


觉得有启发的话,欢迎点赞、在看、转发。跟进最新AI前沿,关注我