自编码器与 VAE:用压缩与重建学表征

自编码器(Autoencoder)是一类以「重建自身」为训练目标的无监督神经网络。它不预测标签,而是让模型学会把输入压缩成紧凑的表示,再尽可能无损地还原出来。这种「压缩-重建」的范式,是表征学习(representation learning)最经典、最直观的入口。变分自编码器(Variational Autoencoder,VAE)则在自编码器基础上引入概率建模,使隐空间变得连续、平滑、可采样,从而具备了生成新样本的能力。本文从结构讲起,逐步推到 VAE 的变分下界与重参数化技巧,并比较二者本质差异与局限。

自编码器的结构

一个标准的自编码器由两部分组成,二者通常对称或镜像。

编码器与解码器

编码器(encoder)把高维输入 x 映射为一个低维向量 z,这一低维向量所处的空间称为隐空间(latent space)。解码器(decoder)则把 z 还原为重建结果 x_hat,目标是让 x_hat 与 x 尽可能接近。中间那一层维度极小的 z 被称为瓶颈(bottleneck),它是信息必须经过的「窄口」,模型被迫在这里保留最有用的特征。

训练时使用重建损失(reconstruction loss)衡量差距,常见选择是均方误差(MSE,对连续值)或二元交叉熵(BCE,对像素这类有界值):

# 自编码器训练的单步直觉伪代码
def ae_loss(x, encoder, decoder):
    z = encoder(x)            # 输入压缩到瓶颈 z
    x_hat = decoder(z)        # 从 z 重建
    recon = mse(x, x_hat)     # 重建损失,逼近平原输入
    return recon

# 优化目标:最小化重建损失
# 注意:这里 z 是确定性的,每个 x 对应唯一固定的 z

瓶颈维度与信息取舍

瓶颈维度决定了压缩率。维度太小,模型丢不掉冗余信息,重建质量下降;维度太大,模型可能直接学会「记忆」输入,反而学不到有意义的低维结构。这引出了自编码器最常见的两个风险。

第一是恒等映射风险:如果容量过大、瓶颈又足够宽,网络会退化为一个「复制机」,把输入原样搬回输出,z 里没有语义结构。第二是过拟合:在小数据集上,模型可能记住每个样本而非提炼通用特征。

典型用途

自编码器不只是降维工具。去噪自编码器(denoising autoencoder)在输入上加噪声、要求重建干净版本,迫使模型学到数据的本质结构而非噪声。稀疏自编码器通过正则约束让 z 中多数维度接近零,得到可解释的特征。表征学习场景下,编码器的输出 z 可直接作为下游任务(分类、检索、聚类)的特征向量。

从自编码器到 VAE 的动机

普通自编码器的隐空间存在明显问题:它是「离散且断裂」的。每个样本被映射到一个固定点 z,点与点之间未必连续,从一个 z 走到邻近的 z 再交给解码器,可能得到毫无意义的结果。这意味着你无法在隐空间里「随意取一点」来生成新样本。

VAE 的核心动机正是要解决这个问题:它不再把输入映射为单一确定向量,而是映射为一个概率分布(通常是高斯),让隐空间服从(或逼近)标准正态。这样一来,随机从标准正态里采一个 z,解码器也能产出合理的样本。VAE 因此同时是「编码器-解码器」与「生成模型」。

变分下界 ELBO

VAE 的训练目标是最大化数据的对数似然下界,即证据下界(Evidence Lower Bound,ELBO)。它由两项构成。

第一项是重构损失,期望解码器从采样的 z 重建出 x,等价于普通自编码器的目标。第二项是 KL 散度(Kullback-Leibler divergence),它约束编码器输出的分布 q(z|x) 不要太偏离先验 p(z)(标准正态)。KL 项的作用是把所有样本的隐分布「拉拢」到同一个平滑的先验上,使隐空间连续、可插值、可采样。其直觉损失形式如下:

# VAE 训练的直觉伪代码(单样本)
def vae_loss(x, encoder, decoder):
    mu, logvar = encoder(x)            # 编码为分布的参数,而非单点
    sigma = exp(0.5 * logvar)
    eps = randn_like(mu)               # 从标准正态采噪声
    z = mu + sigma * eps               # 重参数化:采样变成可微操作
    x_hat = decoder(z)
    recon = bce_or_mse(x, x_hat)       # 重构损失
    kl = -0.5 * sum(1 + logvar - mu**2 - exp(logvar))  # KL(q||p),逼近平滑隐空间
    return recon + beta * kl           # ELBO 的负值,最小化即最大化下界

