Skip to content

VAE:重建誤差、KL 與重參數化如何合作|CMU 10-423 第 9 堂

2026年10月11日1 分鐘
TL;DR普通 autoencoder 把輸入壓成一個向量再還原;VAE 則為每筆資料產生一個潛在分佈,讓重建與生成能在同一個機率模型中討論。

🌏 English version

影片狀態:錄影需登入或課程授權。 本文依公開投影片與作業整理,數值例子為本站補充,不是課堂逐字稿。

普通 autoencoder 把輸入壓成一個向量再還原;VAE 則為每筆資料產生一個潛在分佈,讓重建與生成能在同一個機率模型中討論。這堂的目標是能拆解 ELBO 的兩項、算一次 Gaussian KL,並指出重參數化的梯度從哪裡來。第 9 堂投影片末段的 zero/few-shot 另接到 ICL 篇,不把它當成 VAE 的訓練機制。

先備是高斯均值/方差、期望值與 autograd。若只記得「加一個 KL」,下面會先解釋為何需要 encoder 的近似分佈,再完整計算兩筆自擬資料。

生成方向與推論方向不同

生成模型先抽 z∼p(z),再從 decoder 的 pθ(x|z) 產生 x,常選 p(z)=N(0,I)。訓練只觀察 x,想知道哪些 z 能解釋它,但真實 posterior pθ(z|x) 通常難算。因此 encoder 定義可計算的 qφ(z|x),例如對角高斯,輸出均值 μ 與 log variance。

qφ 是近似推論分佈,不是生成時必須先餵一張圖的步驟。重建可以使用 encoder 得到 z;無條件生成則直接從 prior 抽 z。這兩種操作共用 decoder,但輸入來源不同。

ELBO 為什麼是下界

對固定 x,把 log pθ(x) 寫成兩部分:ELBO + KL(qφ(z|x) || pθ(z|x))。由於 KL 非負,ELBO≤log pθ(x)。再展開 ELBO,得到 E_q[log pθ(x|z)]−KL(qφ(z|x)||p(z))。

因此最小化負 ELBO 就是重建的負對數概似,加上 q 對 prior 的 KL。前者要求 z 足以解釋 x,後者約束每筆輸入的潛在分佈與 prior 的距離。這不是「KL 衡量生成圖跟原圖差多少」;影象重建誤差出現在第一項。

KL 非負並不代表任意手改係數仍是同一個 likelihood 下界。β-VAE 把 KL 乘 β 是另一個目標設計,要明說;原版 β=1 的例子才能直接對應上述分解。

兩筆資料走完一次取樣與 loss

以下是本站自擬一維例子。資料 A 的 x=1,encoder 給 μ=1、σ=0.5;資料 B 的 x=0,給 μ=0、σ=1。decoder 定義 p(x|z)=N(z,1),所以其均值就是 z。prior 是 N(0,1)。

重參數化為 z=μ+σε,ε∼N(0,1)。本次 A 抽 ε=0,得到 z=1;B 抽 ε=1,得到 z=1。對 unit-variance Gaussian decoder,負對數概似為 (x−z)²/2 + ln(2π)/2。A 的平方誤差部分為 0,B 為 0.5;常數約 0.9189 每筆都相同。

一維 KL(q||N(0,1)) = (μ²+σ²−1−ln σ²)/2。A 的 KL=(1+0.25−1−ln 0.25)/2≈0.8181;B 為 0。省略共同重建常數,兩筆平均的單次 Monte Carlo 負 ELBO 估計是 (0+0.8181+0.5+0)/2≈0.6591;若保留常數則約 1.5780。

這不是精確期望。對本例 decoder,E[(x−z)²/2]=((x−μ)²+σ²)/2,因此 A 為 0.125、B 為 0.5;省略常數的精確 batch 期望為 (0.125+0.8181+0.5)/2≈0.7216。單次抽樣可能高或低,不能把一次 loss 說成已算完 E_q。

隨機節點如何傳回梯度

將噪聲放在與 φ 無關的 ε,z=μ+σε 對 μ、σ 都可微。本次 A 的 ε=0,所以 ∂z/∂μ=1、∂z/∂σ=0;重建 residual 為零,此次重建項對兩者都沒有梯度。但 KL 對 μ 的導數是 μ=1,對 σ 的導數是 σ−1/σ=−1.5,仍會推動 encoder 更新。

這解釋了為甚麼「這張圖重建完美」不等於整體 VAE loss 已經最低。σ 也不能直接輸出任意負值;常用 log variance 並計算 σ=exp(logvar/2),確保正值與數值穩定。

後驗崩塌與離散潛在的邊界

若 decoder 很強,它可能忽略 z,讓 q 接近 prior、KL 很小,但 latent 對輸入沒有足夠資訊。只看 KL 下降不能宣稱表示變好,需要同時看重建、生成與 latent 是否被使用。

投影片還談 VQ-VAE:把連續 latent 對應到 codebook 中的離散碼項目。它涉及量化、codebook 與不同訓練技巧,不等於直接把本篇 Gaussian KL 套到離散 token 上。後續音訊 codec 篇會接這條表示路線,這裡先守住連續 VAE 的推論與梯度。

變式題與答案

把 A 的 μ 改成 0、σ 改成 1,KL 變成 0。但 x 仍為 1、decoder 仍是 z,所以預期重建半平方誤差變成 ((1−0)²+1)/2=1,比原本 0.125 大。把 latent 拉回 prior 不是免費改善。

若 ε=2、μ=1、σ=0.5,z=2,∂z/∂μ=1、∂z/∂σ=2。重參數化讓模型可透過樣本值學習,不是移除所有隨機性。理解這點後,到作業 2 檢查 diffusion tensor,再讀 latent diffusion 看壓縮表示如何接到生成。

上一篇|下一篇|系列總覽

課程影片來源

官方錄影入口位於 SCS Panopto。匿名資料夾未載入並提示登入;這表示未取得公開播放內容,不代表沒有錄影。原音與字幕須依課程授權存取。

參考資料