長尾問題
詞彙表有數萬個 token,在任一步,其中數千個都帶著極小但非零的機率。單看每個都不太可能,但加總起來,那條長尾握有出乎意料的機率質量——而且在當下脈絡中多半是胡言。純溫度取樣仍可能伸進那條尾巴、抽出一個錯字,這正是不連貫與退化的來源之一。解法:先截斷分布——丟掉不太可能的尾巴,只從剩下的部分取樣。
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 當保險)成為多數聊天系統的預設。
核采样保留概率之和已经至少达到 p 的最小词元集合,再做归一化。
Min-p:相對的下限
Min-p 取樣又換一個角度:它把門檻設成相對於最高 token。選一個比例(例如 min_p = 0.1),然後丟掉所有機率低於「最可能 token 機率 × 該比例」的 token。若最佳 token 在 0.6,下限就是 0.06;若最佳 token 只有 0.2,下限就是 0.02——於是存活集合會在模型有把握時自動收緊、不確定時自動放鬆。許多人發現 min-p 即使在高溫下仍保持連貫,因此在創意寫作中很受歡迎。
Min-p 设定一个相对下限:仅当某词元的概率不低于最高概率词元的 min_p 倍时才保留它。
它們如何與溫度疊用
這些方法不是對手——通常是疊著用。常見的流程是先跑過濾器界定一個合理的候選池,再用溫度重塑剩下的,最後抽取。順序很重要,因為溫度會改變截斷門檻所衡量的那組機率。
- 從詞彙表上完整的 softmax 分布開始。
- 套用截斷過濾器(top-k、top-p 或 min-p),保留一個合理的候選集合。
- 套用溫度重塑存活機率,再重新正規化。
- 從重新正規化的集合中取樣一個 token,繼續循環。
直接懲罰重複
截斷壓制垃圾,但你也能正面迎擊重複。重複懲罰(repetition penalty)會降低任何已出現過 token 的 logit,抑制迴圈。近親有頻率懲罰(frequency penalty,依出現次數加重)與存在懲罰(presence penalty,token 一出現就吃一記固定懲罰,推動模型用新詞)。要輕輕用——調太高,模型會開始迴避它真正需要的字,例如常見冠詞或某個人名。