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