← 回首頁

推測解碼 Speculative Decoding(草擬-驗證-回滾)

大型語言模型每次只吐一個字,要接龍成一整句得來回呼叫很多次,又慢又貴。推測解碼(speculative decoding)借用「助手先擬草稿、主管再一次過目」的分工:先讓一個又小又快的模型一口氣猜好幾個字,再交給 又大又準的主模型從頭核對,遇到第一個不一樣的字就打回、後面全部重寫。妙處是它只省下呼叫大模型的次數, 答案卻和大模型自己慢慢寫的一模一樣。下面你會看到每一輪的草擬、驗證與回滾,最後逐字比對兩種寫法的 結果是否完全相同。

每一輪先用小、快的「草擬模型」連續猜 k 個候選 token,再交給大、準的「目標模型」以一次平行前向傳遞逐位 驗證:從頭比對,一旦某個位置與目標模型的答案不符就整段作廢——接受前面已比對相符的草擬 token,該位置改用 目標模型的正確答案取代,其後尚未驗證到的草擬 token 全部捨棄(回滾);若 k 個候選全部相符(全收),目標 模型還會在同一次呼叫中「順帶」多算出下一個 token(bonus token)。這套「先斬後奏、錯了就回滾」的手法只 換取目標模型呼叫次數的節省,不改變最終輸出——本頁把這個等價保證當成教學核心,逐輪展示草擬/驗證/ 接受/改正/bonus,並在終幀獨立重放純目標模型自迴歸序列,逐字比對兩者是否完全相同。

為什麼 AI 時代重要

推測解碼(speculative decoding)是當前 LLM 推理加速主力之一——2023 年起幾乎已是業界標配:用小、快的 草擬模型一次連續猜 k 個候選 token,交由大、準的目標模型以一次平行前向傳遞驗證,驗證到第一個不一致就整段 作廢、以目標模型當下輸出取代並捨棄其後草擬。它的價值不只是「省呼叫次數」,而是保證輸出分佈/結果與目標 模型單獨自迴歸完全相同——只換速度,不換答案,這正是它能被大規模生產部署採用的關鍵。

它是分支預測與驗證回滾思路的延伸

「先斬後奏、錯了就回滾」與 CPU 分支預測(猜測執行指令流、猜錯就清空管線重來)、樂觀鎖(先做完再檢查 衝突、衝突就重試)同屬一類「猜測-驗證-回滾」設計思路的另一個化身。它與同屬 LLM 逐 token 解碼家族的 序列解碼 Viterbi/Beam Search 共享「逐 token 生成」這個底層問題, 只是解決不同軸向:Beam/Viterbi 在「選哪個 token」上做搜尋/最佳化,推測解碼在「token 已選定的前提下如何 少呼叫幾次大模型」上做加速。它也與 蒙地卡羅樹搜尋 MCTS/UCB 同屬「先模擬/猜測,再驗證/回饋」思路的另一化身—— MCTS 用模擬結果回饋更新樹的估值,推測解碼用驗證結果決定接受或回滾草擬。

推測解碼(草擬 k tokens → 目標模型逐位驗證 → 接受/改正/bonus + 輸出等價對照)

每輪流程:(1) 草擬——由已確認序列的最後一個 token 起,用 DRAFT_TABLE 連續查 k 次,得草擬序列。 (2) 驗證——視為目標模型 1 次平行驗證呼叫:對每個位置以草擬序列的前綴尾 token 查 TARGET_TABLE, 逐位比較是否與草擬 token 相符,取第一個不相等位置 mismatchIndex(全部相符則 = k)。 (3) 輪結——mismatchIndex=k(全收):k 個草擬 token 全部接受,目標模型同次呼叫再產出 1 個 bonus token,本輪貢獻 k+1 個;否則接受前 mismatchIndex 個、第 mismatchIndex 個以目標模型改正取代,本輪 貢獻 mismatchIndex+1 個。依序併入序列,一旦序列長度達到目標長度即停止併入(截斷)。

