跳到主要内容

生成对抗网络 — 用博弈定义「像不像」

这一章讲三件事: 「生成」这个问题难在哪(要造一张「像」的图,先得定义「像」); GAN 怎么用两张网络的博弈把定义这件事甩给训练; 以及它的三个变体:点菜式生成、虚拟染色、不配对换域。 主走查是训练循环的 12 步——GAN 的全部运行时行为都在这 12 步里。

1. 顶层全景

噪声 z ~ N(0,1) ──▶ ┌──────────┐ 真实数据 x
(100 维随机数) │ 生成器 G │──┐ │
└──────────┘ ▼ ▼
假图 G(z) 真图 x
│ │
▼ ▼
┌──────────────────┐
│ 判别器 D:真 or 假? │──▶ 0~1 一个数
└──────────────────┘

D 的答案同时喂给两个网络当"损失"

图说:G 想让 D 把假图判成真(输出趋近 1),
D 想把真假分开(真的输出 1、假的输出 0)。
两人的目标正面相撞——这就是"对抗"的全部含义[^1]。

2. 核心原理

2.1 问题:损失函数没法手写

生成模型要回答「新样本像不像训练数据」,前提是学会数据的分布。 autoencoder 和 VAE 的路线(第 06 章)是压进潜空间、再对潜空间的分布做假设。 GAN 换了一条前所未有的路:再造一张网络来定义和更新损失—— 损失函数不是人写的公式,而是判别器在训练中「活」出来的1

具体分工:生成器 G 从纯噪声(潜空间采样,角色像 autoencoder 的解码器)造出假数据; 判别器 D 做真/假二分类,输出 0 到 1 的一个数。D 是二分类器(做二选一判断的模型),用的还是第 03 章的 BCE 损失(二元交叉熵)——唯一的不同:「假」这一类的样本在持续变化,因为 G 在变强2

两个损失,四个式子讲完3:

D 对真图的损失:L(真) = -log D(x) ← D 该把真图判 1,判得越低罚得越重
D 对假图的损失:L(假) = -log(1 - D(G(z))) ← D 该把假图判 0
D 的总损失 = 两者平均
G 的损失 = -log D(G(z)) ← 注意:G 用的是"真"标签!

G 的损失是最妙的一步:造假者不看「真假」的客观标准,只看「骗过裁判没有」—— 它把假图标成真(标签取 1)来算自己的损失,损失越小=骗得越成功4。 双方各退一步的表述:G 在最大化 D 损失里的假图项,D 在最小化它——同一项,两个方向5。 这就是 2014 年 Goodfellow 那篇开山论文定义的对抗目标6

2.2 主走查:训练循环 12 步

GAN 的训练是两块网络的交替更新,原书给了完整步骤表7。走一遍,数值随手算 (凡是我编的数都注明;比例与逻辑按原书):

① 从数据集抽一张真图 x(如一张 MNIST 手写数字,已缩放到 64×64、像素值 -1~1[^9])
② 算 D(x)。设此刻 D 对真图给 0.8(演示值)
③ 真图损失 = -log(0.8) ≈ 0.22
④ 抽一个 100 维噪声 z ~ N(0,1)
⑤ 假图 = G(z)
⑥ 算 D(G(z))。设此刻 D 对假图给 0.3(演示值)——D 还挺警觉
⑦ 假图损失 = -log(1-0.3) ≈ 0.36
⑧ D 的总损失 = (0.22+0.36)/2 = 0.29 ← 这 0.29 只用于更新 D
⑨ 反向传播,更新 D:让 D(x) 更高、D(G(z)) 更低
⑩ 换算 G 的损失 = -log D(G(z)) = -log(0.3) ≈ 1.20
⑪ 反向传播,更新 G(注意:D 此刻不动):让 D(G(z)) 变高
⑫ 回到 ①。直到两边损失都不再单边下降——原书说找的是"平衡",
不是"最小值"[^10]

第 ⑨ 和 ⑪ 步的「交替、互不干扰」是 GAN 训练的纪律: 更新 D 时 G 冻结,更新 G 时 D 冻结。谁先动、动多狠(学习率),都会打破天平。

2.3 工程细节:DCGAN 配置单

手写数字项目用的是 DCGAN(深度卷积版 GAN),配置单原书给得极细8:

