VAE 变分自编码器
先把数据压缩成一团"模糊的云",再从云里随机采一个点解压——每次都能生成新图像
01 核心原理(大白话版)
普通自编码器(AE)把一张图压缩成一个点,再从这个点还原——但你只能还原原图,无法生成新图。
VAE 的改进:压缩成一团"高斯云"而不是一个点——云有中心(均值)和半径(方差)。生成时从云里随机采一个点解压,每次结果略有不同,就能生成"全新但合理"的图像。
与 GAN 的对比
VAE
有明确的概率解释,训练稳定,潜在空间连续可插值(两张脸之间的过渡很自然),但生成图像偏模糊。
GAN
生成图像更锐利、更逼真,但训练不稳定,潜在空间不保证连续,有模式崩塌问题。
结构三步走
输入图像 → 输出两个向量:均值 μ 和对数方差 log σ²(描述潜在空间里那团"云"的位置和大小)。
从云里采一个点:z = μ + σ·ε,其中 ε ~ N(0,1)。这个技巧让随机采样可以反向传播梯度。
把采到的点 z 还原成图像。训练目标:还原要准(重建损失)+ 云要靠近标准正态分布(KL 散度)。
潜在空间插值:VAE 最迷人的特性。在潜在空间里从"猫的向量"走到"狗的向量",中间会经过"像猫又像狗"的合理过渡,因为整个潜在空间都被迫学得平滑连续。
一步步构建 VAE
从螺旋数据到潜在空间,逐步搭建变分自编码器。
生成两条螺旋线作为训练数据,随机初始化编码器/解码器权重矩阵。
编码器输出均值 μ 和方差 σ,重参数化技巧让随机采样可以反向传播。
解码器把潜在向量还原为原始坐标;损失 = 重建误差 + KL 散度。
小批量梯度更新 600 轮,观察潜在空间从混乱到有序的过程。
02 代码
03 学术性讲解
变分推断框架
假设数据 x 由潜变量 z 生成,真实后验 p(z|x) 不可解析,用近似后验 q(z|x) 逼近。最大化证据下界(ELBO):
第一项是重建损失(解码器还原能力),第二项是KL 正则项(迫使后验接近先验 N(0,I))。
重参数化技巧
直接对 z ~ q(z|x) 采样无法反向传播。重参数化将随机性分离:
梯度可以流过 μ 和 σ,ε 只是一个不需要梯度的噪声源。这是 VAE 可端到端训练的关键。
KL 散度的解析形式
当 q(z|x) = N(μ, σ²I),p(z) = N(0, I) 时,KL 散度有解析解:
无需蒙特卡洛估计,直接从编码器输出的 μ 和 log σ² 计算。
β-VAE 与解纠缠
给 KL 项加权重 β > 1:
β 越大,潜在空间越被压缩,各维度趋向独立解纠缠(每个维度对应一个语义因素,如脸的朝向、光照方向)。这是 β-VAE 的核心贡献。
与 GAN 的理论对比
- VAE:最大化 ELBO,有明确概率目标,训练稳定,但重建损失(MSE/BCE)导致生成图偏模糊
- GAN:最小化 JS 散度(原版)或 Wasserstein 距离,判别器提供"感知损失",生成更锐利,但容易梯度消失、模式崩塌
- VQVAE / 扩散模型:结合两者优势的后续工作