← 回首頁

LLM 取樣策略(Temperature + Top-k + Top-p / nucleus)

你每天用的 ChatGPT、Claude,寫出下一個字時其實不是「直接挑最有把握的那個」。模型每一步會先對整份詞表算出 一組分數(logits),代表「這個字接下去有多合理」;接著把分數轉成一份機率分佈,再依機率抽一個當作 這一步的輸出。問題來了——要多聽話、還是多有創意?全挑最高分會變得死板重複;完全照機率抽又可能冒出一個 離題的冷僻字。這頁示範真實 LLM 用來拿捏這個取捨的三道旋鈕:Temperature(溫度,調整整體隨機度)、 Top-k(只留最高分的前 k 個候選)、Top-p / nucleus(只留累積機率達門檻的「核心集合」)。

用一個生活情境串起來:你想養一隻寵物,腦中候選有「貓、狗、魚、鳥、兔、龜、鼠、蛇」,各自有一個偏好分數。 Temperature 像心情——冷靜(T<1)時偏好被放大、幾乎總挑最愛的那個;興奮(T>1)時連冷門選項都 願意考慮。Top-k 像「只在前三名裡選」的硬規定,不管分佈長什麼樣都固定留 k 個。Top-p 則更聰明—— 「把握夠集中就少留幾個、把握分散就多留幾個」,依分佈形狀動態決定核心集合大小。截斷之後都會 重新正規化(保留集合機率除以其總和,使和 = 1),最後才在這份重塑過的分佈上抽出這一步的字。

為什麼 AI 時代重要

這一頁不是理論練習,而是所有生成式 LLM 實際跑的取樣層——ChatGPT / Claude / Gemini 產出的每一個 token, 都經過 temperature 縮放、再套 top-k 或 top-p(nucleus)截去長尾雜訊,最後才抽樣。你在 API 上調的 temperaturetop_ptop_k 三個參數,對應的就是本頁三道旋鈕:調高 temperature / top_p 讓輸出更發散多樣(適合腦力激盪),調低則更聚焦保守(適合抽取事實、寫程式);top-p 因為會依分佈形狀動態縮放核心集合,是目前多數模型的預設策略。看懂這頁,就看懂了「同一個提問為何每次回答 略有不同」與「該怎麼調參數控制它」。

它是取樣演算法(Reservoir / Alias)與序列解碼(Beam / Greedy)的延伸

「在正規化分佈上依機率抽一個」這件事的底層機制,正是 取樣演算法 Reservoir / Alias 在解決的問題(Alias 表可做 O(1) 加權抽樣); 本頁多做的是抽樣之前的「分佈重塑」策略層——先用 temperature / top-k / top-p 把分佈改造成想要的形狀, 兩者疊起來才是完整的 LLM 取樣。另一條血緣連到 序列解碼 Viterbi / Beam Search:Beam Search 是保留多條高分路徑的 決定性解碼、Greedy 永遠挑最高分,而本頁的取樣是隨機解碼——同屬「LLM 每一步從機率分佈選下一個 token」的兩大流派(收斂最優 vs 探索多樣),temperature→0 時取樣即退化為 greedy。

取樣流程(temperature → top-k → top-p → 抽樣 → 估計 vs 真實)

固定情境「我想養一隻 ___」,對 8 個候選 token 給定固定 logits(嚴格降冪,使機率亦嚴格降冪,長條由左至右 遞減,被保留的 top-k / top-p 皆為連續前綴)。流程分五段:先掃 T=1.0 / 0.5 / 1.5 觀察 temperature 如何 重塑分佈(argmax 不變、只有集中程度改變);再於 T=1.0 分佈上示範 Top-k=3 截斷 + 重新正規化;接著示範 Top-p=0.9 由大到小累加選出 nucleus(核)+ 重新正規化(本例 nucleus 為 4 個,刻意與 Top-k 的 3 個 不同集合,製造「固定個數 vs 動態個數」的對照張力);最後在 Top-p 分佈上以固定 seed 抽一個字, 並用多種子(2000 次)實測入選頻率對照理論正規化機率。抽樣隨機源與 Reservoir / Alias 為同一顆 LCG:next(x) = (1664525·x + 1013904223) mod 2^32、 取值一律用高 16 位、先 burn-in 3 步。

固定 logits [3.0, 2.2, 1.5, 1.0, 0.4, -0.3, -1.1, -2.5]、token [貓,狗,魚,鳥,兔,龜,鼠,蛇]; temperature 掃描 {1.0, 0.5, 1.5};Top-k=3、Top-p=0.9;單次抽樣 seed=42;多種子頻率枚舉 seed=0..1999 (共 2000 次)。
已執行步數(steps):0 階段:temperature Temperature:1
長條 = 各 token 目前機率(所有機率 < 1,渲染以 1.0 為滿高,長條高度即絕對機率百分比,跨幀可直接 比較高低)。綠色(sorted)= 被 top-k / top-p 保留的 token;暗色(out,range 之外)= top-k 被截斷區; 藍色(checking)= top-p 當前累加中的 token;粉紅(pivot)= argmax;紅色(found)= 這一步抽中的 token。 被截斷的 token 於重新正規化後機率為 0,長條歸零、視覺上直接「消失」。 誠實揭露:單次抽樣是決定性教學簡化(固定 seed → 固定 token),真實 LLM 每步用不同亂源; 多種子頻率是有限次數(2000)重跑的統計量,會收斂到理論正規化機率附近但非精確相等,存在 抽樣波動;logits / token / 溫度值皆為教學縮尺,非真實模型詞表(真實詞表達數萬 token)。

目前機率分佈(逐 token,綠色 = 被保留)

單步操作紀錄(opLog)

(空)

Top-p 累加明細(nucleus 核)

抽樣落點(seed=42)

估計(2000 種子實測頻率)vs 真實(理論正規化機率)

token實測頻率理論機率差值