
“無損加速”最容易被誤解成兩件事輸出文本逐字不變或者小模型猜錯了也無所謂。隨機采樣下真正要保留的是目標模型的輸出分布。草稿模型負責提出候選接受規(guī)則和拒絕后的補償分布共同保證結果漏掉后半段就不是原來的算法。投機解碼的早期論文已給出保持目標分布的采樣方法。Leviathan 等人的論文2022/2023 2026 年 10 月 14 日vLLM 的自適應驗證說明又提醒了一個工程風險根據(jù)已經(jīng)抽中的候選自身概率決定是否裁掉它可能改變候選分布不能直接沿用原來的接受公式。vLLM 官方說明三個詞元足夠看清補償設目標分布 p(0.5,0.3,0.2)草稿分布 q(0.2,0.5,0.3)詞表只有 A、B、C。草稿抽到 x 后以min(1,p(x)/q(x))的概率接受。直接接受的概率質量是 min(p,q)(0.2,0.3,0.2)總量只有 0.7。剩余 0.3 要從正殘差 max(p?q,0)(0.3,0,0) 中補回。將殘差歸一化得到拒絕后應采樣的分布 r(1,0,0)。于是總輸出又回到 (0.5,0.3,0.2)。圖中的殘差分支省略了歸一化步驟實際抽樣必須先除以殘差總和。若 pq接受概率總量為 1拒絕分支不會發(fā)生不能讓程序在不可達分支里除以零后產(chǎn)生 NaN。用精確分數(shù)驗證不用隨機頻率湊答案這段代碼枚舉全部概率質量不調用模型也不依賴隨機種子。保存為 Python 文件即可運行。from fractions import Fraction as F p [F(5, 10), F(3, 10), F(2, 10)] q [F(2, 10), F(5, 10), F(3, 10)] assert sum(p) sum(q) 1 accepted [min(a, b) for a, b in zip(p, q)] reject 1 - sum(accepted) residual [max(a - b, F(0)) for a, b in zip(p, q)] assert sum(residual) reject if reject: r [x / reject for x in residual] output [a reject * b for a, b in zip(accepted, r)] else: output accepted assert output p print(accepted:, list(map(str, accepted))) print(reject:, str(reject)) print(output:, list(map(str, output)))代碼證明的是這組離散分布的代數(shù)關系。把詞表換大公式仍要求 p、q 對應同一個候選上下文并且使用實際參與抽樣的歸一化分布。溫度、Top-P 或其他 logits 處理如果改變了分布就必須體現(xiàn)在這些概率里。三種“相同”不要混用說法能證明什么不能順便推出什么分布相同無限重復采樣的理論概率一致固定種子下文本逐字一致單次答案一致這一條運行產(chǎn)生相同文本任意輸入下分布一致任務分數(shù)接近指定數(shù)據(jù)集上的指標相近算法嚴格無偏、尾部行為不變同分布也不意味著同耗時。草稿生成、目標驗證、KV 管理和通信都有成本。高并發(fā)下驗證可能占用更多計算資源某個場景接受率很高也不能直接寫成所有場景固定三倍加速。工程實現(xiàn)應分別檢查分布正確性和資源收益。前者需要核對抽樣、拒絕補償與上下文回滾后者需要固定模型對、采樣配置、負載形狀與硬件。本文沒有運行真實模型或 GPU 投機內核離線枚舉通過只是一項算法檢查不能替代部署驗收。