投機的デコーディングとドラフトモデル
LLM の生成が遅いのは1トークンずつしか進めないから。小モデルで先読みし大モデルで一括検証する投機的デコーディングなら、出力分布を一切変えずに体感速度を数倍にできる。
- 1.小さなドラフトモデルで複数トークンを安く先読みし、大モデルで1回だけ並列検証する。Decode のメモリ帯域律速を逆手に取り、1回の前方計算で平均1トークン超を確定させて高速化する。
- 2.修正版棄却サンプリングにより、最終的な出力分布は大モデル単独と数学的に完全一致する。受理確率は min(1, p/q) で、ドラフト分布 q が本物 p に近いほど受理が伸びる。近似ではなく無損失。
- 3.Medusa は別ドラフトモデルを持たず複数の予測ヘッドを本体に足す方式、自己投機は同一モデルの浅い層・一部層スキップで先読みする方式。いずれも別モデル運用コストを避ける派生。
なぜ「先読みして一括検証」が速いのか
KV キャッシュと LLM 推論の最適化 で見たとおり、LLM の生成(Decode フェーズ)はメモリ帯域律速です。1トークン出すだけのために、モデルの全パラメータと KV キャッシュを HBM から読み出す必要があり、計算ユニットはほとんど遊んでいます。バッチサイズ1の対話生成では、GPU の演算能力の数パーセントしか使えていないことすら珍しくありません。
ここに大きなチャンスがあります。1トークン分を処理するのも、数トークン分を並列処理するのも、読み出す重みは同じなので所要時間がほぼ変わらないのです。つまり「1回の前方計算で複数トークンを確定できれば」、読み出しコストを複数トークンで割り勘でき、実効速度が上がります。
これを実現するのが 投機的デコーディング(speculative decoding) です。安価なドラフトモデルに数トークン先まで当て推量で書かせ、本命の大モデルがそれらをまとめて1回で検証します。当たっていれば一気に複数トークン確定、外れてもそこまでは活かせる、という賭けです。
扱うのは推論時の無損失高速化です。量子化や蒸留(量子化と蒸留)が「モデルを軽くする代わりに精度を多少譲る」のに対し、投機的デコーディングは出力分布を一切変えずに速くする点が決定的に違います。検証アルゴリズムがそれを保証します。
基本アルゴリズム:ドラフトと検証の二段構え
登場人物は2つです。ターゲットモデル(本命の大モデル、分布 p)と、ドラフトモデル(同じ語彙を持つ小さく速いモデル、分布 q)です。ドラフトはターゲットの1/10〜1/30程度の規模がよく使われます。
1ラウンドの流れは次のとおりです。
1. ドラフトで先読み: ドラフトモデルを K 回自己回帰で回し、
候補トークン x_1, x_2, ..., x_K を生成。
各位置の分布 q(x_i | ...) も記録しておく。
2. 一括検証: ターゲットモデルに「現在の文脈 + x_1..x_K」を
1回の前方計算でまとめて入力。これで全位置の
p(x_i | ...) が並列に手に入る(ここが速さの肝)。
3. 受理判定: 先頭から順に各 x_i を確率的に受理/棄却。
棄却が出たらそこで打ち切り、その位置を訂正して次ラウンドへ。
鍵はステップ2です。ターゲットの前方計算はドラフトが書いた K トークンに対して1回だけ走り、Prefill のように全位置を並列処理します。K トークン分の p を、ほぼ1トークン分の時間で得られるわけです。
ドラフト生成は本質的に直列です(次トークンに前の出力が要る)。だがドラフトは小さいので1ステップが安い。対してターゲットの検証は、候補列がすでに確定しているため全位置を一度に流せる。「高い計算を1回・並列で」「安い計算を K 回・直列で」に分業するのが投機の構造です。
受理判定の数理:修正版棄却サンプリング
ここが投機的デコーディングの心臓部であり、「速いのに分布が変わらない」を成立させる仕組みです。各候補 x_i を次のルールで判定します(p はターゲット、q はドラフトの確率)。
位置 i の候補 x_i について:
r を [0,1) の一様乱数とする
if r < min(1, p(x_i) / q(x_i)):
受理(x_i を確定し、次の位置 i+1 へ進む)
else:
棄却(ここで打ち切り)
訂正分布 p'(x) = normalize( max(0, p(x) - q(x)) ) から
1トークンをサンプリングし、それを採用して次ラウンドへ
受理確率は min(1, p/q) です。直観的には次のように読めます。
- ドラフトが控えめ(
q < p)に出した良いトークンは、比p/q > 1なので必ず受理。 - ドラフトが自信過剰(
q > p)に出したトークンは、比p/q < 1の確率で受理され、残りは棄却。 - 棄却時の訂正分布
max(0, p - q)を正規化したものから引き直すのがミソで、これが分布のズレをちょうど打ち消します。
受理されたトークンの分布と、棄却時に訂正分布から引いたトークンの分布を足し合わせると、任意の x について確率がちょうど p(x) に戻ることが証明できます。つまり最終出力は「ターゲットモデルを単独で素直にサンプリングした場合」と数学的に同一分布。投機的デコーディングは近似ではなく厳密に無損失であり、これが量子化など他の高速化と決定的に異なる性質です。
なぜ訂正分布が max(0, p - q) なのかを補足します。位置 i でドラフトが各トークンを確率 q(x) で出し、それを受理確率 min(1, p(x)/q(x)) で受理する操作を全トークンについて合計すると、受理されて出てくる確率は各 x について q(x)·min(1, p(x)/q(x)) = min(p(x), q(x)) になります。本来欲しい p(x) との差し引き分が p(x) - min(p(x), q(x)) = max(0, p(x) - q(x)) です。棄却時にこの差分だけを正規化して引き直せば、合計でちょうど p(x) が再現されます。これが「棄却時は必ず1トークン引き直す(捨てて終わりにしない)」理由でもあります。
高速化はどこから来るか:受理長と期待値
速度向上の大きさは、1ラウンドあたり平均何トークン確定できるかで決まります。受理が先頭から n 個連続で続く確率を考えると、1ラウンドの期待確定トークン数(受理長+訂正の1つ)は、各位置の受理確率を α(acceptance rate)とおくと近似的に次で表せます。
期待確定トークン数 ≒ (1 - α^(K+1)) / (1 - α)
α: 1トークンあたりの平均受理確率(0〜1)
K: 1ラウンドでドラフトが先読みする本数
αが高い(ドラフトがターゲットをよく真似る)ほど、長い受理が続き、確定数が伸びる。Kを増やすほど上限は上がるが、外れた先のドラフト計算は無駄になるため、Kは大きすぎても費用対効果が落ちる(実務ではK = 4〜8程度がよく使われる)。
| 状況 | 受理率 α のイメージ | 起きること |
|---|---|---|
| ドラフトがターゲットに酷似 | 高い(例 0.8 前後) | 受理が長く続き、ラウンドあたり数トークン確定。高速化が大きい |
| ドラフトが粗い/不一致 | 低い(例 0.3 前後) | 先頭で棄却されがち。確定が伸びずドラフト計算が無駄に |
| 定型文・繰り返し・コード | 高くなりやすい | 次が予測しやすく受理が伸びる。投機が特に効く |
| 高エントロピーな自由生成 | 低くなりやすい | 本質的に予測が割れ、投機の利得が小さい |
実効的な高速化率は、おおまかに 期待確定トークン数 / (1 + K×ドラフトコスト比) のような形で、ターゲット1回+ドラフト K 回の総コストを、確定トークン数で割ったものになります。だからドラフトは「ターゲットに似ていて、かつ十分速い」という二律背反のスイートスポットを狙う必要があります。
ドラフトが下手で受理率が低いと、ドラフト計算のオーバーヘッドだけ食ってかえって遅くなることがあります。また温度(デコーディング戦略)を上げて分布を平坦にすると、p と q のズレが受理判定に効きにくくなる一方、そもそも予測が割れて受理長が縮む傾向もあり、ワークロード依存です。導入前に対象タスクで受理率を実測するのが鉄則です。
Medusa・自己投機:別モデルを持たない派生
標準の投機的デコーディングの弱点は、別個のドラフトモデルを用意・運用する手間です。語彙を揃え、メモリに2つ載せ、整合性を保つコストがかかります。これを回避する代表的な派生が2つあります。
| 方式 | 先読みの担い手 | 検証の仕組み | 利点/注意点 |
|---|---|---|---|
| 標準(独立ドラフト) | 別の小モデル q | 修正版棄却サンプリングで無損失検証 | 汎用的だが2モデル運用が必要 |
| Medusa | 本体に追加した複数の予測ヘッド | ツリー状の候補を本体で一括検証 | 別モデル不要。ヘッドの追加学習が要る |
| 自己投機(self-speculative) | 同一モデルの一部層スキップ/浅い実行 | 全層実行で検証 | 追加パラメータほぼ不要。スキップ設計が肝 |
-
Medusa は、ターゲットモデルの最終隠れ状態の上に「2手先」「3手先」を予測する複数の軽量ヘッドを増設します。各ヘッドが候補を出し、それらを組み合わせた**ツリー(複数経路)を本体で一度に検証します。独立ドラフトモデルが要らず、ヘッドだけ追加学習すればよいのが利点です。なお Medusa は典型的には厳密な棄却サンプリングではなくツリーの典型受理(typical acceptance)**で受理範囲を決める実装が多く、設定によっては厳密無損失ではない点に注意します。
-
自己投機(self-speculative decoding) は、ドラフト役を同じモデルの軽量版に担わせます。一部の Transformer 層をスキップしたり、浅い層までで早期に出力したりして安く先読みし、全層を通した本来の計算で検証します。別モデルもヘッドの追加学習も基本不要で、1つのモデルの中で投機を完結させられます。どの層をスキップして速度と受理率を両立させるかが設計の肝です。
「1本の候補列」ではなく、各位置で複数候補を持つツリーを一度に検証する手法(Medusa や各種ツリー投機)が広がっています。1ラウンドで探索できる経路が増えるため、適切な注意マスクで1回の前方計算に詰め込めば、直列の候補列より受理長の期待値を伸ばせます。投機の「賭け」を複線化する発想です。
まとめ:無損失で Decode を割り勘にする
投機的デコーディングは、Decode がメモリ帯域律速で計算が余っているという構造を逆手に取り、安い先読みと1回の並列検証で前方計算を複数トークンに割り勘する技術です。
| 論点 | 実態 | そこから言えること |
|---|---|---|
| なぜ速いか | ターゲット1回の前方計算で平均1トークン超を確定 | Decodeの遊んだ演算資源を受理長ぶん回収できる |
| なぜ無損失か | 修正版棄却サンプリング min(1, p/q) +訂正分布 | 最終分布はターゲット単独と数学的に一致。近似ではない |
| 何で決まるか | 受理率 α と先読み本数 K | ドラフトがターゲットに似るほど高速化。タスク依存 |
| 別モデルを避けるには | Medusa(追加ヘッド)/自己投機(層スキップ) | 2モデル運用を省く。ただし無損失性や学習要否は方式次第 |
実務では、まず対象タスクで受理率を実測し、ドラフトの規模と K を調整するのが出発点です。出力品質を1ビットも妥協せずレイテンシだけ縮められるため、対話やコード補完のように「速さがそのまま体験」になる用途で特に効きます。KV キャッシュと LLM 推論の最適化 の連続バッチングや PagedAttention とも独立に併用でき、デコーディング戦略 で扱う温度・top-p の設定が受理率に影響する点まで押さえると、推論高速化の打ち手が線でつながります。
AI/機械学習 Article
投機的デコーディングとドラフトモデルを実務で読む
TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。
解決すること
LLM
比較で見る軸
難易度: advanced / カテゴリ: AI/機械学習 / タグ数: 5
導入後に効く点
修正版棄却サンプリングにより、最終的な出力分布は大モデル単独と数学的に完全一致する。受理確率は min(1, p/q) で、ドラフト分布 q が本物 p に近いほど受理が伸びる。近似ではなく無損失。
先に潰すリスク
用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。
- 難易度
- advanced
- カテゴリ
- AI/機械学習
- タグ数
- 5
判断チェックリスト
- 自社の用途が「LLM / 推論最適化」に近いか確認する。
- 強みである「小さなドラフトモデルで複数トークンを安く先読みし、大モデルで1回だけ並列検証する。Decode のメモリ帯域律速を逆手に取り、1回の前方計算で平均1トークン超を確定させて高速化する。」が本当に評価軸になるか確認する。
- 注意点の「用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。」を運用で吸収できるか確認する。
- 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
- 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
- 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。