LLM 圖解學習指南 統計篇
了解大型語言模型所需的機率與統計概念
謝舒凱 編審*
大型語言模型從統計的角度看,本質上是一台機率機器(自迴歸):讀入一段文字,算出「下一個詞元」的機率分布,再從中抽出一個。本篇分四章介紹背後的統計概念 - 機率、分布與抽樣、從資料學習、評估與不確定性。
* 本指南草稿由 Claude 協助撰寫。
語言模型說的每一句話,背後都是一張機率表。本章建立描述這張表所需的概念。
模型的每一次輸出,都是一個機率分布。
隨機變數(random variable):結果事先不確定的量。例如「下一個詞元」,可能是「喝水」,也可能是「休息」。
機率分布(probability distribution):列出每個可能結果及其機率。每個機率都不小於 0,而且全部加起來等於 1:
類別分布(categorical distribution):結果是有限個類別之一的分布。詞彙表有 個詞元,下一個詞元就服從一個有 個類別的類別分布。
把一整句話的機率,拆成一連串「接下來會是什麼」。
條件機率(conditional probability):已知 發生時, 發生的機率:
連鎖律(chain rule):任何聯合機率都能拆成條件機率的乘積。套用在一串詞元上:
一步一步算出「石虎在溪邊喝水。」的機率:
附註:許多小於 1 的數相乘,會迅速逼近 0,電腦容易「溢位」(overflost),就是說當產生的資料或數值大小超過了記憶體、暫存器所能容納的極限。實務上改為加總對數機率 — 乘積的對數等於對數的和,表中藍色那一欄就是這樣算的。
用兩個數字概括一個分布:中心在哪裡、散得多開。
期望值(expected value):以機率為權重的平均,記為 :
變異數(variance):偏離期望值的平方的期望;它的平方根 稱為標準差:
樣本平均(sample mean):從分布抽出 個樣本取平均,用來估計期望值。樣本越多越準,誤差隨 縮小:
import numpy as np rng = np.random.default_rng(0) x = rng.normal(loc=3.0, scale=2.0, size=10_000) x.mean(), x.var() # 約 (3.0, 4.0):樣本估計逼近真值
看到資料之後,如何更新原本的看法。
先想一個問題:「失望」這個詞常出現在負面評論裡;反過來,一則評論出現「失望」,它有多大機會是負面的?前者是 ,後者是 ——兩者並不相同。貝氏定理就是把條件的方向翻過來。
用 1000 則評論來想。假設過去的評論有 60% 是正面;「失望」出現在 2% 的正面評論、15% 的負面評論裡:
重點在於:看到證據之後,只看符合證據的那些情況,再算各類別所占的比例。一個詞,就把判斷從「60% 正面」翻成「約 83% 負面」。
貝氏定理(Bayes' theorem):把上面的算法寫成公式。 是假設(例如「正面」), 是證據(例如「出現失望」):
| 名稱 | 意思 | 本例 | 樹狀圖 |
|---|---|---|---|
| 先驗 | 看證據之前的看法 | 600 / 1000 | |
| 概似 | 假設成立時,看到證據的機率 | 12 / 600 | |
| 證據的總機率 | 不分類別,看到證據的機率 | 72 / 1000 | |
| 後驗 | 看完證據之後的看法 | 12 / 72 |
代入數字:分子是「正面且有失望」這條路徑,分母把所有「有失望」的路徑加總:
分母對每個類別都一樣,所以比較類別時常省略它,寫成 ,最後再把結果正規化成加總為 1。下面的動手試試就是這樣算的。
附註:最常見的錯誤是把兩個方向混為一談。 只有 15%, 卻約 83%;兩者可以差很遠。
點選評論中出現的詞,看後驗怎麼一步步更新:
{{ bayesVerdict }}
附註:這裡假設每個詞在給定類別下彼此獨立,所以概似可以直接相乘,這種分類器稱為「單純貝氏」(naive Bayes),是最早的文本分類方法之一。它忽略了「不」「但是」這類改變語意的結構,後來的神經網路與 LLM 才處理得了。
推廣到連續參數。如果要估計的是連續的數值 (例如一個權重),先驗與概似都變成曲線,後驗就是兩條曲線相乘、再正規化後的形狀:
本章認識兩個最重要的分布——常態分布與 softmax 產生的類別分布——以及如何從分布中抽出詞元。
自然界與神經網路裡最常見的鐘形曲線。
常態分布(normal distribution):由平均 決定位置、標準差 決定寬度。約 68% 的值落在 ,約 95% 落在 。
藍色區域是 =[{{ bandLo }}, {{ bandHi }}],約占 68%。灰色虛線是標準常態 。
標準化(standardization):減去平均、除以標準差,把任何資料轉成平均 0、標準差 1——也就是把藍色曲線移回灰色虛線:
把任意實數分數,變成一個機率分布。
分數(logits):模型最後一層替每個詞元打的實數分數,可正可負,總和也不是 1。
Softmax:先取指數讓每個值變正,再除以總和讓它們加起來等於 1。溫度 控制分布的尖銳程度:
「石虎在溪邊__」的六個候選。拖動溫度,看分數相同、分布卻如何改變:
def softmax(z, T=1.0): e = np.exp((z - z.max()) / T) # 先減去最大值,避免指數溢位 return e / e.sum() z = np.array([2.4, 1.6, 0.9, 0.6, -0.3, -1.5]) softmax(z).round(2) # [0.52 0.23 0.12 0.09 0.03 0.01]
有了分布,還得決定怎麼從中挑出一個詞元。
貪婪解碼(greedy decoding):每一步都選機率最高者。結果固定,但容易重複、單調。
Top-k 抽樣:只保留機率最高的 個詞元,重新正規化後再抽。
Top-p 抽樣(nucleus sampling):由高到低累加機率,保留累計剛好達到 的最小集合。分布越尖,留下的詞元越少。
大數法則(law of large numbers):抽樣次數越多,觀察到的頻率越接近真實機率。上圖只抽 10 次時,藍條跳來跳去;抽到 500 次,便幾乎貼齊紅條。
「訓練模型」在統計上就是「估計參數」。本章說明目標是什麼、用什麼衡量、怎麼一步步逼近。
選一組參數,讓已經看到的資料「最不意外」。
概似函數(likelihood):把資料固定、參數當變數的機率:
最大概似估計(maximum likelihood estimation,MLE):找出讓 最大的參數。取對數、加負號後,等價於最小化「負對數概似」:
例:語料中「溪邊」後面出現了 10 次,其中 7 次是「喝水」。令 ,則 。
用「意外程度」衡量預測的好壞。
資訊量(surprisal):機率為 的事件發生時的意外程度 。必然發生的事毫不意外,罕見的事非常意外。
熵(entropy):分布本身的平均意外程度,也就是它有多不確定。
交叉熵(cross-entropy):真實分布是 ,卻用模型 去預測時的平均意外程度。
KL 散度(Kullback–Leibler divergence):用 代替 所多付的意外程度,衡量兩個分布差多遠;只有 時為 0。
| 熵 | |
| 交叉熵 | |
| KL 散度 |
訓練時,「真實分布」就是實際出現的那個詞元(機率 1),其餘為 0。交叉熵於是簡化成 :模型給正確答案的機率越高,損失越小。
困惑度(perplexity,PPL):把一整段文字的平均損失,換算成「模型每一步平均在幾個選項之間猶豫」。越低越好。
先從直覺開始。擲一顆公正的骰子,每一面的機率都是 1/6,猜中的機率是 1/6,好比在 6 個選項中盲猜,困惑度就是 6。只要模型每一步都把機率平均分給 個詞元,困惑度就是 :
| 模型的狀態 | 給正確詞元的機率 | 困惑度 |
|---|---|---|
| 完全確定,而且都對 | 1 | 1 |
| 在 4 個詞之間猶豫 | 1/4 | 4 |
| 詞彙表 5 萬個詞,隨便亂猜 | 1/50000 | 50000 |
實際算一次。模型讀「石虎在溪邊喝水」,每一步給正確詞元的機率各不相同。把每一步的損失 算出來、取平均,再取指數還原:
| 步驟 | 要預測的詞元 | (正確詞元) | 損失 |
|---|---|---|---|
| 1 | 在 | 0.500 | 0.69 |
| 2 | 溪邊 | 0.125 | 2.08 |
| 3 | 喝水 | 0.250 | 1.39 |
| 平均損失 | 1.39 | ||
三步裡模型有時很有把握(1/2),有時不太確定(1/8),平均下來,像是每一步都在 4 個詞之間猶豫。寫成一般式,就是「平均損失的指數」:
附註:為什麼要取指數?損失的單位是 nats,不好想像;取指數後換回「幾個選項」,就能直接比較。例如困惑度從 20 降到 10,代表模型每一步的猶豫範圍大約縮小了一半。不過,不同詞元化方式的模型,困惑度不能直接比較,因為「一步」的長短不一樣。
沿著損失下降最快的方向,一小步一小步往下走。
梯度下降(gradient descent):梯度 指向損失上升最快的方向,往反方向走一步;步長由學習率 決定:
隨機梯度下降(stochastic gradient descent,SGD):每一步只用一小批資料估計梯度——這正是 1.3 的樣本平均。估計帶有雜訊,但計算便宜得多。
附註:不開雜訊時,小球從右邊出發會卡在局部極小。打開雜訊多跑幾次,它偶爾會被「推」過山頭,落進更深的谷底。學習率太小走得慢,太大則會來回震盪。
模型訓練好了,要怎麼知道它真的好?本章談泛化、分數的誤差範圍,以及模型的信心可不可信。
背得滾瓜爛熟,不代表真的學會。
泛化(generalization):在沒看過的資料上依然表現良好。因此資料要切成訓練集、驗證集與測試集。
過擬合(overfitting):訓練損失持續下降,驗證損失卻開始上升——模型開始記住訓練資料裡的偶然雜訊。
偏差與變異(bias and variance):偏差是模型太簡單、抓不到規律的系統性誤差;變異是模型對訓練資料的偶然細節過度敏感。預測誤差可以拆成三份:
準確率 75% 比 72% 好——真的嗎?
標準誤(standard error):基準測驗的 道題,可以看成從「所有可能的題目」中抽出的樣本。換一批題目,分數就會變動;準確率 的標準誤是:
95% 信賴區間(confidence interval):用同樣方法重複很多次,約 95% 的區間會包含真實準確率:
模型 A 答對 72%,模型 B 答對 75%。改變題目數,看差距是否超出抽樣誤差:
{{ verdict }}
附註:「區間是否重疊」只是保守的粗略判斷。嚴謹的做法是直接對兩者的差做檢定;兩個模型答的是同一組題目時,應使用配對檢定,通常能分辨更小的差距。
模型說「我有八成把握」時,它真的對了八成嗎?
校準(calibration):把所有信心約為 的預測放在一起,若其中恰好有比例 答對,模型就是校準良好的。把各組畫成圖,校準良好的模型會貼著對角線。
期望校準誤差(expected calibration error,ECE):各組「正確率與信心的差距」的加權平均,組 有 筆預測:
每個統計概念,在 LLM 的生命週期中出現在哪裡。
| 概念 | 階段 | 在 LLM 中的角色 | 節 |
|---|---|---|---|
| {{ r.c }} | {{ r.s }} | {{ r.r }} | {{ r.n }} |
總結:LLM 用 softmax 產生類別分布(第 2 章),以最大概似/交叉熵從資料學習(第 3 章),用連鎖律一次生成一個詞元(第 1 章),而它的分數與信心,都需要以抽樣誤差和校準的眼光來解讀(第 4 章)。