Variational Autoencoder:用一個下界訓練潛在變數模型
第 2 章從「變分」的角度看 diffusion,起點是 VAE。VAE 用潛在變數 \(\mathbf z\) 描述資料背後的隱藏因素,但它的 likelihood 要對所有 \(\mathbf z\) 積分,算不出來;於是改成最大化一個算得出來的下界 ELBO。這一頁講 ELBO 從哪裡來、它和真正的 likelihood 差多少、為什麼標準 VAE 的生成會模糊,最後(選讀)看把潛在變數疊成很多層的階層式 VAE,它正是下一頁 DDPM 的前身。
讀完這頁你應該能夠
- 說明為什麼潛在變數模型的 likelihood \(p_{\bm\phi}(\mathbf x)=\int p_{\bm\phi}(\mathbf x\mid\mathbf z)p(\mathbf z)\,d\mathbf z\) 和後驗 \(p_{\bm\phi}(\mathbf z\mid\mathbf x)\) 都算不出來,以及 encoder \(q_{\bm\theta}(\mathbf z\mid\mathbf x)\) 的角色。
- 用 Jensen 不等式推出 ELBO,說出「重建項」和「潛在 KL 項」各自在做什麼。
- 證明 \(\log p_{\bm\phi}(\mathbf x)-\mathcal L_{\text{ELBO}}=\mathcal D_{\mathrm{KL}}\big(q_{\bm\theta}(\mathbf z\mid\mathbf x)\,\Vert\,p_{\bm\phi}(\mathbf z\mid\mathbf x)\big)\),並從兩個聯合分佈的角度解讀 ELBO。
- 寫出 Gaussian VAE 的損失(含 KL 的封閉解),並用「最佳 decoder 是條件平均」解釋模糊。
- (選讀)寫出階層式 VAE 的 ELBO,說明為什麼單純把 VAE 的網路加深解決不了表達力不足和 posterior collapse,以及 diffusion 怎麼繞開階層式 VAE 的訓練困難。
前置知識
- B01:forward KL 與 MLE、KL 不對稱、VAE 的一段簡介。
- Jensen 不等式(\(\log\) 是凹函數,所以 \(\log\mathbb E[Y]\ge\mathbb E[\log Y]\))、貝氏定理、高斯分佈。可以參考 CS236 補充課 A。
「書 §」標出原文位置。灰框「轉述者補充」是書裡沒有、另外加上的內容;藍框「推導」展開書中省略的步驟。
01第 2 章在做什麼書 第 2 章開頭
這一章用「變分」的眼光看 diffusion model,分三步:
- VAE:用潛在變數表示資料,訓練時最大化 log-likelihood 的一個好算的下界。學到的 encoder 把觀測映到潛在變數,學到的 decoder 再映回觀測,形成一個閉環。(本頁)
- 階層式 VAE:把好幾層潛在變數疊起來,在多個尺度上捕捉結構。(本頁選讀)
- DDPM:概念上沿用同一個範本,但不再同時訓練 encoder 和 decoder。encoder 被固定成一個逐步把資料變成雜訊的前向加雜訊過程,只訓練 decoder 把這條路徑一步步倒回來。(下一頁 B04)
從這個角度看,VAE、階層式 VAE、diffusion model 都在最佳化同一種東西:一個由變分下界定義的 likelihood 替代品。
書列出的本章學習目標有五項:理解為什麼 VAE 在精確 MLE 太難時改最佳化 ELBO;看 DDPM 怎麼把 VAE 的潛在變數觀點延伸成很多層雜訊;理解把困難的反向去雜訊問題變成好處理目標的 conditioning trick;比較預測平均、預測乾淨資料、預測雜訊三種做法;把實務的 DDPM 去雜訊損失接回 ELBO。本頁負責第一項,其餘在 B04。已經熟悉 VAE 和 ELBO 的讀者,書建議可以略讀本頁,直接從 DDPM 開始。
02從 autoencoder 到 VAE書 §2.1
神經網路要怎麼學會生成逼真的資料?一個自然的起點是 autoencoder:兩個網路,一個確定性的 encoder 把輸入壓縮成低維的潛在代碼,一個確定性的 decoder 從代碼重建輸入;訓練時最小化原始輸入和重建之間的誤差。
這樣能重建得很準,但潛在空間沒有結構:隨便抽一個潛在代碼丟給 decoder,通常只會得到沒意義的東西,所以它不太能拿來生成。
Variational Autoencoder(VAE)的解法是在潛在空間上加一個機率結構,讓模型從單純的重建工具變成真正的生成模型,能產生新的、逼真的資料。
03機率式的 encoder 與 decoder書 §2.1.1
Decoder(生成器)
VAE 區分兩種變數:
- 觀測變數 \(\mathbf x\):看得到的資料,例如一張圖片。
- 潛在變數 \(\mathbf z\):看不到的變化因素,例如物體的形狀、顏色、風格。
模型假設每個觀測 \(\mathbf x\) 都是由一個從簡單先驗抽出的潛在變數產生的,通常是標準高斯:\(\mathbf z\sim p_{\text{prior}}:=\mathcal N(\mathbf 0,\mathbf I)\)。
把 \(\mathbf z\) 映回資料空間的是 decoder(生成器)分佈 \(p_{\bm\phi}(\mathbf x\mid\mathbf z)\)。實務上 decoder 刻意保持簡單,通常是各維獨立的高斯(第 6 節),讓學習的重點放在抽取有用的潛在特徵,而不是死背資料。直覺上,一個像素一個像素直接生成圖片極難;有了一個精簡的潛在表示,從它解碼出精確的像素排列就容易得多。生成新樣本的步驟是:先抽 \(\mathbf z\sim p_{\text{prior}}\),再解碼 \(\mathbf x\sim p_{\bm\phi}(\mathbf x\mid\mathbf z)\)。
VAE 因此透過 marginal likelihood 定義了一個潛在變數生成模型:
$$p_{\bm\phi}(\mathbf x)=\int p_{\bm\phi}(\mathbf x\mid\mathbf z)\,p(\mathbf z)\,d\mathbf z.$$理想上 decoder 的參數 \(\bm\phi\) 應該像 MLE 那樣最大化這個 marginal likelihood。但 decoder 一旦是有表達力的非線性網路,這個對 \(\mathbf z\) 的積分就算不出來,直接做 MLE 不可行。這就是 VAE 要用「變分」方法的動機。
Encoder(推論網路)
為了把這個算不出來的生成器和真實資料接上,反過來問:給定一個觀測 \(\mathbf x\),哪些潛在代碼 \(\mathbf z\) 可能產生它?由貝氏定理,後驗分佈是
$$p_{\bm\phi}(\mathbf z\mid\mathbf x)=\frac{p_{\bm\phi}(\mathbf x\mid\mathbf z)\,p(\mathbf z)}{p_{\bm\phi}(\mathbf x)}.$$麻煩在分母又是 marginal likelihood \(p_{\bm\phi}(\mathbf x)\),要對所有潛在變數積分,對非線性 decoder 算不出來。所以從 \(\mathbf x\) 精確推論 \(\mathbf z\) 在計算上也不可行。
VAE 的「變分」一步,就是用一個好處理的近似取代這個算不出來的後驗:引入一個由神經網路參數化的 encoder(也叫推論網路)\(q_{\bm\theta}(\mathbf z\mid\mathbf x)\),讓它當可以學習的替身:
$$q_{\bm\theta}(\mathbf z\mid\mathbf x)\approx p_{\bm\phi}(\mathbf z\mid\mathbf x).$$實務上,encoder 把每個資料點 \(\mathbf x\) 映到一個潛在代碼上的分佈,提供一條可行、可訓練的、從 \(\mathbf x\) 回到 \(\mathbf z\) 的路,讓學習得以進行。
04用 ELBO 訓練書 §2.1.2
現在定義一個算得出來的訓練目標。\(\log p_{\bm\phi}(\mathbf x)\) 沒辦法直接最佳化,但可以最大化它的一個下界:Evidence Lower Bound(ELBO)。
書中的證明:Jensen 不等式
在積分裡乘再除以 \(q_{\bm\theta}(\mathbf z\mid\mathbf x)\),把積分寫成對 \(q_{\bm\theta}\) 的期望,再用 \(\log\) 的凹性(Jensen):
$$\log p_{\bm\phi}(\mathbf x)=\log\int p_{\bm\phi}(\mathbf x,\mathbf z)\,d\mathbf z=\log\int q_{\bm\theta}(\mathbf z\mid\mathbf x)\frac{p_{\bm\phi}(\mathbf x,\mathbf z)}{q_{\bm\theta}(\mathbf z\mid\mathbf x)}\,d\mathbf z$$ $$=\log\mathbb E_{\mathbf z\sim q_{\bm\theta}(\mathbf z\mid\mathbf x)}\!\left[\frac{p_{\bm\phi}(\mathbf x,\mathbf z)}{q_{\bm\theta}(\mathbf z\mid\mathbf x)}\right]\ge\mathbb E_{\mathbf z\sim q_{\bm\theta}(\mathbf z\mid\mathbf x)}\!\left[\log\frac{p_{\bm\phi}(\mathbf x,\mathbf z)}{q_{\bm\theta}(\mathbf z\mid\mathbf x)}\right].$$(轉述者補充)最後一式就是 ELBO:把 \(p_{\bm\phi}(\mathbf x,\mathbf z)=p_{\bm\phi}(\mathbf x\mid\mathbf z)p(\mathbf z)\) 代入,\(\log\) 拆成 \(\log p_{\bm\phi}(\mathbf x\mid\mathbf z)+\log\frac{p(\mathbf z)}{q_{\bm\theta}(\mathbf z\mid\mathbf x)}\),第二部分的期望正是 \(-\mathcal D_{\mathrm{KL}}(q_{\bm\theta}(\mathbf z\mid\mathbf x)\Vert p(\mathbf z))\)。
ELBO 自然分成兩部分:
- 重建項:鼓勵從潛在代碼 \(\mathbf z\) 準確地還原 \(\mathbf x\)。在 encoder 和 decoder 都是高斯的假設下,這一項恰好化成熟悉的 autoencoder 重建損失(第 6 節)。但就像 autoencoder,只最佳化這一項有死背訓練資料的風險,所以需要額外的正則化。
- 潛在 KL 項:鼓勵 encoder 的分佈 \(q_{\bm\theta}(\mathbf z\mid\mathbf x)\) 貼近簡單的高斯先驗 \(p_{\text{prior}}(\mathbf z)\)。這把潛在空間塑造成平滑、連續的結構,確保從先驗抽出的樣本都能被可靠地解碼,生成才有意義。
兩者的拉扯,讓模型同時有忠實的重建和連貫的取樣。
05資訊論的觀點:ELBO 是一個散度的上界書 §2.1.2
回想 MLE 等於最小化 \(\mathcal D_{\mathrm{KL}}(p_{\text{data}}(\mathbf x)\Vert p_{\bm\phi}(\mathbf x))\)(B01),它量的是模型分佈多接近資料分佈。這一項一般算不出來,變分方法的做法是改成比較兩個聯合分佈:
- 生成的聯合分佈 \(p_{\bm\phi}(\mathbf x,\mathbf z)=p(\mathbf z)\,p_{\bm\phi}(\mathbf x\mid\mathbf z)\):描述模型怎麼生成資料。
- 推論的聯合分佈 \(q_{\bm\theta}(\mathbf x,\mathbf z)=p_{\text{data}}(\mathbf x)\,q_{\bm\theta}(\mathbf z\mid\mathbf x)\):把真實資料和它被推論出的潛在變數配對。
比較這兩個聯合分佈,得到不等式
$$\mathcal D_{\mathrm{KL}}\big(p_{\text{data}}(\mathbf x)\,\Vert\,p_{\bm\phi}(\mathbf x)\big)\le\mathcal D_{\mathrm{KL}}\big(q_{\bm\theta}(\mathbf x,\mathbf z)\,\Vert\,p_{\bm\phi}(\mathbf x,\mathbf z)\big),$$有時稱為 KL 散度的連鎖律。直覺是:只比較邊際分佈(\(\mathbf x\))可能藏住一些差異,把潛在變數和資料的整個聯合分佈攤開來比,這些差異才會現形。
正式地,把聯合 KL 展開:
$$\underbrace{\mathcal D_{\mathrm{KL}}\big(q_{\bm\theta}(\mathbf x,\mathbf z)\Vert p_{\bm\phi}(\mathbf x,\mathbf z)\big)}_{\text{總誤差的上界}}=\mathbb E_{q_{\bm\theta}(\mathbf x,\mathbf z)}\!\left[\log\frac{p_{\text{data}}(\mathbf x)\,q_{\bm\theta}(\mathbf z\mid\mathbf x)}{p_{\bm\phi}(\mathbf x)\,p_{\bm\phi}(\mathbf z\mid\mathbf x)}\right]$$ $$=\mathbb E_{p_{\text{data}}(\mathbf x)}\!\left[\log\frac{p_{\text{data}}(\mathbf x)}{p_{\bm\phi}(\mathbf x)}+\mathcal D_{\mathrm{KL}}\big(q_{\bm\theta}(\mathbf z\mid\mathbf x)\Vert p_{\bm\phi}(\mathbf z\mid\mathbf x)\big)\right]=\underbrace{\mathcal D_{\mathrm{KL}}(p_{\text{data}}\Vert p_{\bm\phi})}_{\text{真正的建模誤差}}+\underbrace{\mathbb E_{p_{\text{data}}(\mathbf x)}\big[\mathcal D_{\mathrm{KL}}\big(q_{\bm\theta}(\mathbf z\mid\mathbf x)\Vert p_{\bm\phi}(\mathbf z\mid\mathbf x)\big)\big]}_{\text{推論誤差}}.$$第一項是真正的建模誤差;第二項是推論誤差,也就是近似後驗和真後驗的差距。推論誤差永遠非負,這就解釋了上面的不等式。
展開的每一步
第一個等號:在分子分母分別用 \(q_{\bm\theta}(\mathbf x,\mathbf z)=p_{\text{data}}(\mathbf x)q_{\bm\theta}(\mathbf z\mid\mathbf x)\) 和 \(p_{\bm\phi}(\mathbf x,\mathbf z)=p_{\bm\phi}(\mathbf x)p_{\bm\phi}(\mathbf z\mid\mathbf x)\)(後者是生成聯合分佈的另一種分解:先 \(\mathbf x\)、再給定 \(\mathbf x\) 的後驗)。
第二個等號:\(\log\) 拆成 \(\log\frac{p_{\text{data}}(\mathbf x)}{p_{\bm\phi}(\mathbf x)}+\log\frac{q_{\bm\theta}(\mathbf z\mid\mathbf x)}{p_{\bm\phi}(\mathbf z\mid\mathbf x)}\),期望 \(\mathbb E_{q_{\bm\theta}(\mathbf x,\mathbf z)}=\mathbb E_{p_{\text{data}}(\mathbf x)}\mathbb E_{q_{\bm\theta}(\mathbf z\mid\mathbf x)}\)。第一部分不含 \(\mathbf z\),內層期望不改變它;第二部分的內層期望就是 \(\mathcal D_{\mathrm{KL}}(q_{\bm\theta}(\mathbf z\mid\mathbf x)\Vert p_{\bm\phi}(\mathbf z\mid\mathbf x))\)。
最後,注意到
$$\log p_{\bm\phi}(\mathbf x)-\mathcal L_{\text{ELBO}}(\bm\theta,\bm\phi;\mathbf x)=\mathcal D_{\mathrm{KL}}\big(q_{\bm\theta}(\mathbf z\mid\mathbf x)\,\Vert\,p_{\bm\phi}(\mathbf z\mid\mathbf x)\big).$$也就是說,推論誤差恰好就是 log-likelihood 和 ELBO 之間的缺口。所以最大化 ELBO 等於直接減少推論誤差,訓練確實在壓低整個上界中有意義的一部分。
缺口恆等式怎麼來(書直接寫出,這裡補上推導)
由貝氏定理 \(p_{\bm\phi}(\mathbf x,\mathbf z)=p_{\bm\phi}(\mathbf x)\,p_{\bm\phi}(\mathbf z\mid\mathbf x)\),代進 ELBO 的 Jensen 形式:
$$\mathcal L_{\text{ELBO}}=\mathbb E_{q_{\bm\theta}(\mathbf z\mid\mathbf x)}\!\left[\log\frac{p_{\bm\phi}(\mathbf x)\,p_{\bm\phi}(\mathbf z\mid\mathbf x)}{q_{\bm\theta}(\mathbf z\mid\mathbf x)}\right]=\log p_{\bm\phi}(\mathbf x)-\mathbb E_{q_{\bm\theta}(\mathbf z\mid\mathbf x)}\!\left[\log\frac{q_{\bm\theta}(\mathbf z\mid\mathbf x)}{p_{\bm\phi}(\mathbf z\mid\mathbf x)}\right].$$最後一項就是 \(\mathcal D_{\mathrm{KL}}(q_{\bm\theta}(\mathbf z\mid\mathbf x)\Vert p_{\bm\phi}(\mathbf z\mid\mathbf x))\),移項即得。由此也看出:Jensen 不等式取等號,若且唯若 \(q_{\bm\theta}(\mathbf z\mid\mathbf x)\) 等於真後驗。
Demo AELBO 與它的缺口轉述者補充
兩個一維的小模型,先驗都是 \(z\sim\mathcal N(0,1)\),所以 \(\log p(x)\)、真後驗 \(p(z\mid x)\)、ELBO 都可以用數值積分精確算出。Encoder 限定是高斯 \(q(z)=\mathcal N(\mu,\sigma^2)\),你可以手動調它,或按「最佳化 \(q\)」讓程式在 \((\mu,\sigma)\) 上搜尋最大的 ELBO。
- 線性模型:\(x\mid z\sim\mathcal N(1.5z,\,0.5^2)\)。真後驗剛好是高斯,所以最佳的 \(q\) 能讓缺口歸零。
- 平方模型:\(x\mid z\sim\mathcal N(z^2,\,0.3^2)\)。因為 \(z\) 和 \(-z\) 產生同樣的 \(x\),\(x\) 稍大時真後驗有兩個對稱的峰,單一高斯 \(q\) 怎麼調都蓋不住。
值得試的幾件事:
- 任意調 \(q\),讀數裡的「缺口」和另外直接算的 \(\mathcal D_{\mathrm{KL}}(q\Vert p(z\mid x))\) 永遠相等(第 5 節的恆等式),而且 ELBO 永遠不超過 \(\log p(x)\)。
- 線性模型按「最佳化 \(q\)」:\(q\) 疊上真後驗,缺口幾乎是 0。
- 平方模型、\(x=1\) 或 \(2\):最佳的 \(q\) 只抓住兩個峰的其中一個,缺口約 \(0.7\approx\log2\)。這正是第 8 節說的「encoder 的分佈家族不夠豐富」。\(q\) 選擇抓一個峰而不是攤開蓋兩個,是因為缺口是 \(\mathcal D_{\mathrm{KL}}(q\Vert p)\) 這個方向的 KL(B01 Demo A 的 reverse KL 也是這樣)。
06Gaussian VAE書 §2.1.3
標準的 VAE 用高斯分佈當 encoder 和 decoder。
Encoder:
$$q_{\bm\theta}(\mathbf z\mid\mathbf x):=\mathcal N\big(\mathbf z;\,\bm\mu_{\bm\theta}(\mathbf x),\,\mathrm{diag}(\bm\sigma_{\bm\theta}^2(\mathbf x))\big),$$其中 \(\bm\mu_{\bm\theta}:\mathbb R^D\to\mathbb R^d\) 和 \(\bm\sigma_{\bm\theta}:\mathbb R^D\to\mathbb R_+^d\) 是 encoder 網路的確定性輸出(\(D\) 是資料維度,\(d\) 是潛在維度)。
Decoder:固定變異數的高斯,
$$p_{\bm\phi}(\mathbf x\mid\mathbf z):=\mathcal N\big(\mathbf x;\,\bm\mu_{\bm\phi}(\mathbf z),\,\sigma^2\mathbf I\big),$$其中 \(\bm\mu_{\bm\phi}:\mathbb R^d\to\mathbb R^D\) 是神經網路,\(\sigma>0\) 是控制變異數的小常數。
在這個假設下,ELBO 的重建項化簡成
$$\mathbb E_{q_{\bm\theta}(\mathbf z\mid\mathbf x)}\big[\log p_{\bm\phi}(\mathbf x\mid\mathbf z)\big]=-\frac1{2\sigma^2}\,\mathbb E_{q_{\bm\theta}(\mathbf z\mid\mathbf x)}\big[\Vert\mathbf x-\bm\mu_{\bm\phi}(\mathbf z)\Vert^2\big]+C,$$\(C\) 是和 \(\bm\theta,\bm\phi\) 無關的常數。最大化 ELBO 於是變成
$$\min_{\bm\theta,\bm\phi}\ \mathbb E_{q_{\bm\theta}(\mathbf z\mid\mathbf x)}\!\left[\frac1{2\sigma^2}\Vert\mathbf x-\bm\mu_{\bm\phi}(\mathbf z)\Vert^2\right]+\mathcal D_{\mathrm{KL}}\big(q_{\bm\theta}(\mathbf z\mid\mathbf x)\,\Vert\,p_{\text{prior}}(\mathbf z)\big),$$其中 KL 項因為高斯假設有封閉解。所以訓練 VAE 就是最小化一個帶正則化的重建損失。
重建項的常數 \(C\) 與 KL 的封閉解
高斯的 log 密度是 \(\log\mathcal N(\mathbf x;\bm\mu,\sigma^2\mathbf I)=-\frac{\Vert\mathbf x-\bm\mu\Vert^2}{2\sigma^2}-\frac D2\log(2\pi\sigma^2)\),所以 \(C=-\frac D2\log(2\pi\sigma^2)\),只依賴固定的 \(\sigma\)。
(轉述者補充,書只說有封閉解)對角高斯對標準高斯的 KL,各維獨立相加:
$$\mathcal D_{\mathrm{KL}}\big(\mathcal N(\bm\mu,\mathrm{diag}(\bm\sigma^2))\,\Vert\,\mathcal N(\mathbf 0,\mathbf I)\big)=\frac12\sum_{j=1}^d\big(\mu_j^2+\sigma_j^2-1-\log\sigma_j^2\big).$$一維的推導:\(\mathbb E_q[\log q-\log p]=\mathbb E_q\big[-\tfrac{(z-\mu)^2}{2\sigma^2}-\log\sigma+\tfrac{z^2}{2}\big]=-\tfrac12-\log\sigma+\tfrac12(\mu^2+\sigma^2)\),用到 \(\mathbb E_q[(z-\mu)^2]=\sigma^2\)、\(\mathbb E_q[z^2]=\mu^2+\sigma^2\)。它在 \(\mu=0,\sigma=1\) 時是 0,也就是 encoder 輸出和先驗一模一樣。
實際怎麼對 \(\bm\theta\) 取梯度:reparameterization trick
書在這裡沒有談,但訓練時一定會遇到:重建項是對 \(q_{\bm\theta}\) 取期望,而 \(q_{\bm\theta}\) 本身含有參數,不能直接把梯度穿進「抽樣」這個動作。標準做法是把抽樣寫成
$$\mathbf z=\bm\mu_{\bm\theta}(\mathbf x)+\bm\sigma_{\bm\theta}(\mathbf x)\odot\boldsymbol\epsilon,\qquad\boldsymbol\epsilon\sim\mathcal N(\mathbf 0,\mathbf I),$$隨機性全部移到和參數無關的 \(\boldsymbol\epsilon\),\(\mathbf z\) 變成 \(\bm\theta\) 的可微函數,就能用一般的反向傳播。Demo B 的訓練就是這樣做的。詳見 Kingma & Welling(2013)以及 CS236 第 6 講。
07缺點:生成的圖很模糊書 §2.1.4
VAE 的框架在理論上很漂亮,卻有一個關鍵缺點:它常常生出模糊的結果。
書的註腳特別限定範圍:這裡分析的限制只針對前面介紹的常見設定,也就是簡單的高斯 decoder 加上平方重建誤差。在這個設定下,母體最佳的 decoder 回傳一個條件平均;如果幾個看起來不同的輸入對應到重疊的潛在區域,平均就會表現成模糊。這不應該被讀成對所有 VAE 架構或觀測模型都成立的結論。
為了看清楚,固定一個高斯 encoder \(q_{\text{enc}}(\mathbf z\mid\mathbf x)\),decoder 取 \(p_{\text{dec}}(\mathbf x\mid\mathbf z)=\mathcal N(\mathbf x;\bm\mu(\mathbf z),\sigma^2\mathbf I)\),\(\bm\mu(\mathbf z)\) 是 decoder 網路。對任意固定的 encoder,最佳化 ELBO(差一個常數)就是最小化期望的重建誤差:
$$\arg\min_{\bm\mu}\ \mathbb E_{p_{\text{data}}(\mathbf x)\,q_{\text{enc}}(\mathbf z\mid\mathbf x)}\big[\Vert\mathbf x-\bm\mu(\mathbf z)\Vert^2\big].$$這是對 \(\bm\mu(\mathbf z)\) 的標準最小平方問題,解是條件平均:
$$\bm\mu^*(\mathbf z)=\mathbb E_{q_{\text{enc}}(\mathbf x\mid\mathbf z)}[\mathbf x],$$其中 \(q_{\text{enc}}(\mathbf x\mid\mathbf z)\) 是 encoder 誘導出的「給定潛在變數時輸入的後驗」,由貝氏定理定義:
$$q_{\text{enc}}(\mathbf x\mid\mathbf z)=\frac{q_{\text{enc}}(\mathbf z\mid\mathbf x)\,p_{\text{data}}(\mathbf x)}{q_{\text{enc}}(\mathbf z)},\qquad q_{\text{enc}}(\mathbf z):=\int q_{\text{enc}}(\mathbf z\mid\mathbf x)\,p_{\text{data}}(\mathbf x)\,d\mathbf x.$$用貝氏定理,最佳生成器還可以寫成等價的形式:
$$\bm\mu^*(\mathbf z)=\frac{\mathbb E_{p_{\text{data}}(\mathbf x)}\big[q_{\text{enc}}(\mathbf z\mid\mathbf x)\cdot\mathbf x\big]}{q_{\text{enc}}(\mathbf z)}=\frac{\mathbb E_{p_{\text{data}}(\mathbf x)}\big[q_{\text{enc}}(\mathbf z\mid\mathbf x)\cdot\mathbf x\big]}{\mathbb E_{p_{\text{data}}(\mathbf x)}\big[q_{\text{enc}}(\mathbf z\mid\mathbf x)\big]}.$$這個式子說:\(\bm\mu^*(\mathbf z)\) 是所有資料的加權平均,權重是「這筆資料被 encode 到 \(\mathbf z\) 附近的機率」。現在假設兩個不同的輸入 \(\mathbf x\neq\mathbf x'\) 被映到潛在空間中重疊的區域,也就是 \(q_{\text{enc}}(\cdot\mid\mathbf x)\) 和 \(q_{\text{enc}}(\cdot\mid\mathbf x')\) 的支撐集有交集。那麼在重疊處,\(\bm\mu^*(\mathbf z)\) 會把好幾個可能毫不相關的輸入平均起來,輸出就是模糊、沒有特色的東西。這種在互相衝突的 mode 之間取平均的效應,是 VAE 生成樣本特有模糊感的根本原因。
和 B02「網路學到的是平均」是同一件事
B02 裡 diffusion 的網路用平方誤差預測乾淨資料,學到的是 \(\mathbb E[\mathbf x_0\mid\mathbf x_t]\);這裡 VAE 的 decoder 用平方誤差重建,學到的是 \(\mathbb E[\mathbf x\mid\mathbf z]\)。兩者都是條件平均。差別在於 diffusion 不會只用一次這個平均:它從高雜訊到低雜訊反覆使用,每一步的模稜兩可都比上一步少(B02 Demo C),最後得到清楚的樣本;VAE 的 decoder 只解碼一次,平均出來的模糊就直接成了輸出。
Demo B訓練一個小 VAE:重建、取樣、模糊與 posterior collapse轉述者補充
資料是平面上 5 個小團(灰點)。VAE 的潛在維度 \(d=2\),encoder 和 decoder 都是兩層、每層 32 個神經元的 MLP,用第 6 節的 Gaussian VAE 損失加上 reparameterization 訓練 3,000 步(約 2–4 秒)。唯一的旋鈕是 decoder 的變異數 \(\sigma\):它決定重建項前面的權重 \(\frac1{2\sigma^2}\),也就是重建和潛在 KL 誰比較重要。
依序試四個 \(\sigma\),觀察三種現象:
- \(\sigma\) 很小(0.05):重建幾乎完美,但潛在 KL 很大,encoder 把各團擠成先驗裡互相分開的小島。從先驗抽的 \(\mathbf z\) 常落在島和島之間,解碼後就落在資料團之間的空地上。
- \(\sigma\) 適中(0.15–0.5):兩者取得平衡,落在團上的取樣明顯變多(0.15 時約四成、0.5 時約一半)。其餘的點落在團和團之間:decoder 在潛在空間的空隙處只能輸出鄰近幾團之間的折衷,這和第 7 節「在 mode 之間取平均」是同一類現象。
- \(\sigma\) 很大(2):潛在 KL 幾乎是 0,encoder 對每筆資料都輸出先驗本身。\(\mathbf z\) 不再帶任何資訊,decoder 只能輸出資料的總平均,所有樣本擠在中央。這就是第 8 節的 posterior collapse。
08(選讀)從標準 VAE 到階層式 VAE書 §2.1.5
為了建模複雜的資料,階層式 VAE(Hierarchical VAE,HVAE)引入一整個階層的潛在變數。這種多層結構讓模型能在不同的抽象層次捕捉資料特徵,大幅提升表達力,也呼應真實世界資料「由部分組成整體」的性質。
HVAE 的模型
標準 VAE 只用一個潛在代碼 \(\mathbf z\);HVAE 引入好幾層潛在變數,排成由上而下的階層。每一層潛在變數決定它下面那一層,形成一串條件先驗,在越來越細的抽象層次捕捉結構。聯合分佈因此由上而下分解成
$$p_{\bm\phi}(\mathbf x,\mathbf z_{1:L})=p_{\bm\phi}(\mathbf x\mid\mathbf z_1)\prod_{i=2}^L p_{\bm\phi}(\mathbf z_{i-1}\mid\mathbf z_i)\;p(\mathbf z_L),$$它定義的資料邊際分佈是
$$p_{\text{HVAE}}(\mathbf x):=\int p_{\bm\phi}(\mathbf x,\mathbf z_{1:L})\,d\mathbf z_{1:L}.$$生成是逐層進行的:從最上層的 \(\mathbf z_L\) 開始,一層一層往下解碼到 \(\mathbf z_1\),最後生成觀測 \(\mathbf x\)。
Encoder 部分,HVAE 用一個和生成階層對稱、有結構、可學習的變分 encoder \(q_{\bm\theta}(\mathbf z_{1:L}\mid\mathbf x)\)。常見的選擇是由下而上的 Markov 分解:
$$q_{\bm\theta}(\mathbf z_{1:L}\mid\mathbf x)=q_{\bm\theta}(\mathbf z_1\mid\mathbf x)\prod_{i=2}^L q_{\bm\theta}(\mathbf z_i\mid\mathbf z_{i-1}).$$HVAE 的 ELBO
和單層 VAE 一樣用 Jensen 不等式:
$$\log p_{\text{HVAE}}(\mathbf x)=\log\mathbb E_{q_{\bm\theta}(\mathbf z_{1:L}\mid\mathbf x)}\!\left[\frac{p_{\bm\phi}(\mathbf x,\mathbf z_{1:L})}{q_{\bm\theta}(\mathbf z_{1:L}\mid\mathbf x)}\right]\ge\mathbb E_{q_{\bm\theta}(\mathbf z_{1:L}\mid\mathbf x)}\!\left[\log\frac{p_{\bm\phi}(\mathbf x,\mathbf z_{1:L})}{q_{\bm\theta}(\mathbf z_{1:L}\mid\mathbf x)}\right]=:\mathcal L_{\text{ELBO}}.$$把兩個分解代進去:
$$\mathcal L_{\text{ELBO}}=\mathbb E_{q_{\bm\theta}(\mathbf z_{1:L}\mid\mathbf x)}\!\left[\log\frac{p(\mathbf z_L)\prod_{i=2}^L p_{\bm\phi}(\mathbf z_{i-1}\mid\mathbf z_i)\,p_{\bm\phi}(\mathbf x\mid\mathbf z_1)}{q_{\bm\theta}(\mathbf z_1\mid\mathbf x)\prod_{i=2}^L q_{\bm\theta}(\mathbf z_i\mid\mathbf z_{i-1})}\right].$$這個階層式 ELBO 可以拆成幾個好解讀的部分:一個重建項、一串「相鄰兩層互相匹配」的項,以及最上層對先驗的 KL 正則化(下面「階層改變了什麼」會寫出來)。
從淺層網路走向深層網路曾經徹底改變機器學習,類似的想法也改變了生成模型:HVAE 展示了用深的、堆疊的層來建構資料的威力。這種層狀階層的概念是現代生成建模的基石,之後會在 score-based 方法(第 3 章)和 normalizing flow(第 5 章)再次出現。
為什麼單層 VAE 把網路加深還不夠
標準(單層)VAE 有兩個根本限制,不會因為把 encoder 和 decoder 加深就解決。
第一,變分分佈的家族。標準 VAE 的 \(q_{\bm\theta}(\mathbf z\mid\mathbf x)=\mathcal N\big(\mathbf z;\bm\mu_{\bm\theta}(\mathbf x),\mathrm{diag}(\bm\sigma_{\bm\theta}^2(\mathbf x))\big)\),所以對每個固定的 \(\mathbf x\),encoder 給的後驗就是單一個對角共變異數的高斯。網路加深只會讓 \(\bm\mu_{\bm\theta}\)、\(\bm\sigma_{\bm\theta}\) 算得更準,不會擴大這個家族;就算用滿的共變異數矩陣,也還是一個單峰的橢球。當真後驗 \(p_{\bm\phi}(\mathbf z\mid\mathbf x)\) 有好幾個峰時,這個家族就配不上,ELBO 變鬆、推論變差。要解決,需要更豐富的後驗家族,而不只是更深的網路。(Demo A 的平方模型就是這個情況。)
第二,decoder 太強時會發生 posterior collapse。回想 VAE 的目標,把對資料的平均也寫進來:
$$\mathbb E_{p_{\text{data}}(\mathbf x)}\big[\mathcal L_{\text{ELBO}}(\mathbf x)\big]=\mathbb E_{p_{\text{data}}(\mathbf x)q_{\bm\theta}(\mathbf z\mid\mathbf x)}\big[\log p_{\bm\phi}(\mathbf x\mid\mathbf z)\big]-\mathbb E_{p_{\text{data}}(\mathbf x)}\big[\mathcal D_{\mathrm{KL}}\big(q_{\bm\theta}(\mathbf z\mid\mathbf x)\Vert p(\mathbf z)\big)\big]$$ $$=\mathbb E_{p_{\text{data}}(\mathbf x)q_{\bm\theta}(\mathbf z\mid\mathbf x)}\big[\log p_{\bm\phi}(\mathbf x\mid\mathbf z)\big]-\mathcal I_q(\mathbf x;\mathbf z)-\mathcal D_{\mathrm{KL}}\big(q_{\bm\theta}(\mathbf z)\Vert p(\mathbf z)\big),$$其中 \(\mathcal I_q(\mathbf x;\mathbf z)\) 是互資訊(mutual information),
$$\mathcal I_q(\mathbf x;\mathbf z)=\mathbb E_{q(\mathbf x,\mathbf z)}\!\left[\log\frac{q_{\bm\theta}(\mathbf z\mid\mathbf x)}{q(\mathbf z)}\right]=\mathbb E_{p_{\text{data}}(\mathbf x)}\big[\mathcal D_{\mathrm{KL}}\big(q_{\bm\theta}(\mathbf z\mid\mathbf x)\Vert q(\mathbf z)\big)\big],$$而 \(q_{\bm\theta}(\mathbf z)=\int p_{\text{data}}(\mathbf x)\,q_{\bm\theta}(\mathbf z\mid\mathbf x)\,d\mathbf x\) 是聚合後驗(aggregated posterior)。
平均 KL 怎麼拆成互資訊加聚合 KL
在 \(\log\frac{q_{\bm\theta}(\mathbf z\mid\mathbf x)}{p(\mathbf z)}\) 裡插入聚合後驗:
$$\log\frac{q_{\bm\theta}(\mathbf z\mid\mathbf x)}{p(\mathbf z)}=\log\frac{q_{\bm\theta}(\mathbf z\mid\mathbf x)}{q_{\bm\theta}(\mathbf z)}+\log\frac{q_{\bm\theta}(\mathbf z)}{p(\mathbf z)}.$$對 \(p_{\text{data}}(\mathbf x)q_{\bm\theta}(\mathbf z\mid\mathbf x)\) 取期望:第一項就是 \(\mathcal I_q(\mathbf x;\mathbf z)\);第二項只依賴 \(\mathbf z\),而 \(\mathbf z\) 在這個聯合分佈下的邊際正是 \(q_{\bm\theta}(\mathbf z)\),所以期望是 \(\mathcal D_{\mathrm{KL}}(q_{\bm\theta}(\mathbf z)\Vert p(\mathbf z))\)。兩項都非負。
如果 decoder 的家族不用 \(\mathbf z\) 就能把資料建模得很好(也就是它包含某個 \(p_{\bm\phi}(\mathbf x\mid\mathbf z)=r(\mathbf x)\),和 \(p_{\text{data}}\) 很接近),那麼 ELBO 的最大化解會讓 \(q_{\bm\theta}(\mathbf z\mid\mathbf x)=p(\mathbf z)\),於是 \(\mathcal I_q(\mathbf x;\mathbf z)=0\)、\(q_{\bm\theta}(\mathbf z)=p(\mathbf z)\),後面兩個懲罰項都是 0。這個「忽略 \(\mathbf z\)」的解不會因為網路加深而消失,而且有兩個後果:
- 學到的潛在代碼和 \(\mathbf x\) 無關,不帶任何對下游任務有用、依資料而變的結構;
- 以 \(\mathbf z\) 為條件、或在 \(\mathbf z\) 空間中移動,對生成的樣本都沒有影響,可控生成失效。
Demo B 的 \(\sigma=2\) 為什麼也會 collapse
書講的是「decoder 太強」的情況。Demo B 的 decoder 只是一個高斯,但 \(\sigma=2\) 時重建項的權重 \(\frac1{2\sigma^2}=0.125\) 很小,而一個忽略 \(\mathbf z\)、永遠輸出資料平均的 decoder 在這個 \(\sigma\) 下已經「夠好」(資料的總變異數約 4,和 \(\sigma^2\) 同一個量級),用 \(\mathbf z\) 帶資訊換來的重建改進抵不上 KL 的代價。結構和書上相同:存在一個不靠 \(\mathbf z\) 也夠好的 decoder,最佳解就選擇忽略 \(\mathbf z\)。
階層改變了什麼
HVAE 有好幾層潛在變數,
$$p_{\bm\phi}(\mathbf x,\mathbf z_{1:L})=p_{\bm\phi}(\mathbf x\mid\mathbf z_1)\prod_{i=2}^L p_{\bm\phi}(\mathbf z_{i-1}\mid\mathbf z_i)\,p(\mathbf z_L),$$它的 ELBO 是
$$\begin{aligned}\mathcal L_{\text{ELBO}}(\mathbf x)&=\mathbb E_{q_{\bm\theta}(\mathbf z_1\mid\mathbf x)}\big[\log p_{\bm\phi}(\mathbf x\mid\mathbf z_1)\big]\\&\quad-\mathbb E_{q_{\bm\theta}(\mathbf z_{1:2}\mid\mathbf x)}\big[\log q_{\bm\theta}(\mathbf z_1\mid\mathbf x)-\log p_{\bm\phi}(\mathbf z_1\mid\mathbf z_2)\big]\\&\quad-\sum_{i=2}^{L-1}\mathbb E_{q_{\bm\theta}(\mathbf z_{1:i+1}\mid\mathbf x)}\big[\log q_{\bm\theta}(\mathbf z_i\mid\mathbf z_{i-1})-\log p_{\bm\phi}(\mathbf z_i\mid\mathbf z_{i+1})\big]\\&\quad-\mathbb E_{q_{\bm\theta}(\mathbf z_{L-1}\mid\mathbf x)}\Big[\mathcal D_{\mathrm{KL}}\big(q_{\bm\theta}(\mathbf z_L\mid\mathbf z_{L-1})\,\Vert\,p(\mathbf z_L)\big)\Big].\end{aligned}$$書在這裡註明期望記號 \(\mathbb E_q:=\mathbb E_{p_{\text{data}}(\mathbf x)q_{\bm\theta}(\mathbf z_{1:L}\mid\mathbf x)}\),也就是同時對資料取平均;上式是對單一 \(\mathbf x\) 寫的版本,對資料平均時在每一項外面再加 \(\mathbb E_{p_{\text{data}}(\mathbf x)}\) 即可。
這個拆法怎麼來
把 ELBO 裡的 log 比值逐項重新分組(\(\log p(\mathbf z_L)\) 和 \(\log q(\mathbf z_L\mid\mathbf z_{L-1})\) 配成一對,其餘每個 \(\mathbf z_i\) 讓「encoder 產生它的那一項」和「decoder 產生它的那一項」配成一對):
$$\log p_{\bm\phi}(\mathbf x\mid\mathbf z_1)+\Big[\log p_{\bm\phi}(\mathbf z_1\mid\mathbf z_2)-\log q_{\bm\theta}(\mathbf z_1\mid\mathbf x)\Big]+\sum_{i=2}^{L-1}\Big[\log p_{\bm\phi}(\mathbf z_i\mid\mathbf z_{i+1})-\log q_{\bm\theta}(\mathbf z_i\mid\mathbf z_{i-1})\Big]+\Big[\log p(\mathbf z_L)-\log q_{\bm\theta}(\mathbf z_L\mid\mathbf z_{L-1})\Big].$$每一項只牽涉幾個變數,所以只需要對那幾個變數的邊際取期望(這就是每項期望下標不同的原因)。最後一項對 \(\mathbf z_L\) 取期望後,正是給定 \(\mathbf z_{L-1}\) 時的 KL,外面再對 \(\mathbf z_{L-1}\) 取期望。
每一層潛在變數只和相鄰的層互動:encoder 透過 \(q_{\bm\theta}(\mathbf z_i\mid\mathbf z_{i-1})\) 把資訊往上傳,decoder 透過 \(p_{\bm\phi}(\mathbf z_{i-1}\mid\mathbf z_i)\) 把資訊往下傳。所以 ELBO 分解成一個重建項、相鄰層的匹配項,以及最上層對先驗的 KL。這些性質來自階層式的潛在圖結構,而不是單純把單層 VAE 的網路加深。
接下來呢
HVAE 用多層潛在變數擴充了 VAE 的表達力,但訓練有它特有的困難:
- encoder 和 decoder 要一起最佳化,學習不穩定:低層和 decoder 已經能重建 \(\mathbf x\),高層的潛在變數就幾乎拿不到有效的訊號。
- 傳到深層變數的梯度往往間接又微弱,很難讓它們發揮作用。
- 容量很難平衡:太有表達力的條件分佈會主導重建任務,壓抑高層潛在變數的用處。
有意思的是,「深的層狀階層」這個核心想法,在變分 diffusion model 中有更強大的化身(下一頁 B04)。Diffusion 繼承了 HVAE 逐步生成的結構,卻漂亮地避開了它的主要弱點:把 encoding 過程固定下來,只學生成方向的反轉。這帶來了新的穩定性和建模彈性,讓生成品質大幅躍進。
記號預告:為了簡潔,書從這裡開始不再沿用 VAE「encoder 用 \(q\)、生成器用 \(p\)」的慣例,而是一律用 \(p\),再用下標或上標標明角色,並在上下文中說清楚。