LLMのデコーディングにおいて、確率の高い順にトークンを累積し、累積確率がp(核)に達するまでのトークン集合のみを候補としてサンプリングする手法。Holtzman et al. (2020)が提案し、現在のLLM APIの標準デコーディング手法となっている。
Top-pサンプリング(Nucleus Sampling)とは、言語モデルのデコーディングにおいて、トークンを確率降順に並べ、累積確率が閾値p(核 = nucleus)に達するまでの最小トークン集合を候補として残し、その集合からサンプリングする手法である。Holtzman et al.の論文「The Curious Case of Neural Text Degeneration」(2020)で提案された。
Top-pの処理フローは以下の通りである。(1) softmax後の確率分布を降順にソート、(2) 上位から累積確率を計算、(3) 累積確率がpを超えた時点で以降のトークンを全て除外、(4) 残ったトークン集合(nucleus)を再正規化、(5) 再正規化した分布からサンプリング。
例: 語彙を確率降順に並べた結果
猫: 0.35, 犬: 0.25, 鳥: 0.20, 魚: 0.15, 虫: 0.05
p=0.8の場合:
累積: 猫(0.35) → 犬(0.60) → 鳥(0.80) ← ここでp到達
nucleus = {猫, 犬, 鳥}(3トークン)
魚と虫は除外
Top-kは常に固定k個のトークンを候補に残すが、Top-pは確率分布の形状に応じて候補数が動的に変化する。これがTop-pの最大の優位性である。
| コンテキスト | 確率分布の形状 | Top-k=40の候補数 | Top-p=0.9の候補数 |
|---|---|---|---|
| 「東京は日本の」 | 鋭く集中 | 40(多すぎる) | 2-3(適切) |
| 「好きな食べ物は」 | 広く分散 | 40(少なすぎる場合あり) | 50-100(適切) |
| 「2+2=」 | 極度に集中 | 40(大幅に多すぎる) | 1(適切) |
この動的適応性により、Top-pはコンテキストを問わず安定した出力品質を実現する。
| API | デフォルトTop-p | 備考 |
|---|---|---|
| OpenAI GPT-4/4o | 1.0 | Top-pフィルタリングなし(全トークン候補) |
| Anthropic Claude | 1.0 | Top-pは補助的に使用 |
| Google Gemini | 0.95 | Top-kとの併用がデフォルト |
| Meta Llama 3 | 0.9 | Metaの推奨値 |
OpenAIとAnthropicのデフォルトTop-p=1.0は、Top-pフィルタリングを事実上無効にしている。これはTemperatureによる制御を主軸とし、Top-pは必要に応じてユーザーが調整する設計思想を反映している。
p=0.9〜0.95が多くのタスクで良好な結果を出す汎用的な設定である。p=1.0はフィルタリングなし(全トークンが候補)、p=0はGreedy Decodingに相当する。
pを下げすぎると出力が単調になり、上げすぎると低確率の不自然なトークンが混入するリスクが高まる。実務上はp=0.9を起点として、タスクの性質に応じて微調整するアプローチが効率的である。
Top-p=1.0はTop-pフィルタリングを無効化するだけであり、Temperatureによるサンプリングは引き続き行われる。OpenAI APIのデフォルト設定(Temperature=1.0, Top-p=1.0)では、softmax後の元の確率分布からそのままサンプリングが実行される。
Min-pはMikolov (2023)が提案した手法で、最大確率トークンの確率にmin_p倍率を掛けた値を閾値とし、それ未満のトークンを除外する。Top-pが累積確率ベースであるのに対し、Min-pは最大確率からの相対閾値で判定する点が異なる。llama.cppやvLLMで実装が進んでいる。
使える。バッチ内の各シーケンスごとに独立してTop-pフィルタリングが適用される。ただし候補数がシーケンスごとに異なるため、GPU上での並列処理効率はTop-k(候補数固定)よりやや低下する場合がある。