Skip to content

LLM Decoding

1、背景故事

想像你是一位小說家,你腦中已經構思出開場的第一句:「在遙遠的城市裡,」。接下來你要決定第二句是什麼。
你可能會根據前一句的語氣、情境、人物,想出許多候選的續句:「一場暴風雨正在逼近」、「有個小孩在街上奔跑」、「燈光閃爍,夜色迷離」。
每一句都合理,但風格、節奏、氛圍完全不同。
大型語言模型(LLM) 在生成文字時,也面臨一樣的抉擇:
它會根據前文的上下文,計算出下一個字、詞或 token 的機率分佈,而 Decoding(解碼) 的任務,就是從這個分佈中「選」出最合適的一個或一串 token。


2、解決的痛點

2-1、從機率分佈中挑選合理輸出

當模型輸出下一個 token 的機率分佈時,可能長這樣:

\[ P(\text{token}) = \begin{bmatrix} \text{"暴風雨"}: 0.45, \quad \text{"陽光"}: 0.25, \quad \text{"小孩"}: 0.15, \quad \text{"燈光"}: 0.10, \quad \text{"貓"}: 0.05 \end{bmatrix} \]

如果我們總是選擇機率最高的詞(如「暴風雨」),生成的句子會非常可預測,缺乏創意。
Decoding 策略的目的,就是在「合理」與「多樣」之間找到平衡。

痛點:如何讓模型在生成時既不亂說話,又能保持自然流暢與多樣性。


2-2、貪婪解碼(Greedy Decoding)——最直接的選擇

在貪婪解碼中,模型每次都選擇機率最高的 token:

\[ \hat{y}_t = \arg\max_{y} P(y|y_{<t}) \]

這種方法像是一個總是選擇「看起來最保險」的學生,每一步都正確但缺乏驚喜。
生成結果通常語法正確,但容易重複或顯得呆板。

痛點:輸出雖正確但缺乏多樣性,容易陷入重複或無趣的文本。


集束搜尋會同時保留多個候選句子路徑(稱為 beam),每次根據累積機率保留前 \(k\) 條最可能的序列。

\[ \text{score(sequence)} = \prod_{t=1}^{T} P(y_t|y_{<t}) \]

舉例來說,當 \(k=3\) 時,模型會同時考慮三種可能的句子延續,最後挑選最整體合理的一條。
這就像小說家同時構思三個版本的情節,最後挑選最順暢的一條。

痛點:避免因單一步驟的貪婪選擇導致整體語義不通順。


2-4、隨機取樣(Sampling)——加入一點創意的隨機性

在 Sampling 策略中,模型不再只取最大值,而是根據機率分佈「抽樣」下一個 token。
例如上例中,「暴風雨」有 45% 機率被選中,但「陽光」、「小孩」也有被選中的機會。
為了控制隨機程度,我們引入溫度參數 \(T\)

\[ P_i^{\text{new}} = \frac{e^{\log P_i / T}}{\sum_j e^{\log P_j / T}} \]

\(T\) 越小(例如 0.5),模型越保守;
\(T\) 越大(例如 1.5),模型越有創造力。

痛點:避免模型生成過於死板或完全隨機,讓創造與穩定之間可調節。


2-5、Top-k 與 Top-p(Nucleus Sampling)——控制探索範圍

為了避免抽樣時選到太不合理的詞,我們可以限制候選範圍。

  • Top-k Sampling:只保留機率最高的 \(k\) 個詞再抽樣。
    例如 \(k=3\),只在「暴風雨、陽光、小孩」中抽。

  • Top-p Sampling:保留總機率質量達到 \(p\) 的詞,例如 \(p=0.9\),表示保留前幾個詞直到機率總和達 0.9。

這讓模型能在有限的合理範圍內隨機選擇,兼顧真實性與多樣性。

痛點:控制模型生成範圍,避免出現語意不連貫或突兀的詞。


2-6、重複懲罰(Repetition Penalty)——防止模型「卡詞」

大型語言模型常會出現重複輸出的情況,例如生成「我很開心開心開心...」。
為此,我們在每次生成時,對已出現過的 token 降低其分數:

