CS236 第 4 講 · Maximum Likelihood Learning
Stanford CS236 · Fall 2023 · Lecture 4

Maximum Likelihood Learning:讓模型和資料的 KL 最小

前 30 分鐘把第 3 講沒講完的 attention、PixelCNN 補完。之後進入第二個大問題:模型家族定好了,參數要怎麼學?答案是一條很短的推導鏈:最小化 \(D_{\mathrm{KL}}(P_{\text{data}}\Vert P_\theta)\) ⟺ 最大化期望 log-likelihood ⟺(用 Monte Carlo 近似)最大化訓練集的 log-likelihood ⟺ 讓每個條件分類器的 cross-entropy 最小。

讀完這頁你應該能夠

  1. 說明 attention 怎麼解決 RNN 的瓶頸,以及遮罩如何讓 Transformer 在訓練時平行計算。
  2. 寫出 KL divergence 的定義、證明它非負,並用「壓縮多花的 bit 數」解釋它。
  3. 區分 \(D(P_{\text{data}}\Vert P_\theta)\) 和 \(D(P_\theta\Vert P_{\text{data}})\):前者 mode-covering,後者 mode-seeking。
  4. 推導「最小化 KL ⟺ 最大化 log-likelihood」,並說明為什麼我們只能比較模型、不知道離最佳有多遠。
  5. 說明 Monte Carlo 估計量的三個性質:不偏、收斂、變異數 \(\propto 1/T\)。
  6. 手算硬幣例子的 MLE,並說明 autoregressive model 的 MLE 等於訓練一串分類器。
  7. 解釋 SGD 是另一層 Monte Carlo,以及 bias-variance 取捨與防止 overfitting 的方法。

前置知識檢查

  • 期望值 \(\mathbb E_{x\sim p}[g(x)] = \sum_x p(x)g(x)\)、變異數(B4 會複習)
  • 對數的性質:\(\log(ab) = \log a + \log b\)、\(\log(a/b) = \log a - \log b\)、log 是遞增函數
  • 凹函數與 Jensen 不等式(B2 補充)
  • 微分求極值(B5 補充)、梯度下降和 backpropagation 的概念
  • 第 3 講:autoregressive model、MADE 的遮罩、PixelCNN 的名字

投影片轉成圖片後逐頁看過,文中的「投影片 N 的圖」描述圖片內容。標「出處」的補充來自 Lai et al. (2026)《The Principles of Diffusion Models》§1.1(arXiv 2510.21890v3),以及投影片引用的原始論文。前半段(Part A)用到的第 3 講投影片 25–36,圖的描述在第 3 講筆記第 8 節。

Part A · 00:00–30:30

第 3 講投影片 25–36 的內容。第 3 講筆記第 8 節有投影片版的整理,這裡依照課堂實際的講法補充細節。

A1Attention 與 Transformer

RNN 的三個問題(回顧)

以「My friend opened the」為例,RNN 要用最後一個隱藏向量 \(\mathbf h_4\) 預測下一個字(door、window…)。01:05

  1. 瓶頸:單一向量要總結前面全部的意思。
  2. 慢:算 loss 要沿時間依序展開,訓練很慢。02:09
  3. 難訓練:早期資訊要經過很多步才傳到現在,梯度會爆炸或消失。

Attention 的四個步驟

現代語言模型更像 NADE、MADE:預測時直接使用到時間 t 為止的整個序列,而不只最後一個隱藏向量。03:09

  1. 比較:用當前的隱藏向量當 query,和過去每個隱藏向量(key)算相似度,最簡單是內積。就像在資料庫用 query 檢索 key。04:18
  2. 正規化:把這些分數過 softmax,得到 attention 分佈,表示哪些位置重要。
  3. 彙整:用 attention 分佈對過去的隱藏向量加權平均。06:23
  4. 預測:把彙整結果和當前向量一起用來預測下一個 token。
$$s_{t,j} = \mathbf h_t^\top\mathbf h_j,\qquad \alpha_{t,j} = \frac{\exp(s_{t,j})}{\sum_{j'\le t}\exp(s_{t,j'})},\qquad \mathbf c_t = \sum_{j\le t}\alpha_{t,j}\,\mathbf h_j$$

課堂例子:「A robot must obey the orders given it …」要預測下一個字,必須先知道 it 指的是誰。attention 可以讓 it 這個位置把注意力放在「a robot」上。06:53

Arobotmustobeytheordersgivenit
示意圖(不是訓練出來的數值):顏色越深代表 query「it」對該位置的 attention 權重越大。
課堂問答 · 04:48Attention 有沒有做條件獨立假設?沒有。它仍然是 chain rule 下的 autoregressive model,只是用一個特定的函數形式表示條件分佈,所以不能表示所有可能的依賴,但沒有明確假設任何條件獨立。真的加上條件獨立假設,效果通常會大幅下降。04:48

從 RNN + attention 到 Transformer

  • 遮罩:不能注意未來的位置,所以和 MADE 一樣要加遮罩。07:25
  • 拿掉遞迴:實際系統完全不用 RNN,只把多層 attention 疊起來(feed-forward)。07:56
  • 平行訓練:於是回到 MADE 的情境,一次 forward 就能平行算出每個位置的預測。
老師怎麼說 · 08:57就建模能力而言,RNN 可能其實也不差,它只是太慢,沒辦法訓練。Transformer 成功的關鍵之一是可以大量平行化、善用 GPU,因此能擴展到非常大的規模。GPT 系列、Llama 都是這個架構。08:57
課堂問答 · 21:35現在為什麼還有人用 RNN?推論時的優點:只要保存一個小的狀態向量,過去的東西都可以丟掉,每一步計算量固定。Transformer 生成每個新 token 都要看全部過去。所以最近有人在研究回到類 RNN 的架構,以提高推論效率。21:35
Transformer 的 query、key、value 和這裡的簡化版有什麼不同?