部件配置
生成器4 层转置卷积(上采样),各配批归一化+ReLU,出口 tanh;输入 100 维噪声
判别器4 层卷积,各配批归一化+LeakyReLU,出口 0~1
数据MNIST 放大到 64×64,归一化到 −1~1(与生成器出口 tanh 的值域对齐)9
权重初始化正态(均值 0、标准差 0.02)——原书明说此举防 mode collapse10
优化器两个 Adam,学习率 0.0002,动量参数 β 取 (0.5, 0.999)——比默认更保守,为保两边平衡11
硬件GPU 必备:CPU 上一轮要几小时,GPU 只要几分钟12

2.4 训练为什么难:平衡,不是收敛

理想终点:G 造出完美假图,D 只能瞎猜——对每张图输出 0.5 左右,损失停在约 0.5。 原书明说:这个平衡在实践中极难达到13。 常见的翻车形态:

  • 损失大幅震荡或发散——两边拉锯的常态,不是 bug 但要盯;
  • mode collapse(模式坍缩):G 找到一两个「必骗过 D」的固定图案,反复输出它, 多样性全无。原书给的对策:给标签加噪声、调学习率14; 初始化(0.02)和保守的 β 也是同一目的1011

读 GAN 训练曲线的姿势因此和别的网络相反:两边损失都「稳在高位」不一定是坏事, 一边归零反而是警报(D 完胜,G 学不到东西;或 G 骗爆 D,判别器形同虚设)。

2.5 三个变体:点菜、换染料、换显微镜

条件 GAN(9A):基础 GAN 只能「随机生成一张手写数字」,不能点名要「4」。 把类别标签一并喂给 G 和 D,生成过程就有了开关——「生成一个 4」变成一句可执行的指令15

虚拟染色(9B):荧光显微要给细胞上化学染料才能看清结构,但染色有侵入性、 常用有毒物质,还会改变细胞状态16。条件 GAN 学「明场图 → 荧光图」的映射, 直接算出染色效果——细胞完好无损,结构照样看清。数据来自 Christiansen 等 2018 年 「In Silico Labeling」的开创性工作17。GAN 在科学成像的第一个大放异彩的应用。

CycleGAN(9C):虚拟染色需要「同一视野的明场-荧光成对图像」; 换成全息显微镜↔明场显微镜,成对拍根本做不到(动态样品等不得两台显微镜换位)18CycleGAN 的答案是放弃配对:两个方向的生成器(明场→全息、全息→明场)各配判别器, 再加一条循环一致约束——真图 A 变到 B 域再变回来,要变回 A 自己。 没有配对数据,靠「可逆」这个约束锁住内容19

3. 作者的判断与证据

  • 有证据的:DCGAN 生成的数字图、真假损失曲线的拉锯、虚拟染色与真染色的对照图、 全息↔明场的转换样例,全是实测。
  • 作者的判断(原话级别):平衡「极难达到」13;初始化 0.02「防 mode collapse」10—— 前者是坦白,后者是经验值。
  • 对比判断:GAN 相对 autoencoder 家族的改进点被原书明确归在「损失由判别器现场定义」, 代价则是训练不稳定——这笔交易在第 12 章(扩散模型)还会重新算一次账。

4. 边界与局限

边界说明
没有收敛判据损失值不对应生成质量;什么时候停只能看图
mode collapse 随时伺机多样性丧失是结构性的,只能缓解
要成对数据的变体(虚拟染色)配对数据贵;CycleGAN 免配对但约束更弱、质量通常略降
判别器是「相对真值」它只认训练集的真;训练集有偏,GAN 学到的「像」也有偏
算力门槛全书唯二点名「没 GPU 跑不动」的章之一(另一个是第 12 章)12

5. 可带走的

  1. GAN 的核心创新:损失函数由另一张网络现场定义,「像不像」不再人写公式;
  2. G 的损失 = -log D(G(z))——造假者只对裁判负责;
  3. 训练找的是平衡不是最小值:理想终点是 D 输出 0.5、损失 0.5,实践中极难达到;
  4. 更新纪律:交替、冻结对方;D 全胜或 G 全胜都是警报;
  5. DCGAN 配置单是可复用的起点:0.02 初始化、Adam β=(0.5,0.999)、数据归一到 −1~1;
  6. 条件 GAN = 把标签接进 G 和 D,生成从抽签变点菜;
  7. 虚拟染色:学「明场→荧光」映射,免染料看结构——科学成像的招牌应用;
  8. CycleGAN = 不配对换域:循环一致(去而复返仍是原图)替代配对监督。

