チャプター 07 · 生成 · 7 min

次の単語を選ぶ

温度、top-ktop-p。確率分布をテキストに変換する技術。

分布は計算された。さて、次は?

本書のこの段階で、モデルは次のトークンに対する確率分布を計算する方法を知っている。テキストを生成するには、今度はそこから1つを選ぶ必要がある。これがサンプリングのステップだ。

このメカニズムは第1章ですでに垣間見た。今こそ注意深く立ち戻るときだ——慎重なモデルと創造的なモデル、信頼できるアシスタントと反復するオウムを分けるのは、まさにこれだからだ。

なぜ常に最も確率の高いものを選ばないのか?

最もシンプルな戦略——greedy decoding——は、常に最大確率のトークンを選ぶ。速く、決定論的で、再現可能だ。

それでも、単独で使われることはほとんどない。なぜか?

なぜなら greedy decoding は奇妙なほど平板なテキストを生成するからだ。ループに陥る(「とてもとてもとても面白い面白い面白い……」)。常に最もありふれた単語を選ぶ。技術的には正しい文を生成するが、起伏がない。モデルは人間のテキストで訓練されており、人間のテキストには常に予測不可能性が含まれている——そしてその予測不可能性は生成にも現れる必要がある。

そこで確率的サンプリングだ:分布に従ってランダムにトークンを引く。トークンの確率が高いほど選ばれる可能性が高いが——他のトークンにもチャンスがある。

3つのレバー

生の確率的サンプリングはノイズが多すぎる。引く前に通常3つのフィルタを適用する:

温度

温度 Tsoftmax の前に logits を割る。最も強力な調整パラメータだ。

  • T = 1.0 — モデルから出てくる分布そのまま(基準)
  • T < 1.0 — 分布がより尖る:高いものはより高く、低いものはより低くなる。モデルはより予測可能になる。
  • T → 0greedy decoding と等価(可能なトークンは1つだけ)。
  • T > 1.0 — 分布が平坦化:確率の低い選択肢が浮上する。モデルは創造的に、あるいは奇妙にすらなる。
  • T → ∞ — 一様、モデルは完全にランダムに引く。

温度は予測可能性と想像力の間のダイヤルだ。

Top-k

語彙のすべてのトークン(5万以上)を許可するのではなく、最も確率の高い k 個を残し残りをゼロにし、再正規化する。k = 40 は創造性のための古典的な値で、k = 1 は greedy に戻る。

利点:偶然引かれてしまう可能性のある不条理なトークン(0.0001%のもの)をきっぱり排除する。欠点:最適な k の値はステップごとに依存する——5候補で十分なときもあれば、100すべてが妥当なときもある。

Top-pnucleus sampling

top-k より賢い。累積質量が p を超える最小集合を残し、再正規化する。

  • モデルが30の近い選択肢の間で迷うステップでは → top-p は合計が p に達するすべての選択肢を残す。
  • モデルが95%の確信を持つステップでは → top-p は単一のトークンだけを残す。

実用上、top-p ≈ 0.9 が現代の LLM のデフォルト設定になっている。モデルの確信度に自動的に適応する。

もう一度操作してみよう

このビジュアライゼーションは第1章ですでに見た——まさにこのトピックなのでここで再演する:

Temperature を動かしてみよう:0 ではモデルは決定論的で繰り返しが多く、1.5 では創造的になりすぎて意味が崩壊する。Top-kTop-p はあり得ない候補の長い裾を切り落とし、もっともらしい候補には触れない。

今回は観察してみよう:

  • 首都では、モデルは非常に確信を持っている(次点に対して 10.0 vs 5.0)ので、Paris 以外を出すには極端に高い温度(>1.5)が必要だ。答えが既知のプロンプトに典型的だ。
  • の2ステップ目では、いくつかの継続が意味的に妥当だ。temperature = 1.5 で、 の代わりに が出てくるかもしれない。意味は正しいまま、しかしテキストはより予測しにくくなる。
  • top-k = 1 では、他のどんな設定も無意味になる:greedy モードだ。
  • 首都プロンプトで top-p = 0.5 の場合、Paris だけが生き残る(単独で既に50%に達するからだ)。

いくつかの典型的な設定

ユースケース別の典型的な設定:

ケースTemperatureTop-p
コード、構造化データ0.0–0.21.0
事実的な回答0.3–0.50.9
一般的な会話0.70.9
ブレインストーミング、創造的な執筆0.9–1.20.95
バリエーションの生成1.2–1.50.95

これらは厳密なルールではない。しかし LLM を使うほとんどの製品で見つかる桁感だ。

知っておくべきもう3つのレバー

temperature / top-k / top-p のほかに、APIのあちこちに登場する設定がいくつかある。

Repetition penalty(OpenAI では frequency penalty / presence penalty)。すでに出力に現れたトークンにペナルティを課す。temperature を上げずに反復ループを断ち切るのに有用だ。典型的な値:1.05〜1.2。

Stop sequences。 出力中に現れたら即座に生成を停止する文字列のリスト。構造化された用途には不可欠だ:フォーマットされた対話では、モデルが勝手に会話を続けないように <|im_end|>\n\nUser: で停止させる。

Beam search 確率的にサンプリングする代わりに、各ステップで k 個の最良の部分シーケンスを並行して保持し、生成終了時に全体の確率を最大化するものを選ぶ。結果はより「滑らか」になるが、しばしば不自然だ。機械翻訳や音声認識で使われ、創造的な生成ではあまり使われない。

決定論の幻想

最後の微妙な点。temperature = 0 でも、同じモデルへの2回の呼び出しが実用上異なる結果を返すことがある:

  • 非決定的な量子化(INT8/FP8 の計算には誤差の余地がある)。
  • サーバ側の動的バッチング(他のリクエストに応じて、浮動小数点演算の順序が変わる)。
  • プロバイダで黙って変わるモデルのバージョン

LLM の正確な出力に依存するテストを書いたら、苦労することになる。

次へ

この段階で、LLM がどのように動くかを知っている:

  • テキストをトークンに分割する、
  • それらをベクトルに変換する、
  • アテンションを通じて互いに見合わせる、
  • Transformer ブロックを積み重ねて表現を洗練する、
  • 次のトークンに対する分布を予測する、
  • サンプリング戦略でそこから1つを引く。

それでも、「アシスタント」と呼ばれるもの——ChatGPT や Claude のような——はそれだけではない。この段階のベースモデルはテキスト補完器であって、アシスタントではない。どうやって一方からもう一方に移るのか?それが最後の章のテーマだ:アライメント

更新日

次のトークンを選ぶ:temperature、top-k、top-p · Step by Token