跳到主要内容

生成式模型 — VAE 的分布与 GAN 的博弈

这一章讲三件事: 自编码器为什么「会压缩不会创作」,VAE 怎么用一条分布约束补上这个缺陷; GAN 怎么把「造图」变成两个网络的对局,以及它为什么训练起来出名的难; 想控制生成结果(「给我一个 8」)时,CGAN 加了什么。 这是原书「三大硬骨头」的最后一块,也是第 12 章生成式实战的理论底座。

1. 顶层全景:两条通往「会造」的路

判别模型:x → y(图片 → 类别) 学习能力
生成模型:y → x(规则/噪声 → 图片) 创新能力

路线一 VAE:图片 → 编码 → 潜在空间(强制服从正态分布) → 解码 → 图片
损失 = 重建得像(BCE) + 空间像正态(KL 散度)
路线二 GAN:噪声 z → 生成器 → 假图 ─┐
├→ 判别器:真图还是假图?
真图 ────────────────────┘
损失 = 双方各自的对局得分(没有统一的最小化目标)

书里给两条路线的分野画得很准:GAN 基于博弈论,目标是生成器与判别器达到纳什均衡(谁也占不到对方便宜的僵持点);VAE 根植贝叶斯(从结果反推原因的统计派)推理,目标是把潜在空间本身建模好,从中采样出新数据1

2. 自编码器为什么不会创作

自编码器(AE)的结构像压缩:输入图 → 编码器压成一个低维向量 z → 解码器(还原的那一半)照着 z 还原原图,训练目标就是「还原得像」2。它学到的是一个能压缩能解压的系统——但它不会创作。书里指出的病灶很具体:z 都是从某张具体图片编码来的,潜在空间里任意取一个点解码出来的不是图,是噪声——空间不连续、没结构,「无法产生新的内容」3

3. VAE:给潜在空间加一条正态约束

VAE(变分自编码器)的改动只有一处,却直击病灶:强迫编码器输出的潜在空间服从正态分布。正态分布连续,处处都有取值——从里面任何位置取点都能解出一张合理的图4。实现上是「编码器输出两个向量」:均值 mu 和方差的 log_var(对数:把乘除变成加减的运算)(正态分布由这两个参数唯一确定,用网络拟合它们,书里说「简单效果也不错」)5

怎么从分布里取一个点? 这里有个很聪明的间接法——不直接从 N(mu, σ) 采样(采样不可导,梯度断在这里),而是从标准正态采一个噪声 ε,再拼回去:z = mu + exp(log_var/2)·ε(书里的式 8-1)6。随机性由 ε 提供,梯度沿 mu 和 log_var 流动,整个系统端到端(从输入到输出一条线直训)可训——这一步的名字叫重参数化。ε 的随机性同时保证了空间的连续性与良好结构:每个方向都对应数据里有意义的变化(笔画粗细、倾斜角度)7

损失函数是两项之和,正好对应两个要求8:

loss = 重构损失 + KL 散度
= BCE(重建图, 原图) 「造得像不像」
+ (−0.5·Σ(1 + log_var − mu² − exp(log_var))) 「分布像不像正态」

KL 散度(Kullback-Leibler divergence):衡量两个分布差多远的量,
两分布完全重合时为 0。第一项拉着重构贴近原图,第二项拉着空间贴近正态。

书里的实现:MNIST,784 维输入、潜在维 20、训练 30 轮;训练完把 z 直接喂解码器,产出的新数字形态完好9

4. GAN:造假者与验钞机的对局

GAN(生成对抗网络,Ian Goodfellow 2014)换掉整套思路。书里的比喻一针见血:像一台验钞机和一台造假币机器的博弈——假币越造越像,验钞机越验越精,直到验钞机分不出真假10;另一个版本是伪造者与艺术商人:伪造者把赝品混进真迹请商人鉴定,根据反馈改进,最终「拥有了一些非常逼真的赝品」11

落到网络上是两个角色12:生成器 G 吃一个潜在空间的随机向量,吐一张合成图;判别器 D 吃一张图(真图或假图),输出「来自训练集」的概率。本章的主走查是训练循环里的一步,看两个损失怎么定义(标签:真图=1,假图=0)13:

