JOVANA
Explore Library Glossary Getting Started Three Levels Fields How it works Mission
Join the mission
All guides

截斷取樣:Top-k、Top-p 與 Min-p

光靠溫度,仍可能從長尾抽到垃圾。截斷法在擲骰之前先剪掉壞選項。

長尾問題

詞彙表有數萬個 token,在任一步,其中數千個都帶著極小但非零的機率。單看每個都不太可能,但加總起來,那條長尾握有出乎意料的機率質量——而且在當下脈絡中多半是胡言。純溫度取樣仍可能伸進那條尾巴、抽出一個錯字,這正是不連貫與退化的來源之一。解法:先截斷分布——丟掉不太可能的尾巴,只從剩下的部分取樣。

p_i = \frac{e^{z_i}}{\sum_{j} e^{z_j}}

Softmax 将 logits 转换为整个词表上的概率分布——它那条由极小却非零的词元组成的长尾,正是截断方法要修剪的部分。

Top-k:保留固定數量

Top-k 取樣是最直接的切法:把 token 依機率排序,保留前 k 個(例如 k = 40),其餘丟掉,把存活者重新正規化(renormalize)使其加總為 1,再取樣。它保證你絕不會選到前 k 名之外。它的弱點是僵硬:當模型幾乎確定時,k = 40 太多了(正確 token 已有 99% 機率,卻還拖著 39 個干擾項),而當模型真心在許多好選項間糾結時,k = 40 又太少。

Top-p(核取樣):保留固定質量

核取樣(nucleus sampling),更常被叫做 top-p,靠著以機率質量而非數量來修剪,修好了 top-k 的僵硬。把 token 排序,然後保留累積機率首次達到 p(例如 p = 0.9)的最小集合——即(nucleus)——再從中取樣。模型有把握時,核可能只有 1~2 個 token;模型不確定時,核會自然擴大到數十個。正是這種自適應,讓 top-p(通常再配一個小的 top-k 當保險)成為多數聊天系統的預設。

\sum_{i \in V^{(p)}} p_i \ge p, \quad |V^{(p)}|\ \text{minimal}

核采样保留概率之和已经至少达到 p 的最小词元集合,再做归一化。

Min-p:相對的下限

Min-p 取樣又換一個角度:它把門檻設成相對於最高 token。選一個比例(例如 min_p = 0.1),然後丟掉所有機率低於「最可能 token 機率 × 該比例」的 token。若最佳 token 在 0.6,下限就是 0.06;若最佳 token 只有 0.2,下限就是 0.02——於是存活集合會在模型有把握時自動收緊、不確定時自動放鬆。許多人發現 min-p 即使在高溫下仍保持連貫,因此在創意寫作中很受歡迎。

\text{keep } t_i \iff p_i \ge \text{min\_p}\cdot \max_{j} p_j

Min-p 设定一个相对下限:仅当某词元的概率不低于最高概率词元的 min_p 倍时才保留它。

它們如何與溫度疊用

這些方法不是對手——通常是疊著用。常見的流程是先跑過濾器界定一個合理的候選池,再用溫度重塑剩下的,最後抽取。順序很重要,因為溫度會改變截斷門檻所衡量的那組機率。

  1. 從詞彙表上完整的 softmax 分布開始。
  2. 套用截斷過濾器(top-k、top-p 或 min-p),保留一個合理的候選集合。
  3. 套用溫度重塑存活機率,再重新正規化。
  4. 從重新正規化的集合中取樣一個 token,繼續循環。

直接懲罰重複

截斷壓制垃圾,但你也能正面迎擊重複重複懲罰(repetition penalty)會降低任何已出現過 token 的 logit,抑制迴圈。近親有頻率懲罰(frequency penalty,依出現次數加重)與存在懲罰(presence penalty,token 一出現就吃一記固定懲罰,推動模型用新詞)。要輕輕用——調太高,模型會開始迴避它真正需要的字,例如常見冠詞或某個人名。