課堂的簡化版直接拿隱藏向量 \(\mathbf h\) 當 query 和 key,也拿它來加權平均。Transformer 先用三個學出來的矩陣把每個位置的表示投影成三個不同的向量:

$$\mathbf q_t = W_Q\mathbf h_t,\quad \mathbf k_j = W_K\mathbf h_j,\quad \mathbf v_j = W_V\mathbf h_j,\qquad \mathbf c_t = \sum_{j\le t}\mathrm{softmax}_j\!\Big(\tfrac{\mathbf q_t^\top\mathbf k_j}{\sqrt d}\Big)\,\mathbf v_j$$

分開投影讓「拿來比對的特徵」和「拿來傳遞的內容」可以不同。Multi-head 則是同時做好幾組不同的投影,讓模型同時關注不同種類的關係(語法、指代等)。另外要加上位置編碼,因為加權平均本身不知道順序。

A2影像上的 autoregressive model

PixelRNN:補完下半張圖

把圖片看成像素序列,每個像素的 R、G、B 也依序生成,用 RNN 加上 MADE 式的遮罩:預測紅色時不能偷看綠色和藍色,預測綠色時可以看紅色。11:02

在 downsampled ImageNet 上的示範:把真實圖片的下半部拿掉,當作 prompt,讓模型逐像素補完。補出來的結果有合理的結構和對稱性;同一個 prompt 每次取樣都不同。這和第 3 講 Demo A 的「補完下半部」是同一件事。缺點是算機率要依序展開,非常慢。12:37

PixelCNN:遮罩卷積

影像分類上效果最好的是卷積網路,自然想拿來做生成模型。條件是必須和 autoregressive 順序一致:預測一個像素時,只能用已經生成的區域(上方各列和同列左邊)。做法仍然是遮罩:把卷積核中「未來」位置的權重設為 0。14:42

老師怎麼說 · 15:30這和 MADE、Transformer 的 self-attention 是同一招:用遮罩確保計算和順序一致。15:30

Blind spot(盲點)

只用一種遮罩卷積疊很多層時,感受野會出現盲點:目標像素右上方的一塊區域,即使在順序上屬於「過去」,也永遠不會被看到。需要在架構上組合不同遮罩的卷積來修正(後續的 Gated PixelCNN 用垂直和水平兩個 stack)。22:38換成 CNN 後,樣本明顯更好,速度也快很多。

為什麼會有盲點?

3×3 遮罩卷積在 \((r, c)\) 位置可以看到 \((r-1, c-1), (r-1, c), (r-1, c+1), (r, c-1)\)。疊第二層時,\((r-1,c+1)\) 這一格本身又能看到 \((r-2, c+2)\) 等,所以感受野往右上延伸。但 \((r, c-1)\) 這一格(同列左邊)只能往左上延伸。

結果在目標像素右上方、而且離它比較遠的某些位置,永遠沒有任何一條連線能傳過來。疊越多層,這個三角形盲區越大。這些像素在 raster 順序中明明已經生成了,模型卻看不到,浪費了資訊。

課堂問答整理

  • 影像能用 attention 嗎?可以,用遮罩 attention 的影像 autoregressive model 效果很好,但多在業界、沒有公開,訓練也比較貴。實務上 diffusion model(第 16 講)表現更好。15:46
  • 影像的順序要怎麼選?沒有好答案,常用左上到右下。有研究試圖學出最佳順序,成效普通。順帶一提,語言從右到左建模也行得通,所以順序可能沒有想像中重要。17:22
  • CNN 也能做語言模型:用因果(只看過去)的一維卷積,表現可以接近 Transformer,同樣能平行計算。18:56
  • 用 inpainting 訓練(遮住一部分、預測其餘)能得到生成模型嗎?一般不能直接得到可以由左而右取樣的模型,要用更昂貴的取樣程序。19:28
  • Transformer 比 RNN 更有表達力嗎?很難這樣說,RNN 理論上已經是 Turing complete。差別比較在訓練效率和歸納偏誤。20:30

A3PixelDefend:用 likelihood 偵測 adversarial example

在一張狗的圖片上加一點人眼看不出的雜訊,最先進的分類器就會非常有信心地判錯。能不能偵測這種被動過手腳的輸入?23:42

做法:把輸入送進一個在乾淨影像上預訓練的 PixelCNN,用 chain rule 算 \(p(\mathbf x)\)。結果的直方圖顯示,訓練集和測試集的 likelihood 落在同一區,多數攻擊(RAND、FGSM、BIM)產生的 adversarial example 明顯偏低,設一個門檻就能擋下來;擾動較小的 DeepFool、CW 只稍微偏低,和乾淨影像重疊較多。25:19

老師怎麼說 · 27:26重點不是 autoregressive model 比較抗攻擊,而是說明:一個只靠 maximum likelihood 訓練的 PixelCNN,真的學到了像素之間細微的依賴關係。likelihood 本身就有用,不只是拿來取樣。27:26
直方圖橫軸的「bits per dimension」是什麼?

直接比 \(p(\mathbf x)\) 數字太小也太難讀。常用的正規化是

$$\text{bits/dim} = \frac{-\log_2 p(\mathbf x)}{D}$$

\(D\) 是維度數(例如 32×32×3 = 3072)。意思是「用這個模型壓縮,平均每個像素值需要幾個 bit」。越低代表模型認為越可能。8-bit 像素完全不壓縮是 8 bits/dim,好的影像模型在 CIFAR-10 約 3 bits/dim 左右,例如 PixelSNAIL 2.85、Sparse Transformer 2.80(數字見第 14 講投影片的表)。課堂直方圖中正常影像大約在 1 到 4.5 之間、峰值約 3。28:57

