变分自动编码器(VAE)

点击量: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\)是通过一个神经网络学习得到的。于是,这个生成模型的完整结构就是这样的:
    Imgur

那么这个问题如何求解(学习)呢?按照惯例,我们需要最大化它的对数似然函数(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\)也是通过一个神经网络学习得到的。于是,这个生成模型的完整结构就是这样的:
Imgur
引入识别模型之后,我们重新推导对数似然函数\(\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}
$$完整的结构如下:
Imgur
下面我们对这个目标函数进行做几点解释:

  • \(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),因此可以用来压缩数据。
Imgur
它的目标函数是:
$$ L(x, x’) = ||x-x’||^2 $$
相比之下,VAE是一个概率模型(probabilistic model),它把深度模型和概率方法结合了起来,也因此取名Variational Autoencoder。它的主要作用是生成新的相似的数据而非学习一个低维的隐性表达。

与GAN的区别

本来想再写一篇关于GAN的文章的,但是网上关于GAN的文章实在太多了,没有写的必要。于是乎,就这里稍微提及下VAE和GAN的区别吧。我们先来回顾一下GAN的模型:
Imgur

  • 判别器(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:以上内容参考自张连文老师的课件,有兴趣的童鞋可以自行前往围观

     

原创不易,如果您觉得本文对您有帮助,可以打赏博主一杯咖啡,鼓励博主持续创作!


  • Ethereum/Polygon/Bsc/Arbitrum: 0xa8c00949fd7dD23b5Ec36A9181966c8C8436A015
  • Bitcoin: bc1qdvf0j0rntarvdal62n35etwmjzwk307w4jtyjz
  •    
  • 支付宝:

  • 变分自动编码器(VAE)》上有5条评论

    1. Vonderland

      真的写得很清晰,开头发现居然是师兄hhh。虽然 Nevin 的课真是yyds,但课件毕业后就翻不动了-.-

      回复

    发表评论

    邮箱地址不会被公开。 必填项已用*标注