skip to content
s7ev3n'space

Variational Autoencoder

/ 14 min read

Background

Notation

  • 大写字母XX表示随机变量
  • 大写P(X)P(X)表示随机变量的概率分布
  • xP(X)x\sim P(X)表示从概率分布中采样出某个值xx
  • 小写p(X)p(X)表示随机变量XX的概率密度函数
  • p(X=x)p(X=x)表示某一点xx处的概率值

Bayesian

贝叶斯公式:

p(ZX)=p(XZ)p(Z)p(X)p(Z|X)=\frac{p(X|Z)p(Z)}{p(X)}

其中,p(ZX)p(Z|X)被称为后验概率(posterior probability),p(XZ)p(X|Z)被称为似然函数(likelihood),p(Z)p(Z)被称为先验概率(prior probability),p(X)p(X)是边缘似然概率。

Likelihood

定义:The likelihood function (often simply called the likelihood) describes the joint probability of the observed data as a function of the parameters of the chosen statistical model. For each specific parameter value θ\theta in the parameter space, the likelihood function p(Xθ)p(X | \theta) therefore assigns a probabilistic prediction to the observed data XX.

总结一下上面定义的关键点:

  • 似然不是概率,尽管它看起来像个概率分布,它的加和不是11,似然p(XZ)p(X|Z)是关于ZZ的函数,是给定XX变化ZZ的概率
  • 一般情况,我们选定似然函数的形式,比如假设ZZ就是高斯分布的μ,σ\mu,\sigma,我们来变换不同的μ,σ\mu, \sigma,得到不同参数分布下得到XX的概率,换句话说,一般似然函数是可计算的
  • 和条件概率的区别:哪个变量是固定哪个变量是变化的:条件概率p(XZ)p(X|Z)ZZ是固定的,XX是变化的;似然函数p(XZ)p(X|Z),正相反,XX是固定的,ZZ是变化的。

Expecation

离散的随机变量zz,服从分布zQϕ(ZX)z \sim Q_{\phi}(Z|X)(注意这个概率分布假定XX是给定的,ZZ是变化的)。关于随机变量xx的函数f(z)f(z)的期望定义:

EzQϕ(ZX)[f(z)]=zqϕ(zx)f(z)\mathbb{E}_{z \sim Q_{\phi}(Z|X)}[f(z)]=\sum_{z} q_{\phi}(z|x)\cdot f(z)

其中,qϕ(zx)q_{\phi}(z|x)是取到某个zz的概率值。另外,zqϕ(zx)=1\sum_{z} q_{\phi}(z|x)=1

Variational Inference

变分推断(Variational Inference)是指通过优化方法“近似”后验分布的过程

我们都有后验概率的解析式p(zx)=p(xz)p(z)p(x)p(z|x)=\frac{p(x|z)p(z)}{p(x)},为什么不能直接计算后验概率而要近似呢?

依次来看似然p(xz)p(x|z),先验p(z)p(z)和边缘似然p(x)p(x)

  • 似然p(xz)p(x|z): 一般是假设已知似然函数的形式,例如高斯分布
  • 先验p(z)p(z): 一般也可以估计,例如统计大量数据中猫的图片的数量占比,即为先验
  • 边缘似然p(x)p(x): 在高维的情况下,计算边缘似然p(x)p(x)是非常困难的

边缘似然p(x)p(x)的定义是p(x)=zp(xz)p(z)p(x)=\sum_{z}p(x|z)p(z),如果zz是高维度向量z=(z1,z2,...,zn)z=(z_1,z_2,...,z_n),每个维度ziz_i有非常多可能的取值,要遍历所有的zz,计算p(x)p(x)是非指数级时间复杂度。

因此,变分推断通过引入一个参数化的近似分布qϕ(z)q_{\phi}(z),通过优化方法是其逼近真实的后验分布p(zx)p(z|x)

Evidence Lower Bound (ELBO)

以下的推导来自这篇博客1。我们定义一个参数化的分布Qϕ(ZX)Q_{\phi}(Z|X)(假设是高斯分布),通过调整参数ϕ\phi来近似P(ZX)P(Z|X),例如下图: q_p

如何“近似”呢?当然是分布间的距离,这里采用了Reverse KL,对离散的zzP(ZX)P(Z|X)XX是观测量固定值,ZZ是随机变量)进行求和:

KL(Qϕ(ZX)P(ZX))=zZqϕ(zx)logqϕ(zx)p(zx)\begin{align} KL(Q_\phi(Z|X)||P(Z|X)) = \sum_{z \in Z}{q_\phi(z|x)\log\frac{q_\phi(z|x)}{p(z|x)}} \end{align}