6. 原文地图

主题原书章原文位置
损失由判别器定义(相对 AE/VAE)Understanding GANstext/65-fm-understanding-gans.txt:7(搜「separate neural network」)
G/D 分工Understanding GANstext/65-fm-understanding-gans.txt:13(搜「pure noise」) · text/65-fm-understanding-gans.txt:15(搜「differentiates real data」)
动态损失Understanding GANstext/65-fm-understanding-gans.txt:17(搜「dynamically learned loss function」)
D 是二分类、假类在变Understanding GANstext/65-fm-understanding-gans.txt:21(搜「constantly changing」)
BCE 与四个损失式Understanding GANstext/65-fm-understanding-gans.txt:23(搜「binary cross-entropy」) · text/65-fm-understanding-gans.txt:31(搜「log(D(x))」) · text/65-fm-understanding-gans.txt:47(搜「log(D(G(z)))」)
G 最大化 D 的假图项Understanding GANstext/65-fm-understanding-gans.txt:51(搜「maximize」)
对抗目标与 GoodfellowUnderstanding GANstext/65-fm-understanding-gans.txt:53(搜「adversarial objective」)
训练循环 12 步Understanding GANstext/65-fm-understanding-gans.txt:57(搜「training loop」) · text/65-fm-understanding-gans.txt:59(搜「Sample a real data point」)
找平衡不找最小值Understanding GANstext/65-fm-understanding-gans.txt:83(搜「achieve an equilibrium」)
数据归一 −1~1Generating Digits with a GANtext/66-fm-generating-digits-with-a-gan.txt:17(搜「vanishing or exploding gradients」)
GPU/CPU 对比Generating Digits with a GANtext/66-fm-generating-digits-with-a-gan.txt:58(搜「several hours」)
G/D 结构Generating Digits with a GANtext/66-fm-generating-digits-with-a-gan.txt:73(搜「hyperbolic tangent」) · text/66-fm-generating-digits-with-a-gan.txt:88(搜「leaky ReLU」)
初始化 0.02 防 mode collapseGenerating Digits with a GANtext/66-fm-generating-digits-with-a-gan.txt:92(搜「0.02」)
Adam β 保守取值Generating Digits with a GANtext/66-fm-generating-digits-with-a-gan.txt:126(搜「balance the trade-off」)
理想平衡 0.5Generating Digits with a GANtext/66-fm-generating-digits-with-a-gan.txt:270(搜「50 percent chance」)
震荡与 mode collapse 对策Generating Digits with a GANtext/66-fm-generating-digits-with-a-gan.txt:272(搜「adding noise to the labels」)
条件 GANProject 9A: Generating Digits with a Conditional GANtext/67-fm-project-9a-generating-digits-with-a-conditional-.txt:3(搜「conditional GAN」)
染色的毒性Project 9B: Virtually Staining a Biological Tissuetext/68-fm-project-9b-virtually-staining-a-biological-tissu.txt:3(搜「toxic substances」)
虚拟染色定义Project 9B: Virtually Staining a Biological Tissuetext/68-fm-project-9b-virtually-staining-a-biological-tissu.txt:5(搜「virtual staining」)
In Silico LabelingProject 9B: Virtually Staining a Biological Tissuetext/68-fm-project-9b-virtually-staining-a-biological-tissu.txt:11(搜「In Silico Labeling」)
全息 vs 明场Project 9C: Converting Between Holographic and Bright-Field Microscopy Imagestext/69-fm-project-9c-converting-between-holographic-and-br.txt:3(搜「Holographic microscopy captures」)
配对难题Project 9C: Converting Between Holographic and Bright-Field Microscopy Imagestext/69-fm-project-9c-converting-between-holographic-and-br.txt:5(搜「coregistered」)
CycleGAN 解法Project 9C: Converting Between Holographic and Bright-Field Microscopy Imagestext/69-fm-project-9c-converting-between-holographic-and-br.txt:7(搜「CycleGANs offer」)
GAN 谱系Seminal Works and Further Readingtext/71-fm-seminal-works-and-further-reading.txt:3(搜「Generative Adversarial Networks」) · text/71-fm-seminal-works-and-further-reading.txt:7(搜「Cycle-Consistent」)