\[ P'(y_t) = \frac{P(y_t)}{(\text{penalty})^{f(y_t)}} \]

其中 \(f(y_t)\) 表示該 token 出現的次數。
這會讓模型更傾向選擇新的詞彙。

痛點:防止模型陷入重複迴圈,保持文本自然流暢。


3、綜合應用場景

3-1、聊天機器人

在聊天場景中,模型使用 Top-p + 溫度調整 的策略,讓回覆既自然又有創意。
例如在「你今天怎麼樣?」的回答中,模型不會每次都說「很好」,而是可能回答「還不錯」、「有點累」、「挺開心的」。

痛點:保持對話多樣性與真實互動感。


3-2、文件生成或翻譯

在需要穩定、嚴謹輸出的任務中(如翻譯或摘要),
通常使用 Beam SearchGreedy Decoding,確保語義一致、邏輯清晰。

痛點:在需要準確性的應用中避免語意偏移。


3-3、創意式應用(詩歌、故事)

在創意生成時,會使用 高溫度 SamplingTop-p Sampling,以獲得更具想像力的結果。
例如生成詩句或故事開頭,模型能自由組合語彙,呈現多樣風格。

痛點:鼓勵模型生成新穎內容而不失語意合理性。


4、從模型輸出到機率(前向傳播開始)

4-1、輸入情境設定

假設我們的語言模型剛生成了一個句子的上下文:「我 愛」,
接下來要預測下一個 token。模型最後一層的輸出是一個向量(語意表示),我們稱為 \(h_t\)

\[ h_t\ (shape=1\times4)= \begin{bmatrix} 0.6 & 0.2 & 0.8 & 0.4 \end{bmatrix} \]

痛點:將語意壓縮成固定維度的向量表示,方便後續進行詞彙層的映射。


5、輸出層線性映射(轉換為詞彙空間)

5-1、建立權重矩陣與偏置

假設詞彙表中有 5 個詞彙:「我」、「愛」、「AI」、「學習」、「自然語言」。

模型的輸出層權重矩陣與偏置如下:

\[ W_{out}\ (shape=4\times5)= \begin{bmatrix} 0.2 & 0.4 & 0.1 & 0.3 & 0.5\\ 0.1 & 0.3 & 0.2 & 0.6 & 0.4\\ 0.5 & 0.2 & 0.3 & 0.1 & 0.2\\ 0.4 & 0.1 & 0.2 & 0.5 & 0.3 \end{bmatrix} \]
\[ b_{out}\ (shape=1\times5)= \begin{bmatrix} 0.05 & 0.05 & 0.05 & 0.05 & 0.05 \end{bmatrix} \]

痛點:建立從語意空間到詞彙空間的映射,讓模型能「說出」具體的詞彙。


5-2、進行矩陣運算

我們將 \(h_t\) 經過線性層:

\[ 矩陣A = h_t\ (shape=1\times4) \]
\[ 矩陣B = W_{out}\ (shape=4\times5) \]

矩陣相乘:

\[ 矩陣A \cdot 矩陣B = 矩陣C\ (shape=1\times5) \]

再加上偏置項 \(b_{out}\)

\[ z = 矩陣C + b_{out} = \begin{bmatrix} 0.65 & 0.61 & 0.47 & 0.67 & 0.71 \end{bmatrix} \]

痛點:將高維語意投影到詞彙空間,使模型能對每個詞產生預測分數。


6、轉換為機率分佈(Softmax)

6-1、套用 Softmax 函數

Softmax 將分數轉換為機率:

\[ P_i = \frac{e^{z_i}}{\sum_j e^{z_j}} \]

計算後結果為:

\[ P\ (shape=1\times5)= \begin{bmatrix} 0.21 & 0.20 & 0.17 & 0.21 & 0.21 \end{bmatrix} \]

痛點:將模型分數轉換為「可比較」的機率,使得每個詞的可能性可被明確量化。


7、Decoding 選擇策略(取樣階段)

7-1、貪婪解碼(Greedy Decoding)

在貪婪解碼中,我們選取機率最大的詞:

\[ \hat{y}_t = \arg\max P_i \]

由於 \(P\) 中「自然語言」的機率最高(0.21,與其他相近但略高),
模型輸出為「自然語言」。

痛點:確保輸出穩定且語義連貫,適合需要高準確性的應用如翻譯。


7-2、Top-k Sampling(引入多樣性)

若我們選擇 \(k=3\),只保留前三高的詞彙:

\[ P_{top3}\ (shape=1\times3)= \begin{bmatrix} 0.21 & 0.21 & 0.21 \end{bmatrix} \]

在這三者中,模型隨機抽樣一個詞作為最終輸出。
假設此次抽樣結果為「AI」。

痛點:在保留合理性的前提下,引入隨機性,提升生成內容的多樣性。


7-3、Top-p Sampling(動態概率截斷)

假設我們設定 \(p=0.8\)
則模型會累積機率總和達 0.8 的詞集合:

\[ P_{top-p}\ (shape=1\times4)= \begin{bmatrix} 0.21 & 0.20 & 0.21 & 0.17 \end{bmatrix} \]

在這四個詞中隨機取樣。
假設此次抽樣結果為「學習」。

痛點:根據語境動態控制候選範圍,避免選項過多造成語意偏離。


8、最終輸出與語言生成意義

8-1、最終生成句子

假設模型最終選擇的詞是「學習」,
那麼生成結果為:

「我 愛 學習」

這一步的矩陣運算,是 LLM 在生成過程中每一步的核心:
從語意向量 → 詞彙分數 → 機率 → 選擇最終輸出。

痛點:讓模型能從連續語意空間中選擇具體的字詞,完成自然語言生成的最後一步。