Candlest 的博客

Back

VAE:潜空间与生成式模型Blur image

吐槽 花了 7 小时写这篇文章,加上之前的时间差不多 20 小时了,但是还是有点懵。回头再看。

问题引入#

假如我们现在有一个 100×100×3100 \times 100 \times 3 自由度的 RGB 图像空间,现在想在这张画布上生成一只猫的图片,该怎么做?

换成数学语言就是:

在一个 100×100×3100 \times 100 \times 3 的空间中,找到一个点,使得这个点对应的图像是一只猫。

更进一步:

在一个 dd 维空间里,按照目标分布 pdata(x)p_{\text{data}}(x) 的指引进行采样,使得我们采样出来的向量恰好表示一只猫的图像。

这个问题,我们可以形式化为:

我们给定真实数据分布 pdata(x)p_{\text{data}}(x),目标是学习一个模型分布 pθ(x)p_\theta(x),使得 pθ(x)p_\theta(x) 能尽可能逼近 pdata(x)p_{\text{data}}(x),从中采样出符合要求的图像。

在 VAE 之前,生成式模型主要面临着如下问题:

训练这类模型一直是机器学习领域的一个长期难题,传统上大多数方法都存在以下三个严重缺陷之一:1

  1. 它们可能需要对数据结构做出强假设。
  2. 它们可能采用过于粗略的近似,导致模型效果欠佳。
  3. 它们可能依赖计算成本高昂的推断过程,如马尔可夫链蒙特卡洛方法。

NN 的快速发展让 NN 作为高效的函数逼近器成为可能,VAE 引入变分贝叶斯方法和「最小描述长度」编码模型,为彼时的生成式模型翻开了新的一页。

模型结构#

我们可以从 Pytorch 官方的最小样例中找到一份 VAE 生成手写数字的代码。2

vae

和传统自编码器(AE)对比:

ae

AE 将输入映射为潜空间中的一个点,VAE 将输入映射为潜空间中一个高斯分布的参数(μ\muσ\sigma),通过采样产生隐变量。3

manifold.png

这样,VAE 允许在潜空间采样并生成全新的样本。

Latent Variable Models#

真实世界往往过于复杂,难以直接建模。引入潜变量 zz 之后,我们尝试把复杂的数据分布 p(x)p(x) 分解为:

p(x)=p(x,z)dz=p(xz)p(z)dzp(x) = \int p(x,z) dz = \int p(x|z) p(z) dz

这里,p(z)p(z) 是潜空间的先验,pθ(xz)p_\theta(x \mid z) 是给定潜变量生成数据的条件分布,qϕ(zx)q_\phi(z \mid x) 是用于近似后验的推断分布。 在 VAE 中:

  • Decoder 实现 pθ(xz)p_\theta(x|z),生成数据
  • Encoder 学习近似后验分布 qϕ(zx)q_\phi(z|x),辅助训练与推断

简记流程:

zp(z)xpθ(xz)z \sim p(z) \quad \to \quad x \sim p_\theta(x|z)

其中,p(z)p(z) 通常取标准正态。

Reparameterization Trick(重参数化)#

「sample」这个步骤是不可微的,所以我们无法通过反向传播来更新 encoder 的参数。

VAE 的解决方案是 reparameterization trick:

z=μ+σϵ,ϵN(0,I)z = \mu + \sigma \odot \epsilon, \quad \epsilon \sim \mathcal{N}(0, I)

每次正向传播时,我们先从一个标准正态分布中采样 ϵ\epsilon,然后反向传播时,我们可以通过链式法则来计算 μ\muσ\sigma 的梯度。有点像 dropout 的反向传播处理方法。

Loss(Evidence Lower Bound, ELBO)#

我们训练 VAE 的时候,怎么保证两个 FC 学到的就是 μ\mulogσ2\log \sigma^2

对于经典 VAE:

x → Encoder → h →
                 ├── fc_mu → μ
                 └── fc_logvar → logσ²
plaintext

并没有一个明确的结构硬保证。

所以关键不在结构,而在 loss 怎么约束它们。

我们知道,μ\mulogσ2\log \sigma^2 建模的是 qϕ(zx)q_\phi(z \mid x),用来近似真实后验 pθ(zx)p_\theta(z \mid x)

logpθ(x)=logpθ(xz)p(z)dz\log p_\theta(x) = \log \int p_\theta(x|z) p(z) dz

乘以 qϕ(zx)qϕ(zx)\frac{q_\phi(z|x)}{q_\phi(z|x)}

=logEqϕ(zx)[pθ(xz)p(z)qϕ(zx)]= \log \mathbb{E}_{q_\phi(z|x)} \left[ \frac{p_\theta(x|z) p(z)}{q_\phi(z|x)} \right]

由 Jensen 不等式(log\log 是凹函数,logE[Y]E[logY]\log \mathbb{E}[Y] \geq \mathbb{E}[\log Y]):

Eqϕ(zx)[logpθ(xz)p(z)qϕ(zx)]\geq \mathbb{E}_{q_\phi(z|x)} \left[ \log \frac{p_\theta(x|z) p(z)}{q_\phi(z|x)} \right]

拆开:

Eqϕ(zx)[logpθ(xz)p(z)qϕ(zx)]=Eqϕ(zx)[logpθ(xz)]重建项DKL(qϕ(zx)p(z))KL 项\mathbb{E}_{q_\phi(z|x)} \left[ \log \frac{p_\theta(x|z) p(z)}{q_\phi(z|x)} \right] = \underbrace{\mathbb{E}_{q_\phi(z|x)} [\log p_\theta(x|z)]}_{\text{重建项}} - \underbrace{D_{KL}(q_\phi(z|x) \| p(z))}_{\text{KL 项}}

重建项最大化在 latent zz 下生成原数据 xx 的概率。重建误差会鼓励 decoder 生成逼近输入的样本。

KL 项保证 latent 空间规整且可采样。它衡量近似后验与先验的距离,防止潜空间过拟合。

这两项共同构成 VAE 的损失函数,约束 μ\mulogσ2\log \sigma^2 的学习。

其他参考资料#


Footnotes#

  1. Tutorial on Variational Autoencoders

  2. pytorch/examples/blob/main/vae/main.py

  3. VAE: Variational Autoencoders – How to Employ Neural Networks to Generate New Images

VAE:潜空间与生成式模型
https://blog.candlest.cc/blog/ai/vae
Author Candlest
Published at 2026年4月8日