变分自编码器(VAE)
ELBO 损失、重参数化技巧、潜在空间探索,以及使用 VAE 生成图像。
变分自编码器(VAE) 是 CoddyKit 上的免费 Learn AI with Python 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Learn AI with Python 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Learn AI with Python 课程共包含 4 节课。
从自编码器到 VAE
普通自编码器学到的是分散的点,因此采样新点时会产生无意义的结果。变分自编码器(VAE)学习一个平滑、连续的潜在空间,您可以从中进行采样,使其成为真正的生成模型。
编码为分布
VAE 编码器不再输出一个点,而是针对每个输入输出一个分布:均值 mu 和对数方差 log_var。每个输入会映射到潜在空间中的一个小型模糊区域,而不是单个点。
class Encoder(nn.Module):
def __init__(self):
super().__init__()
self.fc = nn.Linear(784, 256)
self.fc_mu = nn.Linear(256, 64)
self.fc_logvar = nn.Linear(256, 64)为什么使用 mu 和 log_var
我们不直接预测方差,而是预测 log_var,因为它可以是任意实数(不受正值约束),并且在数值上更加稳定。需要时,通过取指数即可恢复方差。
def forward(self, x):
h = torch.relu(self.fc(x))
return self.fc_mu(h), self.fc_logvar(h)对潜在变量 z 进行采样
要进行解码,我们必须从预测的分布中采样 z。直接进行这种随机采样是不可微的,因此无法通过它进行反向传播。重参数化技巧解决了这个问题。
重参数化技巧
将采样重写为 z = mu + eps * exp(0.5 * log_var),其中 eps 是随机噪声。这样,随机性位于 eps 中(不需要梯度),而梯度可以通过 mu 和 log_var 传播。
def reparameterize(mu, log_var):
std = torch.exp(0.5 * log_var)
eps = torch.randn_like(std)
return mu + eps * std解码器
解码器接收采样得到的 z 并重建图像,就像普通自编码器的解码器一样,通过 Sigmoid 输出将 64 维扩展回 784 个像素。
decoder = nn.Sequential(
nn.Linear(64, 256),
nn.ReLU(),
nn.Linear(256, 784),
nn.Sigmoid()
)重建损失项
VAE 损失的第一部分是重建损失:解码后的图像与输入匹配得有多好。像素级损失使用二元交叉熵(或 MSE)。
recon_loss = nn.functional.binary_cross_entropy(
recon, x, reduction="sum"
)KL 散度项
第二部分是KL 散度,它将每个编码后的分布拉向标准正态分布。这样可以对潜在空间进行正则化,使其平滑且连续,从而支持生成。
kl = -0.5 * torch.sum(1 + log_var - mu.pow(2) - log_var.exp())ELBO 目标
VAE 最大化ELBO(证据下界),这等价于最小化 reconstruction + KL。重建损失使输出保持忠实;KL 使空间保持良好的形状。平衡二者就是全部关键。
loss = recon_loss + kl
loss.backward()生成新图像
由于潜在空间与标准正态分布相匹配,您可以从 N(0,1) 中采样 z 并进行解码,从而生成全新的图像,无需输入图像。
with torch.no_grad():
z = torch.randn(16, 64)
new_images = decoder(z) # 16 generated samplesVAE 为什么重要
VAE 提供了一个有理论依据且平滑的潜在空间,您可以在其中进行插值和采样。它支撑着许多生成技术,也传授了学习分布而不仅仅是学习点这一核心思想。
快速检查
测试您对 VAE 的理解。
回顾:变分自编码器
您学习了 VAE:编码器输出 mu 和 log_var,重参数化技巧 z = mu + eps * exp(0.5 * log_var) 使采样过程保持可微,损失为 ELBO = reconstruction + KL。从 N(0,1) 中采样 z 并进行解码即可生成新图像。
常见问题解答
「变分自编码器(VAE)」课时是免费的吗?
是的 — 「变分自编码器(VAE)」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Learn AI with Python 课程的其余内容,请升级到 CoddyKit PRO。 Learn AI with Python 课程共包含 4 节课。
「变分自编码器(VAE)」这节课中我会学到什么?
ELBO 损失、重参数化技巧、潜在空间探索,以及使用 VAE 生成图像。 你通过在浏览器中直接运行的动手代码来练习 Learn AI with Python,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Learn AI with Python 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Learn AI with Python 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。
「变分自编码器(VAE)」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Learn AI with Python 课中编写并运行代码吗?
能。每节 Learn AI with Python 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- 用于表示学习的自编码器
- 变分自编码器(VAE)
- GAN:生成器与判别器
- 条件 GAN 与风格迁移