── 训练判别器 D(它要越验越准)──
D(真图) 对比标签 1 → d_loss_real 真的应该认真
z→G(z)=假图 → D(假图) 对比标签 0 → d_loss_fake 假的应该认假
d_loss = d_loss_real + d_loss_fake ← 两半缺一不可

── 训练生成器 G(它要越造越像)──
z→G(z)=假图 → D(假图) 对比标签 1 → g_loss
↑ 注意:还是那张假图、还是过 D,
但标签改成「真」——D 不动,G 学着把 D 骗成「真」

GAN 与普通网络最本质的差别在这一句:它不是求某个损失的最小值,而是保持生成与判别两股力量的动态平衡——所以训练比一般神经网络难得多14

5. 两套架构,两条死穴

书里把 VAE 与 GAN 的账算得很清楚,值得整表带走:

VAEGAN
潜在空间连续、有结构、方向可解释(倾斜、笔画粗细)15训练后不保证有连续性或结构16
生成质量偏模糊——损失按像素算距离,只能「平均地像」17更清晰18
训练难度正常反向传播难:G 的梯度要经过 D 传回来,D 太准则 G 收不到信号;还会模式坍塌(G 一旦找到一张能骗过 D 的图就反复输出它,不再多样)19
药方换距离:用 Wasserstein 距离替代「骗过与否」(即 WGAN 的思路)20

书里的总结论就两句:GAN 生成的效果优于 VAE;GAN 比 VAE 更难训练21

6. CGAN:从「随便造」到「按需造」

VAE 和 GAN 生成什么全看随机向量 z 的运气——你没法要求「生成一个 8」。CGAN(条件 GAN)的补法朴素:把条件 y 拼进输入。y 是标签(数字类别、性别、是否微笑),先用一层 Embedding 变成向量再与 z 拼接——书里的实现是 z 的 100 维加标签的 10 维,生成器输入 110 维;判别器同样吃条件,图片 784 维拼标签 10 维=794 维,它判断的是「这张图配不配这个标签」22。生成特定数字变成一行:generate_digit(G, 8)23。加了标签的 GAN,书里按半监督模型归类——无监督的生成里掺了一点监督信号24

7. DCGAN 与训练技巧清单

DCGAN 把全连接换成卷积:生成器用转置卷积逐层放大(第 06 章的 Cᵀ 在这里上岗),判别器用普通卷积,中间都垫批标准化25。书末积了四条实战技巧,每条背后都是一个已知的坑26:

  1. 批量加载+批标准化——稳住博弈的动态;
  2. 生成器末层用 tanh,图像归一到 [-1,1],别用 sigmoid;
  3. 激活用 LeakyReLU——稀疏的梯度会妨碍 GAN 训练;
  4. 卷积核大小要能被步幅整除,否则生成图有棋盘状伪影(转置卷积覆盖不匀留下的格子纹)。

8. 作者的判断与证据

给了证据的: VAE 的 MNIST 重建/采样图、GAN 的 200 轮假图、CGAN 的 10×10 数字网格都是书中实跑结果;书里明确判「GAN 的新图像明显好于 VAE」并归因于损失函数的差异27

给了机制的: 模式坍塌的成因分析(G 钻空子:骗过 D 即输出,不管图合不合理)、G 难训的梯度链分析,书里都给了因果解释而非只报现象19

作者的取舍: GAN 的理论推导( minimax 博弈、JS 散度)全书未碰,只讲工程直觉与实现;CGAN/DCGAN 也只到「能用」深度。想懂证明,需另读原论文(补充(不在书里,来自通用知识):Goodfellow et al., 2014)。

9. 边界与局限

  • GAN 的训练稳定性问题在本书只是「点了一句」。 谱系方法(WGAN-GP、谱归一化)书里只有 Wasserstein 一个名字;今天训练 GAN 的默认配置与书中 2019 年的技巧清单已有距离。
  • 没有扩散模型。 2020 年后图像生成的主流路线(diffusion)不在书内——本书的「生成」叙事止于 GAN 系。
  • VAE 一节的重构损失代码用了 binary_cross_entropy,对像素值域 [0,1] 有要求,书里没有强调归一化的必要性。
  • 第 12 章还有 GAN 的三个应用变体(修复/跨域/风格),本章不重复。

