精心设计的 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\) 个:
每一篇新论文都在说"我的分数更准"。这篇论文问了一个更根本的问题:这个分数到底买来了什么?
🧠 Random Attention:能写出的最弱选择信号
方法本身三行就能讲完,它刻意把自己做成一个"零假设":
两条结构性规则,背后是同一个直觉——把缓存内容分成两类:
- 题目只被陈述一次。prompt(系统提示、模板、问题)一旦被丢,永远找不回来,所以无条件钉死。
- 思维链会自我复述。模型边推理边把还在用的中间结论重新写进文本,所以这部分敢随机扔。
每次淘汰的开销就是一次 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:(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: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:(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 的留存比例(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:等显存 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前沿,关注我