CS236 第 11 講 · Energy-Based Models
Stanford CS236 · Fall 2023 · Lecture 11

Energy-Based Models:任意的神經網路,除以一個算不出來的常數

要讓神經網路的輸出變成機率,「非負」很容易,「總和為 1」很難。前面的模型(autoregressive、flow、VAE)都靠特殊的結構保證歸一化,代價是架構受限。Energy-based model 直接拿任意網路 \(f_\theta\),定義 \(p_\theta(\mathbf x) = \exp(f_\theta(\mathbf x))/Z(\theta)\),然後接受 \(Z(\theta)\) 算不出來這件事。這講看這樣做換到了什麼(彈性、可組合、只需比較的應用都不用 \(Z\)),付出了什麼(likelihood、訓練、取樣都變難),以及兩個關鍵工具:用模型樣本估計梯度的 contrastive divergence,和只靠比較就能取樣的 MCMC。

讀完這頁你應該能夠

  1. 說明為什麼「歸一化」是設計機率模型時真正困難的條件,以及 autoregressive 和 latent variable model 怎麼繞過它。
  2. 寫出 EBM 的定義與 partition function,說明為什麼用 exp、為什麼叫「能量」。
  3. 舉出不需要 \(Z(\theta)\) 的任務(比較兩點、去雜訊、分類),並解釋原因。
  4. 說明 product of experts 為什麼像 AND、mixture 為什麼像 OR。
  5. 寫出 RBM 的能量函數,說明為什麼它的 \(Z\) 需要指數時間。
  6. 推導 \(\nabla_\theta\log Z(\theta) = \mathbb E_{\mathbf x\sim p_\theta}[\nabla_\theta f_\theta(\mathbf x)]\),並由此得到 contrastive divergence。
  7. 寫出投影片上的 MCMC 演算法,解釋為什麼要偶爾接受變差的提議。

前置知識檢查

  • 第 3 講:autoregressive model 是條件分佈的乘積;第 5 講:latent variable model 是混合分佈。
  • 第 4 講:MLE 等價於最小化 KL;梯度上升。
  • softmax、log-sum-exp;機率圖模型(第 2 講的 Bayes net 是有向的,這講的 Ising model 是無向的)。
  • 微積分:\(\nabla\log g = \nabla g/g\),以及積分與微分交換。

本頁對照過投影片圖片;標「出處」的補充來自 Song & Kingma (2021)〈How to Train Your Energy-Based Models〉(TeX 原始檔)、Lai et al. (2026)(arXiv 2510.21890v3)§3.1、Hinton (2002)、Tieleman (2008)、Besag (1986)。注意 Lai 的書和 Song & Kingma 用能量 \(E = -f\) 的寫法,\(p\propto\exp(-E)\),和課堂的 \(f\) 差一個負號。

01回顧與今天的計畫(投影片 2–4)

  • Likelihood-based(autoregressive、flow、VAE):用 KL / MLE 訓練,有原則,但模型架構受限:必須用鏈式法則、可逆網路,或接受近似。00:35
  • GAN:架構非常自由,但 likelihood 算不出來、訓練不穩定、難以評估、有 mode collapse。02:41

今天的 energy-based model(EBM):04:43

  • 非常有彈性的模型架構;
  • 穩定的訓練(仍然基於 maximum likelihood 或利用「這是一個機率模型」的其他 loss);
  • 相對高的樣本品質,而且和 diffusion model(目前影像、影片、音訊的最先進方法)關係密切;
  • 可以靈活地組合:把不同的模型(甚至不同家族,例如 flow 和 autoregressive)合在一起。05:47

02機率分佈的兩個條件(投影片 5–6)

機率分佈就是一個把 \(\mathbf x\)(圖片、句子……)映射到純量的函數,但不是任意函數都行:07:18

  1. 非負:\(p(\mathbf x)\ge 0\)。
  2. 總和為 1:\(\sum_{\mathbf x}p(\mathbf x) = 1\),連續情況是 \(\int p(\mathbf x)d\mathbf x = 1\)。

非負很容易:拿任意網路 \(f_\theta\),最後加一層就行。\(g_\theta(\mathbf x) = f_\theta(\mathbf x)^2\)、\(\exp(f_\theta(\mathbf x))\)、\(|f_\theta(\mathbf x)|\)、\(\log(1+\exp(f_\theta(\mathbf x)))\)……新網路和原本幾乎一樣有彈性。09:26

總和為 1 才是真正的難題。為什麼它這麼重要?

切蛋糕的比喻總「體積」固定,就像一塊蛋糕:把一片切大,其他片一定變小。訓練時把訓練資料 \(\mathbf x_{\text{train}}\) 的機率調高,就保證它相對於其他東西變得更可能,而其他東西(在生成模型裡,多半是我們不想要的)自動變得較不可能。11:29

投影片 6 的圖:一個切開的派,其中幾片已經被拿走、放在旁邊的盤子上。

問題:任何 \(g_\theta\ge 0\) 都有一個總體積 \(\sum_{\mathbf x}g_\theta(\mathbf x) = Z(\theta)\),但這個數一般會隨 \(\theta\) 改變,不會是 1。要讓它不管參數怎麼選都固定,必須用特殊的設計(autoregressive、可逆架構)。13:33

03已知體積的積木(投影片 7–8)

解法很直接:除以體積。15:39

$$p_\theta(\mathbf x) = \frac{1}{Z(\theta)}g_\theta(\mathbf x) = \frac{1}{\int g_\theta(\mathbf x)d\mathbf x}g_\theta(\mathbf x) = \frac{1}{\text{Volume}(g_\theta)}g_\theta(\mathbf x),\qquad \int p_\theta(\mathbf x)d\mathbf x = \frac{Z(\theta)}{Z(\theta)} = 1$$

