模型学习 - VAE(变分自编码)专题

       理解出错之处望不吝指正。
       今天听师兄给我们讲了VAE,觉得颇有收获,分享一下,希望大家批评指正。

生成模型

       生成模型的目的是从一系列样本x={x1,x2,...,xm}x=\{x_1,x_2,...,x_m\}中学习xx的分布p(x)p(x),我们可以仿照EM算法,通过隐变量zz和生成函数g()g()来得到x^=g(z)\hat x=g(z),并尽可能的让x^\hat {x}接近xx
       上述方法有一个弊端,我们首先依据全概率公式将p(x)p(x)写成如下形式:
p(x)=p(xz)p(z)p(x)=\sum p(x|z)p(z)
       我们易获取到p(z)p(z),但是在zz确定的情况下,无法得知p(xz)p(x|z),这意味着我们无法将 “利用g()g()函数生成的x^i\hat x_i 与 “真实的xix_i 进行对应,如下图所示:
       模型学习 - VAE(变分自编码)专题
       那么怎么解决这个问题呢,接着往下看~

VAE模型

       在VAE模型中,我们解决了上述问题。我们可以从两个角度理解VAE模型,首先是角度1。

理解角度1

       为了解决上述问题,将学习p(x)p(x)改为学习p(zx)p(z|x)即可!
       我们令p(zx)N(μ,σ2)p(z|x)\sim N(\mu,\sigma^2)(ps:为什么这个先验分布是正态分布呢?因为若是其他分布,后面计算KL散度的时候会导致分母为0)。则VAE的编码解码过程如下图所示:
       模型学习 - VAE(变分自编码)专题
       更具体的,我们假设p(zx)N(0,1)p(z|x)\sim N(0,1),即:我们在编码过程中期望学到μi=0,σi=1\mu_i=0,\sigma_i=1,则VAE的训练过程中会产生以下两种情况(类似于对抗):
       1.若σi21\sigma_i^2\rightarrow1,此时加在xix_i上的噪声大,会导致已有的解码能力效果变差,通过反向传播会使得σi20\sigma_i^2\rightarrow0
       2.若σi20\sigma_i^2\rightarrow0,此时加在xix_i上的噪声小,会导致已有的解码能力效果变好,通过反向传播会使得σi21\sigma_i^2\rightarrow1
       
       VAE模型的损失函数如下:
Lvaep(zx)=loss(x,x^)+KL[N(μ,σ2)N(0,1)]L_{vae}^{p(z|x)}=loss(x,\hat x)+KL[N(\mu,\sigma^2)||N(0,1)]
       损失函数中第一部分loss(x,x^)loss(x,\hat x)代表真实数据xx与生成数据x^\hat x之间的误差,可以使用简单的logistics损失或者MSE损失。
       损失函数中第二部分是一个KL散度,用于衡量编码过程中得到的分布是否接近我们设置的先验分布N(0,1)N(0,1),下面对这部分进行详细的剖析。

               KL[N(μ,σ2)N(0,1)]KL[N(\mu,\sigma^2)||N(0,1)]

          =12πσexp{(xμ)22σ2}log12πσexp{(xμ)22σ2}12πexp{x22}dx=\int \frac{1}{\sqrt{2\pi}\sigma}exp\{\frac{-(x-\mu)^2}{2\sigma^2}\}\centerdot\log \frac{\frac{1}{\sqrt{2\pi}\sigma}exp\{\frac{-(x-\mu)^2}{2\sigma^2}\}}{\frac{1}{\sqrt{2\pi}}exp\{\frac{-x^2}{2}\}}dx

          =1212πσexp{(xμ)22σ2}[logσ2+x2(xμ)2σ2]dx=\frac{1}{2}\int \frac{1}{\sqrt{2\pi}\sigma}exp\{\frac{-(x-\mu)^2}{2\sigma^2}\}\centerdot[-\log \sigma^2+x^2-\frac{(x-\mu)^2}{\sigma^2}]dx

          =12(logσ2+μ2+σ21)=\frac{1}{2}(-\log \sigma^2+\mu^2+\sigma^2-1)

          =12μ2+12(σ2logσ21)=\frac{1}{2}\mu^2+\frac{1}{2}(\sigma^2-\log \sigma^2-1)

理解角度2

       在理解角度1中,我们由于不能计算p(xz)p(x|z),所以将学习p(x)p(x)改为了学习p(zx)p(z|x),但是我们忽略了p(x)p(x)不仅可以使用全概率公式分解为p(x)=p(xz)p(z)p(x)=\sum p(x|z)p(z),还可将p(x)p(x)写为p(x)=p(x,z)dzp(x)=\int p(x,z)dz,在这种情况下,我们假设先验分布为q(x,z)q(x,z),则我们的学习目标变为:令p(x,z)p(x,z)无限趋近q(x,z)q(x,z),如下所示:

               KL[p(x,z)q(x,z)]KL[p(x,z)||q(x,z)]

          =p(x,z)logp(x,z)q(x,z)dzdx=\int\int p(x,z)\log \frac{p(x,z)}{q(x,z)} dz dx

          将p(x,z)=p^(x)p(zx)p(x,z)=\hat p(x)p(z|x)带入上式,其中p^(x)\hat p(x)代表利用已有的xx值通过估计得到的分布,可得:

          =p^(x)[p(zx)logp^(x)p(zx)q(x,z)dz]dx=\int \hat p(x)[ \int p(z|x) \log \frac{\hat p(x)p(z|x)}{q(x,z)}dz] dx

          =Exp^(x)[p(zx)logp^(x)p(zx)q(x,z)dz]=E_{x\sim\hat p(x)}[\int p(z|x) \log \frac {\hat p(x)p(z|x)}{q(x,z)}dz]

          将q(x,z)=q(z)q(xz)q(x,z)=q(z)q(x|z)p(zx)logp(zx)q(z)=KL[p(zx)q(z)]p(z|x)\log \frac {p(z|x)}{q(z)}=KL[p(z|x)||q(z)]带入上式,可得:

          =Exp^(x){Ezp(zx)[logq(xz)]+KL[p(zx)q(z)]}=E_{x\sim\hat p(x)}\{E_{z\sim p(z|x)}[-\log q(x|z)] + KL[p(z|x)||q(z)]\}


       我们可以发现,这样计算得到的公式中每一项可以和Lvaep(zx)L_{vae}^{p(z|x)}中的每一项对应:

          logq(xz)loss(x,x^)-\log q(x|z)\longleftrightarrow loss(x,\hat x)

          KL[p(zx)q(z)]KL[N(μ,σ2)N(0,1)]KL[p(z|x)||q(z)]\longleftrightarrow KL[N(\mu,\sigma^2)||N(0,1)]