Speculative Verification: Exploiting Information Gain to Refine Speculative Decoding

Sungkyun Kim, Jaemin Kim, Dogyung Yoon, Jiho Shin, Junyeol Lee, Jiwon Seo (Hanyang / SNU / KAIST) · arXiv:2509.24328v2 · 2026-04-20
关键词: Speculative Decoding · Information Gain · Goodput · Verification Length · Companion Model · 大 batch

速读卡片 (TL;DR)

一句话:额外引入一个跟 draft 模型同量级的 companion model,用 draft–companion 两个分布的对齐度作为 information-theoretic 信号,在线预测每个 drafted token 被 target 接受的概率,然后动态裁剪 verification length—— 把注定会被拒的尾部 token 从 target verify 里剔除,在大 batch 下平均 1.4×、最高 1.9× 优于 vanilla SD。

30–48%
观察 (S,A) 后的 entropy 下降比 (info gain ratio)
21–41%
verification compute 节省 (TFLOPs)
1.4× / 1.9×
大 batch 下平均/峰值 vs SD

立场:这是一篇用 information theory 包装的工程优化论文。核心 insight 不是某个单一公式,而是"draft 自己看自己 → 永远盲;再叫一个 peer 来交叉对照 → 立刻减熵"——把额外算力花在更准确地放弃上,而不是更精确地猜。


1. 动机:fixed-k SD 的"末段浪费"问题

1.1 历史脉络:从"猜更准"到"猜得短一点也行"

Speculative Decoding(SD,Leviathan 2023)的逻辑很简单:让一个小 draft model 先 autoregressively 走 k 步,然后让大 target model 把这 k 个 token 一次性 forward 一遍,用 rejection sampling 验证。每次 verify 至少能 commit 一个 token(target 自己的那一步是 free 的),最多能 commit k+1 个。k 越大期望接受越多 → 越省 wall-clock。

但故事在大 batch 下崩了。论文的 preliminary 测量给出了两个非常刺眼的数字:

原因不复杂:大 batch 下 target 单步 forward 已经接近 compute-bound,verify 成本接近线性正比于 k;而 SD 的 expected accept length 是次线性的(token 越往后越容易被拒,接受率几何衰减)。所以 fixed-k 在 batch=1 时还能赚,batch=64 时尾巴上的几个 token 几乎不创造价值,只是燃 compute。

研究界的反应是"动态调整 k"。但具体怎么调,出现了三条不同思路 —— 见 1.2。

1.2 别的方案为什么不够 — alternatives 表

预测 acceptance 这件事至少有三类做法,SV 论文逐一论证它们在大 batch 下都不够鲁棒:

方法预测信号调的杠杆大 batch 下的具体痛点
Fixed-k SD (Leviathan, Medusa baseline)固定 draft length尾部接受率几何衰减,verify 浪费 40%+;48% 步更慢
SmartSpec (Liu 2024b)过往 acceptance 的 moving averagedraft length逐 step accept rate 抖动剧烈,与 history 几乎无关(论文 Figure 1)
SVIP / AdaEDL / DISCOdraft 分布的 entropy(KL 上界)draft lengthKL→TV 的 bound 很松(Canonne 2022);而且 target 分布在 draft 时不可见
DySpec / Tetrisdraft 自己给 sampled token 的 probtoken tree 优先级"draft prob ⇔ accept prob" 的强假设经常不成立
EAGLE-2 / EAGLE-3 dynamic treedraft-side hidden + tree expansion 评分draft 树形状大 batch 下 tree 展开的 verify 头本身成为 dominant cost
DAS (length-aware budget)RL 训练时 sequence-level 学一个 stop policydraft length需要训练阶段配合,不是纯 inference-time;且 budget 是序列级而非 token 级
Staged SD (Spector 2023)多级 verify性能受中间模型 cap 限制,batch 大时甚至比 target-only 更慢
SV (本文)draft 与 第二个 同量级模型 (companion) 的分布对齐 + companion 给 draft token 的 probverification length(不是 draft length)

核心区别有两点值得反复咀嚼:

  1. SV 用的是第二个独立模型给的信号,而不是 draft 自身的内省信号。"draft 自己估自己有多准"在信息论上有天花板:它最多用 H(draft 内部),看不到 target。引入一个独立的 peer,只要不与 draft 完全统计独立(modern LLM 训练数据高度重合,这条几乎自动成立),就能拿到正的 information gain。
  2. SV 调的是 verify length 而不是 draft length。这是一个低调但关键的转向 —— 见 1.3。

