Greedy Decoding(貪欲法デコーディング)(グリーディデコーディング)
LLMのテキスト生成において、各ステップで語彙全体の確率分布から最も確率の高いトークンを選択する最もシンプルなデコーディング手法。計算コストが最小だが、生成テキストの多様性がなく、繰り返しが発生しやすい。
Greedy Decoding(貪欲法)とは
Greedy Decoding は、大規模言語モデルがテキストを生成する際に、毎ステップで確率が最も高い1つのトークンを選択する手法です。Temperature=0 の設定と実質的に同等であり、OpenAI API や Claude API で temperature=0 を指定した場合にこの挙動になります。
動作原理
- モデルが語彙全体(例: GPT-4 の語彙サイズ = 100,256 トークン)に対する確率分布を出力
- argmax 演算で最大確率のトークン ID を選択
- 選択されたトークンをコンテキストに追加し、次のステップへ
- 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 サンプリングなど確率的手法を推奨