VAE中對使用KL散度的理解
- 什么是 VAE (Variational AutoEncoder)?
- 從自編碼器 (AE) 說起
- VAE:讓潛在空間變得“有意義”和“連續”
- KL 散度是如何用到的?
- 通俗理解 KL 散度在 VAE 中的作用:
- 帶來的好處:
- KL 散度公式 (無需背誦,理解即可):
什么是 VAE (Variational AutoEncoder)?
VAE,全稱是變分自編碼器。要理解它,我們得先從自編碼器 (AutoEncoder, AE) 說起。
從自編碼器 (AE) 說起
想象你有一張照片(比如一張貓的圖片),你想把它壓縮成一個很小的數據包,然后再從這個數據包里把照片還原出來。
- 編碼器 (Encoder):這個部分負責把你的照片(高維數據)“壓縮”成一個潛在向量 (Latent Vector),通常維度很低。這個潛在向量就像是照片的“精髓”或“壓縮包”。
- 解碼器 (Decoder):這個部分負責從“壓縮包”(潛在向量)中把照片“解壓”出來,還原成一張圖片。
自編碼器的工作就是:編碼器把數據壓縮,解碼器把數據還原。 訓練目標是讓還原出來的照片盡可能地接近原始照片。
AE 的問題: AE 學習到的潛在空間(所有壓縮包組成的區域)是不連續且沒有規律的。你不能隨機從潛在空間里取一個“壓縮包”給解碼器,指望它能還原出有意義的貓照片。它很可能還原出一堆噪音,因為你取的這個“壓縮包”可能落在了一片“空白”區域,解碼器根本沒學過如何處理。
VAE:讓潛在空間變得“有意義”和“連續”
VAE 就是為了解決 AE 的這個缺陷而誕生的。它的核心思想是:與其讓編碼器直接輸出一個潛在向量,不如讓它輸出一個“概率分布的參數”!
具體來說,VAE 做出一個關鍵的假設:每個輸入數據(比如一張貓照片)都對應著潛在空間中的一個高斯(正態)分布。
- 編碼器 (Encoder):不再直接輸出一個向量
z
,而是輸出一個均值向量 (μ\muμ) 和一個方差向量 (σ2\sigma^2σ2)。這兩個向量共同定義了潛在空間中的一個高斯分布。- μ\muμ 描述了這個分布的“中心”在哪里。
- σ2\sigma^2σ2 描述了這個分布的“范圍”有多廣。
- 采樣 (Sampling):我們不是直接用 μ\muμ 和 σ2\sigma^2σ2,而是從這個由 μ\muμ 和 σ2\sigma^2σ2 定義的高斯分布中隨機采樣一個潛在向量
z
。 - 解碼器 (Decoder):和 AE 一樣,解碼器接收采樣到的
z
,并嘗試將其還原成原始數據。
為什么 VAE 的潛在空間更“好”?
因為 VAE 的損失函數除了鼓勵重構準確性(還原的照片像不像原始照片)之外,還引入了一個非常重要的懲罰項:KL 散度。
KL 散度是如何用到的?
這就是 KL 散度登場的地方!KL 散度是 Kullback-Leibler Divergence 的縮寫,它在信息論中衡量的是兩個概率分布之間的差異。
在 VAE 中,KL 散度扮演著正則化 (Regularization) 的角色。它被用來懲罰編碼器輸出的潛在分布(由 $\mu$
和 $\sigma^2$
定義)偏離一個預先設定好的、簡單的“標準”分布的程度。這個“標準”分布通常是標準正態分布 N(0,1)N(0, 1)N(0,1)(均值為 0,方差為 1 的高斯分布)。
通俗理解 KL 散度在 VAE 中的作用:
想象一下:
- 編碼器就像一個攝影師,它拍了一堆貓的照片,每張照片都對應一個潛在空間中的“攝影風格”(一個高斯分布)。
- 解碼器就像一個畫家,它根據“攝影風格”畫貓。
- KL 散度就像一個**“風格警察”**:
- 這個警察要求所有的“攝影風格”(即編碼器輸出的每個
$(\mu, \sigma^2)$
分布)都要盡可能地接近一個“標準、統一的風格”(標準正態分布 N(0,1)N(0, 1)N(0,1))。 - 如果攝影師(編碼器)拍出來的風格太**“離譜”**(
$\mu$
離 0 太遠,或者$\sigma^2$
太大太小,分布太平坦或太尖銳),“風格警察”就會開出罰單(KL 損失變大)。 - 這會強制編碼器將不同的輸入數據映射到潛在空間中相互靠近、且形狀相似的分布。
- 這個警察要求所有的“攝影風格”(即編碼器輸出的每個
帶來的好處:
通過 KL 散度的“懲罰”,VAE 的潛在空間變得:
- 連續性 (Continuity):因為所有的潛在分布都被強制拉向 N(0,1)N(0,1)N(0,1),它們會相互重疊,從而消除了 AE 潛在空間中的“空白區域”。這意味著你可以從潛在空間中隨機采樣任何一個點,它都有很大概率屬于某個有效的潛在分布,解碼器就能還原出有意義的數據。
- 可生成性 (Generative Capability):因為潛在空間被正則化成接近標準正態分布,我們就可以直接從一個簡單的 N(0,1)N(0,1)N(0,1) 中隨機采樣一個
z
給解碼器,它就能生成全新的、有意義的數據(比如從未見過的貓的照片)。這使得 VAE 成為了一個強大的生成模型。 - 正則化 (Regularization):KL 散度避免了編碼器將每個輸入映射到潛在空間中的一個孤立點,從而防止過擬合,并鼓勵模型學習到數據的有意義的、低維表示。
KL 散度公式 (無需背誦,理解即可):
在代碼中,你看到的 KL 散度公式:
DKL(N(μ,σ2)∣∣N(0,1))=12∑(1+log?(σ2)?μ2?σ2)D_{KL}(N(\mu, \sigma^2) || N(0, 1)) = \frac{1}{2} \sum (1 + \log(\sigma^2) - \mu^2 - \sigma^2)DKL?(N(μ,σ2)∣∣N(0,1))=21?∑(1+log(σ2)?μ2?σ2)
- μ\muμ (均值):它懲罰潛在分布的中心偏離標準正態分布中心(0)的程度。如果 μ\muμ 越大或越小,μ2\mu^2μ2 就越大,KL 損失也就越大。
- σ2\sigma^2σ2 (方差):它懲罰潛在分布的形狀(方差)偏離標準正態分布方差(1)的程度。
- 如果 σ2\sigma^2σ2 過大(分布太寬),(1+log?(σ2)?σ2)(1 + \log(\sigma^2) - \sigma^2)(1+log(σ2)?σ2) 就會導致損失增大。
- 如果 σ2\sigma^2σ2 過小(分布太窄),(1+log?(σ2)?σ2)(1 + \log(\sigma^2) - \sigma^2)(1+log(σ2)?σ2) 也會導致損失增大。
- 當 σ2=1\sigma^2 = 1σ2=1 時,log?(1)=0\log(1) = 0log(1)=0,(1+0?1)=0(1 + 0 - 1) = 0(1+0?1)=0,這部分懲罰最小。
y=log?(x)?xy = \log{(x)}-xy=log(x)?x 函數圖像
所以,這個公式在數值上量化了你的“攝影風格”(潛在分布)與“標準風格”(標準正態分布)之間的差距。模型的目標就是最小化這個差距,讓生成的數據既能被很好地重構,又能保持潛在空間的良好結構。