AI・機械学習
上級
Jacobi デコーディング(ジャコビデコーディング)
LLMのトークンを逐次ではなく並列に推測・検証するデコーディング手法。Jacobi反復法を応用してドラフトと検証を同時実行する。
0 回閲覧
0 いいね
2026/6/8 更新
関連タグ
LLM推論
投機的デコーディング
並列デコーディング
Jacobi反復法
推論高速化
Jacobi デコーディング
Jacobiデコーディングは、LLMのAutoregressive生成を並列化するためにJacobi反復法(連立方程式の数値解法)のアイデアを応用した手法。投機的デコーディングの一形態だが、別モデル(ドラフトモデル)を必要としない点が特徴。
通常のAutoregressive生成
t=1: [x1] → モデル → y1
t=2: [x1, y1] → モデル → y2
t=3: [x1, y1, y2] → モデル → y3
...
各ステップが前ステップに依存するため本質的に逐次的。
Jacobi デコーディングの手順
Step 1: 並列推測
[x1...xN, y1_guess, y2_guess, ..., yK_guess]
→ モデル1回フォワードパス
→ y1_new, y2_new, ..., yK_new を同時取得
Step 2: 一致チェック
matched = 0
for i in range(K):
if y_new[i] == y_guess[i]:
matched += 1
else:
break
Step 3: 確定と次回推測更新
- matched+1トークンを確定
- 残りを新しい推測で更新し繰り返し
Lookahead Decoding
Jacobiデコーディングの拡張版。過去の生成履歴から「n-gram」プールを維持し、推測精度を高める:
[W step: Jacobiで並列トークン生成]
↓
[V step: n-gramプールと照合して長いシーケンスを確定]
LlamaやMistralで2-3倍の高速化を報告(モデル品質劣化なし)。
CLLMs(Consistency LLMs)
2024年に提案されたJacobiデコーディングを直接最適化するファインチューニング手法:
- Jacobi軌跡から学習データを生成
- 「推測が一致しやすいモデル」に微調整
- 通常のAutoregressive生成より 2.4-3.4 倍高速
loss_ar = cross_entropy(logits, targets)
loss_cll = jacobi_consistency_loss(model, jacobi_trajectory)
loss = loss_ar + lambda_cll * loss_cll
通常の投機的デコーディングとの比較
| 手法 | ドラフトモデル | メモリ追加 | 適用条件 |
|---|---|---|---|
| 投機的デコーディング | 必要(小型モデル) | あり | 小型モデルが利用可能 |
| Jacobi | 不要 | なし | 単一モデルで完結 |
| Lookahead | 不要 | n-gramプール | バッチ推論向き |
実装例
def jacobi_decode(model, tokenizer, prompt: str, n_guess: int = 5):
input_ids = tokenizer.encode(prompt, return_tensors="pt")
guesses = torch.randint(0, tokenizer.vocab_size, (1, n_guess))
while not finished:
extended = torch.cat([input_ids, guesses], dim=1)
with torch.no_grad():
logits = model(extended).logits
predictions = logits[:, -n_guess:, :].argmax(dim=-1)
confirmed = 0
for i in range(n_guess):
if predictions[0, i] == guesses[0, i]:
confirmed += 1
else:
break
input_ids = torch.cat([input_ids, guesses[:, :confirmed+1]], dim=1)
guesses = predictions[:, confirmed:]
高速化は文体・タスクによって大きく異なり、繰り返しの多いテキスト生成(コード生成・形式的文章)で効果が高い。