为什么说是反向Reverse呢?因为我们的目标是P(ZX)P(Z|X),“正向”应该是从P(ZX)P(Z|X)看与Qϕ(ZX)Q_\phi(Z|X)的距离,即KL(P(ZX)Qϕ(ZX))KL(P(Z|X)||Q_\phi(Z|X))。使用Reverse KL的原因在下节。

KLKL各种展开推导:

KL(QP)=zZqϕ(zx)logqϕ(zx)p(x)p(z,x)via p(x,z)=p(zx)p(x)=zZqϕ(zx)(logqϕ(zx)p(z,x)+logp(x))=(zqϕ(zx)logqϕ(zx)p(z,x))+(zlogp(x)qϕ(zx))=(zqϕ(zx)logqϕ(zx)p(z,x))+(logp(x)zqϕ(zx))via zq(z)=1=logp(x)+(zqϕ(zx)logqϕ(zx)p(z,x))\begin{align} KL(Q||P) & = \sum_{z \in Z}{q_\phi(z|x)\log\frac{q_\phi(z|x)p(x)}{p(z,x)}} && \text{via $p(x,z)=p(z|x)p(x)$} \\ & = \sum_{z \in Z}{q_\phi(z|x)\big(\log{\frac{q_\phi(z|x)}{p(z,x)}} + \log{p(x)}\big)} \\ & = \Big(\sum_{z}{q_\phi(z|x)\log{\frac{q_\phi(z|x)}{p(z,x)}}}\Big) + \Big(\sum_{z}{\log{p(x)}q_\phi(z|x)}\Big) \\ & = \Big(\sum_{z}{q_\phi(z|x)\log{\frac{q_\phi(z|x)}{p(z,x)}}}\Big) + \Big(\log{p(x)}\sum_{z}{q_\phi(z|x)}\Big) && \text{via $\sum_{z}{q(z)} = 1 $} \\ & = \log{p(x)} + \Big(\sum_{z}{q_\phi(z|x)\log{\frac{q_\phi(z|x)}{p(z,x)}}}\Big) \\ \end{align}

最小化KL(QP)KL(Q||P)就是最小化上面公式中的第二项,因为logp(x)\log{p(x)}是固定的。然后我们把第二项展开(引入了期望的定义):

zqϕ(zx)logqϕ(zx)p(z,x)=EzQϕ(ZX)[logqϕ(zx)p(z,x)]=EQ[logqϕ(zx)logp(x,z)]=EQ[logqϕ(zx)(logp(xz)+log(p(z)))](via logp(x,z)=p(xz)p(z)=EQ[logqϕ(zx)logp(xz)log(p(z)))]\begin{align} \sum_{z}{q_\phi(z|x)\log{\frac{q_\phi(z|x)}{p(z,x)}}} & = \mathbb{E}_{z \sim Q_\phi(Z|X)}\big[\log{\frac{q_\phi(z|x)}{p(z,x)}}\big]\\ & = \mathbb{E}_Q\big[ \log{q_\phi(z|x)} - \log{p(x,z)} \big] \\ & = \mathbb{E}_Q\big[ \log{q_\phi(z|x)} - (\log{p(x|z)} + \log(p(z))) \big] && \text{(via $\log{p(x,z)=p(x|z)p(z)}$) }\\ & = \mathbb{E}_Q\big[ \log{q_\phi(z|x)} - \log{p(x|z)} - \log(p(z))) \big] \\ \end{align} \\

最小化上面,就是最大化它的负数:

maximize L=zqϕ(zx)logqϕ(zx)p(z,x)=EQ[logqϕ(zx)+logp(xz)+log(p(z)))]=EQ[logp(xz)+logp(z)qϕ(zx)]\begin{align} \text{maximize } \mathcal{L} & = -\sum_{z}{q_\phi(z|x)\log{\frac{q_\phi(z|x)}{p(z,x)}}} \\ & = \mathbb{E}_Q\big[ -\log{q_\phi(z|x)} + \log{p(x|z)} + \log(p(z))) \big] \\ & = \mathbb{E}_Q\big[ \log{p(x|z)} + \log{\frac{p(z)}{ q_\phi(z|x)}} \big] && \\ \end{align}

上面公式还可以进一步推导变得更直观:

