GAN系列
GAN 系列笔记
核心定义
生成对抗网络 (Generative Adversarial Network, GAN) 由 Ian Goodfellow 于 2014 年提出。它利用博弈论的思想,通过两个神经网络——生成器 (G) 和 判别器 (D) 的相互对抗,学习数据的分布并生成逼真的新样本。
1. 核心原理与架构
1.1 对抗流程
GAN 的本质是一个 Minimax Game (极小极大博弈)。
graph LR
Z["随机噪声 z"] --> G["生成器 G"]
G --> Fake["假样本 G(z)"]
Real["真实样本 x"] --> D["判别器 D"]
Fake --> D
D --> Result{"判断真/假"}
Result -.->|反馈梯度| G
Result -.->|反馈梯度| D1.2 目标函数
$$ \min_G \max_D V(D, G) = \mathbb{E}_{x \sim p_{data}}[\log D(x)] + \mathbb{E}_{z \sim p_z}[\log(1 - D(G(z)))] $$- 判别器 D:目标是最大化 $V(D,G)$,即尽可能准确区分真假。
- 生成器 G:目标是最小化 $\log(1-D(G(z)))$,即让判别器无法区分真假。
2. 深度拆解:为什么 GAN 这么难训练?
2.1 理论症结:JS 散度的“病态”
原生 GAN 的目标函数在本质上是最小化真实分布 $P_r$ 与生成分布 $P_g$ 之间的 JS 散度。然而,JS 散度在 GAN 的场景下存在严重的数学缺陷。
核心难题:非重叠区域梯度消失
- 在高维空间中,真实分布 $P_r$ 和生成分布 $P_g$ 通常分布在低维流形上。
- 两个低维流形在整个高维空间中几乎不重叠(测度为 0)。
- 结论:当两个分布完全不重叠时,JS 散度恒等于常数 $\log 2$。常数的导数为 0,这意味着生成器 G 无法获得任何梯度信息来调整自己的权重,从而导致“原地打转”。
2.2 形象比喻:瞎子带路
判别器 D 就像一个恢复视力的向导,生成器 G 是一辆车。如果向导 D 恢复得太快(太强),他给出的指令会变得极其抽象(梯度消失),导致 G 根本听不懂,最后原地崩溃。
3. GAN 训练优化工具箱
3.1 架构与约束 (Structural Constraints)
- Spectral Normalization (谱归一化, SN):通过约束每一层权重的谱半径,使其满足 Lipschitz 连续性,防止梯度爆炸。
- WGAN / WGAN-GP:用 EM 距离 (Wasserstein 距离) 替代 JS 散度,即使分布不重叠也能提供连续梯度。
- LSGAN:用最小二乘损失替代 sigmoid 交叉熵损失,等价于最小化 Pearson $\chi^2$ 散度,同样缓解梯度消失。详见 5.1 节。
- PatchGAN:判别器改为对图像的每个 N×N patch 分别判断真伪,专注局部纹理真实性,常用于 image-to-image 任务。详见 5.2 节。
3.2 训练技巧 (Training Heuristics)
- TTUR (双尺度学习率):D 跑得比 G 快一点,有助于达到平衡。
- Label Smoothing:防止 D 过度自信导致的梯度饱和。
3.3 评估指标 (Evaluation)
- FID (越低越好):捕捉图像质量与多样性,目前最主流。
- IS (越高越好):评价生成的确定性和多样性。
4. 重点补全:数学基石 - 散度与距离
为了深刻理解 GAN 的演进,必须掌握以下四个数学工具:
4.1 KL 散度 (Kullback-Leibler Divergence)
$$ D_{KL}(P||Q) = \int P(x) \log \frac{P(x)}{Q(x)} dx $$- 特性:不对称性 ($D_{KL}(P||Q) \neq D_{KL}(Q||P)$)。
- 代价:如果用 KL 散度训练 GAN,会面临“宽容”或“严苛”的抉择,容易产生 Mode Collapse 或 垃圾样本。
4.2 JS 散度 (Jensen-Shannon Divergence)
$$ D_{JS}(P||Q) = \frac{1}{2} D_{KL}(P || \frac{P+Q}{2}) + \frac{1}{2} D_{KL}(Q || \frac{P+Q}{2}) $$- 改进点:
- 对称性:$D_{JS}(P||Q) = D_{JS}(Q||P)$。
- 有界性:取值范围在 $[0, \log 2]$ 之间。
- 致命缺陷:当 $P$ 和 $Q$ 不重叠时,$D_{JS}$ 恒为 $\log 2$,导致产生阶跃函数,梯度消失。
4.3 Wasserstein 距离 (Earth Mover’s Distance)
$$ W(P, Q) = \inf_{\gamma \in \Pi(P, Q)} \mathbb{E}_{(x,y) \sim \gamma} [\|x-y\|] $$深度直觉对比
- JS 散度 (本地视角):关心的是“分布是否重合”。一旦不重合,它就认为是常数 $\log 2$,无法提供方向引导。这导致了原生 GAN 训练初期的梯度消失。
- W 距离 (全局视角):关心的是“搬运代价”。即使分布完全不重合,它也能感应到两个分布之间的空间几何距离。想象搬运工告诉你:“虽然还没搬到,但你离目标还有 10 米”,从而提供持续平滑的梯度。
WGAN 的数学魔术:对偶变换 (Duality)
由于原始定义(求下确界)在计算机中无法直接计算,WGAN 利用 Kantorovich-Rubinstein 对偶性 将其转化为:
$$ W(P_r, P_g) \approx \max_{w \in \mathcal{W}} \mathbb{E}_{x \sim P_r}[f_w(x)] - \mathbb{E}_{z \sim p_z}[f_w(g_\theta(z))] $$- Critic (判别器):不再给出真假概率,而是给出一个“评分” $f_w$。目标是让真样本得分高,假样本得分低。
- 1-Lipschitz 约束:为了保证 $W$ 距离有界,评分函数 $f_w$ 的变化不能太剧烈(斜率受限)。WGAN 通过 Weight Clipping 或 Gradient Penalty 来实现这一约束。这也是 WGAN 稳如老狗的数学基石。
4.4 Pearson $\chi^2$ 散度 (Pearson Chi-Square Divergence)
$$ D_{Pearson}(P \| Q) = \int \frac{(P(x) - Q(x))^2}{Q(x)} dx $$与 JS 散度的关键差异
即使 $P$ 和 $Q$ 完全不重叠,Pearson $\chi^2$ 散度依然能给出非零、有意义的梯度,不会像 JS 散度那样在不重叠区域退化为常数 $\log 2$。LSGAN(见 5.1)的最小二乘损失在理论上等价于最小化真实分布与生成分布之间的 Pearson $\chi^2$ 散度,这是它能缓解梯度消失问题的数学根源。
四种散度/距离对比:
| KL 散度 | JS 散度 | Pearson $\chi^2$ | Wasserstein 距离 | |
|---|---|---|---|---|
| 对称性 | 非对称 | 对称 | 对称 | 对称 |
| 值域 | $[0, +\infty]$ | $[0, \log 2]$ | $[0, +\infty]$ | $[0, +\infty]$ |
| 分布不重叠时 | $+\infty$(爆炸) | $\log 2$(梯度消失) | 有意义梯度 | 有意义梯度(几何距离) |
| 对应 GAN 变体 | — | 原生 GAN (2014) | LSGAN (2017) | WGAN |
5. 经典生成模型演进
5.1 LSGAN (Least Squares GAN)
论文:Mao et al., Least Squares Generative Adversarial Networks, ICCV 2017
核心思想
原生 GAN 的判别器使用 sigmoid 交叉熵损失,存在两个缺陷:
- 梯度消失:sigmoid 在两端饱和,生成器梯度趋近于 0,训练不稳定
- 生成质量不高:交叉熵只关心"是否骗过判别器",不关心生成样本与真实数据的距离
LSGAN 用最小二乘损失替代交叉熵损失来解决这两个问题。
损失函数
$$ L_D = \frac{1}{2} \mathbb{E}_{x \sim p_{data}}[(D(x) - a)^2] + \frac{1}{2} \mathbb{E}_{z \sim p_z}[(D(G(z)) - b)^2] $$$$ L_G = \frac{1}{2} \mathbb{E}_{z \sim p_z}[(D(G(z)) - c)^2] $$其中 $a$ 为真实样本标签(通常 =1)、$b$ 为生成样本标签(通常 =0)、$c$ 为生成器想让判别器相信的值(通常 =1)。
为什么有效
- 非饱和:最小二乘损失只在一点饱和,不像 sigmoid 交叉熵在分类正确时迅速饱和(梯度=0)
- 拉向决策边界:即使某个生成样本已经骗过判别器,只要它仍偏离决策边界较远,也会被继续拉向决策边界,从而更接近真实数据分布
- 等价于最小化 Pearson $\chi^2$ 散度:详见 4.4 节
架构与效果
- 通常基于 DCGAN 结构搭建,可直接把 DCGAN 的目标函数替换为最小二乘损失(额外使用一些 stride=1 的卷积层)
- 优点:生成图片质量更高、训练过程更稳定、收敛速度快于 WGAN
5.2 PatchGAN
论文:Isola et al., Image-to-Image Translation with Conditional Adversarial Networks, CVPR 2017 (pix2pix)
核心思想
标准判别器输出一个标量代表整张图真/假,PatchGAN 则对图像的每个 N×N patch 分别判断真伪,最后取平均。
为什么需要
在 image-to-image translation 任务中(风格迁移、边缘转照片等):
- 需要保证像素级别的局部一致性
- 整图判断过于粗糙,抓不住局部纹理是否真实
- 高分辨率图像中,远距离像素之间的依赖关系较弱,没必要用全局感受野
结构与感受野
PatchGAN 本质上是一个全卷积网络(无全连接层),输出一个 $N \times N$ 的 score map,每个位置代表原图对应 patch 的真伪判断,最终取平均得到一个标量。
感受野计算:
$$ \text{感受野} = (n-1) \times \text{stride} + \text{kernel size} $$例如 kernel=4、stride=2 的 3 层卷积 → 感受野 10×10,对应 pix2pix 论文中配置的 70×70 patch。常见 PatchGAN 尺寸:1×1(即 PixelGAN,仅约束色彩分布)、16×16、70×70(pix2pix 默认)、256×256(更细粒度)。
特点
- 参数量少(没有全连接层)
- 可处理任意尺寸输入(完全卷积)
- 专注于纹理/风格层面的判别,而非全局结构
5.3 LSGAN 与 PatchGAN 对比
| 特性 | LSGAN | PatchGAN |
|---|---|---|
| 提出目的 | 解决训练不稳定、梯度消失 | 解决图像局部细节真实性 |
| 改进位置 | 损失函数 | 判别器结构(感受野) |
| 适用场景 | 通用图像生成 | image-to-image translation、局部纹理判别 |
| 与原生 GAN 关系 | 改进 loss | 改进 discriminator 架构 |
| 是否可叠加 | 可与 PatchGAN 结合使用 | 可与 LSGAN loss 结合使用 |
实践组合:pix2pix
pix2pix 同时使用 PatchGAN(70×70)判别器结构与 L1 正则项:
$$ L = L_{cGAN}(G,D) + \lambda L_{L1}(G) $$实践中可以进一步把 $L_{cGAN}$ 中判别器的交叉熵损失替换为 LSGAN 的最小二乘损失,二者不冲突,可以叠加使用。patch 越小感受野越小、判别越细但可能过严,patch 越大则相反,实际常用 70×70 作为平衡点。
(此处保留后续各模型 (StyleGAN, CycleGAN 等) 的详细分析…)
6. 面试/复习高频考点
快速通关
- Q: 为什么 WGAN 解决了训练不稳定的问题?
- A: WGAN 将损失函数从 JS 散度(在不重叠时梯度消失)切换到了 Wasserstein 距离,确保了梯度的连续性,同时通过 Lipschitz 约束限制了判别器的权重变化。
- Q: LSGAN 为什么能缓解梯度消失?
- A: 原生 GAN 的 sigmoid 交叉熵损失在分类正确时迅速饱和,梯度趋于 0;LSGAN 改用最小二乘损失,只在一点饱和,且理论上等价于最小化 Pearson $\chi^2$ 散度——即使真假分布不重叠也能提供有意义梯度,同时把偏离决策边界的样本继续拉近,从而生成质量更高。
- Q: PatchGAN 和普通判别器有什么区别?
- A: 普通判别器输出一个标量代表整张图真假;PatchGAN 是全卷积网络,输出 N×N 的 score map,对图像的每个 patch 分别判断真伪再取平均,专注于局部纹理的真实性,常用于 pix2pix 等 image-to-image 任务。