テキスト生成において複数の候補系列(ビーム)を並行して探索し、全体として最も高い確率を持つ系列を選択するデコーディング手法。機械翻訳や音声認識で広く使用され、Greedy Decodingより高品質な出力を実現するが計算コストが増大する。
Beam Search は、LLMのテキスト生成において複数の候補系列を同時に探索する半決定論的なデコーディング手法です。各ステップでビーム幅 k 個の最有力候補を維持し、最終的にシーケンス全体の対数確率和が最も高い系列を選択します。Google の機械翻訳システムや OpenAI Whisper の音声認識で標準的に使用されています。
計算量は O(T × k × V) で、Greedy Decoding の k 倍です。
| パラメータ | 標準値 | 説明 |
|---|---|---|
| beam_width (k) | 4〜8 | 並行探索するビーム数。大きいほど高品質だが遅い |
| length_penalty (α) | 0.6〜1.0 | 長い系列へのペナルティ/ボーナス。α>1で長文を促進 |
| no_repeat_ngram_size | 3 | 指定 n-gram の繰り返しを禁止 |
| early_stopping | True | 上位 k 系列がすべて EOS に達した時点で探索終了 |
| num_return_sequences | 1 | 返却する候補系列数(≤ k) |
outputs = model.generate(
**inputs,
num_beams=5,
num_return_sequences=3,
length_penalty=0.8,
no_repeat_ngram_size=3,
early_stopping=True,
max_new_tokens=200
)
generator = SequenceGenerator(
models, tgt_dict,
beam_size=5,
len_penalty=0.6,
max_len_b=200
)
k 本のビームが類似した系列に収束しやすい問題があります。
対話型LLM(ChatGPT、Claude)ではビームサーチはほぼ使用されず、Top-p サンプリングが主流です。ビームサーチは翻訳・音声・要約など「正解に近い出力」が求められる seq2seq タスクに限定される傾向が強まっています。vLLM 0.8 以降はビームサーチのサポートを維持しつつも、Speculative Decoding との併用を推奨しています。
Q1: ビーム幅を大きくすれば品質は必ず向上しますか? A: 必ずしもそうではありません。ビーム幅を16以上にするとスコアは向上しますが、出力が短く一般的な表現に偏る「ビームサーチの呪い(curse of beam search)」が発生することが報告されています。実用的には beam_width=4〜8 が最適範囲です。
Q2: Beam Search と Top-p サンプリングを併用できますか? A: 一般的には併用しません。Beam Search は決定論的な探索であり、Top-p のような確率的サンプリングとは設計思想が異なります。ただし、Diverse Beam Search はサンプリング的な要素を取り入れた折衷手法です。
Q3: GPT-4o や Claude はなぜ Beam Search を使わないのですか? A: 対話型LLMでは「唯一の正解」が存在しないため、多様で自然な応答を生成する確率的サンプリングが適しています。また、Beam Search はメモリ使用量がビーム幅に比例するため、数十億パラメータのモデルでは実用的なコストが高いことも理由です。