【深度學習】VAE(Variational Auto-Encoder)原理

下面的內容是從李宏毅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)P(x)xx即輸入數據。
在VAE中,我們通過高斯混合模型(Gaussian Mixture Model)來生成P(x)P(x),也就是說P(x)P(x)是由一系列高斯分佈疊加而成的,每一個高斯分佈都有它自己的參數μ\muσ\sigma
在這裏插入圖片描述
那我們藉助一個變量zN(0,I)z\sim N(0,I)(注意zz是一個向量,生成自一個高斯分佈),找一個映射關係,將向量zz映射成這一系列高斯分佈的參數向量μ(z)\mu (z)σ(z)\sigma (z)。有了這一系列高斯分佈的參數我們就可以得到疊加後的P(x)P(x)的形式,即xzN(μ(z),σ(z))x|z \sim N \big(\mu(z), \sigma(z)\big)。(這裏的“形式”僅是對某一個向量zz所得到的)。
那麼要找的這個映射關係怎麼獲得呢?就拿神經網絡來做唄,只要神經元足夠想要啥樣的函數得不到呢。如下圖形式:
在這裏插入圖片描述
輸入向量zz,得到參數向量μ(z)\mu (z)σ(z)\sigma (z)。這個映射關係是要在訓練過程中更新NN權重得到的。這部分作用相當於最終的解碼器(decoder)

對於某一個向量zz我們知道了如何找到P(x)P(x)。那麼對連續變量zz依據全概率公式有:
P(x)=zP(z)P(xz)dzP(x)=\int _{z} P(z)P(x|z)dz但是很難直接計算積分部分。我們用極大似然估計來估計P(x)P(x),有似然函數LLL=xlogP(x)L=\sum_{x}\log P(x)這裏我們額外引入一個分佈q(zx)q(z|x)zxN(μ(x),σ(x))z|x \sim N\big(\mu^\prime(x), \sigma^\prime(x)\big)。這個分佈表示形式如下:
在這裏插入圖片描述這個分佈同樣是用一個神經網絡來完成,向量zz根據NN輸出的參數向量μ(x)\mu '(x)σ(x)\sigma '(x)運算得到,注意這三個向量具有相同的維度。這部分作用相當於最終的編碼器(encoder)
之後就開始推導了。
logP(x)=zq(zx)logP(x)dzzq(zx)dz=1=zq(zx)logP(z,x)P(zx)dz=zq(zx)log(P(z,x)q(zx)q(zx)P(zx))dz=zq(zx)logq(zx)P(zx)dz+zq(zx)logP(z,x)q(zx)dz=DKL(q(zx)P(zx))+zq(zx)logP(z,x)q(zx)dzzq(zx)logP(z,x)q(zx)dzDKL(qP)0\begin{aligned} \log P(x)&=\int_{z}q(z|x)\log P(x)dz \qquad \because \int_{z}q(z|x)dz=1 \\ &=\int_{z} q(z|x)\log \frac{P(z, x)}{P(z|x)}dz \\ &=\int_z q(z|x)\log \big(\frac{P(z,x)}{q(z|x)} \cdot \frac{q(z|x)}{P(z|x)}\big)dz \\ &=\int_z q(z|x)\log \frac{q(z|x)}{P(z|x)}dz + \int_z q(z|x)\log \frac{P(z,x)}{q(z|x)}dz \\ &=D_{KL}\big(q(z|x)||P(z|x)\big) + \int_z q(z|x)\log \frac{P(z,x)}{q(z|x)}dz \\ &\eqslantgtr \int_z q(z|x)\log \frac{P(z,x)}{q(z|x)}dz \qquad \because D_{KL}(q||P) \eqslantgtr 0 \end{aligned}
我們將zq(zx)logP(z,x)q(zx)dz\int_z q(z|x)\log \frac{P(z,x)}{q(z|x)}dz稱爲logP(x)\log P(x)(variational) lower bound\textit{\textbf{(variational) lower bound}} (下界),簡稱爲LbL_b最大化LbL_b就等價於最大化似然函數LL。那麼接下來具體看LbL_b
Lb=zq(zx)logP(z,x)q(zx)dz=zq(zx)log(P(z)q(zx)P(xz))dz=zq(zx)logP(z)q(zx)dz+zq(zx)logP(xz)dz=DKL(q(zx)P(z))+zq(zx)logP(xz)dz=DKL(q(zx)P(z))+Eq(zx)[logP(xz)]\begin{aligned} L_b&=\int_z q(z|x)\log \frac{P(z,x)}{q(z|x)}dz \\ &=\int_z q(z|x)\log \big(\frac{P(z)}{q(z|x)} \cdot P(x|z) \big)dz \\ &=\int_z q(z|x)\log \frac{P(z)}{q(z|x)}dz + \int_z q(z|x)\log P(x|z)dz \\ &=-D_{KL}\big( q(z|x)||P(z)\big) + \int_z q(z|x)\log P(x|z)dz \\ &=-D_{KL}\big( q(z|x)||P(z)\big) + E_{q(z|x)}[\log P(x|z)] \end{aligned}
最大化LbL_b包括下面兩部分:

  • minimizing\textit{minimizing} DKL(q(zx)P(z))D_{KL}\big( q(z|x)||P(z)\big),使後驗分佈近似值q(zx)q(z|x)接近先驗分佈P(z)P(z)。也就是說通過q(zx)q(z|x)生成的編碼zz不能太離譜,要與某個分佈相當才行,這裏是對中間編碼生成起了限制作用。
    q(zx)q(z|x)P(z)P(z)都是高斯分佈時,推導式有([2]中Appendix B):DKL(q(zx)P(z))=12jJ(1+log(σj)2(μj)2(σj)2)D_{KL}\big( q(z|x)||P(z)\big)=-\frac{1}{2}\sum_{j}^{J}\big( 1+\log (\sigma_{j})^2 - (\mu_j)^2-(\sigma_j)^2\big)其中JJ表示向量zz的總維度數,σj\sigma_jμj\mu_j表示q(zx)q(z|x)輸出的參數向量σ\sigmaμ\mu的第jj個元素。(這裏的σ\sigmaμ\mu等於前文中μ(x)\mu '(x)σ(x)\sigma '(x))
  • maximizing\textit{maximizing} Eq(zx)[logP(xz)]E_{q(z|x)}[\log P(x|z)],即在給定編碼器輸出q(zx)q(z|x)下解碼器輸出P(xz)P(x|z)越大越好。這部分也就相當於常規的Reconstruction Loss(重建損失)。