這個單位和 B2 節「KL = 多花的 bit 數」直接相關:log-likelihood 本來就是壓縮長度。

總結(同第 3 講):autoregressive model 容易取樣、容易算機率、容易擴充到連續變數,但沒有自然的方式取得特徵或分群。這要等到潛在變數模型。29:59

Part B · 30:30–83:52

本講投影片 1–25。模型家族已經會定義了,現在要決定「距離」並最佳化。

B1問題設定:什麼叫「學得好」

  • 資料由某個未知分佈 \(P_{\text{data}}\) 產生;我們有 \(m\) 筆 i.i.d. 樣本組成的資料集 \(\mathcal D\)。每筆樣本是所有變數的一組取值(像素值,或 \(X_{\text{bank}}=1, X_{\text{dollar}}=0,\dots,Y=1\))。31:30
  • 模型家族 \(\mathcal M\):例如「某個固定結構的 Bayes net 加上所有可能的 CPT」,或「FVSBN 的所有 logistic 係數」。\(\theta\) 就是把所有係數串起來的向量。
  • 目標:在 \(\mathcal M\) 裡挑一個好的 \(P_\theta\)。只能看樣本,不能查詢 \(P_{\text{data}}(\mathbf x)\) 的值。32:32

為什麼不可能完美

784 個二元像素有 \(2^{784}\approx10^{236}\) 種圖。就算有一千萬或十億個訓練樣本,相對於所有可能性,覆蓋率仍然極為稀疏。再加上計算資源有限,只能接受近似。33:36

「最好」取決於用途

  1. 密度估計:要完整的分佈,之後才能回答任何條件機率查詢。目標最高也最難。35:40
  2. 特定預測任務:只要用分佈做某個預測(垃圾信分類、影片下一格、看圖說話)。那只需要學條件分佈,例如 \(p(y\mid x)\)。36:10
  3. 結構 / 知識發現:在乎模型本身(基因怎麼互動、什麼導致癌症)。這是 CS228 的範圍,本課不談。

本講先處理 1,最後一節處理 2。

投影片 3–6 的圖:純文字為主。投影片 6「Learning as density estimation」重畫了第 2 講那張大圖:狗的照片 \(x_i\sim P_{\text{data}}\),綠色的 Model family,以及兩者之間的 \(d(P_{\text{data}}, P_\theta)\),最後一行問「How do we evaluate “closeness”?」。

B2KL divergence:衡量兩個分佈的距離

怎麼比較兩個分佈?不同的比較方式會得到不同的生成模型。本講用資訊理論的方式(壓縮),之後 GAN 會用「能不能分辨兩邊的樣本」。39:18

定義 $$D(p\,\Vert\,q) = \sum_{\mathbf x} p(\mathbf x)\log\frac{p(\mathbf x)}{q(\mathbf x)} = \mathbb E_{\mathbf x\sim p}\!\left[\log\frac{p(\mathbf x)}{q(\mathbf x)}\right]$$ 性質:\(D(p\Vert q)\ge0\),等號成立若且唯若 \(p=q\)。而且不對稱:\(D(p\Vert q)\ne D(q\Vert p)\)。

直覺:看每個可能的 \(\mathbf x\),比較兩個分佈給它的機率比值,再用 \(p\) 的機率加權平均。如果處處相等,比值是 1,\(\log1=0\),KL 就是 0。47:05

投影片 7 的圖:KL 的定義 \(D(p\Vert q) = \sum_xp(x)\log\frac{p(x)}{q(x)}\),以及一行的非負性證明 \(\mathbb E_{x\sim p}[-\log\frac{q(x)}{p(x)}]\ge-\log(\mathbb E_{x\sim p}[\frac{q(x)}{p(x)}]) = -\log(\sum_xq(x)) = 0\),最後強調 KL 不對稱,且「measures the expected number of extra bits required to describe samples from \(p(x)\) using a compression code based on \(q\) instead of \(p\)」。下面的補充框把這一行證明逐步展開。

非負性的證明(課堂跳過的「一行證明」):Jensen 不等式

Jensen 不等式:若 \(f\) 是凸函數,則 \(\mathbb E[f(X)]\ge f(\mathbb E[X])\)。直覺:凸函數的圖形是向上彎的碗,兩點連線(平均)一定在曲線上方。

\(-\log\) 是凸函數(\(\log\) 是凹的)。令 \(X = q(\mathbf x)/p(\mathbf x)\),\(\mathbf x\sim p\):

$$D(p\Vert q) = \mathbb E_{\mathbf x\sim p}\!\left[-\log\frac{q(\mathbf x)}{p(\mathbf x)}\right] \ge -\log\mathbb E_{\mathbf x\sim p}\!\left[\frac{q(\mathbf x)}{p(\mathbf x)}\right] = -\log\sum_{\mathbf x}p(\mathbf x)\frac{q(\mathbf x)}{p(\mathbf x)} = -\log\sum_{\mathbf x}q(\mathbf x) = -\log1 = 0$$

等號只有在 \(q(\mathbf x)/p(\mathbf x)\) 是常數時成立(Jensen 的等號條件),又因為兩者都加總為 1,常數只能是 1,也就是 \(p=q\)。

注意:KL 不是數學上的「距離」(metric),因為它不對稱,也不滿足三角不等式。所以常叫它 divergence。

KL 的壓縮解釋

知道資料的分佈,就能設計更好的壓縮方式。43:24

  • 公平硬幣丟 100 次:正面記 0、反面記 1,平均每次 1 bit,無法更好。
  • 如果正面遠比反面常見:把常見的序列(HHHH)編成短碼,罕見的(TTTT)編成長碼,平均長度就會變短。
  • Morse code 就是這樣:E 是「•」、A 是「•−」,罕見的 Q 是「− − • −」。英文裡母音最常見,所以碼最短。44:26

