この回のゴール
- 生成 AI が「出力を 1 つ選ぶ瞬間」に何が起きているかを理解する
- softmax, temperature, top-k, top-p (nucleus), greedy の違いを数式と図で掴む
- ChatGPT の「temperature 設定」の意味を腹落ちさせる
1. 前回の復習
前回、生成モデルは「確率分布 $p(x)$ を学ぶ」ものだと学びました。
LLM の場合、これは「次のトークンがこれになる確率」です。例えば「今日は良い」の次には:
天気 : 0.31
日 : 0.14
気分 : 0.08
思い出 : 0.02
...(数万トークン分)
👉 どうやって 1 つ選ぶ? これがこの回のテーマです。
2. まず: ロジット → 確率(softmax)
ニューラルネットから出てくるのは「ロジット(logit)」という 実数ベクトル $z$。これを確率に変えるのが softmax:
$$ p_i = \frac{e^{z_i}}{\sum_j e^{z_j}} $$
性質: - 全ての $p_i \ge 0$ - $\sum p_i = 1$ - 大きい $z_i$ ほど大きい $p_i$
3. Temperature(温度)でシャープさを変える
softmax にパラメータ $T > 0$ を入れる:
$$ p_i = \frac{e^{z_i / T}}{\sum_j e^{z_j / T}} $$
| $T$ | 何が起きる | 呼び方 |
|---|---|---|
| $T \to 0$ | 最大のロジットだけが確率 1 になる | greedy / argmax |
| $T = 1$ | 通常の softmax | 標準 |
| $T = 2, 3, \ldots$ | 分布が平坦に。意外な単語が出やすい | 高温(創造的だが意味不明も) |
| $T \to \infty$ | 一様分布(完全ランダム) |
👉 低温 = 真面目、高温 = 創造的、というイメージ。
4. Top-k サンプリング
確率の 上位 k 個 だけを残し、他をゼロにしてから正規化。
$$ p_i' = \begin{cases} p_i / Z & \text{if } i \in \text{top-}k \ 0 & \text{otherwise} \end{cases} $$
効果: ロングテールの「変な単語」を切り捨てて破綻を防ぐ。 問題: 常に k 個に切るのは硬い。文脈によって「妥当な選択肢数」は変わるはず。
5. Top-p(Nucleus)サンプリング
確率の高い方から足していって、累積確率が $p$ を超えるまで の単語を残す。
$$ V_p = \min \bigl{ V' \subseteq V : \textstyle \sum_{i \in V'} p_i \ge p \bigr} $$
効果: 文脈に応じて残す単語数を動的に変えられる。top-k より柔軟。
現代の LLM では top-p が主流(Claude API でも top_p を指定できる)。
6. 比較表
| 手法 | 確率の操作 | 多様性 | 破綻リスク |
|---|---|---|---|
| Greedy(argmax) | 最大 1 個のみ | ❌ なし | ❌ 低い(繰り返しやすい) |
| Temperature | 全体をシャープ/平坦化 | 可変 | $T$ が大きいほどリスク |
| Top-k | 上位 k 個だけ | 中 | 中 |
| Top-p | 累積 p まで | 高(柔軟) | 低 |
| 組み合わせ | Temperature + Top-p | 実用的 | 制御しやすい |
Claude API や OpenAI API は temperature と top_p の両方を同時に使います。
7. なぜ決定論的(greedy)にしないのか
理論的には「一番確率の高い次の単語」を選び続ければ良さそうですが:
- 繰り返しに陥る(「とても、とても、とても...」)
- 多様性がなく、創造的な出力が出ない
- 文章全体として最適とは限らない(局所最適に落ちる)
だから適度なランダム性が実用的に必要。
まとめ
- ロジット $z$ は softmax で確率 $p$ に変換される
- temperature は分布のシャープさを変える(低温=真面目、高温=創造的)
- top-k は上位 k 個を残す硬めの制御
- top-p (nucleus) は累積確率で切る柔軟な制御(現代の主流)
- greedy (argmax) は繰り返しに陥りやすく、実用では使いにくい
この回の限界(次への動機)
ここまでで「確率分布から 1 つ選ぶ」仕組みはわかりました。でも、そもそも 数万トークンの確率分布 をどうやって作っているのか? は未解決です。
👉 次回は「ナイーブベイズで文生成」。N-gram という 最もシンプルな言語モデル で、実際に文を生成してみます。
よくある質問
Q. temperature=0 にしておけば安全なのでは? A. 安全だが 多様性がゼロ になります。同じ質問に毎回全く同じ答え。創作や壁打ちには不向き。一方コード生成や分類タスクでは temperature=0 が推奨されます。
Q. top-k と top-p はどっちを使えば? A. 迷ったら top-p。文脈によって「妥当な選択肢数」が変わるので、動的に切れる top-p の方が実用的です。
Q. 「ハルシネーション」は temperature のせい? A. 一因ではあるが、根本原因ではありません。モデルの 学習データ と 知識の限界 に由来します。だから後の章で RAG が必要になります。
参考文献
- Holtzman et al. The Curious Case of Neural Text Degeneration (2019) — top-p の原論文
- Claude API docs: temperature / top_p / top_k パラメータ