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:]

高速化は文体・タスクによって大きく異なり、繰り返しの多いテキスト生成(コード生成・形式的文章)で効果が高い。

この記事について
カテゴリーAI・機械学習
難易度上級
作成日2026/6/8