兩種選擇哲學
一旦有了機率分布,挑 token 大致有兩種方式。第一種是利用(exploit):永遠拿最可能的那個——這就是貪婪解碼(greedy decoding)。第二種是取樣(sample):把機率當成加權樂透,隨機抽一張,所以機率 30% 的 token 大約有 30% 機會被選中。兩者之間的張力就是取樣 vs 貪婪(sampling versus greedy)的核心。
為什麼純貪婪會變得乏味
貪婪感覺安全,但在開放式寫作上有個著名的失敗模式:它會陷入迴圈、變得平淡又重複——模型一直選同一個最舒服的接續,卡在「然後他們走了然後他們走了……」。這就是退化與重複(degeneration),也是創意任務寧可加入隨機性、而不去追逐那唯一最高機率句子的重要原因。
溫度:多樣性旋鈕
取樣最主要的旋鈕是溫度(temperature,T)。在 softmax 之前,每個 logit 都先除以 T。低溫(例如 0.2)會把分布變尖——最高的 token 遠遠壓過其他,行為因此靠回貪婪。高溫(例如 1.3)會把分布攤平——冷門 token 也有真正的機會,產生驚喜、有時不連貫的文字。當 T → 0,取樣會塌回貪婪;許多 API 直接把 `temperature=0` 當成貪婪。
温度 T 在 softmax 之前除以每个 logit:低温让分布更尖锐,高温让分布更平坦。
集束搜尋:獵捕最可能的整句
貪婪在每一步挑最好的 token,但此刻最好的 token 可能導向之後更糟的句子。集束搜尋(beam search)試圖修正這點:同時保留機率最高的 k 條部分序列(即集束,beam)、把它們全部展開,最後回傳機率最高的整條序列。它在有明確目標的任務上表現出色——機器翻譯、文法修正、簡短的事實回答。
但集束搜尋並不適合開放式生成。最可能的長文往往是最一般化的那篇,於是集束會塌縮成安全、重複的文字——同樣的退化陷阱,只是現在被內建進搜尋裡。這就是為什麼聊天與創意端點幾乎都改用取樣。
用 logit bias 微調個別 token
有時你不想改整個策略,只想推幾個特定 token。logit bias 讓你在 softmax 之前,為選定的 token 在 logit 上加一個固定數值。大的正偏置讓某 token 變得更可能;大的負偏置(朝 −100)等於封殺它——很適合用來禁止髒話、擋掉多餘的引號,或強制只能在「是/否」這組 token 裡選。
logit 偏置在 softmax 之前给选定词元的 logit 加上一个固定数值,从而上调或下调它们的概率。
# Pseudocode: bias applied to raw logits, before softmax
logits[token_id(" yes")] += 5.0 # strongly encourage
logits[token_id(" maybe")] -= 100 # effectively ban
probs = softmax(logits / temperature)
next_token = sample(probs)目前我們有一個全域設定(貪婪 vs 取樣)、一個旋鈕(溫度)、一種搜尋法(集束),以及一把手術刀(logit bias)。下一篇要加上讓取樣變可靠的安全網:在抽取之前先修剪分布。