LLM Decoding
1、背景故事
想像你是一位小說家,你腦中已經構思出開場的第一句:「在遙遠的城市裡,」。接下來你要決定第二句是什麼。
你可能會根據前一句的語氣、情境、人物,想出許多候選的續句:「一場暴風雨正在逼近」、「有個小孩在街上奔跑」、「燈光閃爍,夜色迷離」。
每一句都合理,但風格、節奏、氛圍完全不同。
大型語言模型(LLM) 在生成文字時,也面臨一樣的抉擇:
它會根據前文的上下文,計算出下一個字、詞或 token 的機率分佈,而 Decoding(解碼) 的任務,就是從這個分佈中「選」出最合適的一個或一串 token。
2、解決的痛點
2-1、從機率分佈中挑選合理輸出
當模型輸出下一個 token 的機率分佈時,可能長這樣:
如果我們總是選擇機率最高的詞(如「暴風雨」),生成的句子會非常可預測,缺乏創意。
Decoding 策略的目的,就是在「合理」與「多樣」之間找到平衡。
痛點:如何讓模型在生成時既不亂說話,又能保持自然流暢與多樣性。
2-2、貪婪解碼(Greedy Decoding)——最直接的選擇
在貪婪解碼中,模型每次都選擇機率最高的 token:
這種方法像是一個總是選擇「看起來最保險」的學生,每一步都正確但缺乏驚喜。
生成結果通常語法正確,但容易重複或顯得呆板。
痛點:輸出雖正確但缺乏多樣性,容易陷入重複或無趣的文本。
2-3、集束搜尋(Beam Search)——多條路徑的智慧選擇
集束搜尋會同時保留多個候選句子路徑(稱為 beam),每次根據累積機率保留前 \(k\) 條最可能的序列。
舉例來說,當 \(k=3\) 時,模型會同時考慮三種可能的句子延續,最後挑選最整體合理的一條。
這就像小說家同時構思三個版本的情節,最後挑選最順暢的一條。
痛點:避免因單一步驟的貪婪選擇導致整體語義不通順。
2-4、隨機取樣(Sampling)——加入一點創意的隨機性
在 Sampling 策略中,模型不再只取最大值,而是根據機率分佈「抽樣」下一個 token。
例如上例中,「暴風雨」有 45% 機率被選中,但「陽光」、「小孩」也有被選中的機會。
為了控制隨機程度,我們引入溫度參數 \(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 降低其分數:
其中 \(f(y_t)\) 表示該 token 出現的次數。
這會讓模型更傾向選擇新的詞彙。
痛點:防止模型陷入重複迴圈,保持文本自然流暢。
3、綜合應用場景
3-1、聊天機器人
在聊天場景中,模型使用 Top-p + 溫度調整 的策略,讓回覆既自然又有創意。
例如在「你今天怎麼樣?」的回答中,模型不會每次都說「很好」,而是可能回答「還不錯」、「有點累」、「挺開心的」。
痛點:保持對話多樣性與真實互動感。
3-2、文件生成或翻譯
在需要穩定、嚴謹輸出的任務中(如翻譯或摘要),
通常使用 Beam Search 或 Greedy Decoding,確保語義一致、邏輯清晰。
痛點:在需要準確性的應用中避免語意偏移。
3-3、創意式應用(詩歌、故事)
在創意生成時,會使用 高溫度 Sampling 或 Top-p Sampling,以獲得更具想像力的結果。
例如生成詩句或故事開頭,模型能自由組合語彙,呈現多樣風格。
痛點:鼓勵模型生成新穎內容而不失語意合理性。
4、從模型輸出到機率(前向傳播開始)
4-1、輸入情境設定
假設我們的語言模型剛生成了一個句子的上下文:「我 愛」,
接下來要預測下一個 token。模型最後一層的輸出是一個向量(語意表示),我們稱為 \(h_t\)。
痛點:將語意壓縮成固定維度的向量表示,方便後續進行詞彙層的映射。
5、輸出層線性映射(轉換為詞彙空間)
5-1、建立權重矩陣與偏置
假設詞彙表中有 5 個詞彙:「我」、「愛」、「AI」、「學習」、「自然語言」。
模型的輸出層權重矩陣與偏置如下:
痛點:建立從語意空間到詞彙空間的映射,讓模型能「說出」具體的詞彙。
5-2、進行矩陣運算
我們將 \(h_t\) 經過線性層:
矩陣相乘:
再加上偏置項 \(b_{out}\):
痛點:將高維語意投影到詞彙空間,使模型能對每個詞產生預測分數。
6、轉換為機率分佈(Softmax)
6-1、套用 Softmax 函數
Softmax 將分數轉換為機率:
計算後結果為:
痛點:將模型分數轉換為「可比較」的機率,使得每個詞的可能性可被明確量化。
7、Decoding 選擇策略(取樣階段)
7-1、貪婪解碼(Greedy Decoding)
在貪婪解碼中,我們選取機率最大的詞:
由於 \(P\) 中「自然語言」的機率最高(0.21,與其他相近但略高),
模型輸出為「自然語言」。
痛點:確保輸出穩定且語義連貫,適合需要高準確性的應用如翻譯。
7-2、Top-k Sampling(引入多樣性)
若我們選擇 \(k=3\),只保留前三高的詞彙:
在這三者中,模型隨機抽樣一個詞作為最終輸出。
假設此次抽樣結果為「AI」。
痛點:在保留合理性的前提下,引入隨機性,提升生成內容的多樣性。
7-3、Top-p Sampling(動態概率截斷)
假設我們設定 \(p=0.8\),
則模型會累積機率總和達 0.8 的詞集合:
在這四個詞中隨機取樣。
假設此次抽樣結果為「學習」。
痛點:根據語境動態控制候選範圍,避免選項過多造成語意偏離。
8、最終輸出與語言生成意義
8-1、最終生成句子
假設模型最終選擇的詞是「學習」,
那麼生成結果為:
「我 愛 學習」
這一步的矩陣運算,是 LLM 在生成過程中每一步的核心:
從語意向量 → 詞彙分數 → 機率 → 選擇最終輸出。
痛點:讓模型能從連續語意空間中選擇具體的字詞,完成自然語言生成的最後一步。