GAN (Generative Adversarial Network)
GAN(生成对抗网络)由 Ian Goodfellow 等人在 2014 年论文 "Generative Adversarial Nets" 中提出。它通过让两个神经网络——生成器(Generator)和判别器(Discriminator)——互相对抗来学习数据分布,从而生成逼真的样本。GAN 的出现开启了深度生成模型的新时代,被 Yann LeCun 称为"过去十年机器学习领域最有趣的想法"。
背景与动机
生成模型回顾
深度生成模型的核心目标是学习数据分布 \(p_{data}(x)\),然后从中采样生成新的数据。根据建模方式,可以分为两大类:
显式密度估计(Explicit Density):直接定义并优化一个概率密度函数 \(p_\theta(x)\)。
- 自回归模型(如 PixelRNN/PixelCNN):将联合分布分解为条件分布的乘积,逐像素生成
- 变分自编码器(VAE):通过变分推断,优化对数似然的下界(ELBO)
- 流模型(Flow):通过可逆变换,精确计算似然
隐式密度估计(Implicit Density):不显式定义概率密度函数,而是直接学习一个从噪声到数据的映射。
- GAN 就是这一类的代表:我们永远不知道 \(p_g(x)\) 的解析形式,但可以从中采样
显式 vs 隐式的直觉理解
显式方法好比"我给你写一个数学公式来描述猫的长相"——你既能算概率又能生成样本。隐式方法好比"我训练一个画家,他不懂概率公式,但他画出来的猫看起来很真"——你只能生成,无法计算某张图的精确概率。
GAN 的核心思想:博弈论视角
GAN 的灵感来源于博弈论中的二人零和博弈(Two-player Minimax Game)。两个网络各自有自己的目标:
- 生成器 G:尽可能生成"以假乱真"的样本,让判别器无法分辨
- 判别器 D:尽可能准确地区分真实样本和生成样本
两者的博弈推动彼此不断进步,最终达到纳什均衡:生成器生成的数据与真实数据无法区分。
"造假币者 vs 警察"类比
Goodfellow 在原论文中给出了一个直觉类比:
- 生成器 G = 造假币者:不断提升造假技术,试图让假币越来越逼真
- 判别器 D = 警察:不断提升鉴别能力,试图识破每一张假币
造假币者和警察的"军备竞赛"推动双方能力不断提升。最终理想状态是:造假币者的技术完美到警察完全无法分辨真假——此时假币就等价于真币。
GAN 架构详解
整体架构
随机噪声 真实数据
z ~ N(0, I) x ~ p_data
│ │
▼ │
┌──────────────┐ │
│ Generator G │ │
│ (神经网络) │ │
└──────┬───────┘ │
│ │
▼ ▼
G(z) x
(生成样本) (真实样本)
│ │
└──────────┬─────────────────┘
│
▼
┌─────────────────┐
│ Discriminator D │
│ (神经网络) │
└────────┬────────┘
│
▼
D(·) ∈ [0, 1]
(真实概率的估计)
生成器 G (Generator)
生成器是一个从低维潜在空间到高维数据空间的映射:
- 输入:随机噪声向量 \(z \sim p_z(z)\),通常 \(z \sim \mathcal{N}(0, I)\) 或 \(z \sim \text{Uniform}(-1, 1)\)
- 输出:生成的假样本 \(G(z)\),与真实数据具有相同维度
- 目标:让 \(G(z)\) 的分布 \(p_g\) 尽可能接近真实数据分布 \(p_{data}\)
在图像生成任务中,G 通常使用转置卷积(Transposed Convolution)逐步将低维噪声上采样为高分辨率图像。
判别器 D (Discriminator)
判别器是一个二分类器:
- 输入:一个样本(可能是真实的 \(x\),也可能是生成的 \(G(z)\))
- 输出:该样本来自真实数据的概率估计
- 目标:对真实样本输出高概率(接近 1),对生成样本输出低概率(接近 0)
对抗训练目标函数
GAN 的训练被形式化为如下极小极大博弈(Minimax Game):
拆解理解这个目标函数:
- \(\mathbb{E}_{x \sim p_{data}}[\log D(x)]\):D 把真实样本判为"真"的对数概率。D 希望最大化这一项(让 \(D(x) \to 1\))
- \(\mathbb{E}_{z \sim p_z}[\log(1 - D(G(z)))]\):D 把生成样本判为"假"的对数概率。D 希望最大化这一项(让 \(D(G(z)) \to 0\)),而 G 希望最小化这一项(让 \(D(G(z)) \to 1\))
目标函数的直觉
判别器 D 想让 \(V(D,G)\) 尽可能大——既能认出真品,又能识破赝品。生成器 G 想让 \(V(D,G)\) 尽可能小——让判别器把赝品当真品。这就是 \(\min_G \max_D\) 的含义。
训练过程详解
交替训练
GAN 的训练采用交替优化策略。在每一轮迭代中:
步骤一:训练判别器 D(k 步)
固定 G,更新 D 的参数以最大化 \(V(D, G)\):
- 从真实数据中采样一个 mini-batch \(\{x^{(1)}, \ldots, x^{(m)}\}\)
- 从噪声分布中采样一个 mini-batch \(\{z^{(1)}, \ldots, z^{(m)}\}\)
- 通过梯度上升更新 D:
步骤二:训练生成器 G(1 步)
固定 D,更新 G 的参数以最小化 \(V(D, G)\):
- 从噪声分布中采样一个 mini-batch \(\{z^{(1)}, \ldots, z^{(m)}\}\)
- 通过梯度下降更新 G:
为什么先训练 D 多步?
如果 D 太弱,它无法为 G 提供有意义的梯度信号。直觉上说,如果"警察"连真假都分不清,"造假者"就无从知道自己该往哪个方向改进。因此原论文建议每训练 G 一步,先训练 D k 步(原文中 k=1 就够了,但实践中有时需要更多)。
理论最优判别器
给定固定的生成器 G,最优判别器 \(D^*\) 的解析解为:
推导:对于固定的 G,目标函数 \(V(D, G)\) 关于 D 的优化可以写成:
对被积函数关于 \(D(x)\) 求导并令其为零:
解得 \(D^*(x) = \frac{p_{data}(x)}{p_{data}(x) + p_g(x)}\)。
全局最优
将 \(D^*\) 代回目标函数,可以证明:
其中 \(D_{JS}\) 是 JS 散度(Jensen-Shannon Divergence):
因为 JS 散度恒非负,且当且仅当 \(p_{data} = p_g\) 时为零,所以:
- 全局最优在 \(p_g = p_{data}\) 时达到
- 此时 \(V(D^*, G) = -\log 4\)
- 此时 \(D^*(x) = \frac{1}{2}\),即判别器对每个样本都输出 0.5——完全无法区分真假
Non-Saturating Loss
实际训练中 G 的梯度问题
在训练早期,G 生成的样本很差,\(D(G(z)) \approx 0\)。此时 \(\log(1 - D(G(z))) \approx \log(1) = 0\),梯度几乎为零,G 很难学习。这被称为饱和(saturation)问题。
原始目标让 G 最小化 \(\log(1 - D(G(z)))\),但实际训练中通常替换为最大化 \(\log D(G(z))\):
| 目标 | G 的损失函数 | 梯度特性 |
|---|---|---|
| 原始 (Minimax) | \(\log(1 - D(G(z)))\) | \(D(G(z)) \to 0\) 时梯度消失 |
| 替代 (Non-saturating) | \(-\log D(G(z))\) | \(D(G(z)) \to 0\) 时梯度很大 |
两者在 \(D(G(z)) = 0.5\) 处梯度大小相同,但 Non-saturating 版本在训练初期提供更强的梯度信号,极大改善了训练稳定性。
数值示例:1D 高斯分布拟合
为了直观理解 GAN 的训练过程,考虑一个简化例子:真实数据服从一维高斯分布 \(p_{data} = \mathcal{N}(5, 1)\),生成器从均匀噪声 \(z \sim \text{Uniform}(0, 1)\) 出发学习这个分布。
假设 G 是一个简单的线性变换 \(G(z) = az + b\),D 是一个小型神经网络。
训练过程可视化
| 阶段 | G 的输出分布 | D 的行为 | 说明 |
|---|---|---|---|
| 初始 | \(G(z) \sim \text{Uniform}(0, 1)\)(远离目标) | \(D\) 轻松区分真假,\(D(x_{real}) \approx 1\), \(D(G(z)) \approx 0\) | G 的样本完全不像真实数据 |
| 第 100 步 | \(G(z)\) 分布均值开始向 5 移动 | \(D\) 仍能较好区分,但准确率下降 | G 学到了大致的位置 |
| 第 500 步 | \(G(z) \approx \mathcal{N}(4.5, 0.8)\) | \(D\) 区分变得困难,\(D(\cdot) \approx 0.6\text{--}0.7\) | G 接近目标分布 |
| 收敛 | \(G(z) \approx \mathcal{N}(5, 1)\) | \(D(x) \approx 0.5\)(对所有输入) | 达到纳什均衡 |
损失变化趋势
Loss
│
│ D_loss
│ ╲
│ ╲ ___________
│ ╲______╱ ─── → ln(2) ≈ 0.693
│
│ ╱‾‾‾‾‾‾‾‾‾‾‾‾‾
│ _____╱
│ ╱
│ ╱ G_loss
│
└──────────────────────────→ Training Steps
在理想情况下,当训练达到均衡时:
- \(D_{loss} = -[\log(0.5) + \log(0.5)] = \log 4 \approx 1.386\)(每个样本取平均后为 \(\log 2 \approx 0.693\))
- \(G_{loss} = -\log(0.5) = \log 2 \approx 0.693\)
训练困难与解决方案
GAN 的训练以不稳定著称。以下是几个核心问题及应对策略。
Mode Collapse(模式坍缩)
问题:生成器只学会生成少数几种样本,而忽略了数据分布的其他模式。例如,在 MNIST 数据集上,G 可能只会生成数字 "1" 和 "7",而不生成其他数字。
原因:G 发现某些样本特别容易骗过 D,于是"投机取巧"只生成这些样本。从优化角度看,这是因为 G 的目标函数并不直接惩罚多样性缺失。
解决方案:
- Minibatch Discrimination:让 D 同时看一批生成样本,检测其多样性
- Unrolled GAN:让 G 在优化时"展望" D 未来几步的更新
- WGAN:使用 Wasserstein 距离替代 JS 散度,从根本上缓解问题
训练不稳定
问题:D 太强时,G 收到的梯度接近零(梯度消失);D 太弱时,G 收到的梯度信号没有意义。两个网络必须保持微妙的平衡。
类比:就像一场师生对弈——老师太强学生学不到东西(每步都被碾压),老师太弱学生也学不到东西(每步都轻松获胜)。
解决方案:
- 仔细调节 D 和 G 的学习率和训练步数比例
- 使用 Spectral Normalization 约束 D 的 Lipschitz 常数
- 使用 Two-Timescale Update Rule (TTUR):D 用较大学习率,G 用较小学习率
梯度消失
问题:当 D 训练得太好时,\(D(G(z)) \approx 0\),原始损失 \(\log(1 - D(G(z))) \approx 0\),G 几乎无法获得梯度更新。
数学分析:在最优判别器 \(D^*\) 下,当 \(p_g\) 和 \(p_{data}\) 的支撑集不重叠时(高维空间中这几乎必然发生),JS 散度为常数 \(\log 2\),梯度为零。
解决方案:
- 使用 Non-saturating loss
- 使用 Wasserstein 距离(即使分布不重叠也能提供有意义的梯度)
- 对输入添加噪声(Instance Noise),使真假分布的支撑集重叠
评估困难
问题:不像分类任务有准确率、回归任务有 MSE,GAN 缺乏一个可靠的单一指标来衡量生成质量。训练损失本身不能反映生成质量——D 和 G 的损失都在振荡并不意味着训练失败。
常用评估指标:
| 指标 | 衡量内容 | 优点 | 缺点 |
|---|---|---|---|
| IS (Inception Score) | 生成质量 + 多样性 | 计算简单 | 不与真实数据对比 |
| FID (Frechet Inception Distance) | 生成分布与真实分布的距离 | 与人类判断相关性高 | 需要大量样本 |
| Precision & Recall | 质量 vs 覆盖率的权衡 | 分离了两个维度 | 计算复杂 |
FID 的直觉
FID 提取真实图像和生成图像在 Inception 网络中间层的特征,将两组特征各自建模为高斯分布,然后计算这两个高斯分布之间的 Frechet 距离。FID 越低,说明生成图像与真实图像越接近。
GAN 变体
GAN 的基本框架诞生后,涌现了大量改进变体,从架构设计、损失函数、训练策略等多个方向推动了生成模型的发展。
DCGAN (Deep Convolutional GAN, 2015)
DCGAN 是第一个成功将 CNN 引入 GAN 的工作,提出了一系列架构指导原则:
- 用步长卷积(Strided Convolution)替代池化层(Pooling)
- 在 G 和 D 中都使用 Batch Normalization(D 的输入层和 G 的输出层除外)
- 去掉全连接层,使用全卷积架构
- G 使用 ReLU 激活(输出层用 Tanh),D 使用 LeakyReLU
Generator 架构(DCGAN):
z ∈ R^100 → FC → Reshape(4×4×1024) → ConvT(512) → ConvT(256) → ConvT(128) → ConvT(3) → 64×64×3 图像
(每层都有 BN + ReLU,输出层用 Tanh)
Discriminator 架构(DCGAN):
64×64×3 图像 → Conv(128) → Conv(256) → Conv(512) → Conv(1024) → FC → Sigmoid
(每层都有 BN + LeakyReLU,输入层无 BN)
DCGAN 的意义在于证明了 GAN 可以生成较高质量的图像,并且学到了有意义的潜在空间表示(例如:戴眼镜男人 - 男人 + 女人 = 戴眼镜女人)。
WGAN (Wasserstein GAN, 2017)
WGAN 是 GAN 训练稳定性的重要突破,核心改动是将 JS 散度替换为 Wasserstein-1 距离(Earth Mover's Distance):
直觉上,Wasserstein 距离衡量的是"把一堆土从分布 \(p_g\) 搬到分布 \(p_{data}\) 所需的最小工作量"。
通过 Kantorovich-Rubinstein 对偶,WGAN 的目标函数变为:
关键改动:
- D(此时称为 Critic)的输出不再经过 Sigmoid,不再输出概率,而是输出一个实数分数
- 使用 Weight Clipping(将 D 的参数裁剪到 \([-c, c]\))来近似 Lipschitz 约束
- 去掉 D 中的 Batch Normalization(会破坏 Lipschitz 约束)
- 使用 RMSProp 优化器(不用基于动量的优化器如 Adam)
WGAN 解决了什么?
JS 散度在两个分布不重叠时恒为 \(\log 2\)(常数),梯度为零。而 Wasserstein 距离即使在分布不重叠时也是连续的、可微的,能持续为 G 提供有意义的梯度信号。同时,Critic 的损失可以作为训练进度的指标——它与生成质量正相关。
WGAN-GP (WGAN with Gradient Penalty, 2017)
WGAN 中的 Weight Clipping 是一种粗暴的做法,容易导致:权重集中在裁剪边界 \(\{-c, c\}\),限制了模型的表达能力。
WGAN-GP 提出用梯度惩罚替代 Weight Clipping:
其中 \(\hat{x}\) 是真实样本和生成样本之间的随机插值点,\(\lambda\) 通常取 10。
梯度惩罚强制 D 在整个空间中满足 1-Lipschitz 约束(梯度范数接近 1),训练更稳定,性能也更好。
Conditional GAN (cGAN, 2014)
条件 GAN 在 G 和 D 中都引入额外的条件信息 \(y\)(如类别标签):
这使得我们可以控制生成内容。例如,输入条件 \(y = \text{"数字5"}\),G 就专门生成数字 5 的图像。
Pix2Pix (2016)
Pix2Pix 将 cGAN 应用于成对的图像到图像翻译任务(如语义分割图 \(\to\) 真实照片、线稿 \(\to\) 彩色图)。
- G 使用 U-Net 架构(带跳跃连接的编码器-解码器)
- D 使用 PatchGAN:不是对整张图输出一个真/假判断,而是对图像的每个局部 patch 分别判断真假
- 损失 = cGAN 损失 + L1 重建损失
CycleGAN (2017)
CycleGAN 解决了无配对数据的图像翻译问题(如马 \(\leftrightarrow\) 斑马、夏天 \(\leftrightarrow\) 冬天)。
核心思想是循环一致性损失(Cycle Consistency Loss):
其中 G 把 A 域图像翻译到 B 域,F 把 B 域图像翻译回 A 域。循环一致性要求:先翻译过去再翻译回来,应该得到原图。
StyleGAN (2018-2021)
StyleGAN 系列(StyleGAN, StyleGAN2, StyleGAN3)在高质量人脸生成方面取得了突破性成果。
核心创新:
- 映射网络:\(z \to w\),先将噪声通过 8 层 MLP 映射到中间潜在空间 \(\mathcal{W}\)
- 自适应实例归一化 (AdaIN):通过 \(w\) 在每一层控制生成风格
- 噪声注入:在每一层注入随机噪声,控制细节变化(如头发纹理、皮肤毛孔)
- 渐进式训练(StyleGAN1)/ 跳跃连接(StyleGAN2)
StyleGAN2 生成的人脸图像达到了肉眼难以区分真假的水平(1024x1024 分辨率)。
Progressive GAN (2017)
Progressive GAN 提出渐进式增长训练:
训练阶段:4×4 → 8×8 → 16×16 → 32×32 → ... → 1024×1024
从低分辨率开始训练,逐步增加层数和分辨率。这种方法使训练更稳定,因为:
- 低分辨率阶段快速学习全局结构
- 高分辨率阶段只需学习精细细节
- 避免了一开始就在高维空间中优化的困难
GAN vs VAE vs Diffusion 对比
| 维度 | GAN | VAE | Diffusion |
|---|---|---|---|
| 建模方式 | 隐式密度(对抗训练) | 显式密度(变分推断) | 显式密度(去噪得分匹配) |
| 生成质量 | 高(锐利、逼真) | 中(常有模糊问题) | 很高(细节丰富) |
| 训练稳定性 | 差(需要精心调参) | 好(稳定收敛) | 好(简单的 MSE 损失) |
| 模式覆盖 | 差(Mode Collapse) | 好(优化似然) | 很好(优化似然) |
| 生成速度 | 快(单次前向传播) | 快(单次前向传播) | 慢(需要多步迭代去噪) |
| 可控性 | 中(需要条件化机制) | 好(有显式潜在空间) | 好(Classifier-free Guidance) |
| 似然计算 | 不可计算 | 可计算下界 (ELBO) | 可计算下界 |
| 典型应用 | 图像超分辨率、风格迁移 | 表示学习、异常检测 | 文本到图像生成 |
| 代表模型 | StyleGAN, BigGAN | VQ-VAE, DALL-E 1 | Stable Diffusion, DALL-E 2/3 |
一句话总结
GAN 生成快且锐利但训练困难;VAE 训练稳定但生成模糊;Diffusion 质量最高但生成最慢。
思考与讨论
GAN 为什么被 Diffusion 取代了?
从 2020 年 DDPM 开始,Diffusion 模型在图像生成领域逐步取代了 GAN 的统治地位。主要原因包括:
-
训练稳定性:Diffusion 模型的训练目标是简单的 MSE 去噪损失,不存在对抗训练中 G 和 D 需要平衡的问题。任何人都可以用标准的训练流程得到好结果,而 GAN 的训练需要大量 trick 和经验。
-
模式覆盖:Diffusion 模型优化的是对数似然(的下界),天然地倾向于覆盖数据分布的所有模式。GAN 的 Mode Collapse 问题始终没有被完美解决。
-
可扩展性:Diffusion 模型在大规模数据和大模型上的表现更好,Scale Up 的规律更清晰(类似于 LLM 的 Scaling Law)。
-
可控生成:Classifier-free Guidance 等技术让 Diffusion 模型的条件生成非常灵活,推动了 DALL-E 2、Stable Diffusion、Midjourney 等产品的成功。
GAN 在哪些领域仍然重要?
尽管在图像生成的"主赛道"上让位于 Diffusion,GAN 在以下场景中仍有不可替代的优势:
- 实时应用:GAN 只需一次前向传播即可生成,速度远快于需要数十到数百步去噪的 Diffusion 模型。在视频游戏、实时风格迁移、移动端应用中 GAN 仍是首选。
- 图像超分辨率:ESRGAN 等模型至今仍是超分辨率的主流方案。
- 图像编辑与操控:GAN Inversion 技术可以将真实图像映射回潜在空间进行编辑(如改变年龄、表情、发型)。
- 数据增强:用 GAN 生成合成数据来扩充训练集,在医学影像等数据稀缺的领域特别有价值。
- Diffusion 模型的加速:将 Diffusion 模型蒸馏为一步生成器时,常常使用对抗训练(如 SDXL-Turbo 中的 Adversarial Diffusion Distillation)。
对抗训练思想的更广泛影响
GAN 提出的对抗训练范式远超出了图像生成的范畴,深刻影响了机器学习的多个领域:
- 对抗样本与鲁棒性:对抗训练是提升模型鲁棒性的核心方法(Adversarial Training for Robustness)
- 域适应(Domain Adaptation):通过对抗训练学习域不变特征(如 DANN)
- 文本生成:SeqGAN 等将 GAN 思想引入离散序列生成(尽管效果有限)
- 强化学习:GAIL(Generative Adversarial Imitation Learning)用对抗训练做模仿学习
- 公平性:用对抗训练去除模型中的敏感属性信息
- 隐私保护:对抗训练被用于差分隐私和联邦学习中
历史地位
GAN 可能不再是最优的图像生成方案,但它对深度学习领域的贡献是永久性的:它证明了隐式密度建模的可行性,开创了对抗训练的范式,启发了无数后续工作。正如 Goodfellow 本人所说,GAN 最重要的贡献不是某个具体的模型,而是一种全新的训练方法论。
参考文献
- Goodfellow, I., et al. (2014). Generative Adversarial Nets. NeurIPS.
- Radford, A., et al. (2015). Unsupervised Representation Learning with Deep Convolutional Generative Adversarial Networks (DCGAN). ICLR.
- Arjovsky, M., et al. (2017). Wasserstein GAN. ICML.
- Gulrajani, I., et al. (2017). Improved Training of Wasserstein GANs (WGAN-GP). NeurIPS.
- Mirza, M. & Osindero, S. (2014). Conditional Generative Adversarial Nets. arXiv.
- Isola, P., et al. (2016). Image-to-Image Translation with Conditional Adversarial Networks (Pix2Pix). CVPR.
- Zhu, J.-Y., et al. (2017). Unpaired Image-to-Image Translation using Cycle-Consistent Adversarial Networks (CycleGAN). ICCV.
- Karras, T., et al. (2018). Progressive Growing of GANs. ICLR.
- Karras, T., et al. (2019). A Style-Based Generator Architecture for Generative Adversarial Networks (StyleGAN). CVPR.
- Karras, T., et al. (2020). Analyzing and Improving the Image Quality of StyleGAN (StyleGAN2). CVPR.