KL 项前面的系数 beta 是可选权重,用来平衡「重建保真」与「隐空间平滑」。beta 过大时隐空间很规整但重建变糊,过小时重建清晰但隐空间不再连续。

重参数化技巧

VAE 之所以能端到端用随机梯度下降训练,关键在于重参数化技巧(reparameterization trick)。直接写 z = sample(N(mu, sigma^2)) 时,采样这个动作本身不可导,梯度无法回传到编码器参数。

重参数化把随机性「挪」到固定的外部噪声 eps 上:z = mu + sigma * eps,其中 eps 从标准正态独立采样。于是 z 对 mu、sigma(进而对编码器参数)是可导的,梯度可以顺畅回传。这正是 Kingma 与 Welling 在 2013 年提出的核心贡献之一:通过对变分下界重参数化,得到一个能用标准随机梯度法直接优化的下界估计器。

自编码器与 VAE 的本质区别

二者看似结构相似,但建模哲学不同。普通自编码器学的是确定性映射:给定 x,输出固定的 z,再解码回 x。VAE 学的是概率分布建模:给定 x,输出的是 z 的分布参数(均值与方差),再从这个分布采样得到 z。前者是「点对点」的压缩,后者是「分布对分布」的推断。

这一区别带来了能力的分野。自编码器擅长表征学习与降维,但在隐空间里插值、采样生成新数据并不可靠。VAE 因为隐空间被先验约束成连续正态,可以从任意正态采样点解码出合理新样本,是真正的生成模型。代价是 VAE 的重建往往比自编码器更模糊——KL 项把隐分布压平,牺牲了部分像素级保真度。

局限与陷阱

VAE 虽优雅,也有公认的短板。

其一,生成样本常偏模糊。因为重构损失在像素上取平均,模型倾向于输出「所有可能样本的平均值」,导致边缘发虚、细节缺失,这也是后来 GAN、扩散模型在图像质量上更受青睐的原因之一。

其二,KL 坍塌(posterior collapse)。当解码器足够强、能仅凭 x 的某些线索重建时,模型可能忽略 z,让 KL 项趋零、q(z|x) 塌缩到先验。此时隐空间失去信息,生成与插值能力退化。实践中常用退火 KL 权重、削弱解码器容量等手段缓解。

相比之下,普通自编码器的局限更多在于隐空间不连续、不可生成,而非重建质量。选择哪种模型,取决于任务是「学一个好表征」还是「生成新数据」。

小结

自编码器通过编码器压缩、解码器重建,以瓶颈迫使模型学到紧凑的表征,可用于降维、去噪与表征学习,但要警惕恒等映射与过拟合。VAE 在此基础上把确定性映射升级为概率分布建模,用重构损失加 KL 散度构成的 ELBO 训练隐空间,并用重参数化技巧让随机采样可微、可端到端优化。二者的本质区别在于确定性映射与概率分布建模,这也决定了 VAE 能生成新样本而普通自编码器不能。理解这套「压缩-重建-分布化」的演进,是进入生成模型世界的重要一步。

参考与延伸阅读

  • Hinton, G. E. 与 Salakhutdinov, R. R. 2006. 「Reducing the Dimensionality of Data with Neural Networks」. Science, Vol 313, Issue 5786, pp. 504-507. 自编码器用于深度降维的经典奠基工作(已核验,DOI: 10.1126/science.1127647)。
  • Kingma, D. P. 与 Welling, M. 2013. 「Auto-Encoding Variational Bayes」. arXiv:1312.6114. 提出 VAE 与重参数化技巧(已核验,https://arxiv.org/abs/1312.6114)。
  • Doersch, C. 2016. 「Tutorial on Variational Autoencoders」. arXiv:1606.05908. 面向初学者的 VAE 系统讲解(延伸阅读,未经本次核验)。
  • Goodfellow, I. 等人 2016. 「Deep Learning」. MIT Press, 第 14 章. 对自编码器与表征学习的体系化论述(延伸阅读)。
本文累计阅读