1.3 为什么是 verify length 而不是 draft length

直觉上"少猜几步就行了",draft length 看似最自然的杠杆。但在生产 serving 场景,draft 和 verify 的成本结构不一样:

换句话说:draft length 的决策点太早,信号还没到;verify length 的决策点是"已经写完 8 个 token,现在决定送几个进 target",这时位置-by-位置的接受概率可以算出来。SV 把决策点向后推到信息密度最大的瞬间。

更进一步:SV 也没有动 draft 流程 —— draft 还是按固定 k(比如 5 或 7)往前写。SV 只在 verify 阶段决定"送 0~k 中的哪一段进 target"。verify_length ≤ draft_length 始终成立。这种最小侵入性是 SV 能附加在 EAGLE-3 / LayerSkip 等 self-spec 之上的关键。

1.4 估 IG 自身要花钱 — 这个生意划算吗?

论文必须回答的硬问题:companion model 自己也要 forward,它会不会把省下的 verify 又烧回去?

Table 3 给了答案。以 Qwen2.5 (1.5B/0.5B/32B) 为例:

更直白地说,companion 的 incremental cost 大约是 verify 节省的 1/16。系统层面再用 MPS 让 companion 与 verify overlap,大部分隐藏在 verify 的等待气泡里。预算确实划算 —— 但只在大 batch 下;小 batch 时 verify 本来就便宜,companion 是纯负担,这也是论文 Figure 7 中 batch=1 时 SV 略输的来源。

Fixed-k SD (k=7),target verify 全部 7 位 t1 t2 t3 t4 t5 t6 t7 target verify 全部 7 位 绿: 高接受概率 橙: 中等 红: 大概率被拒(~40% 浪费) SV: 估每位 acceptance,在 goodput 转折点切断 t1 t2 t3 t4 t5* drop drop verify length γ*=5 蓝色虚线: SV 选定的 γ*,t6/t7 跳过 verify(target 自己再算下一个 token)
图1:fixed-k SD vs SV 的 verify timeline。两者 draft 都写 7 位,但 SV 通过 (S, A) 估计后认为 t6/t7 接受概率太低,选择只送前 5 位进 target。被丢弃的位置由 target 在下一步从自己的分布生成,采样分布严格保留。

2. 背景速查

术语含义(本文用法)
draft model小模型,负责 autoregressive 写 k 个 token,记 Pd
target model大模型,做 verify,记 Pt。最终 token 严格遵循 Pt
companion modelSV 引入,与 draft 同量级、独立的"参照系",记 Pc
draft length k每轮 draft 写多少 token(本文实验 5 或 7)
verification length γSV 真正送进 target 的 token 数,γ ≤ k(SV 的核心杠杆)
acceptance prob Amin(1, Pc(td) / Pd(td)),在 companion 这边假设 SD 采样规则成立时 draft token 被接受的概率
distribution similarity SΣi min(Pd(ti), Pc(ti)),即 1 − TV;SD 中标准的 overlap 测度
information gain I(X;Y)H(X) − H(X|Y),"已知 Y 后 X 的不确定度被压缩了多少"
goodput"已被接受 token / wall-clock 秒",本文优化目标
SD 验证规则速记(为什么 SV 不破坏分布)

对于 draft token td ~ Pd:

该规则下,接受/拒绝合并后等价于直接 sample 自 PtSV 在此规则之外只做一件事:在送 verify 之前选择 γ。跳过的 token 被视为"draft 没写过它",target 直接在该位置 sample 自己的分布 → 仍是 Pt。所以 SV 不引入分布偏移。

3. SV 整体框架

从 control-flow 角度看,SV 在每一轮 SD step 的时序大致是:

Draft model 写出 k=7 token, P_d Companion 同输入 forward, P_c 逐位计算 (S_i, A_i) 查 lookup 表 → P̂(T_i | S_i, A_i) 每位 acceptance 概率 扫 γ ∈ {1..k} 最大化 E[N|γ]/lat(γ) 凹性 → 早停 target verify (γ* tokens) SD 标准 rejection sampling 虚线 box 为 SV 新增组件;target 的接口完全不变,仍接受 γ 个 token 走 SD 验证规则。
图2:SV 在一个 SD step 中的 dataflow。Draft 与 companion 接受相同 prefix,但互相条件;两者输出独立采样。SV 的全部新增计算是 (1) 逐位 (S, A) lookup,(2) γ 的凹搜索,(3) companion 自身 forward。前两步是 cheap pointwise op,(3) 通过 MPS 与 verify overlap 隐藏。