投影片 8 的圖(「Detour on KL-divergence」):100 次公平硬幣,正面記 0、反面記 1,期望每個樣本 1 bit,無法更好;硬幣有偏 \(P[H]\gg P[T]\) 時,把常見的長序列 HHHH 用短碼、罕見的 TTTT 用長碼,再以 Morse code(E = •、A = •−、Q = −−•−)為例;最後一句是 KL 的壓縮解釋。

解釋資料真正來自 \(p\),你卻用針對 \(q\) 最佳化的編碼方式,平均每個樣本會多花 \(D(p\Vert q)\) 個 bit(log 以 2 為底時)。所以最小化 KL 就是在追求最好的壓縮:能壓縮得好,代表你掌握了資料的結構。45:27
Entropy、cross-entropy 和 KL 的關係(課堂只提到名字)

最佳編碼給機率 \(p(\mathbf x)\) 的事件分配約 \(-\log_2 p(\mathbf x)\) 個 bit(Shannon)。機率 1/2 用 1 bit,1/8 用 3 bit。

  • Entropy:用正確分佈編碼的平均長度,\(H(p) = -\mathbb E_{p}[\log p(\mathbf x)]\)。這是無法再壓縮的下限,代表資料本身有多隨機。
  • Cross-entropy:資料來自 \(p\),卻用 \(q\) 的編碼,\(H(p,q) = -\mathbb E_{p}[\log q(\mathbf x)]\)。
  • KL:兩者之差,\(D(p\Vert q) = H(p,q) - H(p)\ge0\)。

例:真實硬幣 \(p(H)=0.9\)。\(H(p) = -0.9\log_2 0.9 - 0.1\log_2 0.1 \approx 0.469\) bit。若誤以為是公平硬幣(\(q(H)=0.5\)),每次都用 1 bit,cross-entropy 是 1 bit,多花了 \(D(p\Vert q)\approx0.531\) bit。

分類器訓練用的「cross-entropy loss」就是這個 \(H(p,q)\),\(p\) 是真實標籤(one-hot)、\(q\) 是模型預測。

方向很重要:forward KL vs. reverse KL

學生問:把兩個參數對調,改成 \(D(P_\theta\Vert P_{\text{data}})\) 會怎樣?49:11

\(D(P_{\text{data}}\Vert P_\theta)\)(forward)\(D(P_\theta\Vert P_{\text{data}})\)(reverse)
對誰取期望真實資料模型自己生成的樣本
重罰的情況資料可能出現、模型卻給 ≈0 機率(log 爆掉)模型生成、資料卻幾乎不可能出現
行為mode-covering:把機率質量攤開,蓋住所有資料mode-seeking:集中在一個 mode 也能得到不錯的分數
類比重 recall(不能漏掉任何真實樣本)重 precision(生成的都要像真的)
可計算性可以,會化成 maximum likelihood(B3)需要 \(P_{\text{data}}(\mathbf x)\) 的值,無法直接最佳化;GAN 會再談

老師指出 reverse KL 在某種意義上更符合使用情境:你實際在乎的是模型自己生成的東西好不好。但它少了讓 forward KL 可計算的那個好性質。49:44兩者在模型夠大、資料無限、最佳化完美時都會得到 \(P_\theta=P_{\text{data}}\),但在真實情況下結果很不一樣。52:58

DemoForward vs. reverse KL:用一個高斯擬合兩個峰

真實分佈 \(P_{\text{data}}\)(灰色)是兩個高斯的混合。模型家族只有單一高斯 \(q=\mathcal N(\mu,\sigma^2)\)(藍色),表達能力不夠,一定會有取捨。拖動滑桿手動調整,或按按鈕讓梯度下降分別最小化兩種 KL。

P_data模型 q = N(μ, σ²)
  • Forward KL 的最佳解剛好是「和資料同平均、同變異數」的高斯(moment matching):寬大的鐘形蓋住兩個峰,中間沒有資料的地方也給了不少機率。這就是 maximum likelihood 的行為,也對應老師說的「被迫分散機率質量,可能生成訓練集中沒有的怪東西」。64:16
  • Reverse KL 會收斂到其中一個峰,忽略另一個。按鈕固定從 \(\mu = 1\)、\(\sigma = 0.4\) 出發,實測收斂到右邊的峰(\(\mu\approx1.99\)、\(\sigma\approx0.61\),reverse KL 0.692 nats,但 forward KL 高達 10 nats);換一個起點,就可能收斂到另一個峰。生成的樣本都很像真的,但多樣性不足。之後 GAN 的 mode collapse 和這個現象有關。
  • Reverse KL 的目標函數有多個局部最佳解。手動把 μ 調到 0、σ 調到 1.8,reverse KL 是 1.138 nats,往 μ 或 σ 任何方向稍微移動都會變大:這是另一個(比較差的)局部極小,比單峰解的 0.692 差。梯度下降如果從這附近出發,會卡在兩峰中間。這是非凸最佳化的典型情形。(Forward KL 的按鈕實測收斂到 \(\mu\approx0.15\)、\(\sigma\approx2.17\),forward KL 0.559 nats。)
  • 把兩峰的距離調到 0,兩種 KL 的最佳解會變成同一個,因為這時模型家族已經能完全表示資料。

B3從 KL 到 maximum likelihood

\(D(P_{\text{data}}\Vert P_\theta)\) 裡面有 \(P_{\text{data}}(\mathbf x)\),看起來算不了。把 log 的比值拆開:55:29

$$D(P_{\text{data}}\Vert P_\theta) = \underbrace{\mathbb E_{\mathbf x\sim P_{\text{data}}}[\log P_{\text{data}}(\mathbf x)]}_{=-H(P_{\text{data}})\text{,和 }\theta\text{ 無關}} - \mathbb E_{\mathbf x\sim P_{\text{data}}}[\log P_\theta(\mathbf x)]$$

