VAE:变分自编码器
VAE 是一种带概率约束的自编码器,它把数据编码成潜在分布,再从这个分布采样并解码生成数据。
VAE 在深度学习中指 Variational Autoencoder,变分自编码器。它是一类生成模型,可以学习数据的潜在表示,并从中生成新的样本。
普通自编码器 Autoencoder 的结构是:
输入 x → 编码器 Encoder → 潜变量 z → 解码器 Decoder → 重建 x' 目标是让输出 x' 尽量接近输入 x。
而 VAE 的区别在于:
普通自编码器把输入压缩成一个确定的向量 z;VAE 不直接输出一个固定的 z,而是输出一个概率分布。
通常是高斯分布:
Encoder(x) → μ, σz ~ N(μ, σ²)Decoder(z) → x'也就是说,VAE 学到的是: 某个输入样本在潜在空间中大概位于哪里,以及它的不确定性有多大。
VAE 的核心思想
VAE 希望学习一个潜在变量模型:
也就是认为数据 x 是由某个隐藏变量 z 生成出来的。
例如在人脸生成中:z 可能表示脸型, 表情, 类型, 发型, 姿态, 光照…
VAE 的目标是学习:, 即给定潜变量 z,如何生成数据 x。
但真实的后验分布: 通常很难直接求,所以 VAE 用一个神经网络近似它:
这就是”Variational”的来源:用变分推断近似难求的后验分布。
VAE 的损失函数
VAE 的损失通常由两部分组成:Loss = Reconstruction Loss + KL Divergence
第一部分:重建损失
衡量生成结果 x' 和原始输入 x 有多像。比如 , 或者二元交叉熵。
它的作用是:让模型尽量重建原始数据。
第二部分:KL散度
VAE 会让编码器输出的分布接近标准正态分布:
, 这里的 q 就是近似后验分布。
KL 散度衡量两个分布之间的差异:
其中通常
它的作用是:让潜在空间更加连续、规则,方便采样和生成。
为什么需要 KL散度?
如果没有 KL 散度,VAE 会退化得更像普通自编码器。 这样虽然重建效果可能不错,但潜在空间可能很乱:
- 某些区域有样本
- 某些区域完全没意义
- 随机采样 z 可能生成垃圾结果
加上 KL 散度后,VAE 会把潜变量压到一个规则的分布里,例如标准正态分布。也就是说,VAE 不只是压缩数据,还能生成数据。
重参数化技巧 Reparameterization Trick
VAE 中有一个关键问题:,采样操作本身不可直接反向传播。
所以使用重参数化技巧:,
这样随机性来自 ,而 和 仍然可以通过梯度下降学习。
类比一下
假设 z 表示”猫的抽象特征”:z = 橘猫、侧脸、坐姿、室内光线
那么 表示:在这些隐藏特征确定的情况下,具体图片可能长什么样。
即使 z 固定,图片仍然可以有很多细节变化:所以 不是单个图片,而是一组可能图片的概率分布。