大模型如何計算 Loss:訓練與推理的差異
深入交叉熵損失、反向傳播與梯度下降,徹底釐清訓練與推理階段的本質差異。
大模型如何計算 Loss:訓練與推理的差異
上一篇我們看到模型如何一個字一個字地生成回應,也理解了推理階段的採樣策略。
但模型是怎麼「學會」預測下一個詞的?它怎麼知道自己錯了?又怎麼從錯誤中調整?
這一篇,我們要深入訓練階段的核心:損失函數(Loss Function)、交叉熵(Cross-Entropy)、反向傳播(Backpropagation)與梯度下降(Gradient Descent),並徹底釐清訓練與推理的本質差異。
一、訓練階段到底在訓練什麼?
在訓練階段,模型的核心任務是最小化預測誤差。
具體來說,模型會接收大量的文本資料,並嘗試預測每一個位置的下一個 Token。
假設我們有一句話:
今天 天氣 真 好
模型會看到:
- 輸入「今天」,預測「天氣」
- 輸入「今天 天氣」,預測「真」
- 輸入「今天 天氣 真」,預測「好」
每一個位置,模型都會輸出一個機率分布,代表詞表中每個詞被選為下一個詞的可能性。
然後我們拿這個分布,跟實際的目標詞(Ground Truth)比對,計算差距。
這個差距,就是損失(Loss)。
損失值越大,代表模型的預測越離譜;損失值越小,代表預測越精確。
訓練的整體目標,就是透過優化演算法,不斷調整模型內部的數十億甚至數千億個參數,逐步降低損失值。
二、交叉熵損失函數:衡量預測與答案的距離
在語言模型中,最常用的損失函數是交叉熵損失(Cross-Entropy Loss)。
什麼是交叉熵?
交叉熵來自資訊理論,用來衡量兩個機率分布之間的差異。
假設:
- (y):真實的目標分布(通常是 One-Hot 向量,正確答案位置為 1,其餘為 0)
- (\hat{y}):模型預測的機率分布
交叉熵的公式為:
[ L = -\sum_{i=1}^{V} y_i \log(\hat{y}_i) ]
其中 (V) 是詞彙表大小。
因為 (y) 是 One-Hot 向量,只有正確答案的位置是 1,其餘是 0,所以公式可以簡化為:
[ L = -\log(\hat{y}_{\text{correct}}) ]
也就是說,交叉熵損失就是正確答案的預測機率取負對數。
直觀理解
- 如果模型預測正確答案的機率是 1.0,則 (L = -\log(1) = 0),損失為零。
- 如果模型預測正確答案的機率是 0.1,則 (L = -\log(0.1) \approx 2.3),損失較大。
- 如果模型預測正確答案的機率是 0.001,則 (L = -\log(0.001) \approx 6.9),損失非常大。
所以,模型越確定正確答案,損失越小;越不確定或預測錯誤,損失越大。
三、反向傳播:從錯誤中找出責任
有了損失值之後,下一個問題是:
我們要如何調整數十億個參數,才能降低這個損失?
這就需要反向傳播(Backpropagation)。
反向傳播的核心思想是鏈式法則(Chain Rule):
如果我們想知道某個參數對最終損失的影響有多大,就必須沿著計算圖,從輸出層一路往回推,計算損失對每個參數的梯度(Gradient)。
梯度代表的是:
「如果我把這個參數增加一點點,損失會增加還是減少?增加或減少多少?」
具體流程如下:
- 前向傳播(Forward Pass):輸入資料經過多層網路,得到預測輸出,並計算損失。
- 反向傳播(Backward Pass):從損失出發,沿著網路反向計算每個參數的梯度。
- 參數更新:根據梯度,調整每個參數的值。
這個過程就像一個大型的責任分配系統:
損失是最終的「錯誤」,反向傳播則是把這個錯誤的責任,一層一層地分配給每個參數。
四、梯度下降:一步步走向更低損失
計算出梯度之後,我們就可以用**梯度下降(Gradient Descent)**來更新參數。
最基本的更新公式是:
[ \theta \leftarrow \theta - \eta \nabla_\theta L ]
其中:
- (\theta):模型參數
- (\eta):學習率(Learning Rate)
- (\nabla_\theta L):損失對參數的梯度
直觀來說:
- 如果梯度是正的,代表損失會隨著參數增加而增加,所以我們要減少參數。
- 如果梯度是負的,代表損失會隨著參數增加而減少,所以我們要增加參數。
學習率 (\eta) 則控制每次更新的步伐大小:
- 太大:可能跨過最低點,導致震盪甚至發散。
- 太小:收斂太慢,訓練時間過長。
在實際訓練中,我們通常不會用全部的資料計算梯度,而是用小批次(Mini-Batch)來估計梯度,這稱為隨機梯度下降(Stochastic Gradient Descent, SGD)。
現代模型更常使用 Adam、AdamW 等自適應優化器,能根據參數的歷史梯度動態調整學習率。
五、為什麼訓練需要 Mask?
在上一篇文章我們提過,訓練時模型不能看到未來的資訊。
這是因為語言模型的目標是預測下一個詞,如果模型在預測第 (t) 個詞時,能看到第 (t+1) 個詞甚至之後的內容,那它根本不需要學習,只要抄答案就好了。
所以我們使用因果掩碼(Causal Mask),將未來位置的注意力分數設定為負無窮大,經過 Softmax 後這些位置的權重就變成 0。
這確保了模型在預測每個位置時,只能關注當前及之前的詞,模擬真實生成時的條件。
六、訓練與推理的關鍵差異
很多人會混淆訓練與推理,但它們的目標、資料流與計算方式截然不同。以下用表格整理:
| 面向 | 訓練階段 | 推理階段 |
|---|---|---|
| 目標 | 最小化預測誤差 | 生成連貫自然的文本 |
| 答案 | 已知(Ground Truth) | 未知,需從機率分布採樣 |
| 計算 | 可平行處理所有位置 | 自回歸,一次只生成一個 Token |
| 損失函數 | 交叉熵損失 | 無損失函數,只有採樣策略 |
| 關鍵技術 | 反向傳播、梯度下降、Mask | Temperature、Top-K、Top-P |
| 輸出 | 參數更新 | 生成的 Token 序列 |
| 資源需求 | 極高(需要大量 GPU、記憶體) | 較低(但推論速度受模型大小影響) |
訓練階段的核心特徵
- 有標準答案:每個位置的下一個詞都是已知的。
- 平行計算:因為答案已知,模型可以同時計算所有位置的損失。
- 目標明確:最小化交叉熵損失。
- 需要 Mask:防止模型看到未來資訊。
- 需要大量計算資源:數十億參數的梯度計算與更新,需要龐大的算力。
推理階段的核心特徵
- 沒有標準答案:模型只能根據自己預測的分布來採樣。
- 自回歸生成:一次只生成一個 Token,無法平行處理。
- 目標是生成品質:透過 Temperature、Top-K、Top-P 等策略平衡準確性與多樣性。
- 不需要反向傳播:只做前向傳播,計算量相對較小。
七、一個具體的訓練例子
假設我們有一句話:
我 喜歡 吃 蘋果
訓練時,模型會收到:
| 輸入 | 目標 |
|---|---|
| 我 | 喜歡 |
| 我 喜歡 | 吃 |
| 我 喜歡 吃 | 蘋果 |
對於每個位置,模型輸出一個機率分布。
假設在預測「蘋果」時,模型輸出:
- 蘋果:0.6
- 香蕉:0.2
- 橘子:0.1
- 其他:0.1
交叉熵損失為:
[ L = -\log(0.6) \approx 0.51 ]
如果模型預測「蘋果」的機率只有 0.1,則:
[ L = -\log(0.1) \approx 2.3 ]
損失越大,反向傳播的梯度就越大,參數更新的幅度也越大。
模型會逐漸學會:在「我 喜歡 吃」之後,下一個詞更應該是「蘋果」而不是其他詞。
八、訓練中的工程挑戰
訓練數十億甚至數千億參數的大模型,面臨著許多優化挑戰。以下是三項核心技術,它們協同作用以確保訓練的穩定性與模型的最終效能:
1. 正規化(Normalization)
用以穩定梯度。在每一層的輸出進行標準化,使數據分布維持在穩定範圍,防止數值爆炸或梯度劇烈震盪。
2. 殘差連接(Residual Connection)
用以防止梯度消失。透過建立跨層的捷徑,讓梯度能有效回流到淺層網路,使訓練極深層模型成為可能。
3. Dropout
用以解決過擬合(Overfitting)。在訓練中隨機停用部分神經元,強迫模型學習更強健的特徵,提升對新數據的泛化能力。
這些技術我們會在下一篇詳細解釋。
九、總結:從錯誤中學習的完整迴圈
大語言模型的訓練,可以濃縮成一個完整的迴圈:
- 前向傳播:輸入文本,模型預測下一個 Token 的機率分布。
- 計算損失:用交叉熵衡量預測與答案的差距。
- 反向傳播:計算損失對每個參數的梯度。
- 梯度下降:根據梯度更新參數,降低損失。
- 重複:數百萬次,直到損失收斂。
而推理階段則是:
- 前向傳播:輸入提示,模型輸出下一個 Token 的機率分布。
- 採樣:用 Temperature、Top-K、Top-P 選出下一個 Token。
- 接續:將新 Token 接到輸入後面,重複直到生成完整回應。
兩者的核心差異在於:
訓練有標準答案,目標是最小化誤差;推理沒有標準答案,目標是生成自然連貫的文本。
理解了這個差異,你就掌握了 LLM 從學習到應用的完整脈絡。
下一篇預告
《大模型為什麼難訓?Normalization、Residual 與 Dropout》
我們會深入解釋為什麼深層網路會梯度消失、為什麼需要正規化、殘差連接如何拯救深層網路,以及 Dropout 如何防止過擬合。這些看似微小的工程細節,其實是打造穩定大模型的關鍵。