Nucleus Sampling
Top-p(核)サンプリングでは、確率の合計がpを超える最小集合から各トークンを選びます。そのため、top-kとは異なり、候補集合はモデルの確信度に応じて変化します。
核サンプリングはtop-pサンプリングとも呼ばれ、確率の合計がしきい値pに達する最小の候補集合から、次のtokenを選んでサンプリングするデコード手法です。ワシントン大学とAllen Institute for AIのAri Holtzman氏らは、2019年の論文The Curious Case of Neural Text Degenerationでこの手法を紹介しました。GPT-2 Largeを使った実験では、貪欲デコードとビームサーチは言語モデルを単調で反復的なループに陥らせる一方、確率分布全体からサンプリングすると一貫性のないテキストに逸脱することを示しました。また、分布の信頼性が低い裾野を切り捨てると、パープレキシティと多様性の両面で、人間の文章に最も近いテキストが生成されました。現在、top-pはほぼすべての大規模言語モデルのテキスト生成 APIで標準的な設定になっています。
Nucleusの選び方#
各ステップで、言語モデルは語彙内のすべてのトークンにスコアを付け、softmaxがそのスコアを確率に変換します。次に核サンプリングは、トークンを確率の高い順に並べ、その順に確率を加算して合計がpに達するまで候補を集めます。集合の外にあるトークンを除外し、残ったトークンの確率の合計が1になるよう再正規化してから、トークンを1つサンプリングします。
確率が0.50、0.25、0.15、0.10の4つの候補があり、pを0.8に設定したとします。最初の2つの合計は0.75でしきい値に届かないため、3つ目も加わり、Nucleusの合計確率は0.90になります。4つ目のトークンは除外され、残った3つのトークンは再正規化後におよそ0.56、0.28、0.17の確率で選ばれます。
Nucleusの特徴は、ステップごとにサイズが変化することです。「フランスの首都は」の後では、ほぼすべての確率を1つのトークンが占めるため、Nucleusは単語1つに縮まります。物語の冒頭では、確率が何百もの妥当な単語に分散するため、Nucleusはそれらを含むように広がります。候補数を固定する方法では、このように適応できません。
6トークンの語彙に対して1回デコードする、同じ処理のPyTorchでの実装例:
import torch
# 6トークンの語彙に対する次トークンの確率
probs = torch.tensor([0.10, 0.40, 0.04, 0.25, 0.06, 0.15])
top_p = 0.75
# 並べ替えた後、累積確率がtop_pに達するまでトークンを保持します
sorted_probs, order = probs.sort(descending=True)
cumulative = sorted_probs.cumsum(dim=0)
keep = cumulative - sorted_probs < top_p # top_pを超えるトークンも保持します
# Nucleusを再正規化し、次のトークンIDをサンプリングします
nucleus = sorted_probs * keep
next_token = order[torch.multinomial(nucleus / nucleus.sum(), num_samples=1)]
print(order[keep].tolist(), next_token.item())出力にはNucleus内のトークンID 1、3、5が表示されます。これらの確率の合計は0.80で、その後にサンプリングされたIDが続きます。このステップではトークン0、2、4は選ばれず、スクリプトを再実行すると、残った3つからそれぞれの確率に応じて選択されます。
トップPと貪欲デコード、トップK、温度の比較#
- 貪欲デコードは、最も確率の高いトークンを常に選択します。決定論的で短い事実回答に適していますが、長い出力ではループに陥りがちです。
- トップKサンプリングでは候補数を固定します。kを50に設定すると、確信度の高いステップでも無意味なものを含む50個のトークンからサンプリングする一方、不確実なステップでは妥当な候補が切り捨てられる可能性があります。トップPでは、固定の候補数の代わりに、確率の合計に対する割合を固定します。
- 温度は、softmaxを適用する前にモデルのスコアを調整します。1未満では上位候補に確率が集中し、1を超えると確率分布が平坦になります。トップPは温度の適用後に使われるため、温度を上げるとNucleusも広がります。
- Min-pサンプリングでは、最も確率の高いトークンの確率に対して、設定した割合以上の確率を持つトークンをすべて残します。そのため、しきい値はモデルの確信度にも連動します。Hugging Face Transformers、vLLM、llama.cppでは、top-pと並んでこの方式を利用できます。
温度とtop-pはいずれもランダム性を制御するため、標準的には両方を同時に変えるのではなく、どちらか一方を調整することが推奨されます。多くの推論エンジンではtop-kとtop-pを併用することもでき、その場合top-kが候補数の上限として機能します。
トップPの値の選び方#
top-pを1.0にするとフィルターが無効になり、一般的なデフォルト値は0.9から1.0の範囲です。top-pはモデル自体の確率を再形成するだけなので、事実の正確性を高めるには、たとえば検索拡張生成を使ってプロンプトに根拠を与える必要があります。検索拡張生成は、必要な事実をモデルに与えることでハルシネーションを減らします。値を高くすると、ブレインストーミング、チャットボットの対話、創作文章で多様性が高まります。0.5など低い値では出力がより予測しやすく反復的になり、データ抽出、分類プロンプト、コードに適しています。制約付きデコードではさらに進んで、必須の形式を壊すトークンをすべてマスクします。
同じ設定は、ビジョンパイプラインにおける言語出力も制御します。Ultralytics YOLO26の検出結果をきっかけにシーンの説明を視覚言語モデルから生成する場合、Ultralytics LLMインターフェースはtop_pなどのリクエスト引数をプロバイダーのAPIにそのまま渡します。そのため、0.5など低い値を設定すると、類似したフレームの説明文を似た表現にそろえられます。