由此我們可以得出VAE的原理圖
在這裏插入圖片描述
通常忽略掉decoder輸出的σ(x)\sigma(x)一項,僅要求μ(x)\mu(x)xx越接近越好。
VAE的損失函數即:
minLossVAE=DKL(q(zx)P(z))Eq(zx)[logP(xz)]\min Loss_{VAE} = D_{KL}\big( q(z|x)||P(z)\big) -E_{q(z|x)}[\log P(x|z)]
附:
極大似然估計P(x)P(x)的時候還有一種寫法,即通過P(x)=zP(x,z)dzP(x)=\int_z P(x,z)dz來推導。如圖[3]:
在這裏插入圖片描述
裏邊有提到術語ELBO,Evidence Lower Bound(證據下界),有興趣的可以自行查閱瞭解(偷個懶)。


三、reparameterization trick

由上文中VAE原理圖可以看出,編碼zz是由分佈q(zx)q(z|x)採樣產生,而採樣操作是不可微分的,因此反向傳播做不了。[2]中提到了reparameterization trick來解決,藉助[4]中的示意圖理解下:
在這裏插入圖片描述
將上圖左圖原來的採樣操作通過reparameterization trick變換爲右圖的形式。引入一個外部向量ϵN(0,1)\epsilon \sim N(0, 1),通過z=μ+σϵz=\mu + \sigma \odot \epsilon計算編碼zz\odot表示element-wise乘法,ϵ\epsilon的每一維都服從標準高斯分佈),由此loss的梯度可以通過μ\muσ\sigma分支傳遞到encoder model處(ϵ\epsilon並不需要梯度信息來更新)。
最終的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/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章