Generative Adversarial Network (GAN)
生成对抗网络(GAN)通过让生成器与判别器对抗训练,直到生成样本足以以假乱真。涵盖训练、变体和用途。
生成对抗网络(GAN)是一种生成式 AI模型,由两个相互对抗训练的神经网络构成:生成器将随机噪声转换为样本,判别器则尝试区分这些样本与真实的训练数据。训练结束后,生成器只需一次前向传播,就能生成新的图像、音频或表格记录。Ian Goodfellow 及其蒙特利尔大学的同事在 2014 年的论文《生成对抗网络》中提出了 GAN;直到扩散模型在 2021 年超越 GAN 之前,GAN 一直引领图像合成领域。
GAN 的训练原理#
两个网络进行极小极大博弈。判别器是一个二元分类器,输出输入为真实样本的概率;它使用交叉熵损失函数进行训练,对真实样本打分为 1,对生成样本打分为 0。生成器看不到真实数据,只能从判别器的梯度中学习。在理论最优状态下,生成分布等于数据分布,判别器对每个输入的输出都是 0.5。在训练初期,伪造样本很容易识别,此时原始生成器目标几乎无法提供梯度,这属于梯度消失问题;因此,Goodfellow 的论文让生成器最大化判别器将其样本判为真实样本的概率。下面的代码使用这种非饱和损失。
一个一维 GAN 仅凭样本就能在 PyTorch中学习高斯分布:
import torch
from torch import nn
torch.manual_seed(0)
# Generator maps 8-D noise to a number; discriminator scores a number as real (high) or fake (low)
generator = nn.Sequential(nn.Linear(8, 32), nn.ReLU(), nn.Linear(32, 1))
discriminator = nn.Sequential(nn.Linear(1, 32), nn.LeakyReLU(0.2), nn.Linear(32, 1))
opt_g = torch.optim.Adam(generator.parameters(), lr=1e-3)
opt_d = torch.optim.Adam(discriminator.parameters(), lr=1e-3)
bce = nn.BCEWithLogitsLoss()
real_label, fake_label = torch.ones(64, 1), torch.zeros(64, 1)
for step in range(3000):
real = 4.0 + 1.25 * torch.randn(64, 1) # training data: samples from N(4, 1.25^2)
fake = generator(torch.randn(64, 8))
# Discriminator step: label real samples 1 and generated samples 0
loss_d = bce(discriminator(real), real_label) + bce(discriminator(fake.detach()), fake_label)
opt_d.zero_grad()
loss_d.backward()
opt_d.step()
# Generator step: push the discriminator to label generated samples 1
loss_g = bce(discriminator(fake), real_label)
opt_g.zero_grad()
loss_g.backward()
opt_g.step()
samples = generator(torch.randn(10000, 8)).detach()
print(f"Generated mean {samples.mean():.2f}, std {samples.std():.2f} (data: 4.00, 1.25)")
print(f"Discriminator's average P(real) on generated samples: {torch.sigmoid(discriminator(samples)).mean():.2f}")交替训练 3,000 步后,生成样本的均值为 3.95、标准差为 1.20,而数据的均值和标准差分别为 4.00 和 1.25;判别器判定这些样本为真实样本的平均概率为 0.51,接近理论最优状态下的抛硬币概率。
GAN 的主要变体#
- DCGAN:Alec Radford、Luke Metz 和 Soumith Chintala 于 2015 年提出的设计,让卷积式生成器和判别器能够稳定训练;该设计用步幅卷积替换池化层,并加入批归一化。
- 条件 GAN 和 pix2pix:向两个网络都输入类别标签或图像,可以让生成器生成指定输出。Phillip Isola 及其同事提出的 pix2pix(2017)能够学习成对转换,例如将标签图转换为街景照片,或将边缘图转换为商品照片。
- CycleGAN:学习在两个图像集合之间进行转换,无需成对样本,例如将马转换为斑马,或将夏季景观转换为冬季景观;它要求转换后的图像能够映射回原图。
- Wasserstein GAN(WGAN):Martin Arjovsky 及其同事于 2017 年用一个估计真实数据与生成数据之间 Wasserstein 距离的评论器取代分类器;即使两个分布几乎没有重叠,这种设计也能保持梯度有效。
- StyleGAN:NVIDIA 的 StyleGAN(2018)和 StyleGAN2(2019)会将学得的风格向量输入生成器的每一层。StyleGAN2 在 FFHQ 数据集的 1024 x 1024 人脸图像上,将 Fréchet Inception 距离(FID)降至 2.84。
应用场景#
- 超分辨率:SRGAN(2017)、ESRGAN(2018)和 Real-ESRGAN(2021)为放大网络加入对抗损失,在仅使用逐像素损失会产生模糊的情况下恢复清晰纹理。
- 医学图像增强:Maayan Frid-Adar 及其同事使用 182 个肝脏病灶的 CT 扫描训练 GAN,并将合成病灶加入训练,使分类器的灵敏度从 78.6% 提高到 85.7%,特异度从 88.4% 提高到 92.4%。
- 深度伪造:Sophie Nightingale 和 Hany Farid 于 2022 年开展的一项研究发现,参与者区分 StyleGAN2 人脸是真实还是合成的准确率为 48%,略低于随机猜测;他们还认为合成人脸更值得信任。
只要真实样本稀缺,GAN 生成的图像就可用作合成数据,并与翻转和旋转等几何变换一起作为数据增强的一环。这些图像与其他图像一样加入 YOLO26训练集:Ultralytics 检测数据集 YAML中的 train 划分接受目录列表,因此合成图像可以放在真实图像旁边的独立文件夹中,只需编辑一行即可添加或移除。
GAN、扩散模型与 VAE 的对比#
OpenAI 的 Prafulla Dhariwal 和 Alex Nichol 于 2021 年报告称,扩散模型在 ImageNet 上取得了比当时最强 GAN BigGAN-deep 更好的 FID,此后扩散模型在图像质量上超越了 GAN。扩散模型的训练是稳定的回归问题,不涉及对抗过程,而且能更全面地涵盖数据的多样性。GAN 训练可能振荡而无法收敛,也可能陷入模式崩溃:生成器只生成少数能骗过判别器的输出,不再生成其余内容。变分自编码器的训练同样稳定,但生成样本更模糊。GAN 持久的优势在于速度,因为采样只需一次前向传播:Adobe Research、卡内基梅隆大学和 POSTECH 开发的 GigaGAN 于 2023 年在 0.13 秒内生成了 512 像素的文本生成图像结果。对抗损失也仍用于扩散系统内部。Stable Diffusion的自编码器使用基于图像块的判别器进行训练;Stability AI 的 SDXL Turbo 则使用对抗式扩散蒸馏,这是一种在损失中加入判别器的知识蒸馏方法,可通过单步生成图像。










