变分自编码器

机器学习中，变分自编码器（Variational Autoencoder，缩写：VAE）是由杜克·金玛和马克斯·威灵提出的一种人工神经网络结构，属于概率图模式和变分贝叶斯方法。

VAE与自编码器模型有关，因为两者在结构上有一定亲和力，但在目标和数学表述上有很大区别。VAE属于概率生成模型（Probabilistic Generative Model），神经网络仅是其中的一个组件，依照功能的不同又可分为编码器和解码器。编码器可将输入变量映射到与变分分布的参数相对应的潜空间（Latent Space），这样便可以产生多个遵循同一分布的不同样本。解码器的功能基本相反，是从潜空间映射回输入空间，以生成数据点。虽然噪声模型的方差可以单独学习而来，但它们通常都是用重参数化技巧（Reparameterization Trick）来训练的。

此类模型最初是为无监督学习设计的，但在半监督学习和监督学习中也表现出众。

## 结构与操作概述

VAE是一个分别具有先验和噪声分布的生成模型，一般用最大期望算法（Expectation-Maximization meta-algorithm）来训练。这样可以优化数据似然的下限，用其它方法很难实现这点，且需要q分布或变分后验。这些q分布通常在一个单独的优化过程中为每个单独数据点设定参数；而VAE则用神经网络作为一种摊销手段来联合优化各个数据点，将数据点本身作为输入，输出变分分布的参数。从一个已知的输入空间映射到低维潜空间，这是一种编码过程，因此这张神经网络也叫“编码器”。

解码器则从潜空间映射回输入空间，如作为噪声分布的平均值。也可以用另一个映射到方差的神经网络，为简单起见一般都省略掉了。这时，方差可以用梯度下降法进行优化。

优化模型常用的两个术语是“重构误差（reconstruction error）”和“KL散度”。它们都来自概率模型的自由能表达式（Free Energy Expression），因而根据噪声分布和数据的假定先验而有所不同。例如，像IMAGENET这样的标准VAE任务一般都假设具有高斯分布噪声，但二值化的MNIST这样的任务则需要伯努利噪声。自由能表达式中的KL散度使得与p分布重叠的q分布的概率质量最大化，但这样可能导致出现搜寻模态（Mode-Seeking Behaviour）。自由能表达式的剩余部分是“重构”项，需要用采样逼近来计算其期望。

## 系统阐述

<image>

从建立概率模型的角度来看，人们希望用他们选择的参数化概率分布$p_{\theta}(x) = p(x|\theta)$使数据$x$的概率最大化。这一分布常是高斯分布$N(x|\mu,\sigma)$，分别参数化为$\mu$和$\sigma$，作为指数族的一员很容易作为噪声分布来处理。简单的分布很容易最大化，但如果假设了潜质（latent）$z$的先验分布，可能会产生难以解决的积分。让我们通过对$z$的边缘化找到$p_\theta(x)$。

$$p_\theta(x) = \int_{z}p_\theta({x,z}) \, dz,$$

其中，$p_\theta({x,z})$表示可观测数据$x$于$p_\theta$下的联合分布，和在潜空间中的形式（也就是编码后的$z$）。根据连锁法则，方程可以改写为

$$p_\theta(x) = \int_{z}p_\theta({x| z})p_\theta(z) \, dz$$

在原始的VAE中，通常认为$z$是实数的有限维向量，$p_\theta({x|z})$则是高斯分布。那么$p_\theta(x)$便是高斯分布的混合物。

现在，可将输入数据和其在潜空间中的表示的映射定义为

- 先验$p_\theta(z)$
- 似然值$p_\theta(x|z)$
- 后验$p_\theta(z|x)$

不幸的是，对$p_\theta(x)$的计算十分困难。为了加快计算速度，有必要再引入一个函数，将后验分布近似为

$$q_\phi({z| x}) \approx p_\theta({z| x})$$

其中$\phi$是参数化的$q$的实值集合。这有时也被称为“摊销推理”（amortized inference），因为可以通过“投资”找到好的$q_\phi$，之后不用积分便可以从$x$快速推断出$z$。

这样，问题就变成了找到一个好的概率自编码器，其中条件似然分布$p_\theta(x|z)$由概率解码器（probabilistic decoder）计算得到，后验分布近似$q_\phi(z|x)$由概率编码器（probabilistic encoder）计算得到。

下面将编码器参数化为$E_\phi$，将解码器参数化为$D_\theta$。

## 证据下界（Evidence lower bound，ELBO）

如同每个深度学习问题，为了通过反向传播算法更新神经网络的权重，需要定义一个可微损失函数。

对于VAE，这一思想可以实现为联合优化生成模型参数$\theta$和$\phi$，以减少输入输出间的重构误差，并使$q_\phi({z| x})$尽可能接近$p_\theta(z|x)$。重构损失常用均方误差和交叉熵。

作为两个分布之间的距离损失，反向KL散度$D_{KL}(q_\phi({z| x})\parallel p_\theta({z| x}))$可以很有效地将$q_\phi({z| x})$挤压到$p_\theta(z|x)$之下。

刚刚定义的距离损失可扩展为

$$\begin{align} D_{KL}(q_\phi({z| x})\parallel p_\theta({z| x})) &= \mathbb E_{z \sim q_\phi(\cdot | x)} \left[\ln \frac{q_\phi(z|x)}{p_\theta(z|x)}\right]\\ &= \mathbb E_{z \sim q_\phi(\cdot | x)} \left[\ln \frac{q_\phi({z| x})p_\theta(x)}{p_\theta(x, z)}\right]\\ &=\ln p_\theta(x) + \mathbb E_{z \sim q_\phi(\cdot | x)} \left[\ln \frac{q_\phi({z| x})}{p_\theta(x, z)}\right] \end{align}$$

