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 -.->|反馈梯度| D

1.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 的场景下存在严重的数学缺陷。

核心难题:非重叠区域梯度消失
  1. 在高维空间中,真实分布 $P_r$ 和生成分布 $P_g$ 通常分布在低维流形上。
  2. 两个低维流形在整个高维空间中几乎不重叠(测度为 0)。
  3. 结论:当两个分布完全不重叠时,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 交叉熵损失,存在两个缺陷:

  1. 梯度消失:sigmoid 在两端饱和,生成器梯度趋近于 0,训练不稳定
  2. 生成质量不高:交叉熵只关心"是否骗过判别器",不关心生成样本与真实数据的距离

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 对比

特性LSGANPatchGAN
提出目的解决训练不稳定、梯度消失解决图像局部细节真实性
改进位置损失函数判别器结构(感受野)
适用场景通用图像生成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 任务。