目录

变分自编码器

变分自编码器简单概念

变分自编码器(Variational Autoencoder,VAE)是一种生成模型,可以学习数据的潜在分布,并生成类似的样本。与传统自编码器不同,VAE不仅仅学习一个固定的潜在表示(latent representation),而是将输入映射到一个概率分布,从而生成更丰富的输出。

可以把VAE想象成一个学习画风的艺术家,它不仅学习了如何画某个具体的猫,而是理解了猫的各种特征——例如大小、毛色和形状——并可以根据这些特征创造新猫。


“变分”从何而来

什么是变分法

“变分法”本质上是优化问题的一种方法。变分法主要关注从一个函数空间中找到最优函数,使得某个目标函数达到极值。

假设你想设计一个滑梯,滑梯上的每一点都需要满足物理特性(例如平滑),而滑梯的曲线需要保证孩子最快滑到终点。选择最佳滑梯形状的问题就是一个典型的变分问题。

公式解释:经典变分问题可以用下式表示: $$ J[f] = \int_a^b L(x, f(x), f’(x)) dx $$ 目标是找到函数 $f(x)$ 使 $J[f]$ 最小化或最大化。


什么是变分推理

变分推理是一种使用优化方法近似概率分布的方法。它通过定义一个简单的分布 $q(z)$,并让它逼近真实的后验分布 $p(z|x)$。

如果后验分布 $p(z|x)$ 是一片模糊的云,而 $q(z)$ 是一个手电筒光束,那么变分推理就是调整手电筒的位置和形状,让光束尽可能覆盖住模糊的云。

公式解释: 变分推理通过最小化两个分布之间的差异(通常用 KL 散度表示)来逼近目标分布: $$ D_{\text{KL}}(q(z) | p(z|x)) = \int q(z) \log \frac{q(z)}{p(z|x)} dz $$

由于 $p(z|x)$ 通常难以直接计算,变分推理转而最大化证据下界(ELBO): $$ \mathcal{L}(q) = \mathbb{E}{q(z)}[\log p(x|z)] - D{\text{KL}}(q(z) | p(z)) $$ 其中:

  • $\mathbb{E}_{q(z)}[\log p(x|z)]$ 表示数据重建的期望对数似然;
  • $D_{\text{KL}}(q(z) | p(z))$ 是潜在分布 $q(z)$ 和先验分布 $p(z)$ 的差异。

变分自编码器想解决什么问题

传统自编码器存在的问题

传统自编码器直接将数据压缩到一个固定的低维表示,可能导致生成结果质量较低或无法生成新的样本。它学习到的是一种“单点”的潜在表示。

实例:

假设有一组手写数字图片(如 MNIST 数据集):

  • 输入:数字 “5” 的图片。
  • 编码后:输出一个固定向量,比如 $[0.8, 0.1, -0.3]$,表示压缩后的表示。

传统自编码器就像一个只会模仿具体猫照片的画家,只能画出训练过的那几只猫,而无法画出从未见过的猫。


什么是变分分布

变分分布是变分推理中的核心概念,用来近似复杂的后验分布 $p(z|x)$。

  • 定义:在变分推理中,选择一个简单的分布 $q(z|x)$,称为变分分布,用来近似 $p(z|x)$。
  • 形式:变分分布通常是一个参数化的分布,例如: $$ q(z|x) = \mathcal{N}(z; \mu, \sigma^2) $$ 其中 $\mu$ 和 $\sigma$ 是通过神经网络学习的参数。

通过优化变分分布 $q(z|x)$,我们能够更好地近似后验分布。


变分自编码器如何解决这些问题的

变分自编码器通过将数据映射到一个概率分布(例如高斯分布)来捕获数据的多样性。

  1. 假设数据的潜在分布为 $p(z)$,观测数据分布为 $p(x|z)$。
  2. 使用变分推理,定义 $q(z|x)$ 来近似真实后验 $p(z|x)$。
  3. 最大化 ELBO: $$ \mathcal{L}(q) = \mathbb{E}{q(z|x)}[\log p(x|z)] - D{\text{KL}}(q(z|x) | p(z)) $$

实例

假设有一组手写数字图片(如 MNIST 数据集):

  • 输入:数字 “5” 的图片。
  • 编码后:输出一个分布参数,比如 $\mu = [0.8, 0.1, -0.3]$ 和 $\sigma = [0.05, 0.02, 0.01]$,表示编码为一个正态分布。

通过引入随机性,VAE 不仅可以生成类似于训练样本的结果,还能生成从未见过的新样本。


潜空间向量计算过程

在变分自编码器中,编码器会将输入数据映射为一个潜在分布的参数(如均值 $\mu$ 和标准差 $\sigma$)。为了从潜在分布中采样并生成数据,通常使用 重参数化技巧(Reparameterization Trick)。

  1. 编码器生成分布参数

假设编码器接收到输入数据 $x$(如数字 “5” 的图片),编码器神经网络输出:

  • 均值向量 $\mu = [0.8, 0.1, -0.3]$
  • 对数方差向量 $\log \sigma^2 = [-2.0, -3.5, -4.6]$

将对数方差转化为标准差: $$ \sigma = \sqrt{\exp(\log \sigma^2)} $$

具体计算:

  • $\sigma = [\sqrt{\exp(-2.0)}, \sqrt{\exp(-3.5)}, \sqrt{\exp(-4.6)}]$
  • $\sigma = [0.135, 0.053, 0.023]$

因此,潜在分布为: $$ q(z|x) = \mathcal{N}(z; \mu = [0.8, 0.1, -0.3], \sigma = [0.135, 0.053, 0.023]) $$

  1. 使用重参数化技巧采样潜在向量

由于采样的过程是非微分的,为了让神经网络能够通过梯度下降学习,我们采用 重参数化技巧: $$ z = \mu + \sigma \odot \epsilon $$ 其中:

  • $\mu$ 是均值向量;
  • $\sigma$ 是标准差向量;
  • $\epsilon \sim \mathcal{N}(0, I)$,是从标准正态分布采样的随机噪声;
  • $\odot$ 表示逐元素乘积。

最终,潜在空间向量 $z$ 被解码器用于生成新的数据样本。


一个简单的变分自编码器的例子

编码过程

在编码阶段,输入数据 $x$ 被映射到潜在空间中的一个分布 $q(z|x)$,通常假设为高斯分布: $$ q(z|x) = \mathcal{N}(z; \mu(x), \sigma^2(x)) $$ 神经网络用于学习均值 $\mu(x)$ 和方差 $\sigma^2(x)$。

解码过程

在解码阶段,从分布 $q(z|x)$ 中采样 $z$,并通过解码器生成数据: $$ p(x|z) = f_{\text{decoder}}(z) $$ 其中 $f_{\text{decoder}}$ 是一个神经网络,用于还原数据。


对比传统与变分自编码器的编码后结果

  • 传统自编码器:潜在空间中的每个点对应唯一的样本。
  • 变分自编码器:潜在空间中的每个点都是一个分布,可以采样生成多样性更强的样本。