现在定义证据下界（Evidence lower bound，ELBO）：$$L_{\theta,\phi}(x) := \mathbb E_{z \sim q_\phi(\cdot | x)} \left[\ln \frac{p_\theta(x, z)}{q_\phi({z| x})}\right] = \ln p_\theta(x) - D_{KL}(q_\phi({\cdot| x})\parallel p_\theta({\cdot | x}))$$使ELBO最大化$$\theta^*,\phi^* = \underset{\theta,\phi}\operatorname{arg max} \, L_{\theta,\phi}(x)$$等于同时最大化$\ln p_\theta(x)$、最小化$D_{KL}(q_\phi({z| x})\parallel p_\theta({z| x}))$。即，最大化观测数据似然的对数值，同时最小化近似后验$q_\phi(\cdot | x)$与精确后验$p_\theta(\cdot | x)$的差值。

给出的形式不大方便进行最大化，可以用下面的等价形式：$$L_{\theta,\phi}(x) = \mathbb E_{z \sim q_\phi(\cdot | x)} \left[\ln p_\theta(x|z)\right] - D_{KL}(q_\phi({\cdot| x})\parallel p_\theta(\cdot))$$其中$\ln p_\theta(x|z)$实现为$\| x - D_\theta(z)\|^2_2$，因为这是在加性常数的前提下$x \sim \mathcal N(D_\theta(z), I)$得到的东西。也就是说，我们把$x$在$z$上的条件分布建模为以$D_\theta(z)$为中心的高斯分布。$q_\phi(z |x)$和$p_\theta(z)$的分布通常也被选为高斯分布，因为$z|x \sim \mathcal(E_\phi(x), \sigma_\phi(x)^2I)$和$z \sim \mathcal(0, I)$可以通过高斯分布的KL散度公式得到：$$L_{\theta,\phi}(x) = -\frac 12\mathbb E_{z \sim q_\phi(\cdot | x)} \left[ \|x - D_\theta(z)\|_2^2\right] - \frac 12 \left( N\sigma_\phi(x)^2 + \|E_\phi(x)\|_2^2 - 2N\ln\sigma_\phi(x) \right) + Const$$

## 重参数化

<image>

有效搜索到$$\theta^*,\phi^* = \underset{\theta,\phi}\operatorname{arg max} \, L_{\theta,\phi}(x)$$的典型方法是梯度下降法。

它可以很直接地找到$$\nabla_\theta \mathbb E_{z \sim q_\phi(\cdot | x)} \left[\ln \frac{p_\theta(x, z)}{q_\phi({z| x})}\right] = \mathbb E_{z \sim q_\phi(\cdot | x)} \left[ \nabla_\theta \ln \frac{p_\theta(x, z)}{q_\phi({z| x})}\right]$$但是，$$\nabla_\phi \mathbb E_{z \sim q_\phi(\cdot | x)} \left[\ln \frac{p_\theta(x, z)}{q_\phi({z| x})}\right]$$不允许将$\nabla_\phi$置于期望中，因为$\phi$出现在概率分布本身之中。重参数化技巧（也被称为随机反向传播）则绕过了这个难点。

最重要的例子是当$z \sim q_\phi(\cdot | x)$遵循正态分布时，如$\mathcal N(\mu_\phi(x), \Sigma_\phi(x))$。

<image>

可以通过让$\boldsymbol{\varepsilon} \sim \mathcal{N}(0, \boldsymbol{I})$构成“标准随机数生成器”来实现重参数化，并将$z$构建为$z = \mu_\phi(x) + L_\phi(x)\epsilon$。这里，$L_\phi(x)$通过科列斯基分解得到：$$\Sigma_\phi(x) = L_\phi(x)L_\phi(x)^T$$接着我们有$$\nabla_\phi \mathbb E_{z \sim q_\phi(\cdot | x)} \left[\ln \frac{p_\theta(x, z)}{q_\phi({z| x})}\right] = \mathbb {E}_{\epsilon}\left[ \nabla_\phi \ln {\frac {p_{\theta }(x, \mu_\phi(x) + L_\phi(x)\epsilon)}{q_{\phi }(\mu_\phi(x) + L_\phi(x)\epsilon | x)}}\right]$$由此，我们得到了梯度的无偏估计，这就可以应用随机梯度下降法了。

由于我们重参数化了$z$，所以需要找到$q_\phi(z|x)$。令$q_0$为$\epsilon$的概率密度函数，那么$$\ln q_\phi(z | x) = \ln q_0 (\epsilon) - \ln|\det(\partial_\epsilon z)|$$，其中$\partial_\epsilon z$是$\epsilon$相对于$z$的雅可比矩阵。由于$z = \mu_\phi(x) + L_\phi(x)\epsilon$，这就是$$\ln q_\phi(z | x) = -\frac 12 \|\epsilon\|^2 - \ln|\det L_\phi(x)| - \frac n2 \ln(2\pi)$$

## 变体

许多VAE的应用和扩展已被用来使其适应其他领域，并提升性能。

$\beta$-VAE是带加权KL散度的实现，用于自动发现并解释因子化的潜空间形式。这种实现可以对大于1的$\beta$值强制进行流形分解。这个架构可以在无监督下发现解耦的潜因子。

条件性VAE（CVAE）在潜空间中插入标签信息，强制对所学数据进行确定性约束表示（Deterministic Constrained Representation）。

一些结构可以直接处理生成样本的质量，或实现多个潜空间，以进一步改善表征学习的效果。

一些结构将VAE和生成对抗网络混合起来，以获得混合模型。