Footnotes

  1. 出处:「Understanding GANs」第 7 段(text/65-fm-understanding-gans.txt:7,搜「separate neural network」)、第 17 段(text/65-fm-understanding-gans.txt:17,搜「dynamically learned loss function」)。

  2. 出处:「Understanding GANs」第 21 段(text/65-fm-understanding-gans.txt:21,搜「constantly changing」)、第 23 段(text/65-fm-understanding-gans.txt:23,搜「binary cross-entropy」)。

  3. 出处:「Understanding GANs」第 31 段(text/65-fm-understanding-gans.txt:31,搜「log(D(x))」)、第 35 段(text/65-fm-understanding-gans.txt:35,搜「1−D(G(z))」)、第 37 段(text/65-fm-understanding-gans.txt:37,搜「average of the loss functions」)、第 47 段(text/65-fm-understanding-gans.txt:47,搜「log(D(G(z)))」)。

  4. 出处:「Understanding GANs」第 45-49 段(text/65-fm-understanding-gans.txt:45,搜「setting the ground-truth label y = 1」)。

  5. 出处:「Understanding GANs」第 51 段(text/65-fm-understanding-gans.txt:51,搜「maximize」)。

  6. 出处:「Understanding GANs」第 53 段(text/65-fm-understanding-gans.txt:53,搜「adversarial objective」)。

  7. 出处:「Understanding GANs」第 57-81 段(text/65-fm-understanding-gans.txt:57,搜「training loop」)、第 59 段(text/65-fm-understanding-gans.txt:59,搜「Sample a real data point」)。

  8. 出处:「Generating Digits with a GAN」第 73-75 段(text/66-fm-generating-digits-with-a-gan.txt:73,搜「hyperbolic tangent」)、第 88-90 段(text/66-fm-generating-digits-with-a-gan.txt:88,搜「leaky ReLU」)。

  9. 出处:「Generating Digits with a GAN」第 17 段(text/66-fm-generating-digits-with-a-gan.txt:17,搜「vanishing or exploding gradients」)。

  10. 出处:「Generating Digits with a GAN」第 92 段(text/66-fm-generating-digits-with-a-gan.txt:92,搜「0.02」)。 2 3

  11. 出处:「Generating Digits with a GAN」第 126 段(text/66-fm-generating-digits-with-a-gan.txt:126,搜「balance the trade-off」)。 2

  12. 出处:「Generating Digits with a GAN」第 58 段(text/66-fm-generating-digits-with-a-gan.txt:58,搜「several hours」)与「INTRODUCTION」第 52 段(text/08-fm-introduction.txt:52,搜「without a GPU」)。 2

  13. 出处:「Generating Digits with a GAN」第 270 段(text/66-fm-generating-digits-with-a-gan.txt:270,搜「50 percent chance」)。 2

  14. 出处:「Generating Digits with a GAN」第 272 段(text/66-fm-generating-digits-with-a-gan.txt:272,搜「adding noise to the labels」)。

  15. 出处:「Project 9A: Generating Digits with a Conditional GAN」第 3 段(text/67-fm-project-9a-generating-digits-with-a-conditional-.txt:3,搜「conditional GAN」)。

  16. 出处:「Project 9B: Virtually Staining a Biological Tissue」第 3 段(text/68-fm-project-9b-virtually-staining-a-biological-tissu.txt:3,搜「toxic substances」)。

  17. 出处:「Project 9B: Virtually Staining a Biological Tissue」第 5 段(text/68-fm-project-9b-virtually-staining-a-biological-tissu.txt:5,搜「virtual staining」)、第 11 段(text/68-fm-project-9b-virtually-staining-a-biological-tissu.txt:11,搜「In Silico Labeling」)。

  18. 出处:「Project 9C: Converting Between Holographic and Bright-Field Microscopy Images」第 5 段(text/69-fm-project-9c-converting-between-holographic-and-br.txt:5,搜「coregistered」)。

  19. 出处:「Project 9C: Converting Between Holographic and Bright-Field Microscopy Images」第 7 段(text/69-fm-project-9c-converting-between-holographic-and-br.txt:7,搜「CycleGANs offer」)。