跳轉到

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\) 的聯合機率,由機率論的連鎖律精確分解:

\[ \boxed{\; P(w_1, w_2, \dots, w_T) = \prod_{t=1}^{T} P(w_t \mid w_1, \dots, w_{t-1}) = \prod_{t=1}^{T} P(w_t \mid w_{<t}) \;} \]

這是恆等式(不是近似)——語言模型的目標就是學出這一連串條件分布。

n-gram 模型:馬可夫近似#

1950 年代的做法:假設只依賴前 \(n-1\) 個詞(馬可夫性):

\[ P(w_t \mid w_{<t}) \approx P(w_t \mid w_{t-n+1}, \dots, w_{t-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):

\[ \max \; \sum_{t}\sum_{-c \le j \le c, j \ne 0} \log P(w_{t+j} \mid w_t), \qquad P(w_{t+j}\mid w_t) = \frac{\exp(\mathbf{v}'_{w_{t+j}\top}\mathbf{v}_{w_t})}{\sum_{w'} \exp(\mathbf{v}'_{w'\top}\mathbf{v}_{w_t})} \]

驚人的經驗事實:語義關係在向量空間中是線性的:

\[ \mathbf{v}_{\text{king}} - \mathbf{v}_{\text{man}} + \mathbf{v}_{\text{woman}} \approx \mathbf{v}_{\text{queen}} \]

詞向量 = 把離散符號嵌入連續空間,語義變幾何。

神經語言模型#

用神經網路 \(f_\theta\) 學條件分布(現代 LLM):

\[ P(w_{t+1} \mid w_{\le t}) = \mathrm{softmax}\big(W_{\text{out}}\, f_\theta(w_{\le t})\big)_{w_{t+1}} \]

訓練目標:最小化負對數概似(= 交叉熵,04.3 節):

\[ \mathcal{L}(\theta) = -\frac{1}{T}\sum_{t=1}^{T} \log P_\theta(w_t \mid w_{<t}) \]

困惑度#

模型好壞的標準度量:

\[ \mathrm{PPL} = \exp\!\left(\mathcal{L}\right) = \exp\!\left(-\frac{1}{T}\sum_t \log P_\theta(w_t \mid w_{<t})\right) \]

PPL 是每步「平均等 unsure 到」的詞選項數:PPL = 10 表示每步約 10 個等機率選項的不確定性。

簡易範例:手算連鎖律#

玩具語料:「貓追狗」(3 次)、「狗追貓」(1 次)。bigram 頻率:

\[ P(\text{狗} \mid \text{貓}) = \frac{3}{3} = 1, \qquad P(\text{貓} \mid \text{狗}) = \frac{1}{4} = 0.25 \]

句子「貓追狗」的機率: \(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——預測越準,損失越低。

歷史典故#

習題#

  1. 用連鎖律寫出三詞句 \(P(w_1, w_2, w_3)\) ,並說明每個條件分布在神經語言模型中由什麼計算。
  2. 證明:最小化交叉熵等價於最大化對數概似。
  3. 對本節範例,計算「狗追貓」在模型 \(P(\text{貓}\mid\text{狗})=0.6\) 下的損失。

補充#

1. 數學推導證明#

證明(習題 2):交叉熵 = 負對數概似(語言模型版)。

設語料經驗分布 \(p_{\text{data}}(w_t \mid w_{<t})\) (真實下一個詞為 one-hot),模型 \(P_\theta\) 。平均交叉熵:

\[ \frac{1}{T}\sum_t H(p_{\text{data}}(\cdot\mid w_{<t}), P_\theta(\cdot\mid w_{<t})) = -\frac{1}{T}\sum_t \sum_w p_{\text{data}}(w)\log P_\theta(w) = -\frac{1}{T}\sum_t \log P_\theta(w_t \mid w_{<t}) = \mathcal{L}(\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 \(=\) 詞表大小是亂猜——兩個端點夾出模型的真實位置。