第一項是常數,最佳化時可以忽略。於是

等價 $$\arg\min_{P_\theta} D(P_{\text{data}}\Vert P_\theta) = \arg\min_{P_\theta} -\mathbb E_{\mathbf x\sim P_{\text{data}}}[\log P_\theta(\mathbf x)] = \arg\max_{P_\theta}\mathbb E_{\mathbf x\sim P_{\text{data}}}[\log P_\theta(\mathbf x)]$$
  • 意思是:讓模型給從 \(P_{\text{data}}\) 抽出的樣本高機率。56:30
  • 因為有 log,任何 \(P_\theta(\mathbf x)\approx0\) 的資料點都會對目標造成很大影響。這就是 forward KL「mode-covering」的來源:每個訓練樣本都必須得到非零機率(高 recall),模型容量有限時就只能把機率質量攤到其他地方,可能生成訓練集中沒有的怪東西(precision 下降)。63:46

代價:只能比較,不知道離最佳有多遠

丟掉的那一項是資料分佈的 entropy \(H(P_{\text{data}})\),代表資料本身有多難建模。我們能比較兩個模型 \(\theta_1,\theta_2\) 誰比較接近資料(相減時常數消掉),但永遠不知道自己離 \(P_{\text{data}}\) 的距離。57:35

$$D(P_{\text{data}}\Vert P_{\theta_1}) - D(P_{\text{data}}\Vert P_{\theta_2}) = \mathbb E_{P_{\text{data}}}[\log P_{\theta_2}(\mathbf x)] - \mathbb E_{P_{\text{data}}}[\log P_{\theta_1}(\mathbf x)]$$

學生問:兩個模型 log-likelihood 一樣時怎麼選?老師說用 Occam's razor,選比較簡單的。59:39

最後一步:用訓練集近似期望

\(\mathbb E_{P_{\text{data}}}\) 還是算不了,但可以用訓練集的平均近似:60:10

$$\mathbb E_{\mathbf x\sim P_{\text{data}}}[\log P_\theta(\mathbf x)] \approx \mathbb E_{\mathcal D}[\log P_\theta(\mathbf x)] = \frac{1}{|\mathcal D|}\sum_{\mathbf x\in\mathcal D}\log P_\theta(\mathbf x)$$
Maximum likelihood learning $$\max_{P_\theta}\ \frac{1}{|\mathcal D|}\sum_{\mathbf x\in\mathcal D}\log P_\theta(\mathbf x) \quad\Longleftrightarrow\quad \max_{P_\theta}\ P_\theta(\mathbf x^{(1)},\dots,\mathbf x^{(m)}) = \prod_{\mathbf x\in\mathcal D}P_\theta(\mathbf x)$$

右邊是「看到這份資料集的機率」,因為樣本 i.i.d.,所以是乘積;取 log 就變成左邊的總和(\(1/|\mathcal D|\) 是常數,不影響最佳解)。61:43

出處:Lai et al. (2026) §1.1.1「Mathematical Setup」的「Forward KL and Maximum Likelihood Estimation」段落用同一條推導,並強調 MLE 只需要資料的樣本,不需要算資料密度本身;同一段也說明 forward KL 為什麼是 mode covering:只要模型在資料有機率的區域給 0,KL 就是無窮大。

學生問:能不能也用樣本估計被丟掉的 entropy?

期望可以用樣本平均估,但裡面的 \(\log P_{\text{data}}(\mathbf x)\) 本身未知,這才是困難所在。可以用 kernel density estimation 之類的方法估 \(P_{\text{data}}\),或乾脆代入一個你相信不錯的模型 \(P_\theta\),但永遠不知道自己偏差多少。62:45

B4Monte Carlo 估計:為什麼可以用樣本平均

這個「用樣本平均取代期望」的想法整門課會一直出現。64:47

  1. 把想算的量寫成某個隨機變數的期望:\(\mathbb E_{x\sim P}[g(x)] = \sum_x g(x)P(x)\)。
  2. 從 \(P\) 抽 \(T\) 個獨立樣本 \(x^1,\dots,x^T\)。
  3. 估計量 \(\hat g(x^1,\dots,x^T) = \frac1T\sum_{t=1}^T g(x^t)\)。

\(\hat g\) 本身是隨機變數,因為它取決於抽到哪些樣本。它的三個性質:66:25

不偏 unbiased\(\mathbb E_P[\hat g] = \mathbb E_P[g(x)]\):平均而言答案是對的
收斂大數法則:\(T\to\infty\) 時 \(\hat g\to\mathbb E_P[g(x)]\)
變異數\(\mathrm{Var}_P[\hat g] = \mathrm{Var}_P[g(x)]/T\):樣本越多,越不可能離譜
不偏和變異數公式的推導

不偏:期望是線性的,\(\mathbb E[\hat g] = \frac1T\sum_t\mathbb E[g(x^t)] = \frac1T\cdot T\cdot\mathbb E[g(x)]\)。

變異數:獨立隨機變數的和,變異數可以相加;常數提出變異數要平方:

$$\mathrm{Var}[\hat g] = \frac{1}{T^2}\sum_{t=1}^T\mathrm{Var}[g(x^t)] = \frac{1}{T^2}\cdot T\cdot\mathrm{Var}[g(x)] = \frac{\mathrm{Var}[g(x)]}{T}$$

所以標準差(誤差的典型大小)以 \(1/\sqrt T\) 下降:樣本多 100 倍,誤差才小 10 倍。

套回 MLE:期望 log-likelihood 是一個固定的數;訓練集平均是它的 Monte Carlo 估計。換一份訓練集答案會不同,但訓練集夠大時會很接近真值。67:28

