下面的內容是從李宏毅2017年機器學習課程中關於VAE一節[1]中整理的。課程講解的非常細緻,再整理一遍方便理解查閱。
一、AE與VAE
AE(Auto-Encoder)是一個應用很廣泛的機器學習方法。
主要內容即是:將輸入(Input)經過編碼器(encoder)壓縮爲一個編碼(code),再通過解碼器(decoder)將編碼(code)解碼爲輸出(Output)。
學習的目標即:要使得輸出(Output)與輸入(Input)越接近越好。
以輸入爲圖像爲例,結構圖如下:
AE中間階段生成的編碼向量,並不是隨機、沒有意義的。編碼中攜帶着與輸入有關的信息,編碼中的某些維度代表着輸入數據的某些特徵。例如生成人臉圖像時,編碼可以表示人臉表情、頭髮樣子、是否有鬍子等等。
VAE變分自動編碼器作爲AE的變體,它主要的變動是對編碼(code)的生成上。編碼(code)不再像AE中是唯一映射的,而是具有某種分佈,使得編碼(code)在某範圍內波動時都可產生對應輸出。藉助下面這個例子進行理解:
如上圖AE示意圖,左側是對滿月圖像編解碼,右側是對弦月圖像編解碼,而像中間的編碼對解碼器來說並不知道要生成何種圖像。在VAE示意圖中,左右兩側對圖像編解碼過程中,編碼有不同程度的擾動(即圖中noise),解碼器利用擾動範圍內的編碼同樣可以生成相應的圖像,而對交界處的編碼,編碼器既想生成滿月圖像,又想生成弦月圖像,爲此做出折中,生成位於兩者之間的圖像。
這就是VAE一個較爲直觀的想法。
二、VAE原理
VAE是一個深度生成模型,其最終目的是生成出概率分佈P(x),x即輸入數據。
在VAE中,我們通過高斯混合模型(Gaussian Mixture Model)來生成P(x),也就是說P(x)是由一系列高斯分佈疊加而成的,每一個高斯分佈都有它自己的參數μ和σ。
那我們藉助一個變量z∼N(0,I)(注意z是一個向量,生成自一個高斯分佈),找一個映射關係,將向量z映射成這一系列高斯分佈的參數向量μ(z)和σ(z)。有了這一系列高斯分佈的參數我們就可以得到疊加後的P(x)的形式,即x∣z∼N(μ(z),σ(z))。(這裏的“形式”僅是對某一個向量z所得到的)。
那麼要找的這個映射關係怎麼獲得呢?就拿神經網絡來做唄,只要神經元足夠想要啥樣的函數得不到呢。如下圖形式:
輸入向量z,得到參數向量μ(z)和σ(z)。這個映射關係是要在訓練過程中更新NN權重得到的。這部分作用相當於最終的解碼器(decoder)。
對於某一個向量z我們知道了如何找到P(x)。那麼對連續變量z依據全概率公式有:
P(x)=∫zP(z)P(x∣z)dz但是很難直接計算積分部分。我們用極大似然估計來估計P(x),有似然函數L:L=x∑logP(x)這裏我們額外引入一個分佈q(z∣x),z∣x∼N(μ′(x),σ′(x))。這個分佈表示形式如下:
這個分佈同樣是用一個神經網絡來完成,向量z根據NN輸出的參數向量μ′(x)和σ′(x)運算得到,注意這三個向量具有相同的維度。這部分作用相當於最終的編碼器(encoder)。
之後就開始推導了。
logP(x)=∫zq(z∣x)logP(x)dz∵∫zq(z∣x)dz=1=∫zq(z∣x)logP(z∣x)P(z,x)dz=∫zq(z∣x)log(q(z∣x)P(z,x)⋅P(z∣x)q(z∣x))dz=∫zq(z∣x)logP(z∣x)q(z∣x)dz+∫zq(z∣x)logq(z∣x)P(z,x)dz=DKL(q(z∣x)∣∣P(z∣x))+∫zq(z∣x)logq(z∣x)P(z,x)dz⪖∫zq(z∣x)logq(z∣x)P(z,x)dz∵DKL(q∣∣P)⪖0
我們將∫zq(z∣x)logq(z∣x)P(z,x)dz稱爲logP(x)的(variational) lower bound (下界),簡稱爲Lb。最大化Lb就等價於最大化似然函數L。那麼接下來具體看Lb,
Lb=∫zq(z∣x)logq(z∣x)P(z,x)dz=∫zq(z∣x)log(q(z∣x)P(z)⋅P(x∣z))dz=∫zq(z∣x)logq(z∣x)P(z)dz+∫zq(z∣x)logP(x∣z)dz=−DKL(q(z∣x)∣∣P(z))+∫zq(z∣x)logP(x∣z)dz=−DKL(q(z∣x)∣∣P(z))+Eq(z∣x)[logP(x∣z)]
最大化Lb包括下面兩部分:
- minimizing DKL(q(z∣x)∣∣P(z)),使後驗分佈近似值q(z∣x)接近先驗分佈P(z)。也就是說通過q(z∣x)生成的編碼z不能太離譜,要與某個分佈相當才行,這裏是對中間編碼生成起了限制作用。
當q(z∣x)和P(z)都是高斯分佈時,推導式有([2]中Appendix B):DKL(q(z∣x)∣∣P(z))=−21j∑J(1+log(σj)2−(μj)2−(σj)2)其中J表示向量z的總維度數,σj和μj表示q(z∣x)輸出的參數向量σ和μ的第j個元素。(這裏的σ和μ等於前文中μ′(x)和σ′(x))
- maximizing Eq(z∣x)[logP(x∣z)],即在給定編碼器輸出q(z∣x)下解碼器輸出P(x∣z)越大越好。這部分也就相當於常規的Reconstruction Loss(重建損失)。
由此我們可以得出VAE的原理圖:
通常忽略掉decoder輸出的σ(x)一項,僅要求μ(x)與x越接近越好。
VAE的損失函數即:
minLossVAE=DKL(q(z∣x)∣∣P(z))−Eq(z∣x)[logP(x∣z)]
附:
極大似然估計P(x)的時候還有一種寫法,即通過P(x)=∫zP(x,z)dz來推導。如圖[3]:
裏邊有提到術語ELBO,Evidence Lower Bound(證據下界),有興趣的可以自行查閱瞭解(偷個懶)。
三、reparameterization trick
由上文中VAE原理圖可以看出,編碼z是由分佈q(z∣x)採樣產生,而採樣操作是不可微分的,因此反向傳播做不了。[2]中提到了reparameterization trick來解決,藉助[4]中的示意圖理解下:
將上圖左圖原來的採樣操作通過reparameterization trick變換爲右圖的形式。引入一個外部向量ϵ∼N(0,1),通過z=μ+σ⊙ϵ計算編碼z(⊙表示element-wise乘法,ϵ的每一維都服從標準高斯分佈),由此loss的梯度可以通過μ和σ分支傳遞到encoder model處(ϵ並不需要梯度信息來更新)。
最終的VAE實際形式如下圖所示:
四、不足
VAE在產生新數據的時候是基於已有數據來做的,或者說是對已有數據進行某種組合而得到新數據的,它並不能生成或創造出新數據。另一方面是VAE產生的圖像比較模糊。
而大名鼎鼎的GAN利用對抗學習的方式,既能生成新數據,也能產生較清晰的圖像。後續的更是出現了很多種變形。
五、參考文獻
[1] Unsupervised Learning: Deep Generative Model (2017/04/27)
[2] VAE原著Auto-encoding variational bayes
[3] VAE的三種不同推導方法
[4] https://www.jeremyjordan.me/variational-autoencoders/