点击量:10544
这学期张连文教授教的CSIT6000G Machine Learning课上讲到了VAE和GAN,学完之后感觉两个概念被解释的很好,所以有必要记录一下。
VAE(Variational Autoencoder)中文译为变分自动编码器,它是一种深度生成模型(Deep Generative Model),是一种无监督学习算法。它的主要作用是能够学习一个函数(模型),使得输出数据的分布尽可能地逼近原始数据分布。
问题描述
假设我们有一堆无标签数据集 \(X = \{x^{(i)}\}_{i=1}^{N}\), 每一个数据\(x^{(i)}\)是一个表示图像的vector,而vector中的每一个元素则表示图像的像素;那么我们的任务就是:
希望从原始数据集\(X\)中学习一个分布\(p(x)\),使得它的分布和原始数据分布接近,也就是说我们可以生成和原始图像相似但不同的图片。
生成模型(Generative Model)
那么这个问题如何求解呢?
我们假设:
- 每一个图片都存在一个与之对应的标签向量\(z\);什么叫标签向量?简单点说可以用\(z\)来代表\(x\),但是\(z\)的维度会比\(x\)低很多,而且\(z\)是没有被观测到的,也就是说不知道\(z\)到底是什么样子的。
- 我们进一步假设图片是按照下面的方法生成的:
我们首先假设\(z\)服从高斯分布:
$$z \sim p(z) = N(0, I)$$
其中,\(I\)是一个单位矩阵(identity matrix).
其次,假设最终的\(x\)由\(z\)生成的:
$$ x \sim p_{\theta}(x|z) $$ 于是,于是我们有:
$$p_{\theta}(x) = \int p_{\theta}(x|z)p(z)dz $$
此外,我们进一步假设条件概率\(p_{\theta}(x|z)\)也是符合高斯分布的:
$$ p_{\theta}(x|z) = N(x|\mu_x(z,\theta), \sigma_{x}^2(z,\theta)I) $$
它的两个参数:mean vector \(\mu_x(z,\theta)\)和协方差矩阵\(\sigma_{x}^2(z,\theta)I\)是通过一个神经网络学习得到的。于是,这个生成模型的完整结构就是这样的:
那么这个问题如何求解(学习)呢?按照惯例,我们需要最大化它的对数似然函数(log likelihood function):
$$ \log p_{\theta}(x) = \sum_{i=1}^{N}\log p_{\theta}(x^{(i)}) $$
其中,
$$ \log p_{\theta}(x^{(i)}) = \log \int p_{\theta}(x|z)p(z)dz $$
然后我们用梯度上升的方法求得最优解,这里就需要计算梯度\(\triangledown_{\theta} \log p_{\theta}(x^{(i)}) \)。但是因为上面的公式包含了一个积分的形式,使得这个梯度并不好求解。那么怎么办呢?最直观的思路就是找到一个方法消除z的积分。回顾一下积分的定义,我们可以采样尽可能多的z,然后用采样得到的z去估计真实的z分布,这样我们就能去掉积分了。这种方式被称为:Naive Monte Carlo Gradient Estimator。具体地,我们从\(p(z)\)中采样出\(L\)个数据点\(z^{(1)},z^{(2)},…,z^{(L)}\),然后用下面的公式去估计\(p_{\theta}(x^{(i)})\):
$$p_{\theta}(x^{(i)}) \approx \frac{1}{L} \sum_{l=1}^{L} p_{\theta}(x^{(i)}|z^{l})$$
新得到的公式中已经没有\(z\)了,这样我们就能计算出它的梯度\(\triangledown_{\theta} \log p_{\theta}(x^{(i)}) \)了。这种方法看上去很完美,但是很遗憾,它并不work。主要原因是,\(x\)的维度非常高,而\(z\)的维度很低。所以,采样得到的\(p_{\theta}(x|z)\)很容易偏斜(highly skewed),很容易只能采样到一小部分区域。因此,要获取准确的结果,采样的数据点个数必须非常大(extremely large),而这很难做到。那怎么办呢?既然凭空采样\(z\)是困难的,那我们能不能利用原始数据\(X\)来缩小\(z\)的采样范围呢?如果可以的话,采样就会更容易、更准确了。于是,我们引入识别模型(Recognition Model)。
识别模型(Recognition Model)
识别模型\(q_{\phi} (z|x)\)的形式如下:
$$ q_{\phi}(z|x) = N(z|\mu_z(x,\phi), \sigma_{z}^2(x,\phi)I) $$
我们仍然假设它服从高斯分布,并且它的两个参数mean vector \(\mu_z(x,\phi)\)和协方差矩阵\(\sigma_{z}^2(x,\phi)I\)也是通过一个神经网络学习得到的。于是,这个生成模型的完整结构就是这样的:
引入识别模型之后,我们重新推导对数似然函数\(\log p_{\theta}(x^{(i)})\):
$$
\begin{align*}
\log p_{\theta}(x^{(i)}) & = E_{z \sim q_{\phi}(z|x^{(i)})} \left [ \log p_{\theta}(x^{(i)}) \right ] \tag{1} \\
& = E_{z \sim q_{\phi}} \left [ \log \frac{p_{\theta}(x^{(i)} |z) p_{\theta}(z)}{p_{\theta}(z | x^{(i)})} \right ] \tag{2} \\
& = E_{z \sim q_{\phi}} \left [ \log \frac{p_{\theta}(x^{(i)} |z) p_{\theta}(z)}{p_{\theta}(z | x^{(i)})} \frac{q_{\phi}(z|x^{(i)})}{q_{\phi}(z|x^{(i)})} \right ] \tag{3} \\
& = E_{z \sim q_{\phi}} \left [ \log p_{\theta}(x^{(i)} |z) \right ] – E_{z \sim q_{\phi}} \left [ \frac{q_{\phi}(z|x^{(i)})}{p_{\theta}(z)} \right ] + E_{z \sim q_{\phi}} \left [ \frac{q_{\phi}(z|x^{(i)})}{p_{\theta}(z|x^{(i)})} \right ] \tag{4} \\
& = E_{z \sim q_{\phi}} \left [ \log p_{\theta}(x^{(i)} |z) \right ] – D_{KL} \left [ q_{\phi}(z|x^{(i)}) || p_{\theta}(z) \right ] + E_{z \sim q_{\phi}} \left [ \frac{q_{\phi}(z|x^{(i)})}{p_{\theta}(z|x^{(i)})} \right ] \tag{5} \\
& = L(x^{(i)},\theta, \phi) + D_{KL} \left [ q_{\phi}(z|x^{(i)}) || p_{\theta}(z|x^{(i)}) \right ] \tag{6}
\end{align*}
$$
其中,
- \(D_{KL}\)表示的是KL散度(KL Divergence),它的定义如下:
$$D_{KL} \left [ p||q \right ] = E \left [ \frac{p}{q} \right ] \tag{7} $$ - 我们定义:
$$L(x^{(i)},\theta, \phi) = E_{z \sim q_{\phi}} \left [ \log p_{\theta}(x^{(i)} |z) \right ] – D_{KL} \left [ q_{\phi}(z|x^{(i)}) || p_{\theta}(z) \right ] \tag{8}$$
下面说下这个公式的推导,不想看可以跳过。这个推导看似很复杂,其实并没有那么复杂,主要有两点:
- 公式1是如何得到公式2的?
贝叶斯定理- 公式5到公式6到底发生了什么?
我们可以根据公式7和公式8推导得出。
目标函数
因为\(D_{KL} \geq 0\),所以根据公式6我们可以得到对数似然函数一个变分下界(variational lower bound on loglikelihood):
$$\log p_{\theta} (x^{(i)}) \geq L(x^{(i)},\theta, \phi) \tag{9}$$于是要最大化\(\log p_{\theta} (x^{(i)})\),只要最大化它的下界即可,于是我们得到VAE的目标函数:
$$
L(x^{(i)},\theta, \phi) = E_{z \sim q_{\phi}(z|x^{(i)})} \left [ \log p_{\theta}(x^{(i)} |z) \right ] – D_{KL} \left [ q_{\phi}(z|x^{(i)}) || p_{\theta}(z) \right ] \tag{10}
$$完整的结构如下:
下面我们对这个目标函数进行做几点解释:
- \(q_{\phi}(z|x^{(i)})\)可以被解释成一个编码器(encoder);\(p_{\theta}(x|z)\)可以被解释成一个解码器(decoder)
- 公式10中的前半部分表示的是construction error,它表示的是输出数据分布和原始数据的逼近程度;
- 后半部分是个正则项,它表示的是后验概率\(q_{\phi}(z|x^{(i)})\)和先验概率\(p_{\theta}(z)\)的接近程度
与Autoencoders的区别
VAE和标准的自动编码器还是有区别的,Autoencoders是一个确定性模型(deterministic model),主要的作用的学习一个数据的隐性表达(learn a latent representation of data),因此可以用来压缩数据。
它的目标函数是:
$$ L(x, x’) = ||x-x’||^2 $$
相比之下,VAE是一个概率模型(probabilistic model),它把深度模型和概率方法结合了起来,也因此取名Variational Autoencoder。它的主要作用是生成新的相似的数据而非学习一个低维的隐性表达。
与GAN的区别
本来想再写一篇关于GAN的文章的,但是网上关于GAN的文章实在太多了,没有写的必要。于是乎,就这里稍微提及下VAE和GAN的区别吧。我们先来回顾一下GAN的模型:
- 判别器(Discriminator)
判别器实际上是一个分类器,用于判定生成器生成的图片和真实图片的接近程度,所以它的cost function是一个cross entropy:
$$J(\theta_g, \theta_d) = -\frac{1}{2} \sum_{i=1}^{m}\log D(X^{(i)}) – \frac{1}{2}\sum_{i=1}^{m} \log(1-D(g(z^{(i)})))$$ - 生成器(Generator)
生成器的cost function是:
$$\sum_{i=1}^{m}\log (1 – D(g(z^{(i)})))$$
GAN和VAE主要有以下不同:
- GAN能从随机噪声开始生成出高质量的图片,也就是说\(z\)是随机初始化的;而VAE则是一个概率模型,中间向量\(z\)是在原始数据\(X\)的基础上引入概率模型后生成的,并不是随机产生的。
- VAE可以学到原始数据一个隐形的表达(a latent representation of data),也就是向量\(z\),而GAN不能
- VAE的目的是最小化真实数据\(p_r\)和生成数据\(p_g\)的KL散度(KL Divergence)\(KL(p_r ||p_g )\),并且使用encoder\(q(z|x)\)去近似(approximate)这个KL散度;而GAN的目的则是最小化真实数据\(p_r\)和生成数据\(p_g\)的Jensen-Shannon divergence\(JS(p_r||p_g)\),并且使用Discriminator去近似(approximate)JS divergence。
- 相比于VAE,GAN能够生成更清晰的图片
reference:以上内容参考自张连文老师的课件,有兴趣的童鞋可以自行前往围观
(4)的公式好像写错了,后两项没加Log, (7)kl散度的公式也错了。
你网站的这个数学公式编辑是如何实现的?方便回复一下吗
可以参考这篇:http://www.fanyeong.com/2017/07/21/wordpress-how-to-display-equation/
真的写得很清晰,开头发现居然是师兄hhh。虽然 Nevin 的课真是yyds,但课件毕业后就翻不动了-.-
公式3是怎么到4的呀