01 核心原理(大白话版)

普通自编码器(AE)把一张图压缩成一个点,再从这个点还原——但你只能还原原图,无法生成新图。

VAE 的改进:压缩成一团"高斯云"而不是一个点——云有中心(均值)和半径(方差)。生成时从云里随机采一个点解压,每次结果略有不同,就能生成"全新但合理"的图像。

与 GAN 的对比

VAE

有明确的概率解释,训练稳定,潜在空间连续可插值(两张脸之间的过渡很自然),但生成图像偏模糊。

GAN

生成图像更锐利、更逼真,但训练不稳定,潜在空间不保证连续,有模式崩塌问题。

结构三步走

1
编码器(Encoder)

输入图像 → 输出两个向量:均值 μ 和对数方差 log σ²(描述潜在空间里那团"云"的位置和大小)。

2
重参数化采样

从云里采一个点:z = μ + σ·ε,其中 ε ~ N(0,1)。这个技巧让随机采样可以反向传播梯度。

3
解码器(Decoder)

把采到的点 z 还原成图像。训练目标:还原要准(重建损失)+ 云要靠近标准正态分布(KL 散度)。

潜在空间插值:VAE 最迷人的特性。在潜在空间里从"猫的向量"走到"狗的向量",中间会经过"像猫又像狗"的合理过渡,因为整个潜在空间都被迫学得平滑连续。

一步步构建 VAE

从螺旋数据到潜在空间,逐步搭建变分自编码器。

第一步 数据与网络权重

生成两条螺旋线作为训练数据,随机初始化编码器/解码器权重矩阵。

第二步 编码器:输入 → 高斯分布

编码器输出均值 μ 和方差 σ,重参数化技巧让随机采样可以反向传播。

第三步 解码器与损失函数

解码器把潜在向量还原为原始坐标;损失 = 重建误差 + KL 散度。

第四步 训练循环

小批量梯度更新 600 轮,观察潜在空间从混乱到有序的过程。

02 代码

03 学术性讲解

变分推断框架

假设数据 x 由潜变量 z 生成,真实后验 p(z|x) 不可解析,用近似后验 q(z|x) 逼近。最大化证据下界(ELBO):

log p(x) ≥ E_q[log p(x|z)] − KL(q(z|x) ‖ p(z))

第一项是重建损失(解码器还原能力),第二项是KL 正则项(迫使后验接近先验 N(0,I))。

重参数化技巧

直接对 z ~ q(z|x) 采样无法反向传播。重参数化将随机性分离:

z = μ(x) + σ(x) ⊙ ε, ε ~ N(0, I)

梯度可以流过 μ 和 σ,ε 只是一个不需要梯度的噪声源。这是 VAE 可端到端训练的关键。

KL 散度的解析形式

当 q(z|x) = N(μ, σ²I),p(z) = N(0, I) 时,KL 散度有解析解:

KL = −½ Σⱼ (1 + log σⱼ² − μⱼ² − σⱼ²)

无需蒙特卡洛估计,直接从编码器输出的 μ 和 log σ² 计算。

β-VAE 与解纠缠

给 KL 项加权重 β > 1:

L = E_q[log p(x|z)] − β · KL(q(z|x) ‖ p(z))

β 越大,潜在空间越被压缩,各维度趋向独立解纠缠(每个维度对应一个语义因素,如脸的朝向、光照方向)。这是 β-VAE 的核心贡献。

与 GAN 的理论对比

  • VAE:最大化 ELBO,有明确概率目标,训练稳定,但重建损失(MSE/BCE)导致生成图偏模糊
  • GAN:最小化 JS 散度(原版)或 Wasserstein 距离,判别器提供"感知损失",生成更锐利,但容易梯度消失、模式崩塌
  • VQVAE / 扩散模型:结合两者优势的后续工作