AI・機械学習
中級

Greedy Decoding(貪欲法デコーディング)(グリーディデコーディング)

LLMのテキスト生成において、各ステップで語彙全体の確率分布から最も確率の高いトークンを選択する最もシンプルなデコーディング手法。計算コストが最小だが、生成テキストの多様性がなく、繰り返しが発生しやすい。

0 回閲覧
0 いいね

Greedy Decoding(貪欲法)とは

Greedy Decoding は、大規模言語モデルがテキストを生成する際に、毎ステップで確率が最も高い1つのトークンを選択する手法です。Temperature=0 の設定と実質的に同等であり、OpenAI API や Claude API で temperature=0 を指定した場合にこの挙動になります。

動作原理

  1. モデルが語彙全体(例: GPT-4 の語彙サイズ = 100,256 トークン)に対する確率分布を出力
  2. argmax 演算で最大確率のトークン ID を選択
  3. 選択されたトークンをコンテキストに追加し、次のステップへ
  4. EOS(End of Sequence)トークンまたは max_tokens に達するまで繰り返し

この手法は分岐や探索を一切行わないため、計算量は O(T × V) です(T = 生成トークン数、V = 語彙サイズ)。

Greedy Decoding が適するタスク

タスク理由推奨設定
コード生成正確性が最優先。創造的な変形は不要temperature=0
数学的推論論理的一貫性を維持する必要があるtemperature=0
機械翻訳(短文)忠実度が重要。意訳より直訳が求められる場面temperature=0〜0.1
情報抽出入力テキストから正確にエンティティを抽出temperature=0
分類タスク決定論的に同一ラベルを返す必要があるtemperature=0

既知の問題と対策

繰り返し問題(Repetition Problem)

Greedy Decoding の最大の弱点は、同じフレーズやパターンが無限に繰り返される「デジェネレーション」現象です。

  • Repetition Penalty(反復ペナルティ): 過去に出現したトークンの logit を減衰(一般的に 1.1〜1.2)
  • No Repeat N-gram: 特定の n-gram が2回以上出現することを禁止(Hugging Face の no_repeat_ngram_size パラメータ)
  • Frequency Penalty / Presence Penalty: OpenAI API で提供される2種のペナルティ。Frequency は出現回数に比例、Presence は出現有無のみで減衰

最適系列を見逃す問題

各ステップでローカル最適を選ぶため、グローバル最適な系列を見逃す可能性があります。例えば「The cat sat on the」の次に「mat」(確率 0.35)より「floor」(確率 0.30)を選んだ場合、後続の文全体の確率積がより高くなる場合があります。

実装例

Hugging Face Transformers

from transformers import AutoModelForCausalLM, AutoTokenizer

model = AutoModelForCausalLM.from_pretrained("meta-llama/Llama-3.1-8B-Instruct")
tokenizer = AutoTokenizer.from_pretrained("meta-llama/Llama-3.1-8B-Instruct")

inputs = tokenizer("def fibonacci(n):", return_tensors="pt")
outputs = model.generate(
    **inputs,
    max_new_tokens=100,
    do_sample=False  # Greedy Decoding
)

vLLM

from vllm import SamplingParams
params = SamplingParams(temperature=0, max_tokens=100)

よくある質問(FAQ)

Q1: Greedy Decoding と Beam Search の違いは何ですか? A: Greedy Decoding は各ステップで1つの最高確率トークンのみを選びますが、Beam Search は複数の候補系列(ビーム)を並行して探索します。Beam Search はより高品質な出力が得られますが、計算コストがビーム幅に比例して増加します。

Q2: temperature=0 と do_sample=False は同じですか? A: 実質的には同等ですが、実装レベルでは異なります。do_sample=False は argmax を直接適用し、temperature=0 は softmax のスケーリングを極端にします。浮動小数点精度の問題から、do_sample=False の方が厳密に決定論的です。

Q3: 本番環境で Greedy Decoding を使う場合の注意点は? A: max_tokens を必ず設定してください。繰り返しによる無限生成を防ぐため、repetition_penalty=1.1 程度の設定も推奨です。また、GPU の非決定性により完全な再現性は保証されないため、seed パラメータの併用を検討してください。

まとめ

  • Greedy Decoding は最もシンプルで高速なデコーディング手法
  • 正確性・一貫性が重要なタスク(コード生成・分類・抽出)に最適
  • 繰り返し問題には Repetition Penalty や No Repeat N-gram で対処
  • 創造性が必要なタスクには Top-p サンプリングなど確率的手法を推奨