Top-p(Nucleus Sampling)(トップピー)
LLMのサンプリング手法の一つで、確率の高いトークンから累積確率がp以上になるまでのトークン集合(nucleus)からのみサンプリングする方式。Top-p=0.9なら上位90%の累積確率に含まれるトークンのみが候補となり、低確率の不自然なトークンを除外できる。
Top-p(Nucleus Sampling)とは
Top-p サンプリング(別名 Nucleus Sampling)は、2019年にHoltzmanらが論文「The Curious Case of Neural Text Degeneration」で提案した LLM のテキスト生成手法である。確率分布の上位から累積確率が閾値 p に達するまでのトークン集合(nucleus)を動的に構成し、その中からサンプリングを行う。
動作原理
Top-p サンプリングの処理フローは以下の通りである。
- モデルが各トークンの確率を算出する
- トークンを確率の降順にソートする
- 上位から確率を累積していき、合計が p を超える直前までのトークンを候補集合(nucleus)とする
- nucleus 内のトークンの確率を正規化(合計1.0に再スケーリング)する
- 正規化された確率分布からサンプリングする
| Top-p 値 | Nucleus の大きさ | 出力の特性 |
|---|---|---|
| 0.1 | 非常に小さい(1〜3トークン) | ほぼ決定的 |
| 0.5 | 小さい(5〜15トークン) | 保守的で一貫性が高い |
| 0.9 | 中程度(数十トークン) | バランスの取れた多様性 |
| 0.95 | やや大きい | 自然な多様性 |
| 1.0 | 全トークン(フィルタなし) | Temperature のみで制御 |
Top-k との違い
Top-k サンプリングは固定数の上位 k 個のトークンから選択するのに対し、Top-p は確率分布の形状に応じて候補数が動的に変化する。
- 確率が集中している場合(例: 次のトークンがほぼ確定): Top-p は自動的に少数のトークンに絞り込む
- 確率が分散している場合(例: 複数の妥当な続きがある): Top-p は多くのトークンを候補に含める
この適応的な挙動が Top-p の最大の利点であり、Top-k の「固定数」という制約を解消している。
主要 API での Top-p 設定
| API | パラメータ名 | デフォルト値 | 設定範囲 |
|---|---|---|---|
| OpenAI | top_p | 1.0 | 0.0〜1.0 |
| Anthropic | top_p | 未指定時は無効 | 0.0〜1.0 |
| Google Gemini | top_p | モデル依存 | 0.0〜1.0 |
| Hugging Face | top_p | 1.0 | 0.0〜1.0 |
| vLLM | top_p | 1.0 | 0.0〜1.0 |
Temperature との組み合わせ
Top-p と Temperature は異なるレイヤーで出力を制御する。Temperature はソフトマックス前のロジットを調整し、Top-p はソフトマックス後の確率分布をフィルタリングする。
OpenAI は公式に「Temperature と top_p の両方を同時に変更することは推奨しない」としている。一方を固定して他方を調整するアプローチが一般的である。
FAQ
Q1: Top-p=0.9 と Top-p=1.0 の違いは大きいですか?
A1: 実用上の差は小さいが、p=0.9 は極めて低確率のトークン(タイポや無関係な単語)を除外する効果がある。安全策として p=0.9〜0.95 に設定するケースが多い。
Q2: Top-p と Top-k は併用できますか?
A2: 併用可能で、両方のフィルタを通過したトークンのみが候補になる。Hugging Face Transformers や vLLM では両方を同時に指定できる。
Q3: Top-p の値はタスクによって変えるべきですか?
A3: 基本的には Temperature の調整を優先し、Top-p は 0.9〜0.95 程度に固定するのが無難。コード生成など正確性重視のタスクでは 0.1〜0.5 に下げると効果的。