L=EQ[logp(xz)+logp(z)qϕ(zx)]=EQ[logp(xz)]+Qq(zx)logp(z)qϕ(zx)Definition of expectation=EQ[logp(xz)]KL(Q(ZX)P(Z))Definition of KL divergence\begin{align*} \mathcal{L} & = \mathbb{E}_Q\big[ \log{p(x|z)} + \log{\frac{p(z)}{ q_\phi(z|x)}} \big] \\ & = \mathbb{E}_Q\big[ \log{p(x|z)} \big] + \sum_{Q}{q(z|x)\log{\frac{p(z)}{ q_\phi(z|x)}}} && \text{Definition of expectation} \\ & = \mathbb{E}_Q\big[ \log{p(x|z)} \big] - KL(Q(Z|X)||P(Z)) && \text{Definition of KL divergence} && \end{align*}

在VAE中,从zQ(ZX)z \sim Q(Z|X)采样是所谓的Encoding过程,即将样本XX压缩到隐变量zz,从xQ(XZ)x \sim Q(X|Z)中采样是Decoding过程,即生成或恢复样本xx

从上面公式可知,L\mathcal{L}是两部分的加和,第一部份是decoding的似然函数的期望,即衡量变分分布可以从隐变量ZZ从解码回到XX的好坏,第二部分是我们用于逼近真实分布的变分分布Q(ZX)Q(Z|X)于隐变量的先验P(Z)P(Z)的KL散度。如果我们假定Q(ZX)Q(Z|X)的形式是条件概率高斯分布,那么先验P(Z)P(Z)经常选取的是标准高斯分布,即均值为0\mathbb{0}和方差是1\mathbb{1}

带入初始的公式(1)(1),会得到:

KL(QP)=logp(x)LKL(Q||P)=\log{p(x)}-\mathcal{L}

由于KL(QP)0KL(Q||P) \geq 0,所以必然有logp(x)L\log{p(x)} \geq \mathcal{L}L\mathcal{L}就被称为变分下界(variational lower bound),或Evidence Lower Bound (ELBO),我们需要知道到底是针对什么的下界,它是logp(x)=logzp(xz)p(z)\log p(x)=\log \sum_{z}p(x|z)p(z),即模型生成观测xx的能力。

回到变分推断的优化目标,如果要最小化KL(QP)KL(Q||P),即要最小化L-\mathcal{L},因此损失函数是:

Loss=L=EQ[logp(xz)]+KL(Q(ZX)P(Z))Loss=-\mathcal{L}= -\mathbb{E}_Q\big[ \log{p(x|z)} \big] + KL(Q(Z|X)||P(Z))

Forward KL vs. Reverse KL

前面说过,在使用变分分布Q(ZX)Q(Z|X)来逼近真实后验分布P(ZX)P(Z|X)时,我们使用的是Reverse KL,即KL(QP)KL(Q||P)。原因是什么呢?

如果选择Forward KL:

KLfwd(PQ)=EzP[logp(z)q(z)]KL_{fwd}(P||Q)=\mathbb{E}_{z \sim P}[\log{\frac{p(z)}{q(z)}}]

我们不必展开过多,上面公式中已经有困难存在:zz需要从真实后验P(ZX)P(Z|X)中采样,这是不可能的,因为真实后验我们不知道。 除了上面的困难,还有优化不稳定的问题

上面公式中p(z)q(z)\frac{p(z)}{q(z)},如果真实后验p(z)>0p(z)>0,但是变分分布q(z)q(z)比如说接近00,会导致p(z)q(z)\frac{p(z)}{q(z)}的值变得无穷大,即q(z)q(z)需要支撑(support)p(z)p(z)区域,否则优化就爆炸了,这会导致变分分布q(z)q(z)在优化过程中避免00出现(zero-avoiding),见下图: forwad-KL

那Reverse KL是什么情况呢?

KLrev(QP)=EzQ[logq(z)p(z)]KL_{rev}(Q||P)=\mathbb{E}_{z \sim Q}[\log{\frac{q(z)}{p(z)}}]

当真实后验p(z)p(z)趋近于00,变分分布q(z)q(z)也会趋近于00,见下图: reverse-KL

总结起来,最小化forward-KL会拉伸变分分布p(z)p(z)来覆盖掉整个真实后验p(z)p(z),而最小化Reverse KL会使得变分分布p(z)p(z)更挤进真实后验p(z)p(z)

Variational Autoencoder

铺垫了很多终于要来到变分自编码器VAE了。Lil’Log的文章2比较了多种Autoencoder,同时也包含VAE,建议去认真阅读。

