變分自編碼器
變分自編碼器保留了自編碼器的編碼器—解碼器架構,但讓潛在空間變成機率性的、組織良好的,於是你真的能從中取樣出新影像。編碼器不再把每張影像映射成編碼空間中的單一點,而是映射成一小團雲(一個機率分布),而我們堅持要所有這些雲一起堆疊成一個平滑、簡單的形狀(標準高斯分布)。如此一來整個編碼空間都被平滑地「填滿」,你便能隨機取一點、加以解碼,得到一張合理的新影像。
精確地說,變分自編碼器是一個潛在變數生成模型,其先驗為 p(z) = N(0, I),即標準多元高斯分布,並有一個解碼器 p_θ(x|z)——一個輸出逐像素影像分布參數(高斯或伯努利分布)的神經網路。若要以最大似然來訓練,我們需要 p_θ(x),也就是 p_θ(x|z) p(z) 對 z 的積分,但這是難以處理的。因此變分自編碼器引入一個近似後驗 q_φ(z|x)——也就是編碼器,它為 z 輸出一個平均值 μ(x) 與變異數 σ²(x)——並改為最大化證據下界(ELBO),而非真正的對數似然。
ELBO 等於期望重建對數似然 E[log p_θ(x|z)] 減去 KL 散度 KL(q_φ(z|x) || p(z))。第一項是重建品質:把 x 編碼成一個編碼分布、取樣一個編碼、解碼,再看它與 x 吻合得多好。第二項,也就是 KL 散度,把每張影像的編碼雲朝標準高斯先驗拉近——這正是讓整體潛在空間平滑且可取樣的關鍵。訓練時使用重參數化技巧(reparameterization trick),讓梯度能穿過 z 的隨機取樣。訓練完成後,你只要從 N(0, I) 取樣一個 z 並解碼一次,即可生成。
在人臉上訓練一個變分自編碼器,接著在潛在空間中沿一條直線,從一張微笑臉的編碼走到一張無表情臉的編碼;解碼這些中間點會得到一段平滑的漸變,微笑逐漸淡去——這證明潛在空間是連續且語意上有意義的,不像一般自編碼器那樣。
相較於 GAN,變分自編碼器傾向產生略為模糊的影像,因為高斯重建損失會獎勵預測「眾多合理輸出的逐像素平均」,而潛在瓶頸加上 KL 項又會丟棄高頻細節。兩個常見的調整旋鈕:後驗崩潰(posterior collapse,模型學會忽略 z)與 β-VAE 中的 β(加重 KL 項,以重建保真度換取更解耦的編碼)。