投机解码的 min(1, p/q) 到底是怎么来的:用 80 行 Python 把论文里的概率证明复现一遍
结论先说:投机解码(speculative decoding)在 2026 年已经是 vLLM、SGLang、TensorRT-LLM、llama.cpp 四大推理框架的默认加速路径之一,但真正理解它的工程师不多。大多数文章讲到 “小模型先写一段,大模型一次验证” 就停了,对于那个不起眼的接受公式min(1, p(x)/q(x)),要么一笔带过,要么干脆抄一遍。我这次不打算再讲一遍原理图,而是直接把论文里的概率证明用 80 行 Python 复现出来,用 20 万次采样验证:为什么这个公式能让大模型“偷懒但不偷错”,以及为什么草稿模型差的时候,加大窗口 γ 没什么用。
文章读完你能带走三件事:
min(1, p/q)的接受概率不是工程 trick,它唯一能保证 “最终采样分布 = 目标模型 p” 的数学选择;- 一次投机能期望多产几个 token,直接由 α = Σ min(p, q) 决定,不看草稿模型快不快;
- 窗口 γ 不是越大越好,当 α 低的时候加大 γ 的边际收益以指数衰减。