自编码器一般由两部分构成:编码器和解码器。解码器负责将高维数据压缩到一个隐变量(latent code),相当于对高维数据的降维;解码器负责从隐变量恢复出输入的高维数据数据,注意是恢复,而不是生成。但是,VAE和AE相比非常不一样,VAE是一个“生成式”模型。VAE的编码器将高维数据压缩到一个隐空间的分布中,从分布中采样,解码器负责从新的采样中恢复(生成)和输入数据不同的数据! 我们设输入数据为XX,隐变量为ZZ,隐变量ZZ所在的分布使用P(Z)P(Z)来表示,生成模型的核心任务是学习数据的分布P(X)P(X),从而能够生成与真实数据分布一致的新样本XnewX_{new},但是直接建模高维数据XX的分布十分困难,原因在于高维数据计算复杂,以及数据XX中隐含的潜在变量(如物体的形状、光照条件)未被显式建模。解决方案是引入隐变量ZZ,通过隐变量控制生成:P(XZ)P(Z)P(X|Z)P(Z),具体来说:

  • 概率编码器P(ZX)P(Z|X)把输入X=xX=x压缩到隐空间的分布P(Z)P(Z)
  • 从隐空间Pθ(Z)P_{\theta}(Z)中采样新隐变量znewz_{new}
  • 概率解码器P(XZ)P(X|Z)基于隐变量znewz_{new}生成xnewx_{new}

即:

xnewP(X)=p(xz)p(z)dzx_{new} \sim P(X) = \sum p(x|z)p(z)dz

为什么是对zz的求和(积分)?通过对ZZ求和(积分),模型生成的XX不再依赖于某个特定的ZZ,而是覆盖所有可能的ZZ值,从而匹配真实数据分布P(X)P(X)

上面公式,和前面的边缘似然的定义是一致的,并且在变分方法的推导中,我们知道logp(X)ELBO\log{p(X)}\geq ELBO,即我们需要最小化ELBO-ELBO:

LVAE=Ezqϕ(zx)logpθ(xz)+DKL(qϕ(zx)pθ(z))\mathcal{L}_{VAE}= - \mathbb{E}_{\mathbf{z} \sim q_\phi(\mathbf{z}\vert\mathbf{x})} \log p_\theta(\mathbf{x}\vert\mathbf{z}) + D_\text{KL}( q_\phi(\mathbf{z}\vert\mathbf{x}) \| p_\theta(\mathbf{z}) )

Reparameterization Trick

上面的损失函数放到深度学习的语境下存在一个问题,采样过程zqϕ(zx)\mathbf{z} \sim q_\phi(\mathbf{z}\vert\mathbf{x})是一个随机过程,不可微,没有办法使用反向传播来更新梯度。于是,引入一个技巧,称为重参数化技巧。

VAE中假设qϕ(zx)q_\phi(\mathbf{z}\vert\mathbf{x})的形式是多元高斯分布

zqϕ(zx)=N(μ,σI)\mathbf{z} \sim q_\phi(\mathbf{z}\vert\mathbf{x}) = \mathcal{N}(\boldsymbol{\mu}, \boldsymbol{\sigma}\boldsymbol{I})

经过gθ(ϵ)g_{\theta}(\epsilon)重参数化之后:

z=μ+σϵ, where ϵN(0,I); Reparameterization trick.\mathbf{z} = \boldsymbol{\mu} + \boldsymbol{\sigma} \odot \boldsymbol{\epsilon} \text{, where } \boldsymbol{\epsilon} \sim \mathcal{N}(0, \boldsymbol{I}) \scriptstyle{\text{; Reparameterization trick.}}

其中\odot意味着元素相乘。

如此,梯度变得可计算:

Lμ=EϵN(0,1)[Lzzμ]=Eϵ[Lz1]Lσ=EϵN(0,1)[Lzzσ]=Eϵ[Lzϵ]\begin{align*} \frac{\partial \mathcal{L}}{\partial \mu} &= \mathbb{E}_{\epsilon \sim \mathcal{N}(0,1)} \left[ \frac{\partial \mathcal{L}}{\partial z} \cdot \frac{\partial z}{\partial \mu} \right] = \mathbb{E}_{\epsilon} \left[ \frac{\partial \mathcal{L}}{\partial z} \cdot 1 \right] \\ \frac{\partial \mathcal{L}}{\partial \sigma} &= \mathbb{E}_{\epsilon \sim \mathcal{N}(0,1)} \left[ \frac{\partial \mathcal{L}}{\partial z} \cdot \frac{\partial z}{\partial \sigma} \right] = \mathbb{E}_{\epsilon} \left[ \frac{\partial \mathcal{L}}{\partial z} \cdot \epsilon \right] \end{align*}

最后,使用博客2中的图更直观的表示VAE: vae

Footnotes

  1. A Beginner’s Guide to Variational Methods: Mean-Field Approximation

  2. From Autoencoder to Beta-VAE 2