# 从 GAN 到 WGAN

- 原标题：From GAN to WGAN
- 类型：博客
- 来源：Lilian Weng 博客
- 发布时间：未知（待核验）
- 首次精选：2026-10-29 23:09
- 分级：值得看
- 学习层级：进阶
- 主题：[diffusion-image-generation](<https://oplearnx.com/md/topics/diffusion-image-generation.md>)（第 1 位）、[neural-model-foundations](<https://oplearnx.com/md/topics/neural-model-foundations.md>)（第 21 位）
- 原文链接：[https://lilianweng.github.io/posts/2017-08-20-gan](<https://lilianweng.github.io/posts/2017-08-20-gan>)
- 本站页面：[https://oplearnx.com/resources/pk\_d965e2d946da](<https://oplearnx.com/resources/pk_d965e2d946da>)

## 摘要

这篇博客从博弈论视角讲解生成对抗网络（GAN），先用 KL 与 JS 散度铺垫，推导判别器的最优值和全局最优，解释损失函数的含义，再讨论 GAN 训练中的问题（难以达到纳什均衡、低维支撑、梯度消失、模式崩塌、缺乏合适评价指标）和改进训练方法。最后介绍 Wasserstein GAN，包括 Wasserstein 距离的定义、相比 JS/KL 散度的优势，以及将其用作 GAN 损失函数，并附有生成宝可梦图像的示例。文中注明该文有韩文译本并发布在 arXiv 上。

## 中文精读

### 1. 从 GAN 到 WGAN（引言）

- 生成对抗网络（GAN）在图像、语言、音乐等生成任务上表现突出，其思想来自博弈论：生成器与判别器相互竞争、彼此变强。
- GAN 训练并不容易，常遇到训练不稳定、难以收敛等问题。
- 文章的目标是解释 GAN 背后的数学、说明它为何难训练，并介绍为缓解训练困难而改造的 WGAN。

### 2. KL 散度与 JS 散度

- KL（Kullback–Leibler）散度 D\_KL\(p‖q\)=∫p\(x\)log\(p\(x\)/q\(x\)\)dx，用来衡量分布 p 相对 q 的偏离，当 p 与 q 处处相等时取最小值 0。
- KL 散度不对称：当 p\(x\) 接近 0 而 q\(x\) 明显非零时，q 的影响会被忽略；若要衡量两个同等重要的分布之间的相似度，这可能带来问题。
- JS（Jensen–Shannon）散度是 D\_KL\(p‖\(p\+q\)/2\) 与 D\_KL\(q‖\(p\+q\)/2\) 各取一半后相加，取值被限制在 \[0,1\]，且对称、更平滑。
- 文中给出两个均值分别 0 和 1、标准差同为 1 的高斯分布作例，直观显示 KL 不对称而 JS 对称。
- 有观点（Huszar, 2015）认为 GAN 成功的一个原因，是把传统最大似然中不对称的 KL 损失换成了对称的 JS 散度。

### 3. 生成对抗网络（GAN）

- GAN 由两个模型构成：判别器 D 估计样本来自真实数据集的概率，作为评论者被优化以区分真假；生成器 G 由噪声 z 生成样本，努力捕捉真实分布以骗过 D。
- 训练中两者进行零和博弈：G 尽力骗过判别器，D 尽力不被骗，这种竞争促使双方提升能力。
- 符号约定：p\_z 为噪声 z 上的分布（通常取均匀分布），p\_g 为生成器在数据 x 上的分布，p\_r 为真实样本 x 的分布。
- D 通过最大化 E\_\{x\~p\_r\}\[log D\(x\)\] 保证对真实数据的判断准确，并通过最大化 E\_\{z\~p\_z\}\[log\(1−D\(G\(z\)\)\)\] 使假样本的输出概率接近 0。
- G 则要最小化 E\_\{z\~p\_z\}\[log\(1−D\(G\(z\)\)\)\]，即提高 D 对假样本给出高概率的机会。
- 合并两者得到极小极大（minimax）目标：min\_G max\_D E\_\{x\~p\_r\}\[log D\(x\)\] \+ E\_\{x\~p\_g\}\[log\(1−D\(x\)\)\]；其中真实数据项在梯度更新时对 G 无影响。

### 4. D 的最优值是什么？

- 将损失写成积分形式 ∫\(p\_r\(x\)log D\(x\) \+ p\_g\(x\)log\(1−D\(x\)\)\)dx，并记 D\(x\)=x̃、A=p\_r\(x\)、B=p\_g\(x\)。
- 对积分内函数 f\(x̃\)=A log x̃ \+ B log\(1−x̃\) 求导并令导数为 0，得到最优判别器 D\*\(x\)=A/\(A\+B\)=p\_r\(x\)/\(p\_r\(x\)\+p\_g\(x\)\)，取值落在 \[0,1\]。
- 当生成器训练到最优、p\_g 非常接近 p\_r 时，D\*\(x\) 变为 1/2。

### 5. 全局最优是什么？

- 当 G 与 D 都达到最优，即 p\_g=p\_r 且 D\*\(x\)=1/2 时，损失函数化为 log\(1/2\)∫p\_r\(x\)dx \+ log\(1/2\)∫p\_g\(x\)dx。
- 由于两个分布积分均为 1，最终损失为 −2log2。

### 6. 损失函数代表什么？

- 把 D\* 代入 JS 散度公式展开，可推出 JS 散度与损失的关系：D\_JS\(p\_r‖p\_g\) = ½\(log4 \+ L\(G,D\*\)\)。
- 等价地，L\(G,D\*\) = 2D\_JS\(p\_r‖p\_g\) − 2log2，即判别器最优时 GAN 的损失以 JS 散度度量生成分布与真实分布的相似度。
- 能复现真实分布的最优 G\* 给出最小损失 L\(G\*,D\*\)=−2log2，与前面推导一致。
- 文中附带提到其他 GAN 变体：在半监督学习中，一种思路是让判别器输出真实类别标签 1,…,K−1 以及一个假类别标签 K，生成器的目标是骗过判别器输出小于 K 的类别。

### 7. GAN 存在的问题

- 尽管 GAN 在真实感图像生成上很成功，但训练过程以缓慢和不稳定著称。

### 8. 难以达到纳什均衡

- Salimans 等（2016）讨论了基于梯度下降的训练问题：两个模型同时训练去求解两人非合作博弈的纳什均衡（Nash equilibrium），但各自只独立更新自身代价，不顾对方，同时更新梯度无法保证收敛。
- 文中给出一个简单例子：一方控制 x 最小化 f1\(x\)=xy，另一方不断更新 y 最小化 f2\(y\)=−xy。
- 因为 ∂f1/∂x=y、∂f2/∂y=−x，一次迭代中 x 按 x−η·y 更新、y 按 y\+η·x 同时更新（η 为学习率）。
- 一旦 x 与 y 符号不同，后续每次梯度更新都会引起剧烈震荡，且不稳定随时间加剧（模拟中学习率 η=0.1，迭代越多震荡越严重）。

### 9. 低维支撑集

- 先给出两个术语：流形（manifold）是每点局部近似欧氏空间的拓扑空间，局部欧氏空间为 n 维时称 n 维流形；支撑集（support）是函数定义域中不被映射为零的元素子集。
- Arjovsky 和 Bottou（2017）在《Towards principled methods for training generative adversarial networks》中详细讨论了 p\_r 与 p\_g 的支撑集落在低维流形上以及这如何导致 GAN 训练不稳定。
- 许多真实数据集的维度只是“表面上很高”，实际上集中在更低维的流形上——这也是流形学习的基本假设；例如图像主题或对象固定后受诸多限制（狗要有两只耳朵和尾巴、摩天楼要笔直高耸），无法自由取高维形态。
- p\_g 同样位于低维流形：用 100 维噪声 z 生成 64x64 图像时，4096 个像素的颜色分布由这个 100 维随机向量决定，很难填满整个高维空间。
- 由于两者都处在低维流形上，它们几乎必然不相交（disjoint）；当支撑集不相交时，总能找到完全正确区分真假的完美判别器。
- 文中用三维空间中的两条线、两张曲面作图示，说明高维空间里的低维流形几乎不可能重叠。

### 10. 梯度消失

- 当判别器完美时，对所有真实样本 D\(x\)=1、对所有生成样本 D\(x\)=0，损失 L 降为零，学习迭代中再无梯度可用于更新。
- 文中实验先训练 DCGAN 1、10、25 个 epoch，然后固定生成器、用原始代价函数从头训练判别器并测量梯度；梯度范数（对数尺度）快速衰减，最好情况下 4000 次判别器迭代后下降 5 个数量级。
- 由此 GAN 训练陷入两难：判别器太差则生成器得不到准确反馈、损失无法反映真实情况；判别器太好则梯度接近零，学习极慢甚至停滞。

### 11. 模式坍塌

- 训练中生成器可能塌缩到总是产出相同输出的状态，这一常见失败情况称为模式坍塌（mode collapse）。
- 即使它能骗过对应的判别器，也没能学会表示复杂的真实数据分布，而是卡在多样性极低的小空间里。
- 文中示例：用 4 层、512 单元、ReLU 激活的 MLP 网络训练 DCGAN，配置上缺乏面向图像生成的强归纳偏置，结果出现明显程度的模式坍塌。

### 12. 缺乏合适的评价指标

- GAN 天生没有良好的目标函数来告知训练进展；缺少好的评价指标就像在黑暗中工作。
- 既没有好信号判断何时停止，也没有好指标比较多个模型的性能。

### 13. 改进的 GAN 训练

- 前五种方法出自《Improve Techniques for Training GANs》，是加速收敛的实用技巧；后两种出自《Towards principled methods for training generative adversarial networks》，针对分布不相交问题。
- 特征匹配（Feature Matching）：让判别器检查生成器输出是否匹配真实样本的期望统计量，新损失为 ‖E\_\{x\~p\_r\}f\(x\) − E\_\{z\~p\_z\}f\(G\(z\)\)‖₂²，f 可取均值、中位数等特征统计。
- 小批量判别（Minibatch Discrimination）：让判别器能利用一个批次内数据点之间的关系，而非独立处理每个点；近似每对样本的接近度 c\(x\_i,x\_j\)，把该点与其他样本的接近度求和 o\(x\_i\)=Σ\_j c\(x\_i,x\_j\) 后显式加入模型输入。
- 历史平均（Historical Averaging）：对两个模型都在损失中加入 ‖Θ − \(1/t\)Σ\_\{i=1\}^t Θ\_i‖²，Θ 为当前参数、Θ\_i 为过去第 i 次训练时的参数配置，该项惩罚参数随时间变化过于剧烈、拖慢训练速度。
- 单侧标签平滑（One-sided Label Smoothing）：给判别器喂标签时不直接用 1 和 0，而用 0.9、0.1 等软化值，可降低网络的脆弱性。
- 虚拟批归一化（Virtual Batch Normalization, VBN）：每个样本基于固定的“参考批次”而非自身小批量做归一化，参考批次在训练开始时选定并保持不变。

### 14. 改进的 GAN 训练（续）

- 加噪声：鉴于 p\_r 与 p\_g 在高维空间不相交导致梯度消失，可向判别器 D 的输入加入连续噪声，人工“铺开”分布、提高两个分布重叠的机会。
- 使用更好的分布相似度度量：原始 GAN 的损失衡量 JS 散度，而两个分布不相交时该度量无法给出有意义的值；Wasserstein 度量因数值空间平滑得多而被提议替代 JS 散度。

### 15. 什么是 Wasserstein 距离？

- Wasserstein 距离度量两个概率分布之间的距离，又称推土机距离（Earth Mover's distance, EM distance）：可直观理解为把一堆按某一分布堆放的土搬运并塑造成另一分布形状所需的最小能量代价，代价 = 搬运的土量 × 搬运距离。
- 离散情形示例：P=\(3,2,1,4\)、Q=\(1,2,4,3\)，共四堆土、总量各为十铲。
- 搬运方案：先从 P1 移 2 铲到 P2 使 \(P1,Q1\) 匹配；再从 P2 移 2 铲到 P3 使 \(P2,Q2\) 匹配；最后把 1 铲从 Q3 移到 Q4，使 \(P3,Q3\) 与 \(P4,Q4\) 匹配。
- 记使 Pi 与 Qi 匹配需付出的代价为 δ\_i，有 δ\_\{i\+1\}=δ\_i\+P\_i−Q\_i；本例 δ 依次为 0、2、2、−1、0，最终的推土机距离 W=Σ\|δ\_i\|=5。
- 连续情形下公式为 W\(p\_r,p\_g\)=inf\_\{γ\~Π\(p\_r,p\_g\)\} E\_\{\(x,y\)\~γ\}\[‖x−y‖\]，其中 Π\(p\_r,p\_g\) 是 p\_r 与 p\_g 之间所有可能联合分布的集合，每个 γ 对应一种搬运方案。
- γ\(x,y\) 表示应从点 x 搬到 y 的土量比例，使得搬运后 x 的边缘分布与 y 一致：Σ\_x γ\(x,y\)=p\_g\(y\)，反之 Σ\_y γ\(x,y\)=p\_r\(x\)。

### 16. 什么是 Wasserstein 距离？（续）

- 总搬运量为 γ\(x,y\)、距离为 \|x−y\|、代价为 γ\(x,y\)·\|x−y\|，对所有 \(x,y\) 求期望即 Σ\_\{x,y\}γ\(x,y\)‖x−y‖=E\_\{x,y\~γ\}‖x−y‖；定义中的 inf（下确界）表示只关心最小的搬运代价。

### 17. 为什么 Wasserstein 距离优于 JS 或 KL 散度

- 当两个分布分别落在互不重叠的低维流形上时，Wasserstein 距离仍能给出有意义且平滑的距离表示。
- WGAN 论文用一个简单例子说明：分布 P 取 x=0、y\~U\(0,1\)；分布 Q 取 x=θ（0≤θ≤1）、y\~U\(0,1\)；θ≠0 时两者完全不重叠。
- θ≠0 时，KL\(P‖Q\) 与 KL\(Q‖P\) 都因出现 log\(1/0\) 而为 \+∞；JS\(P,Q\) 恒为 log2，在 θ=0 处发生突变、不可微。
- Wasserstein 距离 W\(P,Q\)=\|θ\|，θ=0 时两个分布完全重合，KL、JS、W 均为 0，只有 W 随 θ 平滑变化，利于梯度下降的稳定训练。

### 18. 用 Wasserstein 距离作为 GAN 的损失函数

- 直接穷举 Π\(p\_r, p\_g\) 中所有联合分布来求下确界不可行，WGAN 作者借助 Kantorovich-Rubinstein 对偶把公式改写为对满足 ‖f‖\_L ≤ K 的函数取上确界的形式：W = \(1/K\)·sup E\_\{p\_r\}\[f\(x\)\] − E\_\{p\_g\}\[f\(x\)\]。
- 新形式中的 f 需满足 K-Lipschitz 连续，即存在常数 K≥0 使 \|f\(x1\)−f\(x2\)\| ≤ K\|x1−x2\|；处处连续可微的函数都满足 Lipschitz 连续，但 Lipschitz 连续函数不一定处处可微（如 f\(x\)=\|x\|）。
- 假设 f 来自以 w 为参数的 K-Lipschitz 连续函数族 \{f\_w\}，判别器的作用变成学习 w 找到好的 f\_w，损失函数即以 f\_w 的期望差来度量 p\_r 与 p\_g 之间的 Wasserstein 距离。
- 判别器不再是直接区分真假样本的 critIC，而是估计 Wasserstein 距离的辅助函数；损失下降意味着 Wasserstein 距离变小、生成分布更接近真实分布。
- 为保持 f\_w 的 K-Lipschitz 连续性，论文采用简单实用的技巧：每次梯度更新后把权重 w 截断到小窗口如 \[-0.01, 0.01\]，使参数空间 W 紧凑，从而给 f\_w 加上下界。
- 相比原始 GAN，WGAN 的改动是：critic 每次更新后把权重截断到固定范围 \[-c, c\]；改用不含对数的 Wasserstein 损失；作者据经验推荐 critic 用 RMSProp 而非 Adam 等基于动量的优化器（原文未给出明确理论解释）。

### 19. Wasserstein GAN 的局限

- 原文在此处用分隔线与前面的 WGAN 算法和三项改动段落隔开，单列一段收尾，指出 WGAN 并不完美。
- WGAN 原论文作者自己也承认“权重截断是强制 Lipschitz 约束的明显糟糕做法”。
- WGAN 仍存在三类问题：训练不稳定；截断窗口过大时收敛慢；截断窗口过小时梯度消失。
- Gulrajani 等 2017 提出用梯度惩罚（gradient penalty）替代权重截断来改进，原文表示留待后续文章讨论。

### 20. 示例：生成新的宝可梦

- 作者在很小的数据集 PokeAPI sprites（约 900 多张宝可梦图像，包含同一物种的不同形态）上试跑了 carpedm20/DCGAN-tensorflow 做实验。
- 由于训练数据很少，生成的新宝可梦只有粗略轮廓、缺少细节；随着训练轮数增加，形状和颜色变好，示例展示了 epoch = 7、21、49 时的采样输出。
- 作者另提供了 lilianweng/unified-gan-tensorflow 仓库，含 DCGAN-tensorflow 的注释版本以及如何改成训练 WGAN 和带梯度惩罚的 WGAN。

### 21. 参考文献

- 列出 9 条参考文献：Goodfellow 等 2014 的 GAN 原始论文、Salimans 等 2016 的 GAN 训练改进技巧、Arjovsky & Bottou 2017 的 GAN 训练原则性方法、Arjovsky 等 2017 的 Wasserstein GAN。
- 其余包括 Gulrajani 等 2017 改进 WGAN 训练、Earth Mover's Distance 在变换下的计算、Wasserstein GAN 与 Kantorovich-Rubinstein 对偶的博客文章、一篇知乎专栏，以及 Huszár 2015 关于生成模型训练的论文。

---
来源：LearnMap · 学径（https://oplearnx.com）