固定資料:起始 prompt「我」;生成目標長度 10;每輪草擬 k=3 個 token。TARGET_TABLE(大模型,權威, 前綴尾 token → 下一 token):我→們→去→吃→飯→店→好→嗎→我(循環);DRAFT_TABLE(小模型)與 TARGET_TABLE 完全相同,僅在「店」「好」兩鍵分歧(店→嗎,TARGET 為好;好→我,TARGET 為嗎),用以在 生成過程中真實觸發接受/拒絕分歧(實測:4 輪中第 1/4 輪全收、第 2 輪中途拒、第 3 輪首拒)。
目標模型驗證呼叫(verifyCalls):0 目前處理輪次(round):1 / 4
階段:草擬
列 = 輪(round,共 4 輪,固定資料下的實測輪數);欄 = 草擬位 0..2(K=3)+ 第 4 欄「bonus/改正」 欄(每輪只會用到其中之一)。草擬幀只顯示 value,尚未標記顏色;驗證幀 grid 不變,逐位比對結果只 反映在敘事文字(narration);輪結幀才把 accept/reject/correct/bonus 同幀寫入 grid(宣告幀同幀, 不分次揭露)。
綠色(accept)= 被接受的草擬 token;紅色(reject)= 未被接受的草擬 token(含實際不符位置與 其後被捨棄的草擬位);橙色(correct)= 目標模型的改正 token(第一個不符位置由目標模型的正確答案 取代);藍色(bonus)= 全收時目標模型於同一次驗證呼叫「順帶」多算出的下一個 token; 帶刪除線+淡化(truncated)= 該 token 雖經驗證判定應併入序列,卻因序列已達長度上限 (targetLength=10)而未實際寫入——教學上刻意保留「已算出但未套用」與「未通過驗證」兩種語意的 差異,第 4 輪即真實觸發此情況(第 3 位與 bonus 欄皆判定應併入,僅前 2 個實際套用)。
決定性教學簡化,非真實機率取樣:真實 speculative decoding 是機率式演算法——草擬 token 依「目標模型機率/草擬模型機率」之比值做 rejection sampling 決定接受或拒絕,拒絕後的改正 token 也是依修正後機率分佈重新抽樣。本頁兩個「模型」皆為決定性查表函式(給定前綴尾 token → 唯一 下一 token,無機率分佈),「草擬 token 是否被接受」簡化為「是否等於目標模型的 argmax(=查表 結果)」。保留的是「草擬-驗證-回滾」與「輸出與目標模型單獨自迴歸等價」這兩個核心概念,捨棄的是 機率抽樣細節(backlog:若要更貼近真實演算法,可將查表函式換成機率分佈表,並實作 rejection sampling 版本的接受/改正邏輯)。
bonus token 口徑:全收(k 個草擬 token 全部接受)時,目標模型於同一次平行驗證呼叫中 「順帶」多算出下一個位置的輸出,本輪因此貢獻 k+1 個 token——這是經典 speculative decoding 演算法 的標準做法;中途拒/首拒則貢獻 mismatchIndex+1 個 token(接受前 mismatchIndex 個 + 目標模型改正第 mismatchIndex 個),此時沒有 bonus token。
呼叫數口徑(教學縮尺):「一輪」計為目標模型 1 次驗證呼叫(不論該輪 mismatchIndex 為 何、也不論是否產出 bonus token,均計 1 次),全部輪數之和即 verifyCalls;基線(逐 token 自迴歸,不做任何草擬)呼叫數 = 需生成的 token 數 = targetLength − 1(起始 prompt 的 1 個 token 不需呼叫模型)。此為「呼叫次數」這個概念性對照,真實世界的加速比另受批次驗證成本、接受率、硬體 平行度等因素影響,不能直接等同於實際加速倍率。
等價保證是本法核心賣點:推測解碼真正的價值不只在於「省呼叫次數」,而在於它保證省下 呼叫次數的同時輸出完全不變——下方「輸出等價宣告」逐字比對投機解碼最終序列與獨立重放(不呼叫本頁 生成邏輯)之純 TARGET 自迴歸序列,只要兩者完全相同,就代表這個核心正確性保證成立。

逐輪記錄(rounds:草擬/驗證/型態/接受/改正/bonus/套用/累積序列)

context草擬 draft驗證 targetPreds型態 接受改正bonus套用 applied累積序列

輸出等價宣告(equivalence,本法核心正確性保證)

(尚未產生,等待終幀宣告)

呼叫數對照(投機 verifyCalls vs 基線 baselineCalls)

方式呼叫次數說明

已執行操作紀錄(opLog)

(空)