10. 可带走的

  1. 判别模型学「看」,生成模型学「造」;造=建模数据的分布,再从分布里采样;
  2. AE 不会创作的根因:潜在空间不连续,任意取点解码出来是噪声;
  3. VAE 的全部魔法=一条正态约束+重参数化(z = mu + exp(log_var/2)·ε,让采样可导);损失=重建 BCE+KL 散度;
  4. GAN=两个网络的对局:D 的损失=「真认真+假认假」两半;G 的损失=同一张假图、标签改成真;
  5. GAN 没有「损失最小化」,只有两股力量的平衡——这是它难训的根源;
  6. G 的梯度经 D 传递,D 太准则 G 学不动;G 找到一张万能假图反复输出=模式坍塌;药方方向是换距离(WGAN);
  7. 按需生成=把条件拼进输入(CGAN:z 100 维+标签 10 维=110);
  8. GAN 实操四条:tanh 输出、LeakyReLU、核尺寸被步幅整除防棋盘纹、批标准化。

11. 原文地图

主题原书章原文位置
判别与生成第8章 生成式深度学习text/09-ch08.txt:3(搜「判别模型」)
纳什均衡与贝叶斯第8章 生成式深度学习text/09-ch08.txt:9(搜「GAN是基于博弈论」)
AE 不会创作第8章 生成式深度学习text/09-ch08.txt:33(搜「无法产生新的内容」)
VAE 的正态约束第8章 生成式深度学习text/09-ch08.txt:35(搜「正态分布」)
编码器输出两个向量第8章 生成式深度学习text/09-ch08.txt:50(搜「log_var」)
重参数化式 8-1第8章 生成式深度学习text/09-ch08.txt:56(搜「mu+exp」)
ε 保证连续性第8章 生成式深度学习text/09-ch08.txt:62(搜「连续性」)
两大损失第8章 生成式深度学习text/09-ch08.txt:74(搜「KL散度」) · text/09-ch08.txt:82(搜「kl_div」)
VAE 超参第8章 生成式深度学习text/09-ch08.txt:110(搜「784」)
GAN 与验钞机第8章 生成式深度学习text/09-ch08.txt:216(搜「Goodfellow」) · text/09-ch08.txt:221(搜「验钞机」)
伪造者比喻第8章 生成式深度学习text/09-ch08.txt:231(搜「伪造者」)
生成器判别器定义第8章 生成式深度学习text/09-ch08.txt:247(搜「判别器网络」)
动态平衡难训第8章 生成式深度学习text/09-ch08.txt:257(搜「动态平衡」)
D 的两半损失第8章 生成式深度学习text/09-ch08.txt:273(搜「d_loss_real」) · text/09-ch08.txt:283(搜「d_loss = d_loss_real + d_loss_fake」)
G 的损失标签为真第8章 生成式深度学习text/09-ch08.txt:292(搜「real_labels」)
VAE 空间可解释第8章 生成式深度学习text/09-ch08.txt:417(搜「倾斜角度」)
GAN 潜空间无结构第8章 生成式深度学习text/09-ch08.txt:254(搜「无法保证带连续性」)
模式坍塌与梯度链第8章 生成式深度学习text/09-ch08.txt:430(搜「坍塌」) · text/09-ch08.txt:434(搜「GAN比较难训练的原因」)
Wasserstein 药方第8章 生成式深度学习text/09-ch08.txt:435(搜「Wasserstein」)
两条总结论第8章 生成式深度学习text/09-ch08.txt:439(搜「优于VAE」) · text/09-ch08.txt:441(搜「更难训练」)
CGAN 条件拼接第8章 生成式深度学习text/09-ch08.txt:474(搜「110」) · text/09-ch08.txt:501(搜「794」)
指定数字生成第8章 生成式深度学习text/09-ch08.txt:553(搜「generate_digit」)
DCGAN 结构第8章 生成式深度学习text/09-ch08.txt:575(搜「DCGAN」)
训练技巧与棋盘伪影第8章 生成式深度学习text/09-ch08.txt:646(搜「tanh」) · text/09-ch08.txt:653(搜「棋盘」)

