LLMのデコーディングにおいて、確率上位k個のトークンのみを候補として残し、それ以外を除外した上でサンプリングする手法。kの値で出力の多様性と安全性のトレードオフを制御する。
Top-kサンプリングとは、言語モデルが次のトークンを生成する際に、確率分布の上位k個のトークンのみを候補として残し、残りの全トークンの確率をゼロに設定した上で、再正規化した分布からサンプリングする手法である。Fan et al. (2018)の論文「Hierarchical Neural Story Generation」で提案され、GPT-2の公開時にOpenAIが採用したことで広く知られるようになった。
Top-kサンプリングの処理は3ステップで行われる。(1) モデルの出力logitにsoftmaxを適用して確率分布を得る、(2) 確率の高い順にk個のトークンを選択し、それ以外のトークンの確率を0に設定する、(3) k個のトークンの確率を再正規化(合計が1になるよう調整)し、その分布からサンプリングする。
例: 語彙={猫, 犬, 鳥, 魚, 虫}, 確率={0.35, 0.25, 0.20, 0.15, 0.05}
k=3の場合:
候補: {猫: 0.35, 犬: 0.25, 鳥: 0.20} → 再正規化 → {猫: 0.4375, 犬: 0.3125, 鳥: 0.25}
魚(0.15)と虫(0.05)は除外
| k値 | 候補数 | 出力の特性 | 典型的な用途 |
|---|---|---|---|
| 1 | 1 | Greedy Decodingと同一 | 数学・論理推論 |
| 5-10 | 少数 | 高品質・低多様性 | 事実ベースQ&A |
| 20-50 | 中程度 | バランス型 | 一般対話 |
| 100-200 | 多数 | 高多様性・要注意 | 創作・ブレスト |
| 語彙全体 | 全候補 | フィルタリングなし | 通常使わない |
GPT-2のデフォルト設定ではk=40が採用されていた。現在の主要LLM APIでは、Top-kよりもTop-p(Nucleus Sampling)がデフォルトで有効化されているケースが多い。
Top-kサンプリングの根本的な問題は、kが固定値であることに起因する。確率分布の形状はコンテキストによって大きく変わるが、kは常に一定数のトークンを候補に残す。
確率が少数トークンに集中しているコンテキスト(例:「東京は日本の」→「首都」がほぼ確定)では、k=40は不要に多くの低確率トークンを候補に含めてしまい、ノイズの原因になる。逆に確率が広く分散しているコンテキスト(例:「好きな食べ物は」→多数の候補が同程度の確率)では、k=40では有望な候補を切り捨ててしまう可能性がある。
この問題を解決するために提案されたのがTop-p(Nucleus)サンプリングであり、確率分布の形状に応じて動的に候補数を調整する。
Top-kフィルタリングはTemperature Scalingの後に適用される。Temperatureが高いと確率分布が平坦になるため、Top-kで切り捨てられるトークンの確率も相対的に高くなる。つまりTemperatureとTop-kの相互作用を考慮して両方のパラメータを調整する必要がある。
一般的にはTop-pの方が推奨される。Top-pは確率分布の形状に動的に適応するため、コンテキストごとに適切な候補数が自動調整される。ただし、候補数を厳密に制御したい場合はTop-kの方が直感的で扱いやすい。
Gemini APIではTop-kのデフォルト値はモデルバージョンによって異なるが、一般的にk=40前後に設定されている。APIドキュメントで最新のデフォルト値を確認することを推奨する。
結果は同じ(常に最高確率トークンを選択)だが、処理パスが異なる。Top-k=1はフィルタリング後に1トークンが残る。Temperature=0はsoftmaxの段階で確率を集中させる。実用上は区別する必要はない。