Variational Autoencoders (第一篇post)

VAE是Max Welling 和他的学生D. Kingma 提出的一种Generative Model. Max Welling现在回荷兰阿姆斯特丹做教授了。挺和蔼的一个教授,在MCMC方面是一流的专家。

VAE本质上不是一个deep generative model. 因为它实质上只是学习一个两层的graphical model. h 是一组 latent variables, 我们有一个概率模型p_\theta (h)p_\theta(x|h), 我们希望能够从一组unlabelled data \{x_i\}_{i=1}^n里面学习出\theta.

这个问题看起来很简单,其实是graphical model特别是latent variable model里面的一个老大难问题,也非常基本。第一次接触这类问题的话,可能会惊讶于machine learning学界连这么简单的一个二层的latent variable model都训练不出来,也反映出概率计算到底是多么地困难。

如果受过一些训练,就会想到EM算法, 不断地做两件事:

(1). 计算l(\theta)=\sum_{k=1}^n\mathbb{E}_{p_{\theta_i}(h|x_k)}[\log p_\theta(x_k,h)]

(2) \theta_{i+1}=\arg \max l(\theta_i)

但这个算法当然要求很高,必须l 是可计算的,换句话说 p(h|x) 形式必须简单。一般来说h只取有限个离散值才可以这么干(clustering)。过去20年unsupervised learning的主要发展就是clustering,但clustering是不足以解决AI问题的。

当然也可以做Monte Carlo EM, 也就是用MCMC sampling去逼近l(\theta). 效果据说很差,因为每个data point 在每个update上都得sample一次。但现在计算资源如此丰富,以后也许不是问题,不知道工业界做MCMC的同僚怎么看。

现在我们假设h 是连续随机变量(这是vae的核心假设)。目标是maximize log-likelihood. 一个很自然的想法来自 Variational inference. 首先我们有variational bound:\log p(x)=\log \int p(h,x)dh=\log \int q(h|x)\frac{p(h,x)}{q(h|x)}dh \geq \int q(h|x)[\log p(h,x)-\log q(h|x)]dh=B(q,x)

Variational Inference 的想法是, 对于q(h|x),我们可以取一些简单的distribution family \{q_\phi(h|x)\} 进行逼近,进而最大化B(q_\phi,x), 对于每一个数据点x. 比如最常见的mean field VI,就假设q 是factorized 的分布。如果p 再比较简单,就可以解析地解出B,然后做最优化.但有时候p复杂,积分还是求不出来,那就只有再靠sampling了。

\nabla_\phi B(q_\phi,x)=\int [\log p_\theta(h,x)-\log q_\phi(h|x)] \nabla_\phi \log q_\phi(h|x) q_\phi(h|x)dh

上面这个gradient就可以用sampling 逼近了。 这个trick基本上起源于REINFORCE algorithm.但悲剧的是,这个estimator的variance相当大。所以并不实用。2012年Jordan的学生在这个式子的基础上加了一点variance reduction,然后就发了一篇ICML。

这里为啥不用variational inference呢?因为VI的distribution太局限了。一般都是mean field的,这样误差一般都会很大。假如h有很复杂的结构,给定x, 我们希望我们的逼近能capture h之间复杂的correlation,不希望简简单单假设他们是独立的。

Variational bound也可以写成

B(q,x)=\int q(h|x)\log p(x|h)dh-D(q(h|x)||p(h)). D 是KL divergence.

第一项是可以看做是reconstruction error. 这就是为啥被称为VAE.

先验概率p(h)往往非常简单,简单到第二项有时候可以算出来。 如果可以算出来,它的gradient estimator的variance就会进一步减小。

VAE做的事情是不对q
做非常简单的假设。这样我们能够capture的distribution就复杂得多。

而假设我们有随机变量满足分布f_\phi(x,\epsilon)\sim q_\phi(h|x), \epsilon是一个random seed,f_\phi是一个被参数化的光滑函数族,比如一个DNN. 为什么做这个变量代换呢?是因为上面的那个estimator的variance大的原因,是因为它需要sample from q,然后利用q的sample处的gradient修正q,这样两次产生的误差会叠加。但做了这个reparametrization,我们只需要sample一个分布非常稳定的random seed的distribution,比如N(0,1)所以noise小得多。

应用这个的trick,我们有对于任意的函数g, \int g(h) q_\phi(h,x) dh=\mathbb{E}_\epsilon[g(f_\phi(x,\epsilon))]. 所以我们求这个东西的gradient,就有 \nabla_\phi\int g(h) q_\phi(h|x) dh=\mathbb{E}_\epsilon[\nabla g(f_\phi(x,\epsilon))]=\mathbb{E}_\epsilon[g'(f(x,\epsilon))\cdot\nabla_\phi f(x,\epsilon)]. 如果它是DNN决定的, 就可以backpropagation. 对\epsilon 做sample, 这个estimator的variance就小了很多。

比如我们假设f(x,\epsilon)满足的分布是一个正态分布,它的mean 和variance由被\phi决定的两个DNN 算出来f(x,\epsilon)=m_\phi(x)+\epsilon\cdot V_\phi(x), \epsilon\sim N(0,1),那么我们就可以很简单地计算\nabla_\phi f(x,\epsilon). 然后交替地优化\theta\phi就可以得到结果。

VAE几乎是现存的最优秀的generative model之一,另外一个是GAN。

它的问题也非常明显。Real data, 比如natural images,它是非常高维的数据,但他一般处在一个low dimensional manifold上面。VAE使用Gaussian approximation去做inference,通常也假设p是gaussian的,这样缺点就是没办法capture这个low dimensional structure。因为gaussian不可能做到100%低维。

下期,我们会讨论VAE在vision和NLP上的应用。

编辑于 2016-07-27