Footnotes

  1. 出处:「第8章 生成式深度学习」第 9 段(text/09-ch08.txt:9,搜「GAN是基于博弈论」)。

  2. 出处:「第8章 生成式深度学习」第 29 段(text/09-ch08.txt:29,搜「低维的向量」)。

  3. 出处:「第8章 生成式深度学习」第 33 段(text/09-ch08.txt:33,搜「无法产生新的内容」)。

  4. 出处:「第8章 生成式深度学习」第 35 段(text/09-ch08.txt:35,搜「正态分布」)。

  5. 出处:「第8章 生成式深度学习」第 43 段(text/09-ch08.txt:43,搜「两个参数均值」)与第 50 段(text/09-ch08.txt:50,搜「log_var」)。

  6. 出处:「第8章 生成式深度学习」第 56 段(text/09-ch08.txt:56,搜「mu+exp」);实现见第 152 段(text/09-ch08.txt:152,搜「randn_like」)。

  7. 出处:「第8章 生成式深度学习」第 62 段(text/09-ch08.txt:62,搜「连续性」)。

  8. 出处:「第8章 生成式深度学习」第 74 段(text/09-ch08.txt:74,搜「KL散度」)与第 82 段(text/09-ch08.txt:82,搜「kl_div」)。

  9. 出处:「第8章 生成式深度学习」第 110 段(text/09-ch08.txt:110,搜「784」)与第 199 段(text/09-ch08.txt:199,搜「这个图像效果也不错」)。

  10. 出处:「第8章 生成式深度学习」第 221 段(text/09-ch08.txt:221,搜「验钞机」)。

  11. 出处:「第8章 生成式深度学习」第 231 段(text/09-ch08.txt:231,搜「伪造者」)。

  12. 出处:「第8章 生成式深度学习」第 244 段(text/09-ch08.txt:244,搜「生成器网络」)与第 247 段(text/09-ch08.txt:247,搜「判别器网络」)。

  13. 出处:「第8章 生成式深度学习」第 273 段(text/09-ch08.txt:273,搜「d_loss_real」)、第 283 段(text/09-ch08.txt:283,搜「d_loss = d_loss_real + d_loss_fake」)与第 292 段(text/09-ch08.txt:292,搜「real_labels」)。

  14. 出处:「第8章 生成式深度学习」第 257 段(text/09-ch08.txt:257,搜「动态平衡」)。

  15. 出处:「第8章 生成式深度学习」第 416 段(text/09-ch08.txt:416,搜「连续性」)与第 417 段(text/09-ch08.txt:417,搜「倾斜角度」)。

  16. 出处:「第8章 生成式深度学习」第 254 段(text/09-ch08.txt:254,搜「无法保证带连续性」)。

  17. 出处:「第8章 生成式深度学习」第 424 段(text/09-ch08.txt:424,搜「模糊」)。

  18. 出处:「第8章 生成式深度学习」第 426 段(text/09-ch08.txt:426,搜「更清晰」)。

  19. 出处:「第8章 生成式深度学习」第 430 段(text/09-ch08.txt:430,搜「坍塌」)与第 434 段(text/09-ch08.txt:434,搜「GAN比较难训练的原因」)。 2

  20. 出处:「第8章 生成式深度学习」第 435 段(text/09-ch08.txt:435,搜「Wasserstein」)。

  21. 出处:「第8章 生成式深度学习」第 439 段(text/09-ch08.txt:439,搜「优于VAE」)与第 441 段(text/09-ch08.txt:441,搜「更难训练」)。

  22. 出处:「第8章 生成式深度学习」第 474 段(text/09-ch08.txt:474,搜「110」)与第 501 段(text/09-ch08.txt:501,搜「794」)。

  23. 出处:「第8章 生成式深度学习」第 553 段(text/09-ch08.txt:553,搜「generate_digit」)。

  24. 出处:「第8章 生成式深度学习」第 454 段(text/09-ch08.txt:454,搜「半监督模型」)。

  25. 出处:「第8章 生成式深度学习」第 575 段(text/09-ch08.txt:575,搜「DCGAN」)与第 610 段(text/09-ch08.txt:610,搜「转置卷积」)。

  26. 出处:「第8章 生成式深度学习」第 644 段(text/09-ch08.txt:644,搜「批量加载」)、第 646 段(text/09-ch08.txt:646,搜「tanh」)与第 653 段(text/09-ch08.txt:653,搜「棋盘」)。

  27. 出处:「第8章 生成式深度学习」第 407 段(text/09-ch08.txt:407,搜「明显好于」)。