Demo · 重複估計 2,000 次,看估計量的分佈

要估計 \(\mathbb E[x^2]\),\(x\sim\mathcal N(0,1)\),真值是 1。每次用 \(T\) 個樣本得到一個 \(\hat g\),重複 2,000 次畫直方圖。

2,000 個 ĝ 的直方圖真值 1
實測標準差理論 √(2/T)

B5最簡單的例子:丟硬幣

資料 \(\mathcal D = \{H,H,T,H,T\}\)。模型家族是所有 \(\{H,T\}\) 上的分佈:\(P_\theta(H)=\theta\)、\(P_\theta(T)=1-\theta\)。68:31

$$L(\theta;\mathcal D) = \prod_i P_\theta(x_i) = \theta\cdot\theta\cdot(1-\theta)\cdot\theta\cdot(1-\theta) = \theta^3(1-\theta)^2$$

找讓 \(L\) 最大的 \(\theta\):答案是 0.6,可以用公式直接解出來(closed form)。70:35

投影片 15 的圖:\(L(\theta)\) 對 \(\theta\in[0,1]\) 的曲線,一個不對稱的鐘形,在 \(\theta = 0.6\) 達到最大,兩端都是 0。

為什麼是 0.6?微分求極值

一般化:\(n_H\) 個正面、\(n_T\) 個反面。log-likelihood 為

$$\ell(\theta) = n_H\log\theta + n_T\log(1-\theta)$$

(取 log 不改變最大值的位置,因為 log 遞增;而且乘積變成總和,比較好微分。)令導數為 0:

$$\frac{d\ell}{d\theta} = \frac{n_H}{\theta} - \frac{n_T}{1-\theta} = 0 \;\Longrightarrow\; n_H(1-\theta) = n_T\theta \;\Longrightarrow\; \theta^\star = \frac{n_H}{n_H+n_T}$$

二階導數 \(-n_H/\theta^2 - n_T/(1-\theta)^2 < 0\),確定是最大值。所以 MLE 就是正面出現的比例:3/5 = 0.6。

這也證明了第 2 講 Demo A 的說法:Bayes net 每個 CPT 的 MLE 就是「計數再除以總數」。Categorical 分佈的 MLE 同樣是各類別的頻率。

Demo · 點硬幣切換正反,看 likelihood 曲線

觀察:資料越多,likelihood 曲線越尖,代表資料對 \(\theta\) 的約束越強。只有 1、2 枚硬幣時,MLE 可能是 0 或 1,這就是小資料下的 overfitting(B7)。

B6訓練 autoregressive model

現在 \(\theta\) 是神經網路的所有參數,但道理相同:找讓資料集機率最大的 \(\theta\)。好消息是 autoregressive model 算 likelihood 很容易,就是 chain rule。71:08

$$L(\theta,\mathcal D) = \prod_{j=1}^m P_\theta(\mathbf x^{(j)}) = \prod_{j=1}^m\prod_{i=1}^n p_{\text{neural}}\big(x_i^{(j)}\mid \mathbf x_{<i}^{(j)};\theta_i\big)$$
$$\ell(\theta) = \log L(\theta,\mathcal D) = \sum_{j=1}^m\sum_{i=1}^n\log p_{\text{neural}}\big(x_i^{(j)}\mid \mathbf x_{<i}^{(j)};\theta_i\big)$$
  • 不再有 closed form,要用最佳化演算法。72:41
  • \(\ell(\theta)\) 就是「所有資料點、所有位置上,各個條件分類器的 log 機率總和」。所以 MLE = 讓每個「由前文預測下一個變數」的分類器的 cross-entropy 盡量小。73:44
演算法(梯度上升)
  1. 隨機初始化 \(\theta^0\);
  2. 用 backpropagation 算 \(\nabla_\theta\ell(\theta)\);
  3. \(\theta^{t+1} = \theta^t + \alpha_t\nabla_\theta\ell(\theta^t)\)。
非凸最佳化,沒有找到全域最佳的保證,但實務上通常效果很好。

沒有參數共享時:各自獨立

$$\nabla_{\theta_i}\ell(\theta) = \sum_{j=1}^m\nabla_{\theta_i}\sum_{i'=1}^n\log p_{\text{neural}}(x_{i'}^{(j)}\mid\mathbf x_{<i'}^{(j)};\theta_{i'}) = \sum_{j=1}^m\nabla_{\theta_i}\log p_{\text{neural}}(x_i^{(j)}\mid\mathbf x_{<i}^{(j)};\theta_i)$$

\(\theta_i\) 只出現在第 \(i\) 個條件中,所以每個條件分佈可以分開訓練。實務上 NADE、PixelRNN、PixelCNN 都會共享參數,梯度就會從所有位置匯集過來(第 3 講 NADE 的 \(\mathbf w_1\) 從所有預測任務得到訊號)。

資料太多時:SGD 是另一層 Monte Carlo

每一步都要對整個資料集求和,太貴。把總和改寫成對「均勻抽一筆資料」的期望:76:23

$$\nabla_\theta\ell(\theta) = m\sum_{j=1}^m\frac1m\sum_{i=1}^n\nabla_\theta\log p_{\text{neural}}(x_i^{(j)}\mid\mathbf x_{<i}^{(j)};\theta_i) = m\,\mathbb E_{\mathbf x^{(j)}\sim\mathcal D}\Big[\sum_{i=1}^n\nabla_\theta\log p_{\text{neural}}(x_i^{(j)}\mid\mathbf x_{<i}^{(j)};\theta_i)\Big]$$

再用 Monte Carlo:只抽一筆(或一小批)資料,用它的梯度估計整體梯度。這就是 stochastic gradient descent 和 mini-batch。這個估計是不偏的,batch 越大變異數越小,和 B4 的 demo 是同一回事。77:26

