温度、top-p、top-k: パラメータ
top-p(nucleus sampling)は、確率の高いトークンから順に、累積確率がp(例えば0.9)に達するまでのトークンだけを残します。top-kは、例えば40個という固定数の候補を残します。温度はサンプリングのランダム性を調整し、0に近い場合、モデルはほぼ常に最も確率の高いトークンを選びます。Ollamaは温度0.8、top-k 40、top-p 0.9で開始します。
ローカルモデルの設定で必ず登場する数値が3つあります。温度(temperature)、top-p、top-kです。このガイドでは、それぞれの設定が候補となる単語のリストから何を取り除き、何を動かすのかを、具体的な数値の例とともに説明します。Ollamaとllama.cppのデフォルト値、モデル開発元が公開している推奨設定、そしてその適用方法も紹介します。
#Top-p、top-k、温度:定義を1つの表で解説
モデルは単語を生成するたびに、語彙内の各トークンの確率を計算します。その後、サンプリングパラメータによって、どのトークンを選ぶかが決まります。Top-pとTop-kは候補を絞り込み、温度は確率の高いトークンと低いトークンの間の差を調整します。いずれもモデルに知識を追加するものではなく、多様性とリスクだけを調整します。
| パラメータ | 作用する対象 | 低い値 | 値が高い場合 | Ollama のデフォルト値 |
|---|---|---|---|---|
| temperature | 出現確率の高いトークンと低いトークンの差 | より決定性の高い回答 | 多様性が増え、誤りも増える | 0,8 |
| top_p | 累積確率によって決まるリストのサイズ | 短いリスト、保守的な出力 | 候補リストが広くなり、多様性が増す | 0,9 |
| top_k | 最大候補数 | 候補は少ない | 候補が多い | 40 |
| min_p | 最大確率を基準とする相対的なしきい値 | 緩やかなフィルタリング | 強いフィルタリング | 0.0(無効) |
| repeat_penalty | 最近使用されたトークンに対するペナルティ | 繰り返しが増える | 繰り返しが減る一方、不自然な出力になるリスクがある | 1.0(無効) |
これらのデフォルト値は、OllamaのModelfileリファレンスに記載されているものです。多くのモデルでは、設定ファイルに独自の値が指定されており、それらがデフォルト値を上書きします。そのため、後述するように、モデルの説明を確認することが重要です。
#LLMが次の単語を選択する仕組みは?
お使いのマシンで、プライベートかつ無料のChatGPTを1時間で構築 — LM Studio、Ollama、Open WebUI、ご自身のドキュメント、クラウド不要。
- 永久に利用できるオンラインスペース
- PDF + ファイル
- 生涯アップデート
モデルは各位置について、語彙全体にわたる確率分布を生成します。常に最も確率の高いトークンを選ぶ方法は「貪欲デコーディング」と呼ばれ、単調で繰り返しの多い文章になり、ときには同じ出力を繰り返すループに陥ります。そのため、サンプリングパラメータで制御しながら、ランダムにトークンを選びます。シード(seed)を固定すると、この選択を再現できます。Ollamaのドキュメントには、同じシードと同じプロンプトを使えば同じ文章が生成されると明記されています。
フィルターの適用順序は重要です。LM Studioなどでも使われているGGUF推論エンジンのllama.cppでは、デフォルトの順序はペナルティ、DRY、top-n sigma、top-k、typical-p、top-p、min-p、XTCで、最後に温度が適用されます。つまり、top-kとtop-pは元の確率に作用し、温度は残った候補からサンプリングするためだけに使われます。多くのチュートリアルでは逆の順序が説明されていますが、実際の順序はエンジンによって異なる場合があり、llama.cppでは--samplersパラメータで設定できます。
#数値を使った例:各設定で何が残るか
次の単語の候補を7つとし、それぞれの確率を0.45、0.25、0.12、0.08、0.05、0.03、0.02とします。この表は説明用の計算例であり、実際のモデルで測定した結果ではありません。
| フィルター | ルール | 残る候補 | カバーされる確率 |
|---|---|---|---|
| なし | すべての単語 | 7 | 100 % |
| top_k = 3 | トップ3 | 3 | 82 % |
| top_p = 0,9 | 累積値が0.90に達した時点で終了します | 4 (0,45 + 0,25 + 0,12 + 0,08) | 90 % |
| top_p = 0.7 | 累計0.70 | 2 | 70 % |
| min_p = 0.1 | 最も確率の高いトークンの確率の10%を超えるトークンを残す。しきい値は0.045 | 5 | 95 % |
要点は次の通りです。top-k は状況に関係なく常に同じ数の候補を保持しますが、top-p と min-p は適応します。モデルが非常に確信している場合(トークンの確率が 0.95 など)、top-p は候補を 1 つまたは 2 つに絞る可能性があります。一方、10 語の間で迷っている場合は、より多くの候補を保持します。そのため、top-p は top-k よりも好まれることが多いです。
#1. 温度:ランダム性を調整するボタン
サンプリングの前に、モデルのロジットを温度で割ります。温度が低いとトークン間の差が広がり、最も確率の高いトークンが他を圧倒します。温度が高いと差が縮まります。温度が0の場合、モデルは常に最も確率の高いトークンを選び、試行のたびに同じ出力を生成します。この点はllama.cppのドキュメントでも確認されています。
| 候補 | 元の確率 | T = 0,5 | T = 1,5 |
|---|---|---|---|
| 1er | 45 % | 70 % | 34 % |
| 2e | 25 % | 22 % | 23 % |
| 3e | 12 % | 5 % | 14 % |
| 4e | 8 % | 2 % | 11 % |
| 5e à 7e | 合計10% | 1,3 % | 17,8 % |
- 0 à 0,3
- 抽出、分類、忠実な要約:毎回同じ回答を期待しています。
- 0,4 à 0,7
- 技術文書の作成、翻訳、サポート:内容が逸脱しない範囲で多様性を持たせる。
- 0,8
- Ollama および llama.cpp のデフォルト値:一般的な会話。
- 1以上
- 創造性、ブレインストーミング;誤りや逸脱のリスクが高まります。
#2. Top-p:適応フィルター
Top-p(核サンプリング、nucleus sampling)は、確率の高いトークンから順に、累積確率がpに達するまで候補として残します。0.9なら、確率分布の裾にある10%分を除外し、1.0なら何も除外しません。Ollamaのドキュメントでは、たとえば0.95のように値を高くすると、より変化に富んだ文章になり、0.5のように低くすると、より焦点を絞った保守的な文章になると説明されています。
- 0,5 à 0,7
- 非常に保守的:無難な回答になりますが、ときには単調です。
- 0,9
- Ollamaのデフォルト値:多様性を損なわずに、確率分布の裾を切り落とします。
- 0,95
- llama-server のデフォルト値であり、複数のモデルのドキュメントで推奨されている値です。
- 1,0
- フィルターが無効の場合、温度のみが作用します。
#3. Top-k:固定上限
Top-kは、確率が最も高いk個のトークンだけを残します。Ollamaのドキュメントでは、このパラメータを、意味の通らない出力が生成される確率を下げる手段として説明しています。値を高くすると(100)回答はより多様になり、低くすると(10)より保守的になります。デフォルト値はllama.cppと同じ40です。llama.cppでは、0にするとこのパラメータが無効になります。
| フィルター | 利点 | 制限 | 使用タイミング |
|---|---|---|---|
| top_k | シンプルで、計算量に上限を設けられる | 分布の形を考慮しない:モデルの確信度が高いときは候補が多すぎ、迷っているときは少なすぎる | 緩やかな制限(20〜100) |
| top_p | モデルの確信度に応じて調整 | 分布が平坦な場合、ロングテール部分まで通してしまうことがあります | 多様性の主な設定 |
| min_p | 最大の確率を基準とする相対的なしきい値で、temperatureの設定値が高くても安定 | あまり知られておらず、Ollamaではデフォルトで無効になっています | top_pの代わりに使い、多くの場合は高めのtemperatureと組み合わせる |
「top p vs top k」という検索クエリについては、top-pを主な設定として使い、top-kは安全策として残してください。同じ試行で両方を調整しないでください。そうすると、どちらの設定が違いを生んだのか分からなくなります。
#既定値と開発元の推奨事項
エンジンのデフォルト値は、汎用的な妥協点です。モデルの提供元は、それぞれのモデルに適した値を公開していることが多く、その値はデフォルト値と異なる場合があります。以下はQwen3.5のモデルカードが同モデル群に推奨する設定です。Ollamaのデフォルト値(温度0.8、top-p 0.9、top-k 40)と比較してください。
| モード | 温度 | top_p | top_k | presence_penalty |
|---|---|---|---|---|
| 論理的推論、一般的なタスク | 1,0 | 0,95 | 20 | 1,5 |
| 論理的推論と正確なコード生成 | 0,6 | 0,95 | 20 | 0,0 |
| 思考なし、一般的なタスク | 0,7 | 0,8 | 20 | 1,5 |
これらの値は、このモデルファミリーに適用されるもので、すべてのモデルに当てはまるわけではありません。他の開発元のモデルカードには異なる値が記載されています。Hugging FaceのモデルカードやOllamaライブラリのモデルページで、推奨サンプリングパラメータに関するセクションを探してください。Qwenのモデルカードにも、これらのパラメータへの対応は推論エンジンによって異なると明記されています。
#ペナルティ:繰り返し、出現頻度、出現の有無
ローカルモデル、特に小型のものや強く量子化されたものは、同じ文を繰り返すことがあります。ペナルティが対策になりますが、その欠点はあまり知られていません。Ollamaではrepeat_penaltyのデフォルト値は1.0で、無効になっています。ドキュメントでは、より強いペナルティを与える値の例として1.5が示されています。よく挙げられる1.1は、自分で選んで設定する値であり、デフォルト値ではありません。
- repeat_penalty
- 最近出現したトークンにペナルティを適用します。repeat_last_n(デフォルトは64)で、参照する範囲を設定します。
- frequency_penalty
- 出現回数に比例するペナルティ。長い生成に向いています。
- presence_penalty
- トークンが出現した時点でペナルティが適用され、より多様な語彙を促進します。Qwen は複数のモードで 1.5 を推奨しており、値が高すぎると言語の混在リスクがあります。
#Ollama にこれらの設定を適用する
方法は2つあります。名前を付けたモデルの設定値を固定する Modelfile を使う方法と、Modelfile と同じパラメータを指定できる API リクエストの options フィールドを使う方法です。Modelfile は日常的な利用に、API はプログラムからの利用に適しています。
Modelfile(システムプロンプト、コンテキスト、テンプレート)の詳細については、カスタマイズガイドを参照してください。LM Studio と Jan では、同じパラメータをモデルの設定パネルで調整できます。
#推論モデル:すべてを温度だけで調整しない
推論モデルは、回答を出す前にまず思考の過程を生成します。Ollama では、これらのモデルは思考用の独立したフィールドを公開しており、利用できるコマンドはモデルによって異なります。ドキュメントでは、指定可能な値とデフォルト値を確認するために show API に問い合わせることを勧めています。例えば gpt-oss のレベルは low、medium、high で、デフォルトは medium です。
単純な質問に対して無駄なリトライを減らすには、まず存在する思考レベルを調整すべきです。温度はモデルのドキュメントに従って設定すべきで、思考が極端に冷たいと停止し、極端に熱いと散漫になる可能性があります。
#用途別の初期プリセット
| 用途 | 温度 | top_p | その他の設定 |
|---|---|---|---|
| 抽出、分類、JSON | 0 à 0,2 | 0,9 | プロンプトで厳密な形式を指定 |
| 忠実な要約 | 0,2 à 0,3 | 0,9 | repeat_penaltyはわずかに1を上回る |
| 一般的な会話 | 0,7 à 0,8 | 0,9 | エンジンのデフォルト設定 |
| 執筆、アイデアの生成 | 0,8 à 1,0 | 0,95 | presence_penaltyを中程度に設定 |
| フィクション、創造性 | 1,0 | 0,95 | 話の脱線を抑える |
これらのプリセットは出発点であり、測定値ではありません。一度に1つのパラメータを変更し、同じプロンプトを3回実行して比較してください。多様性を期待しているのに3回の試行で同じ回答が得られる場合は、温度が低すぎるか、シードが固定されています。
#症状と試してみるべき設定
- モデルが同じフレーズを繰り返します
- repeat_penaltyを1.1前後に設定するか、presence_penaltyを有効にするか、num_predictで生成を短くしてください。
- 単調でありきたりな回答
- 温度を1段階上げます(0.7から0.9へ)、またはtop_pを緩めます。
- モデルは事実を創作します
- 温度を下げてください。ただし、それだけでは不十分です。ハルシネーションに関するガイドを参照してください。
- JSONが破損している
- temperatureを低く設定し、出力形式を明示的に指定してください。Ollamaの構造化出力モードが利用できる場合は、それを使ってください。
- 言語の混在または不自然な語彙
- presence_penaltyまたはrepeat_penaltyを下げたり、モデルの量子化をわずかに上げたりしてください。
LLMにおけるtop-pとは何ですか?+
top-pとtop-kの違いは何ですか?+
温度とtop-pを同時に調整する必要がありますか?+
コード用の温度は?+
Ollama でのデフォルト値は?+
min-p とは何ですか?使うべきですか?+
ご意見、誤りのご指摘、補足はありますか?ぜひお知らせください。皆さんにとってより良いガイドにするために役立ちます。