LLMサンプリングのすべて:ダミー向け現代ガイド
(rentry.co)- LLMは次のトークン確率分布を計算した後に1つを選び、サンプリングはgreedy方式に制御されたランダム性を加えて出力の多様性を調整する
- temperature、反復ペナルティ、DRY、Top-K/Top-P/Min-Pは、トークン選択の前後でlogitsや確率分布を変え、候補範囲と相対確率を再構成する
- 各サンプラーは、固定個数、累積確率、最高確率に対する比率、エントロピー、n-gram反復、surprisalなど、異なる基準でトークンを残したり除外したりする
- 実際のパイプラインでは、フィルタリング、ペナルティ、temperature、分布調整の適用順序が結果を大きく変え、組み合わせによって効果が補完されたり上書きされたりする
- トークナイザーの語彙サイズと分割方式は、モデルが確率を与える単位や、DRYのようなn-gramベースのサンプラーが検出するパターンを変える
LLM生成とサンプリングの基本構造
- LLMはユーザープロンプトのようなテキストを入力として受け取り、次の単語に相当するトークンを計算する
- モデルは有効なトークンで構成された語彙を持ち、学習と推論でこの語彙を参照する
- 学習中には大量のテキストを見てトークンの内部確率マップを作り、推論中には学習済みの確率をもとに次のトークンを決定する
- 生成過程は2段階に分かれる
- 予測: 各位置で可能な次トークン全体の確率分布を計算する
- 選択: その分布から1つのトークンを選び、出力に追加する
- greedy方式は常に最も可能性の高いトークンを選ぶため、反復的で決定的なテキストを作りやすい
- サンプリングは選択段階に制御されたランダム性を入れ、出力をより多様にする
なぜ単語・文字ではなくトークンなのか
- 文字単位のトークン化は同じテキストをはるかに長いシーケンスにし、
tokenizationはサブワード方式の2〜3トークンではなく12トークンになることがある - 長いシーケンスはself-attentionにより多くの計算を要求し、モデルは
t-h-eのような複数位置の情報を1つの概念として結び付けなければならない - 単語単位のトークン化は英語の全単語や複数言語の単語を含める必要があるため、埋め込み行列が非常に大きく高価になる
- 新語や希少語に出会うと、単語単位方式は通常
"unknown"トークンに置き換えるため、意味情報を失う - サブワードトークン化は
grompuficiousのような新しい単語を既存サブワードの組み合わせで表現できる - 新しいトークナイザーを使う言語モデルは、学習データの代表サンプルから頻出するサブワードを見つけるようにトークナイザーを学習させ、語彙サイズをあらかじめ決める
サンプラーが扱う中核値
- logits: モデルが語彙中の各トークンに対して出力する正規化前スコアであり、値が高いほど次トークンである可能性が高い
- softmax: logitsを0〜1の値に変換し、全体の合計が1になる確率分布に変える
- entropy: 確率分布の不確実性やランダム性を表し、高いほどモデルは次トークンに自信がない
- perplexity: モデルがテキストにどれだけ驚いているかを表し、低いほど信頼度が高い
- n-gram: 連続するn個のトークン列で、
"once upon a"は3-gramである - context window: プロンプトと生成出力を含め、LLMが一度に処理できる最大トークン数である
確率分布を直接調整する基本サンプラー
- TemperatureはLLMの「創造性ノブ」のように動作する
- 低いtemperatureは最高スコアのトークンをより有力にし、予測可能性を高める
- 0.7〜1.0のような高めのtemperatureは3番目や4番目の候補も選ばれ得るようにして多様性を増やすが、誤りの可能性も高める
- 1.0を超える非常に高いtemperatureは、Min-Pのような他のサンプリングと併用しないと、出力が粗く予測しにくくなることがある
- 技術的にはlogitsをtemperature値で割ってからsoftmaxを適用する
- Presence Penaltyは、すでに一度でも出現したトークンに固定ペナルティを適用する
- 出現回数に関係なく、以前に使用されたトークンのlogitsからペナルティ値を引く
- より良いペナルティ戦略があるため、一般には推奨されない
- Frequency Penaltyはトークン出現回数に比例してペナルティを強める
- あるトークンが3回出現したなら、logitsは
3 × frequency penaltyだけ減少する - 同じトークンが繰り返されるほど、再び選ばれる可能性は段階的に低くなる
- あるトークンが3回出現したなら、logitsは
- Repetition Penaltyはプロンプトと生成出力の両方に現れたトークンを対象にする
- 正のlogitsはペナルティで割り、負のlogitsはペナルティを掛けてより負にする
- 反復ループを断つのに有用だが、強すぎる値では一貫性のコストが生じる
反復パターンを防ぐDRY
- DRY(Don't Repeat Yourself) は、単純な単語反復より広い範囲で反復パターンを検出する
- 生成済みトークン列からn-gram反復を見つけ、そのパターンをそのまま続けるトークンにペナルティを与える
"the cat sat on the"のようなパターンが以前に現れ、同じ流れが再び始まると、以前その後に続いた次トークンが選ばれにくくなる- 長い反復パターンほど、より強いペナルティが適用される
- 主なパラメータは、ペナルティ強度であるmultiplier、n-gram長に応じた増加率であるbase、最小・最大n-gram長、sequence breaker、range limitなどである
- punctuationのようなsequence breakerはパターンマッチングを初期化でき、効率のために最近のテキストだけを考慮する範囲制限もある
- 創作ライティングのように反復表現が不自然な領域で特に有用である
候補を切り詰めるフィルタリングサンプラー
- Top-Kは全語彙ではなく上位K個のトークンだけを残す
- Kが40なら、最も可能性の高い40個の候補からのみ選ぶ
- 残りのlogitsは
-∞に設定され、softmax後は事実上確率0になる
- Top-P(Nucleus) は固定個数の代わりに、累積確率がしきい値Pを超える最小候補集合を残す
- Pが0.9なら、上位候補の累積確率が90%に達するまで含める
- モデルが確信しているときは候補が少なく、不確実なときはより多くの候補が残る
- 少なくとも1つのトークンは常に残るよう、最高確率トークンは保持する
- Min-Pは最高確率トークンに対する比率で品質の下限を設定する
- 最高確率が0.6でMin-Pが0.1なら、しきい値は0.06である
- 最高候補に比べて確率が低すぎるトークンは除外される
- 通常は1.0〜1.2程度の高めのtemperatureと併用され、Min-P値は0.1程度の非常に低い値で使われる
- Top-KやTop-Pのように全語彙のソートを必要としないため、より効率的である
- Top-Aは最高確率の二乗に比例するしきい値を使う
- モデルの確信が高いほど、二乗効果でしきい値がさらに高くなり、候補が大きく絞られる
- Min-Pより先に登場した方式で、技術的にはMin-Pが線形であるのに対し、Top-Aは二乗ベースである
- Epsilon Cutoffは固定確率しきい値より低いトークンを除去する
- 分布特性に関係なく同じ基準を適用する
- 単純で予測しやすいが、Eta Cutoffのように適応的ではない
分布の形状と不確実性を活用するサンプラー
- Top-N-Sigmaはlogitsの最大値と標準偏差を使って統計的なしきい値を作る
- 基準は
最大logit - N × 標準偏差である - 分布の絶対値だけでなく、全体スコア分布の広がりも反映する
- 基準は
- Tail-Free Sampling(TFS) は確率分布の曲率を見て、長いテールが始まる地点を探す
- logitsを降順に並べて確率に変換した後、二次差分の絶対値を計算する
- 曲率の累積分布がしきい値を超える地点以降のトークンを除去する
- 絶対確率値よりも分布の形状に注目する
- Eta Cutoffは個別確率と全体エントロピーを同時に使う
- モデルが確信している低entropyの状況では、より厳しいカットオフが適用される
- モデルが不確実な高entropyの状況では、より緩やかなカットオフが適用される
- しきい値は
etaとsqrt(eta) * exp(neg_entropy)の最小値で決まる
- Locally Typical Samplingは確率そのものではなく、平均surprisalにどれだけ近いかを見る
- 予測しやすすぎるトークンも、驚きが大きすぎるトークンも、どちらもあまり「typical」ではないとみなす
- surprisal deviationが小さい順にトークンを並べ、
typical-pで保持する累積確率量を決める
- Quadratic Samplingはフィルタリングではなく、logits分布全体を非線形変換する
- 最高スコアトークンを基準に、他のlogitsとの差をquadratic・cubic項で調整する
- smoothing factorは調整強度を、smoothing curveは変換形状を制御する
sが正なら分布はより鋭くなり、kが正なら分布を平坦化する方向に働く
予測可能性と多様性を制御する高度な方式
- XTC(eXclude Top Choices) は確率的に有効化され、最も予測しやすい選択肢を意図的に除外する
- 有効化確率と除外しきい値をパラメータとして使う
- しきい値を超える上位候補のうち、最も低いスコアの候補1つを除外し、残りの高確率候補を取り除く
- 低確率候補を切る一般的なフィルタとは異なり、最も無難な選択肢を狙い撃ちする
- Mirostatは目標surprisalを維持するよう動的に調整するフィードバック方式である
- 現在の
muthresholdで驚きが大きすぎるトークンをふるい落とす - トークン選択後に実際のsurprisalを計算し、目標値
tauと比較する etaはmuをどれだけ速く調整するかを決めるlearning rateである- 更新式は
mu_{t+1} = mu_t - η × (surprisal_t - τ)である - テキスト生成のperplexityを一定に保とうとする自己調整方式である
- 現在の
- Dynamic Temperature Samplingは現在の分布のentropyに応じてtemperatureを変える
- 低entropyではより高いtemperatureで多様性を加える
- 高entropyではより低いtemperatureで出力を集中させる
- ユーザーは最小temperature、最大temperature、exponentを設定する
- 計算式は
temperature = min_temp + (max_temp - min_temp) * (normalized_entropy ^ exponent)である
Beam SearchとContrastive Search
- Beam Searchは複数の候補シーケンスを並列に維持し、全体確率の高い経路を探す
- beam widthの数だけ候補シーケンスを保持し、各decoding stepで候補を拡張した後、上位候補だけを残す
- 通常、各段階で
2k個の候補をサンプリングし、完了済みシーケンスなどを除外した後でも十分な候補が残るようにする - スコアはシーケンスに含まれるすべてのトークンのlogprob合計である
- 同じ入力に対して決定的に同じ出力を作り、コストが高く、より良いサンプリング方式があるため、最近ではあまり使われない
- Contrastive Searchは文脈に合った高確率と反復パターン回避を同時に最適化する
- まずTop-K候補を選ぶ
- 既存contextと候補continuationのhidden representationを比較し、similarityベースのdegeneration penaltyを計算する
- 最終スコアは
score(x) = α * P(x) - (1-α) * sim(x, context)である αは可能性と多様性のバランスを調整する- Beam Searchと同様に広く使われる方式ではない
サンプラー適用順序が結果を変える仕組み
- 実際のLLM実装では、サンプリング技法を順番に適用することが多く、一部ライブラリはリクエストごとの順序変更を許可するが、大半はそうではない
- 一般的なパイプラインは次の順序をたどる
- モデルがraw logitsを生成する
- 考慮すべきでないトークンをフィルタリングまたは禁止する
- repetition、frequency、presenceペナルティを適用する
- DRYのようなパターンベース手法を適用する
- temperature scalingを適用する
- Top-K、Top-P、Min-Pのような分布調整手法を適用する
- 最終確率分布からトークンをサンプリングする
- Temperatureは実装によって、ペナルティやpost-softmaxサンプラーの外側で最初または最後に適用される
- 大半のタスクではtemperatureが先に適用される
- 創作ライティングでは通常最後に適用される
- 各サンプラーは、次のサンプラーが見る確率地形を変える
- ペナルティは既に使われたトークンのピークを下げ、他候補を相対的に持ち上げる
- 低いtemperatureは分布を鋭くし、高いtemperatureは平坦にする
- Top-K/Pのようなフィルタは低確率トークンを除去し、残った確率を再正規化する
順序依存の相互作用と組み合わせ
- Temperature → Filtering の順序は、まず分布全体を再構成してからフィルタリングする
- 低いtemperatureは、フィルタ前の時点から確率質量を少数トークンに集中させる
- 高いtemperatureは、確率質量をより広く拡散させてからフィルタされる
- Filtering → Temperature の順序は、まず候補を切り、その後、残ったトークン間の相対確率だけをtemperatureが調整する
- 高いtemperatureを使っても、元のフィルタで除去されたトークンは戻ってこない
- Top-K 40とtemperature 1.5で先にフィルタを適用すると、もともとの上位40個だけが残る
- Penalties → Temperature は、まず反復トークンの確率を下げ、その後temperatureがその調整を強めたり弱めたりする
- 高いtemperatureでは、ペナルティ効果が事実上打ち消されることがある
- 低いtemperatureでは、ペナルティが過度に増幅されることがある
- Temperature → Penalties は、temperatureで再構成された分布上でペナルティが作用するため、よりバランスが良く予測しやすいペナルティ効果を生みうる
- DRYは位置に敏感である
- パイプライン前半で適用すると反復防止効果は強いが、その後のサンプラーがペナルティを受けたトークンを再び押し上げることがある
- 後半で適用すると、前段のサンプラーがすでに一部候補を除去した後なので弱くなることがあるが、トークン選択直前の最後の防波堤になる
- 相互補完的な組み合わせもある
- Top-K + Top-P: Top-Kはハード上限を与え、Top-Pはモデルの確信度に適応する
- Temperature + Min-P: 高いtemperatureは分布を平坦化し、Min-Pは最高候補に対する品質下限を設ける
- 衝突する組み合わせもある
- High Temperature + Low Top-K: 低いTop-Kが候補を強く制限するため、temperature効果の多くを上書きする
- 複数のフィルタ方式の同時使用: Top-K、Top-P、Min-P、TFSを同時に使うと、最も制約の強い方式が支配し、他は重複する可能性がある
- XTC + Top-A: どちらも上位選択肢を別の方法で除外しようとするため、サンプリング空間を過度に狭めることがある
トークナイザーがサンプリング空間を作る仕組み
- トークナイザーは、モデルが何に対して確率を予測するか、そしてサンプラーがどの候補を扱うかを決める
- サブワードアルゴリズムは、文字単位の長いシーケンス問題と、単語単位の巨大語彙・unknown問題の間でバランスを取る
- BPE(Byte Pair Encoding) は文字やbyteベースの語彙から始め、学習コーパスでもっとも頻繁に現れる隣接symbolペアを繰り返しマージする
- 目的の語彙サイズに達するまでマージを繰り返す
- 例として、語彙サイズ32000または128256 unitsが挙げられている
- 標準BPEでは空白や句読点ベースのpre-tokenizationが必要な場合があり、実装ごとにwhitespace処理が一貫しないことがある
- SentencePieceはテキストを事前分割せず、Unicode文字列として直接扱う
- 空白をトークンの一部として符号化できる
- raw Unicode上で動作するため、whitespaceを
U+2581として明示的に符号化し、tokenizationとde-tokenizationを可逆かつlosslessにできる - 内部的にBPEやunigram language model方式を実装できる
- 言語非依存性と可逆性により、現代のLLMで人気が高い
語彙サイズ・トークン境界・希少語の影響
- トークナイザーは固定語彙サイズを持ち、大きい語彙はより多くの完全語を含み、小さい語彙はサブワードにより多く依存する
"sampling"や"probability"が単一トークンなら、モデルは概念全体の可能性を一度に予測する- 頻出フレーズでは、より直接的で予測しやすい出力が可能になる
- 希少語では
<UNK>や不自然なサブワード結合の問題が生じうる
"sampling"をsampl+ingのように分割すると、モデルはより細かい段階で予測する- temperatureのようなサンプラーが許せば、
samplingではなくsamplerに変わる余地が生まれる - 希少語を断片から構成できる
- common sub-word prefixに固着すると、一貫性が低かったり行き詰まった出力になることがある
- DRYのようなペナルティは、より短く意味の曖昧なシーケンスを追跡しなければならない
- temperatureのようなサンプラーが許せば、
- 同じフレーズでもトークナイザーによって分割が異なる
"State-of-the-art"はState+-+of+-+the+-+artになることもあれば、SentencePieceスタイルでState+_of+_the+_artになることもある- 頻出していれば全体が単一トークンになることもある
- トークン境界はDRYのようなn-gramベースサンプラーに直接影響する
"once upon a time"が4トークンなら、DRYは4-gramを容易に検出できる- 単一トークンなら、出力をrollbackしない限り同じ方法でペナルティを与えにくい
- 希少語や新語は、BPEやSentencePieceで既知の断片に分解されうる
<UNK>が作られると、サンプラーが考慮できる意味のある選択肢が1つ減る- サブワード方式では断片を創造的に組み合わせられるが、希少語の生成には複数のサンプリング段階が必要になるため、単一のknown tokenより途中で逸脱する可能性が高くなる
1件のコメント
Hacker News のコメント
これに関連して、私たちの min_p 論文は ICLR 投稿 12,000 本中 18 位に入り、口頭発表に選ばれた
https://iclr.cc/virtual/2025/oral/31888
ポスターも人気があった: https://iclr.cc/media/PosterPDFs/ICLR%202025/30358.png?t=174...
口頭発表はここで見られる。このテーマで Yoshua Bengio をいじる場面があり、彼が最初の質問者になっている。2人目の発表者は19:30ごろから始まり、発表スライドも一緒にあってかなり笑える: https://iclr.cc/virtual/2025/session/31936
論文: https://arxiv.org/abs/2407.01082
min_p の著者の1人として、現時点で汎用サンプラーとしては Top N sigma が圧倒的に最高だと確認できる。また temperature は今よりずっと高く調整してもよく、そうすべきでもある。min_p や top N sigma のような手法を使えば、temperature 100 でもまったく問題ない
もう一つ、論文の末尾で著者たちが推奨していない top_k = 2 と超高温 temperature の組み合わせも、それ自体かなり興味深い。約10語ごとにスペルミスが出るが、同時にかなり面白い創造性が生まれるようだ
分岐数がとんでもなく大きく、ノード展開のコストも高いのは分かるが、実際には探索していないという点がずっと妙に感じられていた
ここで抜けている点の一つは、サンプラーはモデルの内部状態にアクセスできないということだ。サンプラーは出力分布に基本的な数学を適用しているだけで、その分布には技術的には多少の意味論が含まれているとはいえ、モデルほど賢くなければ解読できない
ここで説明されている反復ペナルティや DRY のようなサンプラーも同じだ。モデルは無数のさまざまな方法で自己反復でき、それをすべて防ぐ唯一の方法は、より良い学習であって、n-gram 検索や古典的な自然言語処理方式ではない。指であらゆる穴をふさごうとしているようなものだが、指はいくつあるのか?
自己回帰プロセスをハックすれば、Min-P のような低いところにぶら下がった果実で改善や気の利いたトリックは可能だが、悪いモデルを良いモデルに変えようという目的なら方向が間違っている
Top n sigma は2024年半ばから、min_p は2023年からあったにもかかわらず、まだオープンソースの外、つまり HF/vllm の外では、こうしたイノベーションが統合されるのを待っている。API 提供者が意図的に遅くしている理由は、モデルが創造的になりすぎるリスクを負いたくないからで、高い temperature がウォーターマーキングを壊す可能性も大きい
もう一つ、モデルに自分のサンプリング設定を知らせるのはとても簡単だ。各トークンまたは各生成のたびに、その設定をモデルへ戻してやればよい。たとえば構造化生成で可能だ。モデルは自分のサンプリング設定を制御でき、ごくわずかな追加プログラミングだけで「内部状態にアクセス」できる。今ではそのコードもモデルが代わりに書ける
最近、Ollama/llama.cpp 向けのサンプリングガイドも少し書いてみたので、フィードバックや修正提案を歓迎する: https://smcleod.net/2025/04/comprehensive-guide-to-llm-sampl...
全体がよく整理され、分かりやすく説明されていて、新しい試みをどこで効果的に行えるかを開いてくれる点が良い
たとえば、なぜ単語全体をトークンとして使わないのだろうか?限定された「ロボット方言」を持つ「ロボット」を作れる。新語や珍しい単語を扱う能力はないだろうが、学習データと入力データを修正して、そうした単語を既存の語彙に翻訳できる。そうすればずっと小さなマッピングができ、文字どおりロボットらしくもなり、ユーザーは C-3PO のように、このロボットがどんな回答を得意とするか期待値を持てる
LLM に単に「次のトークン」ではなくアイデアを出力させようとする試みなら、ロジットベクトル上で選択する過程が、その元のアイデアを壊してしまいそうだ。アイデアが完成しているなら、ロジットに対するサンプリングを使う必要はないはずだ
この枠組みでは、サンプリングは出力に近いレベル、つまり「次に言う単語は何か」で起きるべきではない
数週間前、関連テーマである制約付きサンプリングを扱ったインタラクティブな記事を作った。この文章のほうがずっと徹底してはいる
http://michaelgiba.com/grammar-based/index.html
LLMモデルはトークン化を暗黙的に行えるのだろうか? 別個のトークナイザーを作らず任意の文字列を受け入れ、その後ニューラルネットワークにそれをトークンへ変換させ、そのネットワークの重みを残りのLLMと一緒に学習する、という方式のこと
これらのワンホットベクトルは線形層を通って、モデルの隠れ状態サイズへ圧縮される。たとえばトークン語彙は1万〜10万個あり得るが、隠れ状態サイズは500〜2,000程度かもしれない。モデルの残りの部分はすべて隠れ状態空間[1]で動作し、その中にはさまざまな高次概念が含まれている
トークン化を取り除くと、エンコーダーは私たちが慣れ親しんでいる隠れ状態空間に到達するために、より多くの仕事をしなければならない。対応付けられていないバイト列から隠れ空間への、より効率的なエンコーディングを見つけられる可能性もあるが、多くのモデルのトークン化がすでに学習セットの統計的性質に基づいていることを考えると、その可能性は低そうだ。「anti」や「ism」をモデルに渡す前に単一トークンへ自動結合しなければ、モデルの低層のアテンションヘッドが同じことをしなければならない
以前は文字シーケンスでモデルを学習していたが、効率のためにトークン化へ移行したので、このトレードオフはおそらく価値がない可能性が高い
[0] トークンIDのリストをそのまま渡すことはできない。トークン123.25には数学的な意味がなく、トークンIDを増減させることにも意味はない
[1] 性能は向上するが、解釈可能性はより難しくなる。特に隠れ空間の基底ベクトルは単語や概念と直接対応しておらず、すべての概念は一種のN次元の輪の上に存在する
ほんの数年前に発明された技術を使うように手法を更新したものをモダンと呼ぶのは、ほとんどリテラシーの問題に近い。モダンだと言うなら何と対比しているのか、古典的なLLMサンプリングなのか?
modern, adj. designed and made using the most recent ideas and methods
— https://dictionary.cambridge.org/us/dictionary/english/moder...
この記事が説明している内容は、まさにその定義に当てはまる。この7年ほどの間にこの領域では多くの進展があり、たとえばGPT 1、2、3は現在の基準では明らかにかなり古く、上の定義の意味ではモダンではない
ChatGPTが大衆的なブレークスルーだっただけだ。それ以前にも、スマートフォンのキーボードは10年前からLLMを使っていた
本当に有用な文書だ。説明が非常に明確で、扱う範囲も広い
誰が書いたのか知っている人はいる? 著者が表示されておらず、無料のMarkdown pastebinに載っている
DRY繰り返しペナルティの部分が興味深かった。私はLLMに入力を意図的に正確にコピーして出力してほしいことがよくある。たとえば長い会話を要約するときは、論点を最もよく示す正確な引用を求めることにしている。あとで原文を検索して事実確認しやすいからだ
DRYペナルティは、そうした目標とは逆に働きそうだ