チャプター 07 · 生成 · 7 min
次の単語を選ぶ
分布は計算された。さて、次は?
本書のこの段階で、モデルは次のトークンに対する確率分布を計算する方法を知っている。テキストを生成するには、今度はそこから1つを選ぶ必要がある。これがサンプリングのステップだ。
このメカニズムは第1章ですでに垣間見た。今こそ注意深く立ち戻るときだ——慎重なモデルと創造的なモデル、信頼できるアシスタントと反復するオウムを分けるのは、まさにこれだからだ。
なぜ常に最も確率の高いものを選ばないのか?
最もシンプルな戦略——greedy decoding——は、常に最大確率のトークンを選ぶ。速く、決定論的で、再現可能だ。
それでも、単独で使われることはほとんどない。なぜか?
なぜなら greedy decoding は奇妙なほど平板なテキストを生成するからだ。ループに陥る(「とてもとてもとても面白い面白い面白い……」)。常に最もありふれた単語を選ぶ。技術的には正しい文を生成するが、起伏がない。モデルは人間のテキストで訓練されており、人間のテキストには常に予測不可能性が含まれている——そしてその予測不可能性は生成にも現れる必要がある。
そこで確率的サンプリングだ:分布に従ってランダムにトークンを引く。トークンの確率が高いほど選ばれる可能性が高いが——他のトークンにもチャンスがある。
3つのレバー
生の確率的サンプリングはノイズが多すぎる。引く前に通常3つのフィルタを適用する:
温度
温度 T は softmax の前に logits を割る。最も強力な調整パラメータだ。
T = 1.0— モデルから出てくる分布そのまま(基準)T < 1.0— 分布がより尖る:高いものはより高く、低いものはより低くなる。モデルはより予測可能になる。T → 0— greedy decoding と等価(可能なトークンは1つだけ)。T > 1.0— 分布が平坦化:確率の低い選択肢が浮上する。モデルは創造的に、あるいは奇妙にすらなる。T → ∞— 一様、モデルは完全にランダムに引く。
温度は予測可能性と想像力の間のダイヤルだ。
Top-k
語彙のすべてのトークン(5万以上)を許可するのではなく、最も確率の高い k 個を残し残りをゼロにし、再正規化する。k = 40 は創造性のための古典的な値で、k = 1 は greedy に戻る。
利点:偶然引かれてしまう可能性のある不条理なトークン(0.0001%のもの)をきっぱり排除する。欠点:最適な k の値はステップごとに依存する——5候補で十分なときもあれば、100すべてが妥当なときもある。
Top-p(nucleus sampling)
top-k より賢い。累積質量が p を超える最小集合を残し、再正規化する。
実用上、top-p ≈ 0.9 が現代の LLM のデフォルト設定になっている。モデルの確信度に自動的に適応する。
もう一度操作してみよう
このビジュアライゼーションは第1章ですでに見た——まさにこのトピックなのでここで再演する:
Temperature を動かしてみよう:0 ではモデルは決定論的で繰り返しが多く、1.5 では創造的になりすぎて意味が崩壊する。Top-k と Top-p はあり得ない候補の長い裾を切り落とし、もっともらしい候補には触れない。
今回は観察してみよう:
- 首都では、モデルは非常に確信を持っている(次点に対して 10.0 vs 5.0)ので、
Paris以外を出すには極端に高い温度(>1.5)が必要だ。答えが既知のプロンプトに典型的だ。 - 空の2ステップ目では、いくつかの継続が意味的に妥当だ。
temperature = 1.5で、光の代わりに色や海が出てくるかもしれない。意味は正しいまま、しかしテキストはより予測しにくくなる。 top-k = 1では、他のどんな設定も無意味になる:greedy モードだ。- 首都プロンプトで
top-p = 0.5の場合、Parisだけが生き残る(単独で既に50%に達するからだ)。
いくつかの典型的な設定
ユースケース別の典型的な設定:
| ケース | Temperature | Top-p |
|---|---|---|
| コード、構造化データ | 0.0–0.2 | 1.0 |
| 事実的な回答 | 0.3–0.5 | 0.9 |
| 一般的な会話 | 0.7 | 0.9 |
| ブレインストーミング、創造的な執筆 | 0.9–1.2 | 0.95 |
| バリエーションの生成 | 1.2–1.5 | 0.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 のような——はそれだけではない。この段階のベースモデルはテキスト補完器であって、アシスタントではない。どうやって一方からもう一方に移るのか?それが最後の章のテーマだ:アライメント。
更新日