3.1 关键非平凡点

4. 两个指示量 S 与 A

SV 选择 Y = (S, A) 作为条件随机变量。两者扮演的角色是互补的:

S = Σi ∈ vocab min(Pd(ti), Pc(ti))
A = min(1, Pc(td) / Pd(td))

论文 Appendix B.1 报告:S 单独贡献 4–13% info gain,加上 A 之后跳到 30–40%(Table 1 chat:48%, code:37% with adaptive binning)。也就是说token 级信号 A 比分布级信号 S 重要约 5×。直觉上,这是因为 LLM 的接受瓶颈往往不是"context 难易",而是"draft 这个 token 是不是 outlier"。

4.1 Worked example: 计算 S 和 A

假设一个简化 vocab {猫, 狗, 鸟, 鱼},某位置:

Pd0.500.300.150.05
Pc0.400.400.100.10
min0.400.300.100.05

Draft 采样到 td = "狗"。则:

查表 P̂(accept | S=0.85, A=1.0) ≈ 0.93。这位置 "强力推送 verify"。

对比另一种情况:td = "鱼",A = min(1, 0.10/0.05) = 1.0,但 Pd(鱼)=0.05 本身就是低概率 outlier —— 实际 lookup 表会反映这点(low frequency 区域 acceptance 更不稳)。两个量缺一不可

4.2 反向论证:只用 S 行不行?

论文 Table 1 的"5×5 binning"给出 H(X|S, A) 与 H(X) 的对比。如果只用 S(等价于砍掉 A 维度),IG 仅 4–13%,relative reduction 不到 10%,远低于论文阈值。物理直觉:S 是整列上的全局对齐,而真正决定单 token accept 的是那一行的 condition(即 A)。

5. Verification length 的动态搜索

给定 P̂(Ti | Si, Ai),要从 γ ∈ {1, ..., k} 选最优值。期望接受 token 数:

Pγ(N) = ⎰ P(TN+1 ≠ tN+1) · ∏i=1..N P(Ti=ti), N < γ
⎱ ∏i=1..γ P(Ti=ti), N = γ
E[N | γ] = Σi=1..γ i · Pγ(N=i)

Goodput 即 (E[N|γ] + 1) / latency(γ) —— 加 1 因为 verify 至少额外写一个 free token。SV 从 γ=1 开始递增,只要 goodput 仍上升就继续,一旦下降就回退。论文证明 goodput 关于 γ 是 concave:

所以 first-derivative 式的 hill-climbing 即可,O(k) 一次扫描,k=7 时几十次浮点乘法,完全是 cheap online。

γ (verify length) goodput 1 2 3 4 γ*=5 6 7 8 goodput peak underutilized GPU (latency 增长慢) verify saturated (尾部 accept 几何衰减) 凹函数 → 单峰 → hill climbing 到下降即停
图3:goodput 关于 γ 的形状。SV 从 γ=1 起逐次扩,看到 γ=6 比 γ=5 差就停在 γ*=5。整套搜索成本 = k 次乘加 + k 次延迟查表,与 verify 自身比可忽略。

5.1 Batch 模式下的贪心扩展

多查询同时存在时,SV 维护一个空的"待验证 token 集",每轮挑跨 query 边际增益最大的下一个 token 加入,只要 batch 级 goodput 还在涨就继续。这意味着某些 query 这一轮可能根本没 token 进 verify。但 target 那一步仍会从自己的分布在该 query 的"下一位置"采一个 token —— forward progress 永不卡住。

6. Worked example: 8-token rollout

假设 draft length k=8。draft 顺序写出:"我 / 今天 / 想 / 去 / 公园 / 看 / 一下 / 樱花"。每位置 SV 计算 (S, A) 并查表得到 P̂i:

itokenSiAii (accept)累乘 ∏P̂
10.921.000.950.95
2今天0.880.950.900.86
30.851.000.880.75
40.800.900.780.59
5公园0.700.650.550.32
60.550.400.300.097
7一下0.450.200.120.012
8樱花0.400.100.050.0006

计算 E[N | γ]:

γE[N | γ]profiled latency (ms)goodput = (E+1)/lat
10.953.00.65
21.813.20.88
32.563.41.05
43.153.71.12
53.474.11.09
63.574.60.99
73.585.20.88
83.586.00.76

