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

從機率到文字:解碼到底是什麼

語言模型從不「寫出一個字」,它替每個 token 打分,再由解碼挑出一個。認識每則回覆背後的循環。

沒人讓你看見的那一步

當助理回答你時,感覺像是它在組織句子。但底層其實更機械:它在做下一個 token 預測(next-token prediction)。在每個位置,模型讀完目前為止的內容,然後為詞彙表裡的每一個 token 都產生一個分數——一次數萬個候選。此時它還沒做出任何決定。把這張巨大的分數表變成一個真正的 token,是另一個可替換的步驟,叫做解碼(decoding),而你能採用的規則家族就是解碼策略(decoding strategies)。

分數、softmax、機率

原始分數叫做 logits——沒有上下界的數字,每個 token 一個。為了讓它們可比較,模型把它們送進 softmax,把整列壓成全為正、加總為 1 的數字:一個真正的機率分布。所以在每一步,你實際上會得到像是「『the』= 41%、『a』= 18%、『cat』= 0.003%……」橫跨整個詞彙表的東西。這些機率取(自然)對數後就是 對數機率(log-probabilities,logprobs),多數 API 回報的就是它,因為極小的機率用負對數來看更清楚。

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

Softmax 把原始 logits 转换成覆盖整个词表的概率分布。

貪婪:直接拿最大的

最簡單的解碼器是貪婪解碼(greedy decoding):每一步都挑機率最高的那個 token,然後繼續。它快、完全確定、是很好的思考起點。它的弱點是:每次都抓眼前最愛,可能把自己逼進死角——而且因為毫無隨機性,同一個提示(prompt)你每次都會拿到一模一樣的答案。

x_t = \arg\max_{i}\; p_i

贪心解码就是取 arg-max:每一步都选概率最高的那个 token。

自迴歸循環

解碼不是一次完成,而是一個循環。一旦選出一個 token,它就被接到輸入後面,模型再跑一次,替下一個位置打分。這種回饋——產生一個、餵回去、再產生下一個——就是模型「自迴歸」(autoregressive)的意思。因為文字是一個 token 一個 token 蓋出來的,介面才能讓它逐字浮現;這種即時湧出的效果就是串流生成(streaming generation)。

  1. 在目前為止的內容上跑模型,取得下一個位置的 logits。
  2. 套用 softmax,把 logits 變成機率分布。
  3. 用你的解碼策略,從分布中選出一個 token。
  4. 把選中的 token 接上去,再重複——直到觸發某個停止條件。
自回归解码的循环:打分、选一个 token、追加,然后重复。

自回归生成循环示意图:每个被选中的 token 都反馈回模型。

知道何時該停

這個循環需要出口。模型被訓練成完成時會發出一個特殊的序列結束(end-of-sequence)token,生成就在那裡停下。你也可以設定 `max_tokens` 上限,或定義停止序列(stop sequences)——像 `"\n\n"` 或 `"User:"` 這類字串,一旦被產生就切斷生成,避免它一路衝進下一輪對話。

整個骨架就是這樣:打分 → 選擇 → 接上 → 停止。本軌道接下來談的全都圍繞那一個選擇步驟。貪婪是無趣的基準;一旦你讓機率介入,就走到了取樣 vs 貪婪(sampling versus greedy)——下一篇我們就走進這個岔路口。