# 第 13 章　深度生成模型

> 来源：https://deeplearning.bnuai.com/chapters/13-deep-generative-models ｜ 作者：唐志清（北京师范大学） ｜ 更新：2026-11-01 ｜ 内容依据邱锡鹏《神经网络与深度学习》（https://nndl.ai/）及作者公开课件

## 学习目标

<div class="goals">

- 理解概率生成模型的两个基本功能（密度估计与生成样本）以及隐变量建模的思路；
- 掌握变分自编码器的结构、目标函数（ELBO）和**再参数化技巧**；
- 掌握生成对抗网络的极小极大目标和交替训练过程，了解 DCGAN 的设计要点；
- 理解原始 GAN 的理论缺陷：JS 散度导致的梯度消失、逆向 KL 导致的**模型坍塌**；
- 理解 Wasserstein 距离与 WGAN 的动机，了解 LSGAN、f-GAN 及条件生成的各种扩展。

</div>

## 课件幻灯片

> 本章课件共 64 页，可在网页中逐页浏览：https://deeplearning.bnuai.com/chapters/13-deep-generative-models；PDF 下载：https://deeplearning.bnuai.com/pdf/nndl-ch13.pdf

## 讲义

### 13.1 概率生成模型

机器学习有两种范式：**判别模型**直接学习 $p(y\mid\boldsymbol x)$，**生成模型**学习数据的分布 $p(\boldsymbol x)$（或 $p(\boldsymbol x,y)$）。[幻灯片 4](#slide-4) 概率生成模型包括两个基本功能：[幻灯片 5](#slide-5)

- **概率密度估计**：给定样本，估计 $p_r(\boldsymbol x)$；
- **生成样本**：从估计的分布中生成新的样本，例如生成图像、文本、语音。

高维数据（如图像）的分布非常复杂，各维之间存在复杂的依赖关系，很难直接建模。一种思路是引入低维的**隐变量** $\boldsymbol z$：先从一个简单分布（如标准正态分布）中采样 $\boldsymbol z$，再通过一个复杂的映射（神经网络）$g(\boldsymbol z)$ 把它变换到数据空间。[幻灯片 6](#slide-6) [幻灯片 7](#slide-7)

```mermaid
flowchart LR
  G["深度生成模型"] --> E["显式密度模型<br/>建模 p(x)"]
  G --> I["隐式密度模型<br/>只学习采样过程"]
  E --> V["变分自编码器 VAE<br/>近似推断 + 最大化 ELBO"]
  E --> O["自回归模型 / 流模型 / 扩散模型 …"]
  I --> GAN["生成对抗网络 GAN<br/>对抗训练"]
```

### 13.2 变分自编码器

**含隐变量的生成模型**：$p(\boldsymbol x,\boldsymbol z;\theta)=p(\boldsymbol x\mid\boldsymbol z;\theta)\,p(\boldsymbol z;\theta)$。要最大化边际似然 $\log p(\boldsymbol x;\theta)$，第 11 章的 EM 算法给出了思路：[幻灯片 9](#slide-9) [幻灯片 10](#slide-10)

$$
\log p(\boldsymbol x;\theta)=\mathrm{ELBO}(q,\boldsymbol x;\theta,\phi)+\mathrm{KL}\big(q(\boldsymbol z;\phi)\,\|\,p(\boldsymbol z\mid\boldsymbol x;\theta)\big).
$$

但当 $p(\boldsymbol x\mid\boldsymbol z;\theta)$ 由神经网络建模时，后验 $p(\boldsymbol z\mid\boldsymbol x;\theta)$ 无法计算，E 步无法精确进行。**变分自编码器**（VAE）的思路是：用两个神经网络分别近似这两个分布：[幻灯片 11](#slide-11) [幻灯片 12](#slide-12)

- **推断网络**（编码器）$f_I(\boldsymbol x;\phi)$：输出近似后验 $q(\boldsymbol z\mid\boldsymbol x;\phi)$ 的参数。通常假设它是对角高斯分布 $\mathcal N\big(\boldsymbol z;\boldsymbol\mu_I,\boldsymbol\sigma_I^2\boldsymbol I\big)$，网络输出 $\boldsymbol\mu_I$ 和 $\log\boldsymbol\sigma_I^2$；[幻灯片 13](#slide-13)
- **生成网络**（解码器）$f_G(\boldsymbol z;\theta)$：输出 $p(\boldsymbol x\mid\boldsymbol z;\theta)$ 的参数——二值数据用伯努利分布，连续数据用高斯分布。隐变量先验取标准正态 $p(\boldsymbol z)=\mathcal N(\boldsymbol 0,\boldsymbol I)$。[幻灯片 14](#slide-14)

VAE 的目标是最大化 ELBO：[幻灯片 15](#slide-15)

$$
\mathcal J(\phi,\theta\mid\boldsymbol x)=\underbrace{\mathbb E_{\boldsymbol z\sim q(\boldsymbol z\mid\boldsymbol x;\phi)}\big[\log p(\boldsymbol x\mid\boldsymbol z;\theta)\big]}_{\text{重构项}}-\underbrace{\mathrm{KL}\big(q(\boldsymbol z\mid\boldsymbol x;\phi)\,\|\,p(\boldsymbol z)\big)}_{\text{正则项}} .
$$

第一项鼓励解码器能从 $\boldsymbol z$ 重构 $\boldsymbol x$，第二项让近似后验接近先验。两个都是高斯分布时 KL 项有解析解：

$$
\mathrm{KL}\big(\mathcal N(\boldsymbol\mu_I,\boldsymbol\sigma_I^2\boldsymbol I)\,\|\,\mathcal N(\boldsymbol 0,\boldsymbol I)\big)=\frac12\sum_{d}\Big(\sigma_{I,d}^2+\mu_{I,d}^2-1-\log\sigma_{I,d}^2\Big).
$$

**再参数化**。重构项中的期望需要采样 $\boldsymbol z\sim q(\boldsymbol z\mid\boldsymbol x;\phi)$，而采样操作对 $\phi$ 不可导。**再参数化技巧**把随机性转移到一个与参数无关的噪声上：[幻灯片 16](#slide-16)

$$
\boldsymbol z=\boldsymbol\mu_I+\boldsymbol\sigma_I\odot\boldsymbol\epsilon,\qquad\boldsymbol\epsilon\sim\mathcal N(\boldsymbol 0,\boldsymbol I).
$$

这样 $\boldsymbol z$ 就成为 $\phi$ 的确定性可导函数，整个网络可以端到端地用梯度下降训练。[幻灯片 17](#slide-17) 训练好之后，从 $\mathcal N(\boldsymbol 0,\boldsymbol I)$ 采样 $\boldsymbol z$ 送入生成网络即可生成新样本；在二维隐空间中，可以看到 VAE 学到了平滑连续的数据流形（如手写数字的笔画粗细与倾斜的渐变）。[幻灯片 18](#slide-18)

### 13.3 生成对抗网络

VAE 等**显式密度模型**需要构建 $p(\boldsymbol x)$ 的具体形式。如果只是希望**生成样本**，可以不显式地估计密度，而是直接学习一个从隐空间到数据空间的映射 $G:\boldsymbol z\mapsto\boldsymbol x$——这就是**隐式密度模型**。问题是：没有密度函数，如何衡量生成分布与真实分布的差距？[幻灯片 20](#slide-20) **生成对抗网络**（GAN）的答案是：再训练一个网络来判断。[幻灯片 21](#slide-21)

- **判别网络** $D(\boldsymbol x;\phi)$：判断样本来自真实分布还是生成网络，输出 $\boldsymbol x$ 为真实样本的概率，用交叉熵训练；[幻灯片 23](#slide-23)
- **生成网络** $G(\boldsymbol z;\theta)$：目标是让判别网络把它生成的样本误判为真实样本。

二者构成一个**极小极大博弈**：[幻灯片 24](#slide-24) [幻灯片 26](#slide-26)

$$
\min_\theta\max_\phi\ \Big(\mathbb E_{\boldsymbol x\sim p_r(\boldsymbol x)}\big[\log D(\boldsymbol x;\phi)\big]+\mathbb E_{\boldsymbol z\sim p(\boldsymbol z)}\big[\log\big(1-D(G(\boldsymbol z;\theta);\phi)\big)\big]\Big).
$$

**训练过程**：交替训练判别网络和生成网络——每次迭代中，先固定 $G$，更新 $D$ 若干步（$K$ 步）；再固定 $D$，更新 $G$ 一步。实践中，生成网络常用 $\max_\theta\mathbb E_{\boldsymbol z}\big[\log D(G(\boldsymbol z;\theta))\big]$ 代替原目标，以在训练初期获得更大的梯度。[幻灯片 27](#slide-27) 课件中的动漫人脸生成示例展示了随训练轮数生成质量的逐步提升。[幻灯片 28](#slide-28) [幻灯片 30](#slide-30)

**DCGAN**：一个经典的卷积 GAN 结构。其要点包括：用带步长的卷积（判别网络）和转置卷积（生成网络）代替汇聚层；除生成网络输出层与判别网络输入层外都使用批量归一化；去掉全连接隐藏层；生成网络用 ReLU（输出层 Tanh），判别网络用 LeakyReLU。DCGAN 的隐空间还表现出有趣的“向量算术”性质（如“戴眼镜的男人 − 男人 + 女人 = 戴眼镜的女人”）。[幻灯片 31](#slide-31) [幻灯片 32](#slide-32) [幻灯片 51](#slide-51)

在一维数据上实时训练一个小型 GAN，观察生成分布逼近真实分布、判别器输出趋于 0.5，以及双峰目标下的模式坍塌：

> （此处为交互演示，请在网页中使用：https://deeplearning.bnuai.com/chapters/13-deep-generative-models）

<p class="demo-link">在单独页面中打开：<a href="/demos/gan-1d">一维 GAN 训练</a></p>

### 13.4 模型分析

**最优判别网络**。固定 $G$ 时（设生成分布为 $p_\theta$），最优判别网络为 [幻灯片 33](#slide-33) [幻灯片 35](#slide-35)

$$
D^\star(\boldsymbol x)=\frac{p_r(\boldsymbol x)}{p_r(\boldsymbol x)+p_\theta(\boldsymbol x)} .
$$

代入目标函数，生成网络的目标变为

$$
\mathcal L(G\mid D^\star)=2\,\mathrm{JS}\big(p_r\,\|\,p_\theta\big)-2\log2 .
$$

因此当判别网络最优时，训练生成网络等价于最小化真实分布与生成分布的 **JS 散度**，在 $p_\theta=p_r$ 时达到最优，此时 $D^\star\equiv\frac12$。

**不稳定性：生成网络的梯度消失**。真实分布和生成分布通常都是高维空间中的低维流形，二者几乎没有重叠。此时无论它们相距多远，JS 散度都恒为常数 $\log2$，生成网络得不到有效的梯度。实践中如果判别网络训练得太好，生成网络就会梯度消失；判别网络太差，又无法提供正确的指导——这使得 GAN 的训练非常依赖两者之间的平衡。[幻灯片 36](#slide-36)

**模型坍塌**：使用改进的生成网络目标 $\max\mathbb E[\log D(G(\boldsymbol z))]$ 时，可以推出它等价于最小化 [幻灯片 37](#slide-37)

$$
\mathrm{KL}\big(p_\theta\,\|\,p_r\big)-2\,\mathrm{JS}\big(p_r\,\|\,p_\theta\big),
$$

其中 JS 项为负，会“推开”两个分布；而**逆向 KL 散度** $\mathrm{KL}(p_\theta\|p_r)$ 有如下特点：[幻灯片 38](#slide-38) [幻灯片 39](#slide-39)

| | 前向 KL $\mathrm{KL}(p_r\,\Vert\,p_\theta)$ | 逆向 KL $\mathrm{KL}(p_\theta\,\Vert\,p_r)$ |
| --- | --- | --- |
| 惩罚 | $p_r>0$ 而 $p_\theta\to0$ 时惩罚很大 | $p_\theta>0$ 而 $p_r\to0$ 时惩罚很大 |
| 结果 | 覆盖所有模态（**模态覆盖**），可能生成模糊样本 | 只集中于少数模态（**模态寻找**） |

逆向 KL 使生成网络倾向于只生成“安全”的少数几种样本，缺乏多样性——这就是**模型坍塌**。

### 13.5 改进模型

- **LSGAN**：用最小二乘损失代替交叉熵，对远离决策边界但被判为真的生成样本也给予惩罚，缓解梯度消失。[幻灯片 41](#slide-41)
- **f-GAN**：把 GAN 推广到任意 $f$ 散度 $D_f(p_r\|p_\theta)=\int p_\theta(\boldsymbol x)f\big(\frac{p_r(\boldsymbol x)}{p_\theta(\boldsymbol x)}\big)d\boldsymbol x$（如 KL、逆 KL、JS），通过凸共轭得到可优化的变分下界。[幻灯片 42](#slide-42) [幻灯片 43](#slide-43)
- **Wasserstein GAN**：用 **Wasserstein 距离**（推土机距离）度量两个分布的差异：[幻灯片 44](#slide-44) [幻灯片 45](#slide-45)

$$
W(p_r,p_\theta)=\inf_{\gamma\sim\Gamma(p_r,p_\theta)}\mathbb E_{(\boldsymbol x,\boldsymbol y)\sim\gamma}\big[\|\boldsymbol x-\boldsymbol y\|\big],
$$

即把一个分布“搬运”成另一个分布的最小代价。即使两个分布没有重叠，Wasserstein 距离也能随距离平滑变化，提供有意义的梯度。[幻灯片 46](#slide-46) 根据 **Kantorovich–Rubinstein 对偶**，[幻灯片 47](#slide-47)

$$
W(p_r,p_\theta)=\sup_{\|f\|_L\le1}\Big(\mathbb E_{\boldsymbol x\sim p_r}[f(\boldsymbol x)]-\mathbb E_{\boldsymbol x\sim p_\theta}[f(\boldsymbol x)]\Big),
$$

上确界取遍所有 **1-Lipschitz 连续函数**（$|f(\boldsymbol x_1)-f(\boldsymbol x_2)|\le\|\boldsymbol x_1-\boldsymbol x_2\|$）。[幻灯片 48](#slide-48) WGAN 用一个神经网络（称为**评价网络**，去掉了最后的 Sigmoid）来近似 $f$，通过**权重裁剪**（把参数限制在 $[-c,c]$）满足 Lipschitz 约束；后续的 WGAN-GP 改用**梯度惩罚**。WGAN 的评价网络即使训练到最优，也能给生成网络提供稳定的梯度，训练更稳定，且损失值与生成质量相关。[幻灯片 49](#slide-49) [幻灯片 50](#slide-50)

### 13.6 GAN 的扩展

**条件生成**：在生成网络和判别网络的输入中都加入条件 $\boldsymbol c$（如类别标签、文本描述、另一张图像），实现可控的生成，例如根据文本生成图像、图像到图像的转换（pix2pix、CycleGAN）。[幻灯片 55](#slide-55) [幻灯片 57](#slide-57)

- **InfoGAN**：把隐变量分为无结构噪声 $\boldsymbol z$ 和**隐编码** $\boldsymbol c$，并最大化 $\boldsymbol c$ 与生成样本之间的互信息，从而在无监督的情况下学到可解释的表示（如数字类别、倾斜、粗细）。[幻灯片 59](#slide-59)
- **AC-GAN**：判别网络除了判断真假，还要预测样本的类别，提高了条件生成的质量。[幻灯片 62](#slide-62)
- **BiGAN**：同时学习生成网络 $G:\boldsymbol z\to\boldsymbol x$ 和编码器 $E:\boldsymbol x\to\boldsymbol z$，判别网络对 $(\boldsymbol x,E(\boldsymbol x))$ 和 $(G(\boldsymbol z),\boldsymbol z)$ 进行判别，使 GAN 也能做推断。[幻灯片 63](#slide-63)

> 本章介绍的是第一版教材的内容。近几年，**扩散模型**和基于 Transformer 的自回归模型在图像、视频和文本生成上取得了更大的成功，第二版教材对生成模型部分做了相应扩充。

## 本章小结

- 深度生成模型用神经网络把简单分布的隐变量映射到复杂的数据分布。
- VAE：推断网络近似后验、生成网络建模似然，最大化 ELBO = 重构项 − KL 正则项；再参数化 $\boldsymbol z=\boldsymbol\mu+\boldsymbol\sigma\odot\boldsymbol\epsilon$ 使采样可导。
- GAN：生成网络与判别网络的极小极大博弈，最优判别器下等价于最小化 JS 散度；存在梯度消失与模型坍塌问题。
- WGAN 用 Wasserstein 距离提供平滑梯度；条件 GAN、InfoGAN、AC-GAN、BiGAN 扩展了可控性与推断能力。

## 思考题与习题 {#exercises}

<div class="exercise-list">

1. **（推导）** 推导两个对角高斯分布 $\mathcal N(\boldsymbol\mu,\mathrm{diag}(\boldsymbol\sigma^2))$ 与 $\mathcal N(\boldsymbol 0,\boldsymbol I)$ 之间 KL 散度的解析式。
2. **（分析）** 如果 VAE 的 KL 项权重过大或过小（如 $\beta$-VAE），生成样本和隐空间会有什么变化？
3. **（推导）** 固定生成网络，推导最优判别网络 $D^\star(\boldsymbol x)=\frac{p_r(\boldsymbol x)}{p_r(\boldsymbol x)+p_\theta(\boldsymbol x)}$，并证明此时生成网络的目标为 $2\,\mathrm{JS}(p_r\|p_\theta)-2\log2$。
4. **（计算）** 设 $p_r$ 是 $x=0$ 处的点质量分布，$p_\theta$ 是 $x=\theta$ 处的点质量分布（$\theta\ne0$）。分别计算 JS 散度和 Wasserstein 距离，说明为什么 WGAN 能提供更好的梯度。
5. **（概念）** 用前向 / 逆向 KL 散度的性质解释：为什么 VAE 生成的图像通常比较模糊，而 GAN 容易出现模型坍塌？
6. **（编程）** 在 MNIST 上分别训练一个 VAE 和一个 DCGAN（隐变量维数均为 2 或 16），比较生成样本的清晰度与多样性；对 VAE 画出二维隐空间的流形。

</div>

**部分提示**

- 第 1 题：$\frac12\sum_d\big(\sigma_d^2+\mu_d^2-1-\log\sigma_d^2\big)$。
- 第 3 题：目标对每个 $\boldsymbol x$ 是 $p_r\log D+p_\theta\log(1-D)$，对 $D$ 求导令其为 0。
- 第 4 题：$\mathrm{JS}=\log2$（与 $\theta$ 无关，梯度为 0）；$W=|\theta|$（梯度指向 $\theta\to0$）。
- 第 5 题：最大似然对应前向 KL（模态覆盖，倾向“平均”）；GAN 的改进目标包含逆向 KL（模态寻找）。

## 延伸阅读

- 教材：邱锡鹏《神经网络与深度学习》第 13 章「深度生成模型」。
- Kingma D P, Welling M. Auto-encoding variational Bayes, ICLR 2014；Goodfellow I, et al. Generative adversarial nets, NeurIPS 2014；Radford A, et al. DCGAN, ICLR 2016；Arjovsky M, et al. Wasserstein GAN, ICML 2017。
- Ho J, et al. Denoising diffusion probabilistic models, NeurIPS 2020（扩散模型入门）。
- 实践：[nndl-practice](https://github.com/nndl/nndl-practice) 中的生成模型相关章节。
- 交互：[一维 GAN 训练](https://deeplearning.bnuai.com/demos/gan-1d)。
- 第二版对应章节：第 16 章「深度生成模型」。