為什麼 autoregressive model 的 MLE 能拆成分類器的 cross-entropy?以二元像素為例

第 \(i\) 個條件是 Bernoulli,\(\hat x_i = p(x_i{=}1\mid\mathbf x_{<i})\),所以

$$-\ell(\theta) = \sum_j\sum_i\Big[-x_i^{(j)}\log\hat x_i^{(j)} - (1-x_i^{(j)})\log(1-\hat x_i^{(j)})\Big]$$

每一項就是一個二元分類器的 binary cross-entropy,「正確答案」是資料中真正的 \(x_i^{(j)}\)。這也是第 3 講 autoencoder 損失和 FVSBN 長得一樣的原因。

對 logistic 單元,梯度非常簡潔:\(\partial(-\log p)/\partial z_i = \hat x_i - x_i\)(預測減答案)。第 2、3 講的 demo 程式碼裡的 g = sig(z) - x[i] 就是這一行。

B7過擬合與 bias-variance 取捨

盲目最大化訓練集 likelihood 會出問題。極端例子:模型就是資料本身,把訓練集背下來,每個訓練樣本給機率 \(1/m\),其他全給 0。訓練分數很好,但對沒看過的樣本完全沒用(log 0 = −∞)。我們在乎的是泛化:從同一個分佈來、但沒見過的樣本。78:00

BIAS假設空間太受限(例如只用 logistic regression、強的條件獨立假設),即使資料無限也無法表示 \(P_{\text{data}}\)。限制了能多接近目標。79:02
VARIANCE
假設空間太有彈性、資料又少:很多模型都能把資料擬合得很好,甚至比真模型還好;資料稍微變動,學出的參數就變很多。80:06

投影片用多項式迴歸說明:直線 underfit,高次多項式 overfit,低次多項式取得平衡。下面改用和本課直接相關的密度估計示範同一件事。80:39

投影片 22 的圖:同一組帶雜訊的點畫了三次:用直線擬合(「Hypothesis space: linear relationship. Does it fit well? Underfits」)、用高次多項式擬合(曲線劇烈擺動穿過每個點,「Overfits」)、用低次多項式擬合(「Right tradeoff」)。

Demo · 直方圖密度估計:箱子越多越好嗎?

模型家族:在 \([-4,4]\) 上切成 \(B\) 個等寬箱子的直方圖密度(每箱的 MLE 就是「落在箱內的比例 ÷ 箱寬」,再加一點點平滑避免 log 0)。\(B\) 越大,模型越有彈性。

真實 P_data學到的直方圖密度
訓練集平均 log-likelihood測試集(5,000 個新樣本)真實分佈的 −H(最佳可能)
  • B 很小(bias 大):直方圖太粗,訓練和測試分數都差。
  • B 很大(variance 大):訓練分數持續上升,甚至超過真實分佈的最佳值(模型「比真模型還好」地擬合了訓練資料),但測試分數下降。按「換一份訓練集」,直方圖形狀會大幅改變。
  • 增加訓練樣本數 m,最佳的 B 會往右移:資料越多,能負擔越有彈性的模型。