SV 从 γ=1 起递增。γ=5 时 1.09 仍是局部最大 —— 等等:γ=4 是 1.12 > γ=5 是 1.09,所以 SV 到 γ=5 时发现下降,回退,选 γ*=4

Fixed-k=7 SD 在这一步会送全部 7 位进 target。等价 latency 5.2ms,但有效贡献 E[N]=3.58,goodput=0.88;比 SV 的 γ*=4 (1.12) 慢 27%。被白白 forward 的 token #5/#6/#7 中,#6 和 #7 几乎肯定被拒(累乘到 P̂≈0.012)。

每位 P̂i 与累乘 ∏ P̂(降到 cliff 处) 我 .95 今天 .90 想 .88 去 .78 公园 .55 看 .30 一下 .12 樱花 .05 SV stop: γ*=4 Fixed-k=7 stop SV 从 γ=1 扫到 γ=5 发现 goodput 降低,回退到 γ*=4。fixed-k 一直用全部 7 位,#6/#7 几乎必拒,白烧 verify。
图4:同一条 8-token draft 上,SV 与 fixed-k 的停止点对比。

7. 系统侧:把 companion 的开销藏起来

纯算法层面 SV 已经"省了 verify",但工程上还有两个关键决策:

7.1 NVIDIA MPS + overlap

SV 把 draft / companion 与 target 放进不同进程,通过 NVIDIA Multi-Process Service 让两者并发占用同一张 GPU。MPS 配置上 draft+companion 占 30% SM 资源,target 占其余。两个 micro-batch 同时跑:第 t 步的 verify 与第 t+1 步的 draft+companion。这样 companion forward 大部分时间被 verify 的 latency 吞没。

注意一个细节:profiling latency 必须在 draft+companion 同时运行的状态下测(因为有干扰),否则 γ 搜索会用错误的 latency 表。论文专门提到这一点。

7.2 Prefill 时的 logit 跳过

prefill 阶段 draft / companion 不需要算 logits(它们的输出在 prefill 还没用),论文跳过这一步,prefill overhead 降 3–5%。但即便如此,SV 的 prefill throughput 仍比 SD 低 ~10%(比 target-only 低 30%)。这是 RAG / 短输出场景下 SV 优势收窄的根源。

7.3 输入 tensor compaction + CUDA graph

因 verify length 是 query-级可变的,padding 会浪费大量算力。SV 实现了 variable-length verify 的 input tensor 紧凑化,并修了 FlashInfer 在 CUDA graph 下的 attention bug(让 graph capture 与 padded input 兼容)。这些是必须做对的工程,不是可选。

8. 实验关键结果

8.1 Table 3 — 算账(最承重)

D/C/TSD acceptSV acceptSD TFLOPsV↓C↑net %
Qwen2.5 1.5B/0.5B/32B0.560.6278161−18.3%
Qwen2.5 0.5B/0.5B/32B0.470.5784211−23.4%
Qwen2.5 0.5B/1.5B/32B0.470.7284194−17.4%
CodeLlama 135M/1.2B/34B0.730.8663202−27.6%
Llama2 68M/160M/13B0.140.61109501−44.6%

关键观察:

8.2 Table 1 — info gain 标定

Llama2 13B/160M/68M 在 chat (ShareGPT) 与 code (HumanEvalPack) 上,使用 adaptive binning:

chat 比 code 信号更强 —— 直觉是 chat 的 token-level 模式更稳,companion 给的预测更准;code 的多样性让 acceptance 本身更高熵,IG 比例下降。

8.3 EAGLE-3 整合 — 一个值得标注的失败模式

把 SV 套在 EAGLE-3 上时,小 batch 下反而轻微变慢。原因:EAGLE-3 自身 draft accept 率才 26-27%,意味着 (S, A) 的输入信号本身偏低、companion 难找出靠谱的早停点;同时小 batch 下 verify 本来就便宜,companion 是纯负担。换 SV 自带的更强 draft 后回升 56%。"draft 越烂 + batch 越大 → SV 越赚",这条经验法则可以记住。

8.4 Fairness

1024 query 中,verify 数最少的底部五条平均 2.9 token / step(整体 4.1)。47% step 仅 1–2 token verify,但 39% 仍能拿到 4–5 token —— SV 不挑食得太严重。target verify 至少返回一个 token 保 forward progress 这件事是结构性保证,不靠调度器。

9. 与同类工作对比

