デコーディングとは
Decoding / デコード
モデルが計算した確率分布から、次に出力するトークンを実際に選び取る処理
ひとことで言うと
AIが計算した確率をもとに、次に出す言葉を実際に選ぶ処理。
概要
デコーディング(Decoding)とは、LLMが各ステップで計算した「次のトークンの確率分布」から、実際に出力する1つのトークンを選び取る処理、およびその選び方の戦略全般を指す。 常に最も確率の高いトークンを選ぶ貪欲法(Greedy Decoding)のほか、Temperature・Top-p・Top-kといったパラメータで分布を調整したうえで確率的にサンプリングする方法、複数の候補系列を並行して評価するビームサーチなど、様々なデコーディング戦略が存在する。 同じモデル・同じプロンプトでも、デコーディング戦略やパラメータを変えることで出力の性質(決定性・多様性・品質)が大きく変わる。 貪欲法は再現性の高さから事実性が求められるタスクに向く一方、確率的サンプリングは文章表現に多様性を持たせやすいため、用途に応じて戦略とパラメータを選択する必要がある。
背景
LLMの出力層は、語彙全体に対する確率分布を計算するだけであり、そこからどのトークンを実際に選ぶかは別途決める必要がある。 この選び方によって生成されるテキストの性質が大きく変わるため、デコーディングはLLM活用における重要な設計要素として発展した。
アーキテクチャ
各生成ステップで、モデルはまず語彙全体に対するロジット(スコア)を出力する。 デコーディング戦略は、このロジットにTemperature等の変換を施し、Top-p・Top-k等で候補を絞り込んだうえで、貪欲法・サンプリング・ビームサーチ等の方式に従って次のトークンを決定する。
ワークフロー
モデルが語彙全体に対するロジットを出力 → Temperature等でロジットを調整 → Top-p・Top-k等で候補トークンを絞り込み → 貪欲法・サンプリング・ビームサーチ等の方式で次のトークンを決定する。
コード例
デコーディング戦略(貪欲法とサンプリング)を切り替える
from transformers import AutoModelForCausalLM, AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained("gpt2")
model = AutoModelForCausalLM.from_pretrained("gpt2")
inputs = tokenizer("次の文章を続けてください: ", return_tensors="pt")
# 貪欲法(常に最も確率の高いトークンを選ぶ)
greedy = model.generate(**inputs, max_new_tokens=30, do_sample=False)
# サンプリング(Top-p・Temperatureで確率的に選ぶ)
sampled = model.generate(
**inputs, max_new_tokens=30, do_sample=True, top_p=0.9, temperature=0.7
)利点
- タスクの性質(事実重視・創造性重視等)に応じて出力の性質を調整できる
- モデル自体を再学習せずに、推論時の設定変更だけで挙動を制御できる
- 多くの推論ライブラリで、パラメータの指定だけで戦略を切り替えられ導入が容易
欠点
- デコーディング戦略・パラメータの組み合わせは、タスクやモデルに応じて調整が必要になる
- 貪欲法は同じ入力に対し常に同じ出力になり、単調な繰り返しに陥りやすい
- ビームサーチやサンプリングは、貪欲法より計算コストの増加を招きやすい
比較
- Temperature — Temperatureは、デコーディングにおける確率分布のばらつきを調整するパラメータの1つ
- ビームサーチ — ビームサーチは、複数の候補系列を並行評価する代表的なデコーディング戦略
- 投機的デコーディング — 投機的デコーディングは、デコーディングの速度を高速化する手法
関連用語
よくある質問
デコーディングとサンプリングの違いは?
デコーディングは、次のトークンを選ぶ処理全般を指す広い概念。 サンプリングは、確率分布に従って確率的にトークンを選ぶデコーディング手法の1つで、貪欲法やビームサーチと並ぶ選択肢の1つ。
どのデコーディング戦略から試せばいい?
事実性が求められるタスクは貪欲法や低いTemperatureのサンプリング、創造的な文章生成にはやや高めのTemperatureとTop-pの組み合わせから試すのが一般的な出発点とされる。
参考文献
- DocumentationHugging Face: Generation strategies