傳統的做法是選一個體積能解析算出的 \(g_\theta\):18:52

  • \(g_{(\mu,\sigma)}(x) = e^{-\frac{(x-\mu)^2}{2\sigma^2}}\),體積 \(\sqrt{2\pi\sigma^2}\),得到高斯。高斯 PDF 前面那個奇怪的常數就是體積。
  • \(g_\lambda(x) = e^{-\lambda x}\)(\(x\ge0\)),體積 \(1/\lambda\),得到指數分佈。20:28
  • \(g_\theta(x) = h(x)\exp\{\theta\cdot T(x)\}\),體積 \(\exp\{A(\theta)\}\),\(A(\theta) = \log\int h(x)\exp\{\theta\cdot T(x)\}dx\),得到指數族:常態、Poisson、指數、Bernoulli、beta、gamma、Dirichlet、Wishart 等。21:00

這些函數形式必須能解析積分,所以很受限,但它們是非常好用的積木。前面幾講的模型,其實就是把歸一化的積木組合成更複雜、而且仍然歸一化的物件:23:41

AUTOREGRESSIVE:乘積 $$\int_{\mathbf x}\int_{\mathbf y}p_\theta(\mathbf x)p_{\theta'(\mathbf x)}(\mathbf y)\,d\mathbf y\,d\mathbf x = \int_{\mathbf x}p_\theta(\mathbf x)\underbrace{\int_{\mathbf y}p_{\theta'(\mathbf x)}(\mathbf y)d\mathbf y}_{=1}d\mathbf x = 1$$ 第二個分佈的參數 \(\theta'\) 可以依賴 \(\mathbf x\),只要對每個 \(\theta'\) 都歸一化。
LATENT VARIABLE:混合 $$\int_{\mathbf x}\alpha p_\theta(\mathbf x) + (1-\alpha)p_{\theta'}(\mathbf x)\,d\mathbf x = \alpha + (1-\alpha) = 1$$ \(\alpha\) 就是一個只有兩個值的潛在變數的機率;VAE 是無限多個高斯的混合。27:19

這些「代數規則」保證歸一化,但也限制了最後的物件能多複雜。如果用體積算不出來的 \(g_\theta\) 呢?

為什麼指數族這麼常見?最大熵原理

假設你只知道某些統計量的平均值,例如 \(\mathbb E[T(x)] = \boldsymbol\mu\),想選一個「除此之外不多做假設」的分佈。用熵 \(H(p) = -\int p\log p\) 衡量「不多做假設」,求解

$$\max_p H(p)\quad\text{s.t.}\quad\mathbb E_p[T(x)] = \boldsymbol\mu,\ \int p = 1$$

寫 Lagrangian,對 \(p(x)\) 逐點微分:\(-\log p(x) - 1 + \boldsymbol\theta\cdot T(x) + \lambda = 0\),所以 \(p(x)\propto\exp\{\boldsymbol\theta\cdot T(x)\}\):正好是指數族。例如只固定平均值和變異數,最大熵分佈就是高斯。老師提到熱力學第二定律,也是同一回事:在固定平均能量下最大化熵,得到 Boltzmann 分佈 \(p\propto\exp(-E/kT)\)。38:16

04Energy-based model(投影片 9–10)

EBM 的定義 $$p_\theta(\mathbf x) = \frac{1}{\int\exp(f_\theta(\mathbf x))d\mathbf x}\exp(f_\theta(\mathbf x)) = \frac{1}{Z(\theta)}\exp(f_\theta(\mathbf x)),\qquad Z(\theta) = \int\exp(f_\theta(\mathbf x))d\mathbf x$$ \(f_\theta\) 是任意神經網路;\(Z(\theta)\) 叫 partition function(配分函數)。30:25

就這樣。對任何 \(\theta\),這都是合法的機率分佈:非負、積分為 1。從彈性的角度看,這已經是最好的了。

為什麼用 exp,而不是例如 \(f_\theta^2\)?

  1. 要表示機率上非常大的差異:好看的圖和純雜訊的機率可以差上很多個數量級。用 exp,網路輸出的小變化就對應機率的大變化;log 機率是我們自然想工作的尺度。用平方的話,網路輸出就得變化很劇烈、很不平滑。31:27
  2. 指數族:很多常見分佈本來就是這個形式。
  3. 統計物理:在相當一般的假設下(最大熵、熱力學第二定律)會自然出現這種分佈。
為什麼叫「能量」\(-f_\theta(\mathbf x)\) 叫做能量。物理上能量低的狀態比較可能出現,所以加負號:能量低(\(f_\theta\) 高)的 \(\mathbf x\) 比較可能。38:47
課堂問答 · 32:28這不就是 softmax 嗎?對,softmax 就是一個例子:把網路的原始輸出 \(f_\theta\) 變成類別分佈。差別在於 softmax 只有 \(k\) 個類別,分母可以精確算出;我們關心的 \(\mathbf x\) 是高維的(例如所有可能的圖),積分實際上算不出來。廣義來說,autoregressive model 也可以看成 \(Z(\theta)\equiv1\) 的 EBM:EBM 是非常一般的名詞,和其他家族並不互斥。32:28

優點與缺點(投影片 10)

優點極度有彈性:幾乎可以用任何 \(f_\theta\)。
缺點
  1. 從 \(p_\theta\) 取樣很難;
  2. 評估和最佳化 likelihood 很難(所以學習很難);
  3. 沒有特徵學習(但可以加潛在變數)。

維度的詛咒:根本問題是,沒有解析解時,用數值方法算 \(Z(\theta)\) 的成本隨 \(\mathbf x\) 的維度指數成長。離散情況,要加總的 \(\mathbf x\) 個數隨維度指數增加;連續情況,把空間切成小格子來近似積分,格子數也指數增加。45:39

課堂問答 · 41:55已經學到 \(p_\theta\) 了,為什麼取樣還是難?就算有人直接給你這個函數也一樣:沒有像 autoregressive 那樣的順序可以一個一個抽;連評估一個點的機率都需要 \(Z\),所以也不能用反 CDF。只能用某種局部搜尋式的方法(MCMC)。這很難但可行,diffusion model 本質上就在做這件事。41:55

05不需要 Z 的應用(投影片 11–13)

給兩個點 \(\mathbf x,\mathbf x'\),各自的機率都需要 \(Z(\theta)\),但比值不需要:47:15

$$\frac{p_\theta(\mathbf x)}{p_\theta(\mathbf x')} = \exp\big(f_\theta(\mathbf x) - f_\theta(\mathbf x')\big)$$

分子分母被同一個常數歸一化,約掉了。就像比較兩片蛋糕誰大,不需要知道整塊蛋糕多大。所以能輕易判斷哪個比較可能,應用包括異常偵測和去雜訊。這對設計取樣演算法也很關鍵。48:19

投影片 12 的圖:三個方框都寫著 \(E(Y,X)\),下面各接一個 \(X\) 和一個 \(Y\):物體辨識(\(X\) 是貓的照片、\(Y\) 是標籤 cat)、序列標註(\(X\) 是 "class"、\(Y\) 是 noun)、影像修復(\(X\) 是模糊的風景、\(Y\) 是清晰的風景)。這些任務都只需要比較不同的 \(Y\),所以不需要 \(Z\)。48:49

例:Ising model 去雜訊(投影片 13)

真實影像 \(\mathbf y\in\{0,1\}^{3\times3}\) 未知,觀察到被污染的 \(\mathbf x\in\{0,1\}^{3\times3}\),想還原 \(\mathbf y\)。把聯合分佈寫成一個 EBM(Markov random field):49:49

$$p(\mathbf y,\mathbf x) = \frac1Z\exp\Big(\sum_i\psi_i(x_i,y_i) + \sum_{(i,j)\in E}\psi_{ij}(y_i,y_j)\Big)$$
  • \(\psi_i(x_i,y_i)\):第 \(i\) 個污染像素依賴第 \(i\) 個原始像素,兩者相同時分數較高。
  • \(\psi_{ij}(y_i,y_j)\):相鄰像素傾向相同的值(對影像的先驗)。

投影片 13 的圖:左邊是一張龍貓玩偶和兩顆櫻桃的照片;右邊是 3×3 的格狀 Markov random field:黃色節點 \(Y_1\ldots Y_9\) 是真實像素,排成格子、相鄰的用線相連;每個黃色節點斜下方掛一個綠色節點 \(X_i\)(雜訊像素)。

還原的方法:最大化 \(p(\mathbf y\mid\mathbf x)\),等價於最大化 \(p(\mathbf y,\mathbf x)\)。\(1/Z\) 只是一個縮放因子,不影響最佳解。51:23

課堂問答 · 52:23\(\mathbf y\) 的空間很大,最佳化不是還是很難嗎?是,搜尋本身仍然可能很難,但至少不用管 \(Z\):所有候選 \(\mathbf y\) 都除以同一個 \(Z\)。\(\mathbf x\) 是固定的,也不用對它加總。52:23

Demo AIsing model 去雜訊

用 \(\pm1\) 表示像素。能量(取負號後)為 \(f(\mathbf y;\mathbf x) = \eta\sum_i x_iy_i + \beta\sum_{(i,j)}y_iy_j\):第一項要 \(\mathbf y\) 像觀察,第二項要相鄰像素一致。用 ICM(iterated conditional modes)找局部最大值:輪流看每個像素,選讓 \(f\) 較大的值,也就是 \(y_i\leftarrow\mathrm{sign}(\eta x_i + \beta\sum_{j\sim i}y_j)\)。每一步只比較同一個像素的兩個值,從頭到尾沒有算 \(Z\)。

原始 y(未知)
觀察 x
ICM 還原
  • \(\beta = 0\):沒有先驗,最佳解就是 \(\mathbf y = \mathbf x\),什麼都沒改。
  • \(\beta\) 適中(預設 \(\eta = 1,\beta = 0.8\)):孤立的雜訊點被鄰居「投票」改掉。實測翻轉機率 0.15 時,錯誤率從約 15.6% 降到約 5.1%。
  • \(\beta\) 再加大:先驗壓過觀察,ICM 變成單純的鄰居多數決。這張圖是大塊的粗字,多數決很合適,實測 \(\beta = 1.5\) 反而降到 4.6%;但如果原圖有細線或單像素的細節,強先驗會把它們當成雜訊抹掉。這就是先驗和似然之間的取捨。超過某個比例之後,只要鄰居有共識就一定蓋過觀察,所以 \(\beta = 1.5\) 和 \(\beta = 3\) 的結果完全一樣。
ICM 與它的局限

ICM(Besag 1986)每次只改一個變數,而且只接受讓目標變好的改變,所以會停在局部最大值,結果也依賴更新順序。要找更好的解,可以用 Gibbs sampling 或模擬退火(在第 10 節的 MCMC 裡加入「偶爾接受變差的提議」,並逐漸降低溫度),或者用 graph cut:對這種二值、鄰居相互吸引(\(\beta>0\))的能量,graph cut 可以精確求出全域最佳解。

出處:Besag (1986), "On the Statistical Analysis of Dirty Pictures", JRSS-B;Greig, Porteous & Seheult (1989) 證明二值 Ising MAP 可用最大流精確求解。

06Product of experts(投影片 14–15)

假設已經訓練好幾個模型 \(q_{\theta_1}(\mathbf x)\)、\(r_{\theta_2}(\mathbf x)\)、\(t_{\theta_3}(\mathbf x)\),可以是不同家族(PixelCNN、flow……)。每個都是一個「專家」,能評估輸入 \(\mathbf x\) 有多可能。如果專家各自獨立判斷,很自然地想用乘積來集成:53:59

$$p_{\theta_1,\theta_2,\theta_3}(\mathbf x) = \frac{1}{Z(\theta_1,\theta_2,\theta_3)}\,q_{\theta_1}(\mathbf x)\,r_{\theta_2}(\mathbf x)\,t_{\theta_3}(\mathbf x)$$
  • 各自歸一化的分佈相乘,結果不再歸一化,所以要除以新的 \(Z\):這就是一個 EBM,能量是各專家 log-likelihood 的和:\(f = \log q + \log r + \log t\)。58:03
  • 乘積像 AND:只要有一個專家給 0,整體就是 0。混合 \(\alpha q + (1-\alpha)r\) 像 OR(或者說是軟性的平均):只要有一個專家覺得可能,就有機率。55:01

投影片 15 的圖(Du et al. 2020):四列人臉樣本。第一列只用「年輕」一個 EBM;第二列「年輕 AND 女性」;第三列「年輕 AND 女性 AND 微笑」;第四列再 AND「波浪捲髮」。每多乘一個專家,樣本就多滿足一個屬性。56:02

課堂問答 · 57:33怎麼從 product of experts 取樣?怎麼處理 \(Z\)?有辦法,只是很貴。autoregressive 取樣很快;EBM 要在推論時花更多計算才能產生一個樣本。這是代價。57:33

Demo B乘積(AND)vs. 混合(OR)

兩個二維高斯專家:A 是水平拉長的,B 是可以旋轉的。乘積 \(A\cdot B/Z\) 和混合 \(\frac12A+\frac12B\) 都在格點上數值歸一化。

專家 A
專家 B
A·B / Z(AND)
½A + ½B(OR)

B 垂直、中心重合時,乘積集中在兩個專家都同意的中心小區域,比任一專家都更集中;混合則是一個十字。把 B 往右移,兩個專家的高機率區域越來越不重疊:乘積落在兩者之間「都還算可以」的地方,而 \(Z = \int A\cdot B\) 變得很小,代表兩個專家很少同時同意。

07RBM 與 Deep Boltzmann Machine(投影片 16–18)

Restricted Boltzmann machine(RBM)是有潛在變數的 EBM。可見變數 \(\mathbf x\in\{0,1\}^n\)(例如像素),潛在變數 \(\mathbf z\in\{0,1\}^m\):58:36

$$p_{W,b,c}(\mathbf x,\mathbf z) = \frac1Z\exp\big(\mathbf x^\top W\mathbf z + \mathbf b\mathbf x + \mathbf c\mathbf z\big) = \frac1Z\exp\Big(\sum_{i=1}^n\sum_{j=1}^m x_iz_jw_{ij} + \mathbf b\mathbf x + \mathbf c\mathbf z\Big)$$

能量是一個二次式:\(\mathbf x\) 的線性項、\(\mathbf z\) 的線性項,加上 \(x_i\) 和 \(z_j\) 之間的交叉項。「Restricted」是因為沒有可見–可見(\(x_ix_j\))或隱藏–隱藏(\(z_iz_j\))的連接。60:41

投影片 16 的圖:二部圖。下排藍色節點是 visible units,上排橘色節點是 hidden units,每個 visible 和每個 hidden 都有連線,同一排之間沒有連線。

Deep Boltzmann machine:把 RBM 疊起來,是最早的深度生成模型之一。底層 \(\mathbf v\) 是像素,往上的 \(\mathbf h^{(1)},\mathbf h^{(2)},\mathbf h^{(3)}\) 表示越來越抽象的特徵(角、邊緣等)。61:12

老師怎麼說 · 62:13深度學習剛開始的時候,大家連監督式的深度網路都訓練不好。唯一有效的辦法是先把網路當成生成模型(DBM 的架構,當成 EBM 用非監督方式訓練)做預訓練,再拿來當監督學習的初始值。這是第一個讓深度學習成功的做法,對說服大家去訓練大型神經網路很重要。後來才找到其他方法。62:13

投影片 17–18 的圖:投影片 17 是 DBM 的結構圖,四層節點 \(\mathbf v,\mathbf h^{(1)},\mathbf h^{(2)},\mathbf h^{(3)}\),相鄰層之間有權重 \(W^{(1)},W^{(2)},W^{(3)}\)。投影片 18(Salakhutdinov & Hinton 2009)左右兩格:左邊是訓練樣本,右邊是生成的樣本,內容是 NORB 資料集的灰階小玩具(飛機、汽車、動物等),生成的樣本形狀已經大致合理。62:45

RBM 的條件分佈可以因式分解

因為沒有隱藏–隱藏的連接,給定 \(\mathbf x\) 時,各個 \(z_j\) 是條件獨立的:

$$p(z_j = 1\mid\mathbf x) = \sigma\Big(c_j + \sum_i x_iw_{ij}\Big),\qquad p(x_i = 1\mid\mathbf z) = \sigma\Big(b_i + \sum_j w_{ij}z_j\Big)$$

(\(\sigma\) 是 sigmoid。)所以可以「整層一起」做 Gibbs sampling:給 \(\mathbf x\) 一次抽出整個 \(\mathbf z\),再給 \(\mathbf z\) 一次抽出整個 \(\mathbf x\),交替進行。這正是 Hinton 訓練 RBM 時用的 MCMC。同樣的道理,\(\mathbf z\) 可以解析地加總掉:

$$\sum_{\mathbf z}\exp(\mathbf x^\top W\mathbf z + \mathbf b\mathbf x + \mathbf c\mathbf z) = \exp(\mathbf b\mathbf x)\prod_{j=1}^m\Big(1 + \exp\big(c_j + (\mathbf x^\top W)_j\big)\Big)$$

這讓算 \(Z\) 的成本從 \(2^{n+m}\) 降到 \(2^n\cdot m\),但對 \(n\) 仍然是指數的。Demo C 會比較這兩種算法。

08為什麼 Z 難算(投影片 19–20)

以 RBM 為例,歸一化常數(體積)是

$$Z(W,b,c) = \sum_{\mathbf x\in\{0,1\}^n}\sum_{\mathbf z\in\{0,1\}^m}\exp\big(\mathbf x^\top W\mathbf z + \mathbf b\mathbf x + \mathbf c\mathbf z\big)$$
  • 它是參數 \(W,b,c\) 的一個定義良好的函數,但沒有簡單的封閉形式(不像高斯)。直接算要 \(2^n\cdot2^m\) 項,即使 \(n,m\) 不大也非常貴。64:20
  • 所以評估 \(p_{W,b,c}(\mathbf x,\mathbf z)\) 本身就很難,likelihood-based learning 也就很難。65:21
  • 觀察:最佳化歸一化的 likelihood 很難,但最佳化未歸一化的機率 \(\exp(\mathbf x^\top W\mathbf z + \mathbf b\mathbf x + \mathbf c\mathbf z)\) 很容易。難的是知道「參數改一點,\(Z\) 會怎麼變」。65:52

Demo C算 Z 的代價

一個隨機權重的小 RBM(\(m = 8\) 個隱藏單元)。調 \(n\)(可見單元數),用兩種方法精確計算 \(\log Z\):直接列舉全部 \(2^{n+m}\) 個組態,以及先把 \(\mathbf z\) 解析加總掉(\(2^n\) 項,每項 \(m\) 個乘積)。兩種方法的結果應該相同。

直接列舉 2^(n+m)先加總 z:2^n · m(縱軸是 log₁₀ 毫秒)

每多一個可見單元,兩種方法的時間都大約翻倍:這就是維度的詛咒。一張 28×28 的二值 MNIST 圖有 \(n = 784\) 個像素,\(2^{784}\approx10^{236}\),遠超過宇宙中原子的數量(約 \(10^{80}\))。

09訓練:contrastive divergence(投影片 21–23)

目標:最大化 \(\dfrac{\exp\{f_\theta(\mathbf x_{\text{train}})\}}{Z(\theta)}\)。分子要變大,分母要變小。67:24

直覺:模型沒有歸一化,所以只把 \(f_\theta(\mathbf x_{\text{train}})\) 調高,不保證 \(\mathbf x_{\text{train}}\) 相對變得更可能:可能整塊蛋糕變得更大,這片的比例反而沒變。必須同時考慮對其他「錯誤的點」的影響,把它們壓下去,讓 \(Z(\theta)\) 也變小。68:55

投影片 21 的圖:左圖縱軸 \(f_\theta\)、橫軸 \(X\):在「wrong answer」處曲線較高,標著向下的箭頭「push down」;在「correct answer (train)」處曲線是一個凹谷,標著向上的箭頭「pull up」。右圖是訓練後:曲線的低谷移到 wrong answer,correct answer 處變高。(投影片沒有標出處;這張圖看起來是改編自 LeCun et al. (2006)〈A Tutorial on Energy-Based Learning〉的能量圖,原圖縱軸是能量,所以 push down / pull up 的位置相反。這是我的推測。)

想法:不精確計算 \(Z(\theta)\),改用 Monte Carlo 估計。用一個正樣本(訓練資料)和從模型抽的負樣本互相對比。70:30

CONTRASTIVE DIVERGENCE抽 \(\mathbf x_{\text{sample}}\sim p_\theta\),沿著 \(\nabla_\theta\big(f_\theta(\mathbf x_{\text{train}}) - f_\theta(\mathbf x_{\text{sample}})\big)\) 走一步。讓訓練資料比模型的典型樣本更可能。71:01

為什麼這是對的:推導(投影片 23)

log-likelihood 是 \(f_\theta(\mathbf x_{\text{train}}) - \log Z(\theta)\)。第一項的梯度就是網路的梯度,難的是第二項:74:09

$$\begin{aligned} \nabla_\theta\log Z(\theta) &= \frac{\nabla_\theta Z(\theta)}{Z(\theta)} = \frac{1}{Z(\theta)}\int\nabla_\theta\exp\{f_\theta(\mathbf x)\}\,d\mathbf x = \frac{1}{Z(\theta)}\int\exp\{f_\theta(\mathbf x)\}\,\nabla_\theta f_\theta(\mathbf x)\,d\mathbf x\\ &= \int\underbrace{\frac{\exp\{f_\theta(\mathbf x)\}}{Z(\theta)}}_{p_\theta(\mathbf x)}\nabla_\theta f_\theta(\mathbf x)\,d\mathbf x = \mathbb E_{\mathbf x_{\text{sample}}\sim p_\theta}\big[\nabla_\theta f_\theta(\mathbf x_{\text{sample}})\big] \end{aligned}$$
$$\nabla_\theta\log p_\theta(\mathbf x_{\text{train}}) = \nabla_\theta f_\theta(\mathbf x_{\text{train}}) - \mathbb E_{\mathbf x_{\text{sample}}}\big[\nabla_\theta f_\theta(\mathbf x_{\text{sample}})\big] \approx \nabla_\theta f_\theta(\mathbf x_{\text{train}}) - \nabla_\theta f_\theta(\mathbf x_{\text{sample}})$$

第二項是「改 \(\theta\) 會讓所有其他可能的點的未歸一化機率怎麼變」,每個點用模型目前給它的機率加權。用一個樣本近似這個期望,就是 contrastive divergence,而且是真梯度的不偏估計。77:20

課堂問答 · 72:04怎麼知道抽出來的樣本是「錯的」?它不一定是錯的,只是「模型可能產生的另一個典型結果」。就算剛好抽到訓練集裡的點也沒關係,期望上是對的。72:04

剩下的問題:怎麼從模型取樣?

「contrastive divergence」這個名字的原意,以及 CD-k、PCD

課堂上把「從模型抽樣、用 \(f(\mathbf x_{\text{train}}) - f(\mathbf x_{\text{sample}})\) 的梯度更新」都叫 contrastive divergence。嚴格來說,這個公式本身是 maximum likelihood 的梯度(只要樣本真的來自 \(p_\theta\))。Hinton (2002) 提出的 CD 有一個特定的近似:MCMC 鏈從訓練資料點出發,只跑 \(k\) 步(常常 \(k = 1\),稱 CD-1),遠在收斂之前就停下來。這讓訓練便宜很多,但梯度有偏差。

  • Persistent CD(PCD)(Tieleman 2008):不每次重開鏈,而是讓一組 MCMC 鏈跨越訓練步驟持續跑下去,每步接著上一步的狀態走幾步。因為參數每步只改一點,鏈可以一直接近目前模型的分佈。Demo D 用的就是這個。
  • Replay buffer(Du & Mordatch 2019):保存過去的樣本,新的鏈從裡面隨機挑起點,再搭配 Langevin 動態。
  • Short-run MCMC(Nijkamp et al. 2019,投影片 26 的人臉):每次都從雜訊出發、只跑固定的少數步,把整個短程取樣器當成生成模型的一部分。

截斷的 MCMC 會讓梯度有偏差,可能讓學到的模型不忠實於資料;這是 EBM 訓練的一個核心困難,下一講會介紹完全不需要取樣的訓練方法(score matching、noise contrastive estimation)。

出處:Song & Kingma (2021), "How to Train Your Energy-Based Models", arXiv 2101.03288, §3(TeX 原始檔);Hinton (2002), "Training Products of Experts by Minimizing Contrastive Divergence", Neural Computation;Tieleman (2008), ICML;Lai et al. (2026) §3.1.1。

Demo D訓練一個 2D EBM:有負樣本 vs. 沒有負樣本

\(f_\theta\) 是 2→32→32→1 的網路。每一步:拿 64 個資料點往上推(\(+\nabla f\)),64 個負樣本往下壓(\(-\nabla f\))。負樣本來自 64 條 persistent 的 Metropolis 鏈(下一節的演算法),每步每條鏈走 5 步。另加一個小正則化 \(0.1\,f^2\),避免 \(f\) 的值無限長大(Du & Mordatch 2019 也用類似的項)。「只推高資料」模式則完全不用負樣本。右圖的密度是在 \([-3,3]^2\) 的格點上數值歸一化的,這在 2D 才做得到。

訓練資料
exp(f)/Z(格點歸一化)
MCMC 鏈的位置(負樣本)
contrastive divergence只推高資料均勻分佈的 log-likelihood = −log 36 ≈ −3.58
  • 只推高資料:正則化讓資料點的 \(f\) 停在某個值,但資料以外的地方完全沒有被壓下來,所以歸一化之後,機率質量散得到處都是。這個頁面上(3,000 步)的 test log-likelihood 約 −3.5,和什麼都沒學的均勻分佈(−3.58)差不多;我在 Node.js 用另一個初始化跑,甚至是 −4.3,比均勻分佈還差。這就是投影片 21「只拉高正確答案沒有用」的意思。
  • Contrastive divergence:負樣本一開始散在整個方框裡,資料以外的區域被壓低;之後鏈會慢慢聚集到模型認為可能的地方,也就是逐漸靠近資料。這個頁面上 two moons 到 3,000 步約 −1.38(約 8 秒);8 個高斯排成一圈的資料在這個頁面上約 −1.23,而且兩者都還在進步。
  • 中圖越到後面越「尖」:\(f\) 的範圍持續變大(離線測試裡從 10 長到 60 以上),能量地形越來越陡。這也是 EBM 訓練常見的現象,MCMC 在很陡的地形上也比較難混合。

10從 EBM 取樣:MCMC(投影片 24)

沒有直接取樣的方法:不能像 autoregressive 那樣逐個變數抽,也不能評估每個點的機率(需要 \(Z\))。但可以比較兩個樣本 \(\mathbf x,\mathbf x'\)。所以用一種局部搜尋:從一個不好的樣本出發,一點一點地擾動它,往更可能的方向走。79:23

MARKOV CHAIN MONTE CARLO(投影片 24)
  1. 隨機初始化 \(\mathbf x^0\),\(t = 0\)。
  2. 令 \(\mathbf x' = \mathbf x^t + \text{noise}\)。
    1. 如果 \(f_\theta(\mathbf x') > f_\theta(\mathbf x^t)\),令 \(\mathbf x^{t+1} = \mathbf x'\)。
    2. 否則,以機率 \(\exp\big(f_\theta(\mathbf x') - f_\theta(\mathbf x^t)\big)\) 令 \(\mathbf x^{t+1} = \mathbf x'\)(否則 \(\mathbf x^{t+1} = \mathbf x^t\))。
  3. 回到步驟 2。

兩個判斷都只用到 \(f_\theta\) 的差,所以不需要 \(Z\)。理論上,重複夠多步後會得到來自 \(p_\theta\) 的樣本;實務上可能要非常久才收斂。81:31(投影片寫的「Go to step ??」是 LaTeX 交互參照沒編譯好,指的是步驟 2。)

課堂問答 · 82:04為什麼要偶爾接受比較差的樣本?如果只做步驟 2.1,就是在做最佳化:一路往上爬,卡在某個局部最大值就停了。但我們要的是樣本,不是最大值:要能探索整個空間,因為也許在很遠的地方有機率很高的區域。差一點的提議比較容易被接受,差很多的幾乎不會被接受。82:04
課堂問答 · 83:05一定要這樣設計嗎?不一定。這是最簡單、保證會收斂的版本;Metropolis–Hastings 演算法定義了其他也能用的變體。83:05
為什麼接受機率剛好是 exp(f′ − f)?細緻平衡

這是 Metropolis 演算法(1953)。提議 \(\mathbf x' = \mathbf x + \text{noise}\) 是對稱的:從 \(\mathbf x\) 提議 \(\mathbf x'\) 的機率等於從 \(\mathbf x'\) 提議 \(\mathbf x\) 的機率。接受機率 \(\min\big(1, p_\theta(\mathbf x')/p_\theta(\mathbf x)\big) = \min\big(1,\exp(f_\theta(\mathbf x') - f_\theta(\mathbf x))\big)\) 讓轉移滿足細緻平衡(detailed balance):

$$p_\theta(\mathbf x)\,T(\mathbf x\to\mathbf x') = p_\theta(\mathbf x')\,T(\mathbf x'\to\mathbf x)$$

假設 \(p_\theta(\mathbf x')>p_\theta(\mathbf x)\):往上走一定接受,往下走以 \(p_\theta(\mathbf x)/p_\theta(\mathbf x')\) 接受,代入兩邊就相等。細緻平衡保證 \(p_\theta\) 是這個 Markov chain 的穩態分佈:如果 \(\mathbf x^t\sim p_\theta\),那 \(\mathbf x^{t+1}\sim p_\theta\)。在一些條件下,不管從哪裡出發都會收斂到它。第 12 講開頭會再講一次這個論證。

延伸 補充課 D Markov 鏈與 MCMC:從三狀態鏈到 Metropolis–Hastings,含 detailed balance 的證明與步長的取捨

Demo EMetropolis 取樣器(與 Langevin 預覽)

目標是一維的未歸一化密度 \(\exp(f(x))\),\(f\) 是兩個高斯混合的 log(左峰較高)。取樣器只能呼叫 \(f\)。調整提議雜訊的大小,看取樣的效率。

鏈的樣本直方圖真正的 p(x)(只是用來對照,取樣器看不到 Z)
  • 步長太小(例如 0.04):實測接受率 98%,但每步只走一點點,5,000 步內一次都沒跨到另一個峰,左峰的比例是 0%(正確答案 65%)。
  • 步長適中到偏大(0.5、2、10):接受率分別約 77%、45%、16%,跨越次數 23、327、342 次,左峰比例 73%、60%、64%。在一維,大步長雖然大部分被拒絕,偶爾一次大跳就能跨峰,所以反而不錯;但在高維空間,隨機的大跳幾乎一定落在機率極低的地方,接受率會趨近 0。這就是 MCMC 在影像這種高維資料上很慢的原因。
  • 兩峰離得遠(距離 8):中間的低谷極深。步長 0.5 時一次都沒跨過;步長 2 時 5,000 步只跨了 5 次,比例 48%,離 65% 還很遠。這是 MCMC 在多峰分佈上的根本困難(混合很慢),也是 EBM 訓練的瓶頸。
  • Langevin(投影片 25,第 12 講詳細講):不是隨機亂提議,而是沿著 \(\nabla_x f\)(score)往高機率的方向走,再加一點雜訊:\(x\leftarrow x + \epsilon\nabla_x f(x) + \sqrt{2\epsilon}\,z\)。對 EBM 來說 \(\nabla_x\log p_\theta = \nabla_x f_\theta\),因為 \(\log Z\) 不依賴 \(x\)。注意它沒有「接受/拒絕」這一步,所以 \(\epsilon\) 不夠小時會有偏差:實測 \(\epsilon = 0.5\) 時跨峰 163 次,但左峰比例只有 32%,遠離正確的 65%。在 Langevin 後面加一個 Metropolis–Hastings 修正(MALA)就能消除這個偏差。

11下一講開頭:Langevin MCMC 與現代 EBM(投影片 25–27)

影片在投影片 24 的 MCMC 問答後結束。剩下三張投影片在第 12 講開頭講,這裡先簡單整理。

  • Langevin MCMC(投影片 25):對任何能算梯度 \(\nabla_{\mathbf x}\log p_\theta(\mathbf x)\)(score function)的連續分佈,從一個容易取樣的先驗 \(\pi(\mathbf x)\) 出發,\(\mathbf x^0\sim\pi(\mathbf x)\),重複 $$\mathbf x^{t+1}\sim\mathbf x^t + \epsilon\,\nabla_{\mathbf x}\log p_\theta(\mathbf x^t) + \sqrt{2\epsilon}\,\mathbf z^t,\qquad\mathbf z^t\sim\mathcal N(0,I)$$ 當 \(\epsilon\to0\)、\(T\to\infty\) 時,\(\mathbf x^T\sim p_\theta(\mathbf x)\)。對 EBM,\(\nabla_{\mathbf x}\log p_\theta(\mathbf x) = \nabla_{\mathbf x}f_\theta(\mathbf x) - \underbrace{\nabla_{\mathbf x}\log Z(\theta)}_{=0} = \nabla_{\mathbf x}f_\theta(\mathbf x)\),完全不需要 \(Z\)。
  • 現代 EBM(投影片 26–27):Nijkamp et al. (2019) 用 Langevin 從雜訊逐步變成人臉的過程(一排排從雜訊漸變成清晰臉孔的序列),以及生成的 CelebA 人臉;Du & Mordatch (2019) 的 ImageNet 32×32 樣本(各種物體、動物、風景的小圖拼貼)。

課堂上也有學生問到:能量函數對 \(\mathbf x\) 的導數也不依賴歸一化常數,有什麼用處?老師說會用它來設計取樣方法,就是 Langevin。53:27

常見誤解

誤解:「EBM 不是機率模型,只是一個分數」。對任何 \(\theta\),\(\exp(f_\theta)/Z(\theta)\) 都是合法的機率分佈;只是 \(Z\) 算不出來,不代表它不存在。
誤解:「只要把資料點的 \(f\) 調高,模型就會學到資料」。沒有歸一化,調高 \(f\) 可能讓所有地方一起變高。必須同時壓低模型自己的樣本(Demo D)。
誤解:「能量越高越可能」。能量是 \(-f\),能量越低越可能。不同文獻的符號不同(Lai 的書和 Song & Kingma 用 \(p\propto\exp(-E)\)),讀的時候要注意。
誤解:「MCMC 一定要算出 \(Z\) 才能決定接不接受」。接受機率只依賴 \(\exp(f(\mathbf x') - f(\mathbf x))\),\(Z\) 約掉了。
誤解:「MCMC 只接受變好的提議」。那是爬山法,會卡在局部最大值、得到的也不是樣本。必須以一定機率接受變差的提議。
誤解:「乘積和混合差不多」。乘積是 AND(任何一個專家說不可能就不可能),而且需要重新歸一化;混合是 OR,自動歸一化。

自我測驗

1. 為什麼「總和為 1」比「非負」難得多?
非負只要在網路最後加一個 exp、平方等就能保證。總和為 1 需要對所有可能的輸入加總或積分,這個值一般隨參數改變,必須用特殊結構(鏈式法則、可逆網路)才能保證固定。
2. 用「切蛋糕」解釋歸一化對訓練的意義。
總量固定時,把訓練資料那片切大,其他片自動變小,所以提高訓練資料的機率就保證它相對變得更可能。沒有歸一化,可能整塊蛋糕一起變大。
3. 證明 autoregressive 的乘積仍然歸一化。
\(\int\int p_\theta(\mathbf x)p_{\theta'(\mathbf x)}(\mathbf y)d\mathbf y\,d\mathbf x = \int p_\theta(\mathbf x)\cdot1\,d\mathbf x = 1\):先對 \(\mathbf y\) 積分,因為對每個 \(\theta'\) 都歸一化,所以是 1。
4. EBM 為什麼用 exp?「能量」指的是什麼?
exp 讓網路輸出的小變化對應機率的大變化(log 機率是自然尺度);指數族和統計物理都是這個形式。能量是 \(-f_\theta\),能量低的狀態比較可能。
5. 為什麼比較兩個點不需要 \(Z\)?舉兩個應用。
\(p(\mathbf x)/p(\mathbf x') = \exp(f(\mathbf x) - f(\mathbf x'))\),\(Z\) 約掉。應用:異常偵測、去雜訊(找最大化 \(p(\mathbf y\mid\mathbf x)\) 的 \(\mathbf y\))、分類。
6. Product of experts 為什麼像 AND?它的能量是什麼?
只要一個專家給 0,乘積就是 0。能量(取負號的 f)是各專家 log-likelihood 的和:\(f = \sum_k\log p_k(\mathbf x)\),需要重新除以 \(Z\)。
7. RBM 的「restricted」是什麼意思?它的 \(Z\) 要算多少項?
沒有可見–可見和隱藏–隱藏的連接,只有可見–隱藏。直接算 \(Z\) 要 \(2^{n+m}\) 項;把 \(\mathbf z\) 解析加總後仍要 \(2^n\) 項。
8. 推導 \(\nabla_\theta\log Z(\theta)\)。
\(\frac{1}{Z}\int\nabla_\theta e^{f_\theta}d\mathbf x = \int\frac{e^{f_\theta}}{Z}\nabla_\theta f_\theta\,d\mathbf x = \mathbb E_{p_\theta}[\nabla_\theta f_\theta(\mathbf x)]\)。
9. contrastive divergence 的更新方向是什麼?為什麼是不偏的?
\(\nabla_\theta f_\theta(\mathbf x_{\text{train}}) - \nabla_\theta f_\theta(\mathbf x_{\text{sample}})\),\(\mathbf x_{\text{sample}}\sim p_\theta\)。第二項是 \(\mathbb E_{p_\theta}[\nabla_\theta f_\theta]\) 的單樣本 Monte Carlo 估計,期望值正好等於 \(\nabla_\theta\log Z\)。(前提是樣本真的來自 \(p_\theta\);截斷的 MCMC 會引入偏差。)
10. 寫出投影片 24 的 MCMC 演算法。為什麼不需要 \(Z\)?
提議 \(\mathbf x' = \mathbf x^t + \text{noise}\);若 \(f(\mathbf x')>f(\mathbf x^t)\) 接受;否則以 \(\exp(f(\mathbf x') - f(\mathbf x^t))\) 接受。兩個判斷只用 \(f\) 的差,等於機率的比值。
11. MCMC 為什麼要偶爾接受變差的提議?
否則就是爬山最佳化,會卡在局部最大值,也得不到按 \(p_\theta\) 分佈的樣本。接受變差的提議讓鏈能探索整個空間,並滿足細緻平衡。
12. MCMC 的步長太大或太小各會怎樣?
太小:接受率高但移動慢,難以跨越峰之間。太大:大部分提議落在低機率處被拒絕,鏈停在原地。兩者都導致混合很慢。

延伸閱讀