Top-k サンプリング(トップケーサンプリング)
LLMのテキスト生成で確率上位k個のトークンのみを候補として残し、それ以外を除外した上でサンプリングする手法。kの値が小さいほど出力は決定的になり、大きいほど多様性が増す。シンプルで計算コストが低い反面、確率分布の形状に適応できない制約がある。
Top-k サンプリングとは
Top-k サンプリングは LLM のテキスト生成において、モデルが算出した確率分布から上位 k 個のトークンのみを候補として残し、残りを除外した上でサンプリングを行う手法である。2018年に Fan らの論文で体系化され、初期の GPT モデルや Google の LaMDA で広く採用された。
動作原理
Top-k サンプリングの処理は以下のステップで行われる。
- モデルが語彙中の全トークンに対して確率を算出する
- 確率の降順にソートし、上位 k 個を選択する
- 選択されたトークンの確率を正規化(合計1.0に再スケーリング)する
- 正規化された確率分布からサンプリングする
| k の値 | 候補トークン数 | 出力の特性 |
|---|---|---|
| k = 1 | 1個のみ | 完全に決定的(greedy decoding と同等) |
| k = 5 | 5個 | 非常に保守的 |
| k = 40 | 40個 | GPT-2 デフォルト。バランスが良い |
| k = 100 | 100個 | 多様性が高い |
| k = 0(無効) | 全トークン | フィルタなし |
Top-p との比較
| 特性 | Top-k | Top-p |
|---|---|---|
| 候補数 | 固定(常に k 個) | 動的(確率分布に依存) |
| 適応性 | 低い | 高い |
| 計算コスト | ソート + 切り捨て | ソート + 累積計算 |
| 提案年 | 2018年 | 2019年 |
| 弱点 | 分布に関係なく同数を保持 | 計算がやや複雑 |
Top-k の最大の弱点は、確率分布の形状に関わらず常に固定数のトークンを候補にする点である。次のトークンがほぼ確定している場面(例: 「東京」の後の「都」)でも k=40 なら39個の不要なトークンが候補に残り、逆に多くの選択肢が妥当な場面ではk個に絞ることで有効な選択肢を除外してしまう。
主要フレームワークでの実装
| フレームワーク | パラメータ名 | デフォルト値 |
|---|---|---|
| Hugging Face Transformers | top_k | 50 |
| Google Gemini API | top_k | 40 |
| LM Studio | top_k | 40 |
| llama.cpp | top_k | 40 |
| Ollama | top_k | 40 |
| vLLM | top_k | -1(無効) |
OpenAI API と Anthropic API は Top-k パラメータを直接公開しておらず、Top-p による制御を推奨している。ローカル LLM ランタイム(llama.cpp、Ollama、LM Studio)では Top-k が標準パラメータとして提供される。
実用的な設定ガイド
- 正確性重視(コード・翻訳): k=5〜10 で候補を強く絞り込む
- 一般的な対話: k=40(多くのフレームワークのデフォルト)が無難
- 創造的タスク: k=100〜200 で多様な表現を許容
- ローカル LLM: LM Studio や Ollama では k=40 + Temperature 0.7 が定番の組み合わせ
FAQ
Q1: Top-k と Top-p はどちらを使うべきですか?
A1: 一般的には Top-p の方が適応的で優れているとされる。ただしローカル LLM では Top-k がデフォルトで有効なことが多く、k=40 + top_p=0.9 の併用が実用的。
Q2: k=1 と Temperature=0 は同じですか?
A2: 結果はほぼ同じ(最も確率の高いトークンを選択)だが、実装上は異なる。k=1 はフィルタリング後にサンプリング、Temperature=0 はソフトマックス段階で確率を集中させる。
Q3: Top-k の値を大きくしすぎるデメリットはありますか?
A3: k が語彙サイズ(32,000〜128,000)に近づくと事実上フィルタなしと同じになり、Temperature だけで制御する状態になる。計算リソースの無駄は少ないが、低確率トークンが選ばれるリスクが増す。