怎麼避免 overfitting

  • 硬限制:選表達力較低的模型家族,例如較小的神經網路、權重共享(第 3 講的 NADE、RNN)。82:10
  • 軟偏好(Occam's razor):在目標函數加正則化項,\(\text{objective}(\mathbf x,\mathcal M) = \text{loss}(\mathbf x,\mathcal M) + R(\mathcal M)\)。例如偏好參數較少、或參數值較小的模型。82:43
  • 驗證集:留一部分資料不訓練,用來評估。訓練和驗證 loss 差距很大就表示 overfitting。這是實務上最常用的做法。83:15
  • Bayesian 方法:理論上可以,但計算上非常困難。81:40

投影片 23 的圖:再一次畫出資料、模型家族與距離的大圖,旁邊列出硬限制(較小的網路、權重共享)、軟偏好(Occam's razor、正則化 \(\text{objective}(\mathbf x,\mathcal M) = \text{loss}(\mathbf x,\mathcal M) + R(\mathcal M)\)),以及用驗證集評估泛化。

Bias-variance 分解(以平方誤差為例)

設真值是 \(f\),在不同訓練集上學到的估計是 \(\hat f\)(隨訓練集而變的隨機變數)。則

$$\mathbb E\big[(\hat f - f)^2\big] = \underbrace{\big(\mathbb E[\hat f] - f\big)^2}_{\text{bias}^2} + \underbrace{\mathbb E\big[(\hat f-\mathbb E[\hat f])^2\big]}_{\text{variance}}$$

(展開平方,交叉項的期望是 0。)bias 是「平均而言離真值多遠」,variance 是「換一份資料會抖多少」。模型越有彈性,bias 越小、variance 越大,總誤差在中間某處最小。直方圖 demo 的測試曲線先升後降就是這個現象。

B8條件生成模型(投影片 24)

如果只想由一組變數 \(\mathbf X\) 生成另一組 \(\mathbf Y\)(例如 text-to-speech),就只需要建模 \(p(\mathbf Y\mid\mathbf X)\),用條件損失 \(-\log P_\theta(\mathbf y\mid\mathbf x)\) 訓練。因為損失只依賴條件分佈,不需要學聯合分佈。這是 B1「特定預測任務」那一類,課堂最後一句話帶過。

投影片 24 的圖:一張草地上的棕色馬的照片「Input Image」,箭頭指向文字「Brown horse in grass field」(「Output Caption」),說明看圖說話只需要條件分佈 \(P_\theta(\mathbf y\mid\mathbf x)\)。

本講總結(投影片 25)

  • Autoregressive model 很容易算 \(p_\theta(\mathbf x)\),理想上每個條件 \(\log p_{\text{neural}}(x_i^{(j)}\mid\mathbf x_{<i}^{(j)};\theta_i)\) 可以平行計算(不像 RNN),所以很自然用 maximum likelihood 訓練。
  • log-likelihood 較高,不一定代表樣本看起來比較好。Forward KL 在乎的是「不漏掉任何資料」,不是「每個樣本都漂亮」。
  • 還有其他衡量分佈相似度的方式,例如 GAN(第 9–10 講)。

常見誤解

誤解:「KL 是距離,所以 D(p‖q) = D(q‖p)」。KL 不對稱,也不滿足三角不等式。兩個方向會給出很不同的最佳解(mode-covering vs. mode-seeking)。
誤解:「訓練 log-likelihood 能告訴我模型離真實分佈多近」。中間少了 \(H(P_{\text{data}})\) 這個未知常數,只能比較模型之間的好壞。
誤解:「訓練集 likelihood 越高越好」。可能只是背下訓練資料。要看驗證集 / 測試集。
誤解:「likelihood 高,樣本就好看」。Forward KL 重 recall,可能為了蓋住所有資料而在中間生成奇怪的東西。likelihood 和樣本品質是兩回事。
誤解:「Monte Carlo 估計是隨便猜」。它是不偏的,變異數以 \(1/T\) 下降,有嚴格的保證。SGD 的小批次梯度也是如此。
誤解:「取 log 會改變 MLE 的解」。log 是遞增函數,不改變最大值的位置;它只是把乘積變成總和,避免數值下溢、也比較好微分。

自我測驗

1. Attention 解決了 RNN 的哪兩個問題?Transformer 如何在訓練時平行化?
解決了「單一隱藏向量瓶頸」(可以直接看所有過去位置)和「長距離依賴難學」。Transformer 拿掉遞迴、只疊遮罩 self-attention,訓練時所有位置的條件機率一次 forward 算完。
2. PixelCNN 為什麼要遮罩卷積?疊很多層後會出現什麼問題?
為了讓每個像素的預測只用到 raster 順序中之前的像素,保持 autoregressive。疊多層後會出現 blind spot:右上方一塊已生成的像素永遠看不到,需要組合不同遮罩來修正。
3. 用 Jensen 不等式證明 D(p‖q) ≥ 0。
\(D = \mathbb E_p[-\log(q/p)] \ge -\log\mathbb E_p[q/p] = -\log\sum_x q(x) = 0\),因為 \(-\log\) 是凸函數。
4. 真實硬幣 p(H) = 0.9,你用公平硬幣的編碼。平均每次多花幾個 bit?
\(D(p\Vert q) = 0.9\log_2\frac{0.9}{0.5} + 0.1\log_2\frac{0.1}{0.5} \approx 0.763 - 0.232 = 0.531\) bit。
5. 推導:最小化 D(P_data‖P_θ) 等價於最大化期望 log-likelihood。
\(D = \mathbb E_{P_{\text{data}}}[\log P_{\text{data}}] - \mathbb E_{P_{\text{data}}}[\log P_\theta]\)。第一項與 \(\theta\) 無關,所以最小化 \(D\) 等於最大化 \(\mathbb E_{P_{\text{data}}}[\log P_\theta]\)。
6. 為什麼 forward KL 會 mode-covering?
期望是對資料取的,只要有資料點 \(\mathbf x\) 讓 \(P_\theta(\mathbf x)\approx0\),\(\log P_\theta(\mathbf x)\to-\infty\),損失就爆掉。模型被迫給所有資料可能出現的地方非零機率,容量不足時只能把機率攤開,蓋住所有 mode。
7. 為什麼 reverse KL 不能直接拿來訓練?
\(D(P_\theta\Vert P_{\text{data}}) = \mathbb E_{P_\theta}[\log P_\theta - \log P_{\text{data}}]\),需要對模型樣本計算 \(\log P_{\text{data}}(\mathbf x)\),而我們只有資料樣本、沒有它的機率值。
8. Monte Carlo 估計用 T = 100 個樣本,誤差標準差是 0.2。想降到 0.02,需要多少樣本?
標準差 \(\propto1/\sqrt T\),要小 10 倍需要 \(100\times10^2 = 10{,}000\) 個樣本。
9. 資料有 7 個正面、3 個反面。寫出 log-likelihood 並求 MLE。
\(\ell(\theta) = 7\log\theta + 3\log(1-\theta)\),令導數 \(7/\theta - 3/(1-\theta) = 0\),得 \(\theta^\star = 0.7\)。
10. 沒有參數共享時,FVSBN 的 MLE 可以怎麼簡化?
\(\theta_i\) 只出現在第 \(i\) 個條件裡,所以 \(\ell(\theta)\) 拆成 n 個互不相干的 logistic regression,可以分別訓練:第 i 個用所有資料的 \((\mathbf x_{<i}, x_i)\) 做分類。
11. 為什麼 SGD 也算一種 Monte Carlo?它的估計不偏嗎?
完整梯度可寫成 \(m\,\mathbb E_{\mathbf x\sim\text{Uniform}(\mathcal D)}[\nabla\log P_\theta(\mathbf x)]\),SGD 用抽到的一小批資料的平均梯度估計這個期望。均勻抽樣時是不偏的,batch 越大變異數越小。
12. 直方圖密度估計中,箱子數 B 很大時訓練 log-likelihood 為什麼可以超過真實分佈的 −H?
箱子很窄時,每個訓練點附近的密度會被估得很高(比例 ÷ 很小的箱寬),模型把有限樣本「背」下來,在訓練點上給的機率比真實分佈還高。這是 overfitting:在新資料上,很多點落在沒有訓練樣本的箱子裡,機率很低,測試分數變差。

延伸閱讀