0Pricing
Learn AI with Python · 课时

变分自编码器(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 samples

VAE 为什么重要

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 反馈 — 无需本地设置。

此课程中的所有课时

  1. 用于表示学习的自编码器
  2. 变分自编码器(VAE)
  3. GAN:生成器与判别器
  4. 条件 GAN 与风格迁移
← 返回 Learn AI with Python