06.1 機率語言模型#
本章導讀#
語言模型是什麼?一句話:一個預測下一個詞的機率分布。 從 1950 年代的 n-gram 統計,到 2013 年的詞向量,到 2018 年的預訓練典範—— 架構一直在變,但目標只有一個: \(P(w_{t+1} \mid w_{\le t})\) 。 2018 年之後人們發現:把這一件事做到極致,「智慧」竟開始湧現。
準備說明#
給定一句話「今天天氣真___」,你會猜「好」。語言模型做的是同一件事,但用機率:
- 「好」:0.62,「差」:0.15,「冷」:0.10,……
- 每一步都輸出一個機率分布,取樣生成文字。
數學上,整句話的機率由連鎖律拆解:一個高維聯合分布,變成一連串的條件分布。 訓練 = 讓每個條件分布盡量準。就這麼簡單——但規模大了,質變就發生。
正規理論#
條件機率連鎖律#
一句話 \(w_1, w_2, \dots, w_T\) 的聯合機率,由機率論的連鎖律精確分解:
這是恆等式(不是近似)——語言模型的目標就是學出這一連串條件分布。
n-gram 模型:馬可夫近似#
1950 年代的做法:假設只依賴前 \(n-1\) 個詞(馬可夫性):
用最大概似估計(數頻率): \(P(w_t \mid w_{t-1}) = \dfrac{C(w_{t-1}, w_t)}{C(w_{t-1})}\) 。 問題:詞組沒出現過就估為 0(稀疏性),需要平滑(smoothing)。
詞向量:語義空間#
2013 年 word2vec 把每個詞映射成向量 \(\mathbf{v}_w \in \mathbb{R}^d\) ,訓練目標(skip-gram):
驚人的經驗事實:語義關係在向量空間中是線性的:
詞向量 = 把離散符號嵌入連續空間,語義變幾何。
神經語言模型#
用神經網路 \(f_\theta\) 學條件分布(現代 LLM):
訓練目標:最小化負對數概似(= 交叉熵,04.3 節):
困惑度#
模型好壞的標準度量:
PPL 是每步「平均等 unsure 到」的詞選項數:PPL = 10 表示每步約 10 個等機率選項的不確定性。
簡易範例:手算連鎖律#
玩具語料:「貓追狗」(3 次)、「狗追貓」(1 次)。bigram 頻率:
句子「貓追狗」的機率: \(P(\text{貓}) \times P(\text{追}\mid\text{貓}) \times P(\text{狗}\mid\text{貓}) = \frac{1}{2}\times\frac{4}{4}\times\frac{3}{4} = 0.375\) (設「追」總在貓後)。
若模型預測 \(P(\text{狗}\mid\text{貓}) = 0.6\) ,該步的損失 \(= -\log 0.6 \approx 0.51\) nat——預測越準,損失越低。
歷史典故#
- 2013 年 word2vec:見卷宗 ../2013-word2vec詞向量.md——king − man + woman = queen 驚豔全世界。
- 2018 年預訓練典範:見 ../2018-BERT與GPT預訓練典範.md——「先讀萬卷書、再答題」的兩種哲學。
- 2020 年 GPT-3 規模湧現:見 ../2020-GPT-3規模湧現.md——1750 億參數下,下一詞預測開始寫文章、寫程式(06.3 節)。
習題#
- 用連鎖律寫出三詞句 \(P(w_1, w_2, w_3)\) ,並說明每個條件分布在神經語言模型中由什麼計算。
- 證明:最小化交叉熵等價於最大化對數概似。
- 對本節範例,計算「狗追貓」在模型 \(P(\text{貓}\mid\text{狗})=0.6\) 下的損失。
補充#
1. 數學推導證明#
證明(習題 2):交叉熵 = 負對數概似(語言模型版)。
設語料經驗分布 \(p_{\text{data}}(w_t \mid w_{<t})\) (真實下一個詞為 one-hot),模型 \(P_\theta\) 。平均交叉熵:
正是本章訓練目標。故「最小化交叉熵」即「最大化整句對數概似 \(\sum_t \log P_\theta\) 」即「最大化整句機率 \(\prod_t P_\theta\) 」(連鎖律的每一環都準,整句才準)。 \(\blacksquare\)
證明(習題 1 的連鎖律書寫): 三詞句 \(P(w_1,w_2,w_3) = P(w_1)\,P(w_2\mid w_1)\,P(w_3\mid w_1,w_2)\) 。在神經語言模型中: \(P(w_1)\) 由句首分布(或 BOS 起始向量)給出; \(P(w_2\mid w_1) = \mathrm{softmax}(W_{\text{out}}f_\theta(w_1))_{w_2}\) ; \(P(w_3\mid w_1,w_2) = \mathrm{softmax}(W_{\text{out}}f_\theta(w_1,w_2))_{w_3}\) ——每個條件分布都是「Transformer 讀完上文 \(\to\) 線性層 \(\to\) softmax」的同一個函數,只是上文長度不同。 \(\blacksquare\)
計算(習題 3): 「狗追貓」在模型 \(P(\text{貓}\mid\text{狗}) = 0.6\) 下,該步損失 \(= -\log 0.6 \approx 0.51\) nat( \(= -\log_2 0.6 \approx 0.74\) bit)。與本章「貓追狗」同值——損失只看「模型給正確答案的機率」,不看句子本身。
2. 簡易範例#
範例一:bigram 手算 vs 平滑。 本章手算(無平滑) \(P(\text{狗}\mid\text{貓}) = 3/4 = 0.75\) ;程式 _code/06.1-bigram-lm-perplexity.py 用 Laplace \(+1\) 平滑(含 BOS/EOS),得 \(P(\text{狗}\mid\text{貓}) \approx 0.111\) 、 \(P(\text{追}\mid\text{貓}) \approx 0.444\) ——數字不同是因為平滑把沒見過的組合從 0 抬起來(避開 \(\log 0 = -\infty\) ),這正是 n-gram 實務必做的修正。
範例二:困惑度。 程式對測試句「貓追狗」算出平均交叉熵 \(\approx 0.8109\) nat、PPL \(= e^{0.8109} \approx 2.25\) ——每步約 \(2.25\) 個選項在競爭;對照組每步機率 \(0.99\) 時 PPL \(\approx 1.01\) (幾乎確定)。PPL \(= 1\) 是完美,PPL \(=\) 詞表大小是亂猜——兩個端點夾出模型的真實位置。