用最佳化取代積分
變分推論挑一個可解的分布族 q(w; φ)——比方說在每個權重上各放一個獨立高斯——然後在族內搜尋那個離真實後驗最近的成員,「近」用 KL 散度來衡量。我們就這樣把一個不可能的積分,變成了對變分參數 φ 的熟悉最佳化。麻煩在於:到真實後驗的 KL 裡仍然藏著那個難解的邊際概似。解決它的東西,正是整套方法的核心物件。
把那個 KL 重新整理,就得到證據下界(ELBO):q 之下的期望對數概似,減去 q 到先驗的 KL。最大化 ELBO 會同時最小化到真實後驗的 KL,而完全不必碰那個邊際概似。把兩項讀成一場拔河:第一項把 q 拉向「擬合資料」的權重,第二項是個複雜度懲罰,把 q 拉回先驗。ELBO 就是「貝氏」與「帶正則化的最佳化」變成同一句話的地方。
證據下界(ELBO):在 q 下最大化期望對數似然、同時貼近先驗,恰好等價於最小化到真實後驗的 KL 散度。
重參數化技巧
要用 SGD 最佳化 ELBO,你需要它對 φ 的梯度;但 φ 坐在一個對隨機權重取期望的式子裡——而你無法把梯度推過一個取樣步驟。重參數化技巧就是那把鑰匙:不要直接從 q 取樣 w,而是從一個無參數的分布取樣固定的雜訊 ε,再把 w 算成 φ 與 ε 的一個確定性、可微分函數。隨機性被塞進不帶梯度的 ε 裡,於是反向傳播能乾淨地流過其餘部分。
重參數化技巧:把隨機權重寫成 μ + σ⊙ε,於是梯度可以移入期望內部並回傳到 φ。
# Gaussian weight w ~ N(mu, sigma^2), reparameterized eps = randn_like(mu) # noise, no gradient sigma = softplus(rho) # keep sigma > 0 w = mu + sigma * eps # differentiable in (mu, rho) loss = -log_likelihood(w, batch) + kl(mu, sigma) # one MC sample of the ELBO
這正是驅動變分自編碼器的同一個技巧——那裡它重參數化的是潛在編碼,這裡是權重——所以 VAE 是第一次認識它最乾淨的場所。每一步取一個雜訊樣本,就給出 ELBO 一個帶雜訊但無偏的梯度;實務上通常一個樣本就夠,因為 SGD 本來就已經在小批次上做平均了。
平均場,以及它痛在哪裡
最簡單的 q 把每個權重都當成獨立——這就是平均場近似。它便宜(每個權重兩個數字:一個均值、一個變異數),也是多數函式庫的預設值。但「獨立」是個強烈的謊言。網路裡的權重彼此高度相關,硬逼 q 因式分解會讓它系統性地低估變異數:KL(q‖p) 會懲罰「q 把質量放在後驗沒有質量之處」,於是 q 把自己縮進單一個峰裡,回報出虛假的自信。
擴展與攤銷
每一步都對整個資料集算 ELBO,在規模上是不可能的。隨機變分推論改成抽一個小批次、把它的概似項放大去估計完整總和,再對結果跑普通的隨機最佳化——正是這個想法讓 SGD 能訓練深度網路,現在拿來驅動貝氏推論。這才使變分貝氏在現代規模的資料與模型上根本變得可行。
還有第二種擴展。當你必須推論一個逐輸入的潛在變數(如 VAE)時,否則你得對每個資料點重跑一次最佳化。攤銷變分推論改成訓練單一個推論網路,把任意輸入直接映射到它的變分參數,最佳化成本只付一次、永遠重用。你用一點點精度——所謂「攤銷間隙」——換來「測試時一次前向傳遞就完成近似推論」的能力。
變分自編碼器示意圖:編碼器把輸入映射到隱變量分佈,採樣後由解碼器重建輸入。
超越高斯:流式後驗
如果瓶頸在 q 的形狀,那就讓它更豐富。正規化流後驗從一個簡單的基底分布出發,把它推過一連串可逆、可微分的映射;變數變換公式精確地追蹤密度,所以你仍然算得出 ELBO。結果是一個能彎曲、能偏斜、能帶相關性的變分族——捕捉平均場丟掉的結構——代價是更多參數與更謹慎的工程。
歸一化流後驗把簡單的基分佈經過一連串可逆映射;每一步的對數密度都要減去一個對數雅可比行列式項。