工作调的杠杆信号vs SV 的关键差
Fixed-k SDbaseline,大 batch 下尾部浪费严重
SmartSpecdraft length过往 accept 的 EMAaccept 抖动太剧,history 信号近似无用
SVIP / AdaEDL / DISCOdraft lengthdraft 自身 entropyKL→TV bound 松;target 不可见 → 信号弱;SV 用 peer model 直接缩 H(X)
DySpec / Tetristoken tree 优先级draft 自己给 sampled token 的 prob"draft prob ≈ accept prob" 强假设;SV 不依赖此
EAGLE-2 dynamic treedraft tree 形状draft hidden + tree score大 batch verify 本身才是瓶颈,EAGLE-2 改 draft 帮不到 verify
EAGLE-3 (self-spec)无 verify-side 调节正交,可以叠 SV(论文 7.7 实测)
DAS (length-aware budget)draft lengthRL 训出 stop policy需训练阶段配合;SV 是纯 inference-time;DAS 是 sequence-level,SV 是 token-level
Staged SD多级 verify chain中间模型做 sampling(lossy filter),受其能力 cap;SV companion 只打分不采样
SV (本文)verify lengthdraft–companion (S, A)

简化记忆:所有同类要么调 draft,要么用 draft-内部信号;SV 是唯一一个(a) 调 verify length 且 (b) 用外部 peer model 信号的组合。这两条选择是耦合的:外部信号在 verify 决策点才能拿到充分的 per-position 估计。

10. 局限 / 个人 take / 待验证

10.1 待验证(我会做的下一组实验)

  1. 把 P̂(T|S,A) 改成 online sliding-window 估计,看 distribution shift 鲁棒性。
  2. 验证"draft 极弱时收益最大"的 monotonicity:从 68M draft 一路放大到 7B,SV 相对收益曲线长什么样?(Table 3 暗示是单调下降但论文没给曲线)
  3. SV + EAGLE-3 失败原因是 draft 弱还是 (S, A) 信号本身在 self-spec 下 collapse?(EAGLE-3 的 draft head 与 target 共享 hidden,Pd 与 Pc 可能反而不独立)
  4. 把 companion 替换成更便宜的"distilled head"(类似 Medusa head 但只产 Pc),companion forward cost 进一步压缩到 verify 的 1% 以下,会发生什么?
  5. "verify length 而非 draft length"是否能配合 EAGLE-2 的 dynamic tree —— 即"动态 tree shape × 动态 verify cut"两条杠杆同时开?

11. Memory points

立场 SV = 不动 draft,只动 verify。 用第二个独立 peer model 给每位 drafted token 估接受概率,把没希望的尾部丢掉,把节省的算力用在更高 batch / 更大 target。
核心信号 Y = (S, A): S 是 draft–companion 的 vocab-level overlap (1−TV);A 是 companion 给 draft token 的 SD acceptance。S 弱 (~10% IG),A 强 (~30%+);组合达 30–48% entropy 减
公式 γ* = argmaxγ (E[N|γ]+1) / latency(γ),其中 Pγ(N) 用 P̂(Ti|Si,Ai) 累乘。goodput 关于 γ 凹 → hill climbing 一遍即停。
关键架构选择 companion 只打分不采样(区别于 staged SD);verify length 是 token-level 决策(区别于 DAS 的 sequence-level);决策点放在 verify 前(区别于 SVIP 的 draft-time entropy)。
系统 NVIDIA MPS 把 draft/companion (30% SM) 与 target 并发,companion 与下一轮 verify overlap;CUDA graph + variable-length verify 的 tensor compaction 是必做工程。
数字 大 batch 1.4× 平均、1.9× 峰值;TFLOPs 净省 17–45%(verify ↓ 比 companion ↑ 大 5–20×);accept rate 提升 0.06–0.47。
禁区 小 batch + 弱 draft (e.g. EAGLE-3 self-spec, accept ≈ 0.27)→ 收益不抵 companion 成本。Prefill-heavy (RAG) 加速从 1.4–1.9× 缩到 ~1.39×。
非平凡点 假设是"Pd 与 Pc 不统计独立" —— 极弱条件,modern LLM 训练数据重叠下几乎自动成立。不需要 draft–companion similarity ≈ draft–target similarity 的强相关。
vs 同类 SmartSpec=history、SVIP=entropy、DySpec=draft prob、staged SD=中间模型 sampling、DAS=RL 训 stop。只有 SV 的信号来自外部 peer,杠杆是verify length