Speculative Decoding 的原理是什么?为什么可以加速且保持目标模型分布?
简化版
推测解码(Speculative Decoding) 用一个便宜的 Draft Model(草稿模型) 一口气猜出后面 K 个 token,再让目标大模型一次并行前向验证这 K 个位置,接受猜对的前缀、在第一个猜错处纠正。核心是把「串行生成 K 个 token」变成「一次验证 K 个 token」,而验证是并行的、便宜的。配合严格的接受-重采样规则,它能精确保持目标模型的输出分布(不是近似)。加速多少取决于接受率:草稿越准、接受越多,目标模型的串行调用次数就越少。
详细版
标准自回归解码每生成一个 token 就要跑一次大模型(M 个 token = M 次串行大模型前向)。推测解码利用了「Transformer 能并行评估一段已知序列」这个事实:小模型先猜 K 个 token,大模型一次算出这 K 个位置在自己分布下的概率,再逐个决定接受几个。
它不是盲信小模型:
- 贪心验证:候选 token 与目标模型的贪心选择一致才接受。
- 采样验证(保持分布):设草稿概率 q、目标概率 p,按
min(1, p(x)/q(x))接受;首次拒绝时从校正后的残差分布norm(max(0, p−q))重采样,并丢弃该位置之后的候选。
正是这套接受 + 拒绝重采样规则,从数学上保证最终输出等价于直接用目标模型采样。简化实现若省略校正,就会悄悄改变分布。
完整版教学
一、加速机会:把串行变并行
Decode 慢在时间步串行——第 t 个 token 要等第 t-1 个算完。但有个关键事实:验证一段”已经写好”的候选序列,可以一次并行算完(因为所有位置的输入都已知,能像 prefill 那样并行)。
推测解码就利用这点:小模型串行猜 K 个(便宜),大模型并行验一次(把 K 次大模型串行调用压成 1 次)。如果平均每次验证能接受 n 个 token,目标大模型的串行调用次数就降到约 1/n。
Draft 可以是:更小的同族模型、目标模型的早退层、额外的预测头(如 Medusa)、或 n-gram 等轻量猜测器。
二、接受-拒绝规则:为什么能保持分布
这是本题的技术核心,也是最容易答错的地方。设某位置草稿给出 token x,草稿概率 q(x)、目标概率 p(x):
接受概率 = min(1, p(x)/q(x))
· 若 p(x) ≥ q(x)(目标比草稿更想要它)→ 必接受
· 若 p(x) < q(x)(草稿高估了它)→ 以 p(x)/q(x) 的概率接受
首次拒绝时:从残差分布 p'(x) = normalize(max(0, p(x) − q(x))) 重新采样一个 token,
并丢弃本轮该位置之后的所有草稿。
可以数学证明:这套规则下,每个位置最终被采样出来的分布恰好等于 p(目标模型分布)。所以推测解码是无损加速——输出和直接用大模型采样在统计上完全一致。工程上还要正确处理 EOS、随机数、温度、Top-k/Top-p 等采样变换,否则会破坏这个保证。
记忆钩子:便宜模型先草拟、目标模型批量验收;接受靠
min(1,p/q)、拒绝处从残差max(0,p−q)重采样——这才保证分布不变。
三、接受率决定收益(带估算)
加速比大致取决于平均接受长度。直觉公式:
加速比 ≈ 平均接受 token 数 / (1 + 草稿开销比例)
- 草稿和目标越一致,接受率越高,平均接受长度越长,加速越明显。
- 草稿太弱 → 频繁被拒、平均只接受 1 个,几乎不加速还白搭草稿成本。
- 草稿太强(接近目标大小)→ 猜得准但草稿本身就贵,得不偿失。
候选长度 K 也要权衡:K 太短,摊不平一次验证的成本;K 太长,一旦前面某个位置被拒,后面的草稿全作废、浪费。实践中 K 常取 4~8。
四、为什么不一定更快(重要边界)
推测解码不是万能加速:
- 高并发场景可能反而变慢:连续批处理 + 大 batch 已经把 GPU 算力喂满(compute-bound),此时额外的草稿调用和同步反而增加开销、降低总吞吐。
- 接受率低的场景收益差:复杂开放式生成、高温度采样、草稿领域不匹配,都会拉低接受率。
它最擅长的是「访存受限、低并发的单请求延迟优化」——比如一个用户等一个回答、batch=1 时,GPU 本来闲着,用草稿把空闲算力利用起来,显著降低延迟。所以实际收益必须在目标负载上实测,不能想当然。
五、如何评估
上线前记录并核对:
- 接受 token 数的分布、平均接受长度(收益来源);
- 目标模型验证次数、草稿耗时、TTFT、TPOT、端到端延迟、总吞吐;
- 输出一致性测试:用相同随机种子对比「有/无推测解码」的输出分布,确认精确算法没被采样实现的 bug 改变分布。
最后一项常被忽略——很多”推测解码”实现因为随机数或温度处理不当,悄悄改变了输出,务必验证。
六、易错点
- 误区:推测解码是近似加速、会掉质量。 正确实现是无损的,输出分布与目标模型完全一致。
- 误区:草稿模型越大越好。 太大则草稿本身昂贵,抵消收益;要在「接受率」和「草稿成本」间取平衡。
- 误区:任何场景都能提速。 高并发 compute-bound 场景可能变慢,它主要利于低并发单请求延迟。
- 误区:候选 K 越长越好。 前面被拒则后面全废,K 要适中。
七、加强记忆
推测解码记「草稿猜、目标验、无损加速」:小模型串行猜 K 个 token,大模型一次并行验证,接受对的前缀、在错处纠正,把大模型的串行调用压到约 1/平均接受长度。正确性靠严格规则——接受概率 min(1,p/q)、首次拒绝从残差 max(0,p−q) 重采样——保证输出分布与目标模型完全一致(无损)。收益取决于接受率(草稿要又准又便宜),且主要利于低并发单请求延迟;高并发 compute-bound 时可能反而更慢,务必实测。