目前機率分佈(逐 token,綠色 = 被保留)
單步操作紀錄(opLog)
Top-p 累加明細(nucleus 核)
抽樣落點(seed=42)
估計(2000 種子實測頻率)vs 真實(理論正規化機率)
| token | 實測頻率 | 理論機率 | 差值 |
|---|
你每天用的 ChatGPT、Claude,寫出下一個字時其實不是「直接挑最有把握的那個」。模型每一步會先對整份詞表算出 一組分數(logits),代表「這個字接下去有多合理」;接著把分數轉成一份機率分佈,再依機率抽一個當作 這一步的輸出。問題來了——要多聽話、還是多有創意?全挑最高分會變得死板重複;完全照機率抽又可能冒出一個 離題的冷僻字。這頁示範真實 LLM 用來拿捏這個取捨的三道旋鈕:Temperature(溫度,調整整體隨機度)、 Top-k(只留最高分的前 k 個候選)、Top-p / nucleus(只留累積機率達門檻的「核心集合」)。
用一個生活情境串起來:你想養一隻寵物,腦中候選有「貓、狗、魚、鳥、兔、龜、鼠、蛇」,各自有一個偏好分數。 Temperature 像心情——冷靜(T<1)時偏好被放大、幾乎總挑最愛的那個;興奮(T>1)時連冷門選項都 願意考慮。Top-k 像「只在前三名裡選」的硬規定,不管分佈長什麼樣都固定留 k 個。Top-p 則更聰明—— 「把握夠集中就少留幾個、把握分散就多留幾個」,依分佈形狀動態決定核心集合大小。截斷之後都會 重新正規化(保留集合機率除以其總和,使和 = 1),最後才在這份重塑過的分佈上抽出這一步的字。
temperature、top_p、top_k 三個參數,對應的就是本頁三道旋鈕:調高
temperature / top_p 讓輸出更發散多樣(適合腦力激盪),調低則更聚焦保守(適合抽取事實、寫程式);top-p
因為會依分佈形狀動態縮放核心集合,是目前多數模型的預設策略。看懂這頁,就看懂了「同一個提問為何每次回答
略有不同」與「該怎麼調參數控制它」。
固定情境「我想養一隻 ___」,對 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 步。
| token | 實測頻率 | 理論機率 | 差值 |
|---|