生成对抗网络(GAN)实战:解决图像生成中的模式崩溃问题

1次阅读
没有评论

共计 1830 个字符,预计需要花费 5 分钟才能阅读完成。

image.webp

模式崩溃:GAN 训练中的头号难题

当 GAN 开始反复生成高度相似的样本时(比如人脸生成中只能产生同一种肤色或发型),这就是典型的模式崩溃现象。其本质是生成器找到了能欺骗当前判别器的 ” 捷径 ”,导致优化过程陷入局部最优。通过分析损失函数曲线可以发现,此时生成器损失持续下降而判别器损失剧烈震荡。

生成对抗网络 (GAN) 实战:解决图像生成中的模式崩溃问题

从理论到实践的解决方案演进

1. 原始 GAN 的 JS 散度困境

原始 GAN 的判别器相当于在最小化生成分布与真实分布之间的 JS 散度:

$$\min_G \max_D V(D,G) = \mathbb{E}{x\sim p[\log(1-D(G(z)))]$$}}[\log D(x)] + \mathbb{E}_{z\sim p_z

但当两类分布没有重叠时,JS 散度会恒等于 log2,导致梯度消失。

2. WGAN 的革命性改进

Wasserstein 距离即使分布不重叠也能提供有意义的梯度:

$$W(p_{data}, p_g) = \inf_{\gamma \in \Pi(p_{data},p_g)} \mathbb{E}_{(x,y)\sim \gamma}[|x-y|]$$

实际实现时通过权重裁剪(weight clipping)来满足 Lipschitz 约束,但容易导致梯度爆炸或消失。

3. WGAN-GP 的优雅解法

梯度惩罚(Gradient Penalty)直接约束判别器的梯度范数:

$$\lambda \mathbb{E}{\hat{x}\sim p)|_2 – 1)^2]$$}}}[(|\nabla_{\hat{x}}D(\hat{x

其中 $\hat{x}$ 是真实样本与生成样本的随机插值点。

PyTorch 实现关键细节

# 梯度惩罚层实现
def compute_gradient_penalty(D, real_samples, fake_samples):
    alpha = torch.rand(real_samples.size(0), 1, 1, 1)
    interpolates = (alpha * real_samples + (1-alpha) * fake_samples).requires_grad_(True)
    d_interpolates = D(interpolates)
    gradients = torch.autograd.grad(
        outputs=d_interpolates,
        inputs=interpolates,
        grad_outputs=torch.ones_like(d_interpolates),
        create_graph=True,
        retain_graph=True,
        only_inputs=True
    )[0]
    gradient_penalty = ((gradients.norm(2, dim=1) - 1) ** 2).mean()
    return gradient_penalty

# 判别器权重初始化
def weights_init(m):
    if isinstance(m, (nn.Conv2d, nn.ConvTranspose2d, nn.Linear)):
        nn.init.normal_(m.weight.data, 0.0, 0.02)
    elif isinstance(m, (nn.BatchNorm2d)):
        nn.init.normal_(m.weight.data, 1.0, 0.02)
        nn.init.constant_(m.bias.data, 0)

工业级训练技巧

计算资源优化

  • 在 RTX 3090(24GB 显存)上,batch size 设为 64 时显存占用约 18GB
  • 混合精度训练可节省 30% 显存:
    scaler = torch.cuda.amp.GradScaler()
    with torch.cuda.amp.autocast():
        d_loss = ...
    scaler.scale(d_loss).backward()

超参数调优

  • 标签平滑系数建议 0.05~0.2
  • 判别器更新次数 / 生成器更新次数 =5:1 是常见选择
  • 学习率通常设为 5e-5(Adam 优化器时 beta1=0.5, beta2=0.9)

待探索的方向

  1. 评估指标设计:能否用聚类算法量化生成样本覆盖的真实数据模式数量?
  2. 与扩散模型对比:虽然 Diffusion Model 训练更稳定,但其生成速度是否成为工业部署的瓶颈?

通过本文介绍的方法,在 CelebA 数据集上训练后,生成样本的 FID 分数可从原始 GAN 的 45.3 降低到 WGAN-GP 的 22.1(分辨率 128×128)。建议读者在实现时重点关注梯度惩罚系数的调整,这往往是决定最终效果的关键因素。

正文完
 0
评论(没有评论)