Lecture 1 · 导论:什么是深度生成模型 · Introduction: What Are Deep Generative Models?

Deep Generative Models · Lecture 01。个人学习讲义与配套实验,按主题整理并持续修订。

课程源码 ZIP ↓

个人整理的学习笔记,非官方讲义;课程来源与整理说明见课程介绍。配套示例未逐一运行验证。

本篇目录

对应 Maps to:Stanford CS236 Deep Generative Models(Fall 2023,Stefano Ermon),Lecture 1 · 2023-09-27 · Introduction(slides:cs236_lecture1_2023.pptx);课程笔记 Introduction(Aditya Grover 等);Lecture 2 开头的 “Learning a generative model”(生成模型的三个用途)。 依据说明:本讲以原课第 1 讲的 50 页 slides 为骨架(应用巡礼、判别式 vs 生成式、路线图、课程结构),用课程笔记 Introduction 补充”学习 = 在模型族里找离数据分布最近的分布”和三个核心问题的形式化;课堂录像见 Stanford Online 在 YouTube 公开的 2023 年秋季播放列表。slides 里大量的图片例子(GAN 的人脸、文生图、WaveNet、视频……)在这里用文字和论文出处代替。像素世界和全部实验是本讲义自己设计的,用来把 slides 上的概念变成能运行、能验证的数字;“2023 年之后”一节是补充。 配套代码 Code:code/lecture01/(PyTorch;3 个共享模块 + 5 个演示脚本,每个都在 5 秒以内) 预计阅读时间:3 小时(含运行代码)


0. 本讲导航 · How to read this lecture

0.1 学习目标 Learning goals

学完这一讲,你应该能够:

  1. 用自己的话说清楚什么是(统计)生成模型:它就是一个概率分布 p(x)p(x);它为什么叫”生成”模型;“数据 + 先验知识”是什么意思,以及为什么先验总是必要的、但多少可以不同。
  2. 把生成模型看成一个数据模拟器,说出它的三种用途——采样(生成新数据)、密度估计(给任意数据打分)、表示学习 / 推断(从数据反推隐藏的高层描述),并解释”视觉是逆向图形学”这句话。
  3. 区分判别式模型 p(y∣x)p(y \mid x) 和生成式模型 p(x,y)p(x, y),用贝叶斯公式把它们联系起来;说出判别式模型为什么简单、强大,又在哪三件事上无能为力(不知道 xx 本身像不像、处理不了缺失数据、生成不了 xx);理解”判别式模型是最简单的条件生成模型”。
  4. 列举生成模型的主要应用(图像 / 文生图、逆问题、异常检测、语音、语言、代码、视频、模仿学习、分子),并指出每个应用用到的是生成模型的哪种能力。
  5. 解释两个反直觉的事实:概率最高的数据不等于典型的数据;似然好不等于样本好,样本好也不等于似然好。
  6. 说出全课的三个核心挑战——表示、学习、推断——以及模型家族地图(自回归、VAE、流、GAN、能量模型、得分 / 扩散模型)各自在回答哪个挑战。

0.2 先修与本讲范围 Prerequisites & scope

默认你已经会 Assumed本讲只给直觉,后面几讲再展开 Previewed only
概率:随机变量、联合 / 条件 / 边缘分布、贝叶斯公式、期望贝叶斯网络、条件独立、参数计数(第 2 讲)
机器学习的基本概念:训练集 / 测试集、分类、逻辑回归、过拟合KL 散度与最大似然的严格推导(第 4 讲)
Python 基础;PyTorch 不会也没关系,代码里有解释隐变量模型与 EM 算法(第 5 讲;本讲把 EM 当黑盒用)
各个模型家族的具体做法(第 3–18 讲)

本讲是总论:回答”生成模型是什么、为什么重要、难在哪里、这门课怎样展开”。数学只用到贝叶斯公式和对数,但每个概念都配了一个能精确验证的小实验。

0.3 本讲地图 Map

§1  从“理解”到“创造”:费曼;图形学 = 生成、视觉 = 推断;本讲的玩具世界
§2  统计生成模型:p(x);数据 + 先验的光谱;数据模拟器的三种用途;      ← 代码 01、02
    为什么用对数概率;逆向图形学与推断的代价
§3  判别式 vs 生成式:贝叶斯公式;判别式为什么强;它做不到的三件事;      ← 代码 03
    条件生成模型
§4  应用巡礼:图像、逆问题、异常检测、语音、语言、视频、模仿学习、分子;  ← 代码 04
    在像素世界里做异常检测、去噪、补全;“最可能”≠“典型”
§5  路线图与核心挑战:表示(维数灾难)、学习(怎样比较两个分布)、推断    ← 代码 05
§6  课程地图:模型家族
§7  2023 年之后
§8–12  小结、常见误区、练习、延伸阅读、下一讲预告

0.4 记号 Notation(全课统一)

符号含义本讲的例子
x∈Xx \in \mathcal{X}一个数据点(一张图展平成的向量)像素世界里 x∈{0,1}64x \in \{0,1\}^{64}
pdatap_{\text{data}}数据分布:世界”真正”生成数据的方式,看不见像素世界的图形引擎
D={x(1),…,x(N)}\mathcal{D} = \{x^{(1)}, \dots, x^{(N)}\}训练集:从 pdatap_{\text{data}} 独立抽出的 NN 个样本N=20∼10000N = 20 \sim 10000 张图
pθp_\theta,M\mathcal{M}参数为 θ\theta 的模型分布;所有可选的 pθp_\theta 组成模型族伯努利混合、独立像素……
yy标签或条件形状类别:横线 / 竖线 / 方框 / 十字
zz隐变量:没被观测到的高层描述形状 + 位置 + 大小(177 种配置)
log⁡2p(x)\log_2 p(x),bit以 2 为底的对数概率;−log⁡2p(x)-\log_2 p(x) = 用这个模型压缩 xx 需要的比特数典型图约 −25.6-25.6
H(p)H(p)熵:−Ep[log⁡2p(x)]-\mathbb{E}_{p}[\log_2 p(x)],“平均需要多少 bit”像素世界 H≈25.6H \approx 25.6 bit / 图
bits/dim每个维度(像素)的平均 bit 数 = −log⁡2p(x)/D-\log_2 p(x) / D像素世界 ≈0.40\approx 0.40

0.5 关于这门课 · Which CS236?

CS236 是 Stefano Ermon 在斯坦福开设的研究生课程,课程网站 deepgenerativemodels.github.io 公开了 Fall 2023 的全部 18 份 slides 和一份自洽的课程笔记,往届的课程项目也存档在网站上(例如 2019 年)。原课的成绩由三次作业(各 15%)、期中考试(15%)和一个课程项目(40%)组成;项目可以是新任务 / 新数据上的应用、评估 / 学习 / 推断算法的改进,或者对现有模型的理论分析。先修课是 CS221 / 228 / 229 / 230 之一,加上概率、微积分和 Python。

本讲义按原课 18 次课一一对应(详见 SYLLABUS.md)。和本仓库的其他课程相比:MIT6.S184 从连续时间、微分方程的角度深入讲流匹配和扩散模型;CMU10-423 偏大模型时代的系统与应用;CS236 的特点是概率的、“家族全景”的视角——同一个问题(怎样表示和学习 p(x)p(x)),每个模型家族给出了什么回答,它们之间是什么关系。

0.6 关于数字 · About the numbers

讲义里的实验数字全部来自配套代码在作者机器上的实际输出(macOS,PyTorch 单线程 CPU)。所有脚本固定随机种子,同一台机器上重复运行输出逐字节相同;换一台机器或换 PyTorch 版本,个别数字可能在最后一位有差别,结论不变。有几处结果和我写代码之前的预期不一样(例如”全白的图概率比典型样本还高”),讲义按实际结果写,这些情况都记录在 代码 README 的”关于实验结果”里。


1. 从”理解”到”创造” · From understanding to creating

1.1 AI 的挑战:理解复杂、非结构化的输入

原课第一页 slide 列了四个领域:计算机视觉、自然语言处理、机器人、语音。它们有一个共同的难点:输入是复杂的、非结构化的。一张照片是几百万个像素值,一段语音是每秒几万个采样点,一句话是一串离散符号。它们不像数据库里的表格那样,每一列都有明确的含义;“这张照片里有一只猫”这条信息,散落在成千上万个像素的组合关系里。

传统的做法是判别式的:给定输入 xx,直接学一个函数预测我们关心的那一点信息 yy(“有没有猫""这句话是正面还是负面”)。这在很多任务上非常成功(第 3 节会看到它确实强大)。但它回避了一个更根本的问题:模型到底理解了这些数据吗?

1.2 费曼的一句话

原课第 3 页引用了物理学家费曼黑板上的一句话:

“What I cannot create, I do not understand.” (我造不出来的东西,我就没有真正理解。)

生成式建模(generative modeling)把它反过来用:“What I understand, I can create.”——如果一个模型真的理解了某类数据,它就应该能把这类数据造出来。 一个真正理解了”卧室照片”的模型,应该能生成从没见过但看起来完全真实的卧室照片;能判断一张给定的照片像不像卧室;能从照片里读出床、窗户、灯的位置和样子。

这句话也给出了一个检验理解的标准:判别式模型可以靠”抓住几个有用的线索”达到很高的准确率(例如看到”枕头”就猜”卧室”),而要生成一张以假乱真的卧室照片,模型必须掌握光照、透视、材质、家具的摆放规律……几乎所有细节。生成比判别难得多,也因此要求更深的理解。

1.3 图形学是生成,视觉是推断

怎样让计算机生成一张自然图像?原课第 4 页用计算机图形学(computer graphics)做类比。图形学的工作方式是:先写一个高层描述,

Cube(color=blue, position=(x, y, z), size=...)
Cylinder(color=red, position=(x', y', z'), size=...)

再由渲染引擎按照物理规律(光线怎样反射、透视怎样投影)把它变成原始的感官输出——像素。这是一个”从描述到数据”的生成过程。

反过来,**计算机视觉(computer vision)要做的事是:看到像素,推断出”这里有一个蓝色的立方体、在什么位置、有多大”。这是”从数据到描述”的推断(inference)**过程,所以有一个说法叫”视觉是逆向图形学(vision as inverse graphics)”。

原课在这一页写了一句对整门课都很重要的话:“Many of our models will have similar structure (generation + inference).” 后面你会反复看到这个结构:

  • VAE(第 5–6 讲)有一个解码器(z→xz \to x,生成)和一个编码器(x→zx \to z,推断);
  • 归一化流(第 7–8 讲)的生成和推断是同一个可逆函数的两个方向;
  • GAN(第 9–10 讲)只有生成器,推断要另想办法(BiGAN);
  • 扩散模型(第 16 讲)的”加噪”和”去噪”也是一对生成与推断。

1.4 本讲的玩具世界:像素世界

为了把这些想法变成可以动手验证的东西,本讲义造了一个知道真相的小世界(共享模块 pixel_world.py,后面很多讲都会用)。它就是一个微缩版的”图形引擎”:

  1. 选形状:横线 30%、竖线 20%、方框 30%、十字 20%;
  2. 选位置和大小:在这种形状所有不出画布的摆法里均匀地选一个。形状 + 位置 + 大小合起来叫一个配置 zz,一共 177 种(横线 40 种、竖线 40 种、方框 61 种(边长 3 或 4)、十字 36 种);
  3. 渲染:把配置画到 8×88 \times 8 的黑白画布上,得到一张干净的”模板”;
  4. 加噪声:每个像素独立地以 ε=5%\varepsilon = 5\% 的概率翻转(黑变白、白变黑),模拟扫描噪声和笔迹抖动。

用代码 01 生成的几张图(██ 是黑色笔画,· 是白色背景):

十字 中心(4,4)     横线 行2 列2-5     4×4方框 左上(1,1)   3×3方框 左上(1,2)
· · · · · · · ·    · · · · · · · ·    · · · · · · · ·    · · · · · · · ·
· · · · · · · ██   ██· · · · · · ·    · ████████· · ·    · · · ████· · ·
· · ██· · · · ·    · · ████████· ·    · ██· · ██· ██·    · · ██· ██· · ·
· · · · ████· ·    · · · · · · · ██   ████· ████· · ·    · · ██████· · ·
· · · ██████· ·    · · · · · · · ·    · ████████· · ·    · · · · · · · ·
· · · · ██· · ·    · · · ██· · · ·    · ██· · · · · ·    · ████· · · · ·
· · · · · · · ·    · · · · · · · ·    · · ██· · · · ·    · · · · · · · ·
· · · · · · · ·    · · · · · · · ·    · · · · · · · ·    · · · · · · ██·

它相当于一个缩小版的”二值化 MNIST”(原课第 3 讲起反复用 28×28 的黑白手写数字做例子)。关键的区别是:对 MNIST,我们永远不知道真实的 pdata(x)p_{\text{data}}(x);而在像素世界里,因为 zz 只有 177 种,

p(x)=∑zp(z) p(x∣z),p(x∣z)=∏i=164Bernoulli(xi; qz,i),p(x) = \sum_{z} p(z)\, p(x \mid z), \qquad p(x \mid z) = \prod_{i=1}^{64} \text{Bernoulli}(x_i;\, q_{z,i}),

其中 qz,iq_{z,i} 在模板的笔画处是 1−ε1 - \varepsilon、背景处是 ε\varepsilon。这个求和只有 177 项,可以精确地算出来。于是任何一张图的真实概率、“这张图是怎么画出来的”后验分布、这个世界的熵(任何模型都不可能超越的满分)都是已知的。后面每一个实验都拿模型和这个”标准答案”比。

为什么要用一个玩具世界? 真实数据的 pdatap_{\text{data}} 不可知,我们只能看到模型之间的相对好坏,而看不到”离最好还差多远”。玩具世界牺牲了真实感,换来了可验证性。代价是:凡是结论依赖于”zz 可以枚举”的地方(例如精确推断),讲义都会说明真实世界里为什么做不到。


2. 统计生成模型 · Statistical generative models

2.1 定义:一个概率分布

原课第 6 页给出了这门课的核心定义:

一个统计生成模型就是一个概率分布 p(x)p(x)。

  • 它的输入是一个数据点 xx(一张图),输出是一个标量概率 p(x)p(x);
  • 它之所以叫”生成”模型,是因为从 p(x)p(x) 里采样就生成了新的数据。

这个定义看起来平淡,但它把一个模糊的目标(“让计算机会画画”)变成了一个精确的数学问题(“找到一个分布,使它和数据的分布尽量接近”)。课程笔记把它写成:

min⁡θ∈M  d(pdata, pθ),\min_{\theta \in \mathcal{M}} \; d\big(p_{\text{data}},\, p_\theta\big),

其中 M\mathcal{M} 是模型族(所有候选分布),dd 是两个分布之间的某种”距离”,而 pdatap_{\text{data}} 只能通过训练集 D\mathcal{D} 接触到。这个式子里的三个要素——模型族怎么表示、距离怎么选、怎么优化——就是全课的三个核心问题(§5)。

为什么要”概率”? 因为同一个描述对应很多种合理的数据。“一只狗”可以是任何品种、姿态、光照;同样,“一条横线”每次画出来噪声都不同。确定性的函数只能给出一个答案,概率分布才能描述”所有合理答案以及它们各自有多常见”。生成模型要学的就是这个分布。

2.2 数据 + 先验知识

一个统计生成模型由两样东西决定(原课第 5、6 页):

  • 数据:训练样本,例如一堆卧室照片;
  • 先验知识:分布的参数形式(是高斯吗?是什么结构的神经网络?)、损失函数(最大似然?)、优化算法……

Ermon 在 slide 上画了一条光谱:一端是图形学——几乎全靠先验知识(物理、材质、光照的公式),基本不需要数据;另一端是统计生成模型——主要靠数据学习。他的原话是:“Priors are always necessary, but there is a spectrum.”(先验总是必要的,但有一个光谱。)

为什么先验”总是必要”?因为数据永远不够。课程笔记举了一个例子:一张手机照片有几百万个像素,每个像素 3 个通道、每个通道 256 种取值,可能的图片数量是天文数字;而最大的公开数据集 ImageNet 也只有约 1500 万张图。“从这么少的数据里确定一个这么大空间上的分布”是一个严重欠定的问题——没有任何假设,就没有任何泛化(机器学习的”没有免费的午餐”定理)。

代码 02 在像素世界里把这条光谱上的 6 个模型放在一起比较。每个模型先验的强弱不同:

模型先验知识从数据学什么
图形引擎(纯先验)知道 177 种画法;形状频率猜成均匀、噪声猜成 2%(都猜错了)什么都不学
模板 + 数据知道 177 种画法形状频率、噪声水平(EM 算法)
模板缺十字 + 数据知道 141 种画法,不知道世界上有十字同上
伯努利混合 K=32K = 32只假设”每张图是 32 个原型之一,再加独立噪声”32 个原型本身
独立像素假设 64 个像素互相独立(错误的假设)每个像素黑的概率
查表不做任何假设数一数每张图出现了几次(再留 1% 的概率给没见过的图)

尺子是 5000 张没见过的测试图上的平均 −log⁡2pθ(x)-\log_2 p_\theta(x),减去真实分布在同一批图上的值(这个差就是 KL 散度的估计,第 4 讲详细解释;0 = 和真实分布一样好):

模型(先验从强到弱)N=20N=100N=1000N=10000参数个数
图形引擎(纯先验)1.571.571.571.570
模板 + 数据0.710.910.180.02177
模板缺十字 + 数据1.962.011.381.25141
伯努利混合 K=3215.4810.366.174.622079
独立像素11.5310.4610.0610.0064
查表44.8744.8144.3842.259685(随数据增长)

这张表几乎把”数据 + 先验”的所有要点都展示出来了:

  1. 数据少时,先验为王。 N=20N = 20 时,一张数据都不看的图形引擎只比真实分布差 1.57 bit/图,远好于伯努利混合(15.48)和独立像素(11.53)。但它也永远停在 1.57——它不学习,数据再多也没用。
  2. 正确的先验 + 数据 = 最好的组合。 “模板 + 数据”只用 20 张图就把噪声水平学到了 0.0477(真实 0.05),误差降到 0.71;数据多了以后逼近 0(N=10000N = 10000 时 0.02)。图形引擎的 1.57 bit 主要就是猜错的噪声水平造成的。
  3. 先验错了,数据救不回来。 “模板缺十字”在 N=10000N = 10000 时仍差 1.25 bit。拆开看,误差全部在十字图上:每张十字图多付 7.2 bit(只能解释成”某个别的形状 + 很多翻转”),而其他形状的图反而少付 0.21 bit——本该留给十字的概率被分给了它们。概率的总量是 1,此消彼长。“独立像素”也是一样:参数最少,但”像素独立”这个假设是错的,误差停在 10 bit。
  4. 弱先验需要更多数据,但能一直进步。 伯努利混合起点最差(N=20N = 20 时比独立像素还差 4 bit),但误差一路下降,N≥1000N \geq 1000 时超过了独立像素。这正是”统计生成模型”的路线:**用更灵活的模型族 + 更多的数据,代替人写的先验。**深度生成模型把这条路走到了极致——神经网络是一个极其灵活的模型族,配合海量数据。
  5. 完全不做假设,就完全不会泛化。 查表在训练集上的成绩”好得不可能”(N=100N = 100 时训练集上只要 6.66 bit/图,远低于真实熵 25.7),测试集上却最差(70.5 bit/图):没见过的图一律只拿到 1%×2−641\% \times 2^{-64} 的概率。它的参数个数随数据增长(非参数模型),却什么规律都没学到。这是最极端的过拟合(第 4 讲)。

还有一个细节值得注意:“模板 + 数据”从 N=20N = 20 到 N=100N = 100 反而略差(0.71 → 0.91)。原因是 100 张图只覆盖了一部分配置,EM 算法给没见过的配置只留了很小的概率,测试时恰好遇到它们就要多付 bit。“怎样给没见过的东西留概率”(平滑、正则化)是第 4 讲要讨论的取舍。

深度生成模型在光谱上的位置:它们是”弱先验 + 海量数据”的那一端,但先验并没有消失,只是换了形式——卷积网络假设”局部的模式在图中任何位置都一样”(平移等变),自回归模型假设一个生成顺序,扩散模型假设”逐步去噪”的结构……第 3–18 讲的每个家族,本质上都是在选择一种”合适的先验”。

2.3 生成模型 = 数据模拟器

原课第 7–12 页用一组动画讲了同一个想法:生成模型就是一个数据生成过程的模拟器(data simulator)。

              控制信号 ──→ ┌─────────────┐ ──→ 新的数据点         (生成 / 采样)
                           │ 数据模拟器   │
          候选的数据点 ──→ │ = 统计模型   │ ──→ 概率值             (打分 / 密度估计)
                           │ = 生成模型   │
                           └─────────────┘

把这个模拟器和 Lecture 2 开头列出的”学习一个生成模型的三个目标”对应起来(以”狗的图片”为例):

  1. 生成(generation / sampling):xnew∼p(x)x_{\text{new}} \sim p(x) 应该看起来像一只狗。
  2. 密度估计(density estimation):p(x)p(x) 在 xx 像狗时高、不像时低——可以用来做异常检测。
  3. 无监督表示学习(unsupervised representation learning):学到这些图片的共同点(耳朵、尾巴……),即特征。

代码 01 在像素世界里把三件事都做了一遍。

生成就是按图形引擎的步骤依次抽样:先 z∼p(z)z \sim p(z),再 x∼p(x∣z)x \sim p(x \mid z)。这种”按箭头方向依次采样”叫祖先采样(ancestral sampling),第 2 讲会在贝叶斯网络里正式定义它。几乎所有深度生成模型的采样都是这个结构:“先抽一个简单的随机量,再用一个函数把它变成数据”——VAE 的 z→z \to 解码器、流模型的 z→z \to 可逆网络、GAN 的 z→z \to 生成器、扩散模型的噪声 →\to 逐步去噪。

控制信号让我们指定”生成什么”。代码 01 第 4 部分演示了三种:只画十字、只在左上角 4×4 区域里画(满足条件的配置有 17 个)、只画 4×4 的大方框。在像素世界里,控制信号做的事很简单:不改变”怎样画”和”怎样加噪声”,只是限制(或重新加权)“画什么”,即 p(z∣条件)p(z \mid \text{条件})。文生图模型 p(图∣文字描述)p(\text{图} \mid \text{文字描述}) 是同一件事的大规模版本——原课把它写成 P(X∣Caption="A black table with 6 chairs")P(X \mid \text{Caption} = \text{"A black table with 6 chairs"}),文字描述就是一个极其丰富的控制信号。

2.4 打分:为什么永远用对数概率

给一张图打分,就是算 p(x)p(x)。代码 01 第 3 部分给 6 张图打了分:

一张真实样本       它的干净模板       样本再多翻 6 个像素   全白的图           随机噪声图         两个形状叠在一起
· · · · · · · ·    · · · · · · · ·    · ██· · · · · ·    · · · · · · · ·    · ██████· ██· ·    ████████· · · ·
· · · · · · ██·    · · · · · · · ·    · · · · · · ██·    · · · · · · · ·    · ██· · · · · ·    · · · · · · · ·
· · · · · · ██·    · · · · · · · ·    ██· · · · · ████   · · · · · · · ·    ██· · ████· · ██   · · · · · · · ·
· · · · · · · ·    · · · · · · · ·    · · · · · · · ·    · · · · · · · ·    ██████· ██· ██·    · · · · · · · ·
· · ██· · · · ·    · · · · · · · ·    · · ██· · · ██·    · · · · · · · ·    · ████· · ████·    · · · · · · · ·
██· · · · · · ·    · · · · · · · ·    ██· · ██· · · ·    · · · · · · · ·    · · · ██· ██████   · · · · · · ██·
· · ████████· ·    · · ████████· ·    · · ████████· ·    · · · · · · · ·    · · ██████████·    · · · · · ██████
· · · · · · · ·    · · · · · · · ·    · · · ██· · · ·    · · · · · · · ·    · ██████· ██· ██   · · · · · · ██·
图log⁡2p(x)\log_2 p(x)p(x)p(x)比典型图高多少 bit
一张真实样本−28.782.17e−09−3.20
它的干净模板−11.792.83e−04+13.79
样本再多翻 6 个像素−50.366.92e−16−24.78
全白的图−22.701.47e−07+2.88
随机噪声图−121.702.31e−37−96.12
两个形状叠在一起−29.121.71e−09−3.54

(“典型图”取 2 万个样本的平均 log⁡2p(x)=−25.58\log_2 p(x) = -25.58,也就是这个世界的熵的相反数。)

几个要点:

  • 真实样本的概率也小得惊人(10−910^{-9} 量级)。可能的图太多(2642^{64} 张),概率被摊得极薄。真实的图像模型更夸张:好的模型在 CIFAR-10(32×32×3=307232\times32\times3 = 3072 维)上大约是 3 bits/dim,一张图的概率约为 2−90002^{-9000}。所以生成模型永远在对数空间里计算:64 个小于 1 的数直接相乘会下溢成 0,而对数概率只是 64 个负数相加。论文里报告的 bits/dim、nats、困惑度(perplexity),全都是对数概率的变形。
  • 明显不对的图(随机噪声、噪声大很多的图)比典型图低几十到近百 bit——这是异常检测的基础(§4.4)。
  • 但概率不是”合理程度”的万能尺子:世界里从不存在的”两个形状叠在一起”只比典型图低 3.5 bit——模型把它解释成”一个十字,外加横线那 4 个翻转的像素”,和一张噪声稍多的正常图差不多。
  • 更反直觉的是全白的图:它根本不是一张”画”,概率却比典型样本高 2.9 bit;干净模板更是高出 13.8 bit。“概率高”≠“像真实数据”——这个现象叫”最可能 ≠ 典型”,§4.4 会解释它为什么在高维里不可避免。

2.5 推断:逆向图形学

第三种用途是推断:给一张图,问”它是怎样被画出来的”。在像素世界里,这就是后验分布

p(z∣x)=p(z) p(x∣z)∑z′p(z′) p(x∣z′).p(z \mid x) = \frac{p(z)\, p(x \mid z)}{\sum_{z'} p(z')\, p(x \mid z')}.

代码 01 第 5 部分对几张图算了后验:

  图1  真实配置:3×3方框 左上(4,4)
        后验前三:3×3方框 左上(4,4):1.000;十字 中心(5,5):0.000;十字 中心(5,4):0.000
  图2  真实配置:横线 行6 列4-7
        后验前三:横线 行6 列4-7:0.997;横线 行6 列3-6:0.003;十字 中心(6,6):0.000
  最模棱两可的图  真实配置:竖线 列1 行2-5
        后验前三:横线 行3 列1-4:0.192;竖线 列1 行3-6:0.128;竖线 列4 行1-4:0.128

在 5000 张新图上:最大后验配置等于真实配置的比例是 0.950,最大后验形状等于真实形状的比例是 0.984,真实配置的平均后验概率 0.936;3000 张图的平均后验熵只有 0.192 bit,但最模棱两可的那张有 3.06 bit。

这说明两件事。第一,从像素读出高层描述是可能的:大多数图的后验几乎全部集中在真实配置上——这就是”表示学习”想要的东西,zz 是一个比 64 个像素紧凑得多、也有意义得多的描述。第二,推断的正确输出是一个分布,而不是一个答案:有的图被噪声弄得真正模棱两可(那张”最模棱两可的图”里,真实的竖线有两个笔画像素被噪声擦掉了),此时任何方法都不可能确定答案;即使是”知道真相”的贝叶斯推断,配置准确率也只有 95%——这就是这个世界里任何方法的上限。

推断的代价。为什么像素世界能精确推断?因为分母只有 177 项。代码 01 第 6 部分列了一张表:

设定zz 的取值个数精确推断要做的计算结论
像素世界177177 × 64 = 11,328 次乘加 / 图精确
zz = 10 个二值开关210=10242^{10} = 1024约 65,536 次 / 图还能枚举
zz = 100 个二值开关2100≈1.3×10302^{100} \approx 1.3 \times 10^{30}宇宙寿命也算不完必须近似
zz = 512 维连续向量(典型的 VAE)不可数一个 512 维积分必须近似

生成总是容易的(一次前向计算),推断往往是难的(要对所有可能的 zz 求和或积分)。真实世界的”配置”——物体、姿态、光照、材质——是高维、连续的,精确推断不可能。本课的很多模型都是在回答”推断太难怎么办”:VAE 用一个编码器网络去近似后验(第 5–6 讲);归一化流让生成过程可逆,推断变成一次反向计算(第 7–8 讲);GAN 干脆不做推断(第 9–10 讲)。


3. 判别式 vs 生成式 · Discriminative vs generative

3.1 两种建模对象,一个贝叶斯公式

原课第 16–17 页的例子:区分”卧室”和”餐厅”的照片。

  • 判别式模型(discriminative):图像 XX 是给定的,目标是决策边界,通过条件分布 P(Y∣X)P(Y \mid X) 实现。例子:逻辑回归、卷积网络。
  • 生成式模型(generative):XX 不是给定的,需要 XX 和 YY 的联合分布 P(X,Y)P(X, Y)。

两者由贝叶斯公式联系:

P(Y∣X)=P(X,Y)P(X)=P(X∣Y) P(Y)∑y′P(X∣y′) P(y′).P(Y \mid X) = \frac{P(X, Y)}{P(X)} = \frac{P(X \mid Y)\, P(Y)}{\sum_{y'} P(X \mid y')\, P(y')}.

代码 03 第 1 部分在像素世界里把这个公式的每一项都算了出来(一张真实形状是竖线、但看起来有点像横线的图):

形状 yyp(y)p(y)p(x∣y)p(x \mid y)p(x,y)=p(y) p(x∣y)p(x, y) = p(y)\,p(x \mid y)p(y∣x)p(y \mid x)
横线0.301.112e−133.337e−140.737
竖线0.205.601e−141.120e−140.247
方框0.301.017e−163.052e−170.001
十字0.203.311e−156.622e−160.015
合计1.004.527e−14 = p(x)p(x)1.000

联合概率 p(x,y)p(x, y) 都是 10−1410^{-14} 量级的数——它描述的是”这张图恰好长这样(并且是这一类)“的概率;条件概率 p(y∣x)p(y \mid x) 却是 0.74、0.25 这样的”正常”数字。两者只差一个分母 p(x)p(x)。判别式模型直接学最后一列;生成式模型学前面几列。有了前面几列,最后一列可以算出来;反过来不行。(顺便说一句:这张图的真实形状是竖线,但贝叶斯最优的判断是”横线”——它确实更像横线。贝叶斯最优不等于每次都对。)

3.2 判别式模型为什么简单,又为什么强

原课第 17 页总结了判别式的优势:YY 很简单;XX 总是给定的,所以不需要建模 P(X)P(X)。 想想看要建模的东西有多大:像素世界里 yy 只有 4 种取值(最多 log⁡24=2\log_2 4 = 2 bit 的不确定性,按真实频率算是 1.97 bit),而 xx 有 64 个像素(约 25.6 bit)。判别式模型把”建模 xx“这个最难的部分整个跳过了。

代码 03 第 2 部分比较了三个从数据学出来的分类器(测试集 5000 张):

分类器N=20N=100N=1000N=10000
判别式:逻辑回归(线性)0.3640.4650.5500.565
判别式:神经网络(2 层隐藏层)0.3300.4790.8460.921
生成式:每类一个伯努利混合(K=16K = 16)0.2780.4840.8140.902
贝叶斯最优(真实生成模型 + 贝叶斯公式)0.984

(数字是测试准确率;总是猜最常见的类是 0.30。)

  • 线性逻辑回归停在 0.565,数据再多也没用:同一种形状可以出现在任何位置,“哪些像素亮”和形状之间不是线性关系。模型族太简单——欠拟合。
  • 神经网络随数据增长快速变好(0.33 → 0.48 → 0.85 → 0.92),这是判别式模型的强项:只要 yy 的信息,不必理解 xx 的全部。但小数据时它在没见过的图上过度自信:N=20N = 20 时测试 log loss 4.70 bit,比”只按 p(y)p(y) 瞎猜”(1.97 bit)还差。
  • 学出来的生成式分类器(先学 p(x∣y)p(x \mid y),再用贝叶斯公式)准确率和神经网络差不多、略低(N=10000N = 10000 时 0.902 vs 0.921),但小数据时 log loss 好得多(N=20N = 20 时 3.31 vs 4.70 bit):它的概率来自”这张图在每一类下有多可能”,不像神经网络那样盲目自信。

“生成式模型更省数据、判别式模型渐近更好”是一个经典结论(Ng & Jordan 2002,对比朴素贝叶斯和逻辑回归),但它取决于两个模型族各自和数据的匹配程度。第 2 讲会在原课的框架里(朴素贝叶斯 vs 逻辑回归、“重复证据被算两遍”)把它讲清楚。

3.3 判别式模型做不到的三件事

既然判别式模型这么好用,为什么还要生成式模型?代码 03 的后三部分给出了三个答案。

(一)它说不出”这张图根本不像任何形状”。 给两个判别式模型喂 1000 张随机噪声图:

正常测试图随机噪声图
逻辑回归:最大类别概率的平均0.4911.000
神经网络:最大类别概率的平均0.9691.000
真实生成模型:平均 log⁡2p(x)\log_2 p(x)−25.7−119.9
学出来的生成式分类器:平均 log⁡2pθ(x)\log_2 p_\theta(x)−29.8−96.0

两个判别式模型对噪声图比对正常图还自信。原因很简单:噪声图平均有 31.9 个黑像素,正常图只有 8.5 个;logit 随黑像素的个数一起变大,softmax 被推到饱和。判别式模型的输出永远是”四选一”,没有”这些都不是”的选项;离训练数据越远,它的外推越离谱。而生成式模型能直接说出 xx 本身有多”正常”——噪声图的对数概率比正常图低几十到近百 bit。

(二)缺失数据。 原课第 17 页:“Therefore it cannot handle missing data.” 设想有一半像素看不见。生成式模型的做法是边缘化:

p(y∣x观测)∝∑x缺失p(y,x观测,x缺失).p(y \mid x_{\text{观测}}) \propto \sum_{x_{\text{缺失}}} p(y, x_{\text{观测}}, x_{\text{缺失}}).

对”给定隐变量时像素独立”的模型(像素世界、伯努利混合),这个求和恰好就是把缺失的像素从乘积里拿掉——一行代码。判别式模型只见过完整的图,只能先”填空”再分类:

缺失方式真实模型边缘化学出的生成式边缘化神经网络·缺失填 0神经网络·填平均值
只看到左半边0.6820.6140.5530.587
每张图随机丢一半像素0.7840.6760.4620.599

完整图上神经网络比学出的生成式分类器还略好(0.921 vs 0.902);一旦缺了像素,形势就反过来了,“随机丢一半”时差距最大(0.676 vs 最多 0.599)。如果事先知道缺失方式,可以专门为它重新训练一个判别式模型:只看左半边时重训的神经网络得到 0.628,甚至略好于学出的生成式模型(0.614)。但这只对这一种掩码有效——64 个像素有 2642^{64} 种缺失方式,不可能每种训练一个;生成式模型一个模型就处理了所有缺失方式。另外,真实模型(0.682 / 0.784)比学出的生成式模型高出一截:边缘化本身是精确的,误差来自 pθp_\theta 学得不够好。

(三)它不能反过来生成 xx。 生成式模型可以从 p(x∣y)p(x \mid y) 采样,画出”一张十字""一张横线”;判别式模型 p(y∣x)p(y \mid x) 没有关于 xx 的任何知识,做不到。

3.4 条件生成模型

原课第 19 页把这件事推广了一步:

  • 类别条件生成模型 P(X∣Y=Bedroom)P(X \mid Y = \text{Bedroom}):给定类别,生成这一类的图;
  • 用丰富的附加信息做条件常常更有用:P(X∣Caption="A black table with 6 chairs")P(X \mid \text{Caption} = \text{"A black table with 6 chairs"})——这就是文生图;
  • 而判别式模型是一个非常简单的条件生成模型:P(Y=Bedroom∣X)P(Y = \text{Bedroom} \mid X)——它”生成”的是 YY,而 YY 只有几种取值。

这个视角把”判别”和”生成”统一了起来:所有模型都在学某个条件分布 p(输出∣输入)p(\text{输出} \mid \text{输入}),区别在于输出有多复杂。输出是一个类别标签(2 bit)时,问题相对容易,一个 softmax 就能表示所有可能;输出是一张图、一段语音、一篇文章时,同一个输入对应无数种合理的输出,模型必须表示一个高维的分布——这正是本课要解决的问题。课程笔记的脚注说得很直接:“判别式模型从技术上讲是标签的生成模型;‘生成模型’这个词通常留给高维数据。”


4. 应用巡礼 · What can generative models do?

原课第 13–44 页是一段很长的应用巡礼。这里按”用到了生成模型的哪种能力”把它们组织起来——你会发现,几乎每个应用都是”采样”、“条件采样”或”算概率”之一。

4.1 图像生成

  • GAN 的进展(第 20 页,Ian Goodfellow 2019 年的总结图):从 2014 年模糊的小图,到 2018–2019 年 StyleGAN 生成的以假乱真的人脸(“This Person Does Not Exist”)。GAN 是第 9–10 讲的主角。
  • 扩散模型的进展(第 21 页,Song et al. 2021,Score-Based Generative Modeling through Stochastic Differential Equations):用”逐步去噪”生成高保真图像。Stefano Ermon 的组(Yang Song 等)是得分模型和扩散模型的奠基者之一,这条线索是第 13–14、16 讲。
  • 文生图(第 22–25 页):“An astronaut riding a horse”、“A perfect Italian meal”、DALL·E 3 生成的咖啡馆微缩模型。这是条件采样 p(图∣文字)p(\text{图} \mid \text{文字})。
  • 从笔画到图像(第 13 页,Meng, He, Song et al., ICLR 2022,即 SDEdit):给一张粗糙的涂鸦,生成一张写实的图——同样是条件采样,条件是”大致的布局和颜色”。

4.2 逆问题

原课第 26–30 页列了一组逆问题(inverse problems):观测到的是”坏掉的”数据,要恢复原来的数据。

任务写成条件分布例子
超分辨率P(高清∣低清)P(\text{高清} \mid \text{低清})Menon et al. 2020(PULSE)
补全(inpainting)P(完整图∣遮挡后的图)P(\text{完整图} \mid \text{遮挡后的图})Liu et al. 2018
上色P(彩色∣灰度)P(\text{彩色} \mid \text{灰度})Antic 2020(DeOldify)
图像编辑P(编辑后∣原图, 指令)P(\text{编辑后} \mid \text{原图, 指令})Kawar et al. 2023(Imagic)
医学成像(稀疏视角 CT)P(截面图∣稀疏的投影数据)P(\text{截面图} \mid \text{稀疏的投影数据})Song et al. 2022

为什么逆问题需要生成模型?因为它们都是一对多的:一张低清图对应很多张合理的高清图,一张遮挡的图有很多种合理的补全。判别式地”回归出一个答案”只能得到所有合理答案的平均——模糊的图;生成模型给出的是一个分布,从中采样得到清晰、合理的答案(§4.4 有实验)。医学成像的例子还展示了另一种结构:观测过程(“前向模型”)由物理模拟给出,生成模型只负责提供”真实的人体截面图长什么样”这个先验。

4.3 异常检测

原课第 15 页(Song et al., ICLR 2018,PixelDefend):在交通标志上训练一个生成模型,正常的交通标志拿到高概率,加了对抗扰动的图拿到低概率——用 p(x)p(x) 检测异常输入,再把它”拉回”高概率区域,就能防御对抗攻击。这用到的是密度估计能力。

4.4 在像素世界里试一试:异常检测、典型集、去噪、补全

代码 04 在像素世界里把上面三类应用都做了一遍,结果比预想的更有教育意义。

异常检测。 造了六种”异常”输入(每种 1000 张),用 log⁡p(x)\log p(x) 打分,分数越低越可疑。AUC 衡量”随机拿一张正常图和一张异常图,正常图分数更高的概率”;检出率是在”只冤枉 1% 的正常图”时抓到的异常比例。

输入平均 log⁡2p(x)\log_2 p(x)真实模型 AUC检出率学出模型 AUC检出率
噪声更大(ε = 15%)−50.90.9710.6660.9450.505
随机噪声图−121.01.0001.0001.0001.000
世界里没有的形状:对角线−38.00.8960.0910.6250.008
两个形状叠在一起−39.40.8910.2390.8550.225
黑白反色−195.71.0001.0001.0001.000
空白画布 + 噪声(没有形状)−28.10.6160.0010.2480.000

(正常测试图平均 −25.6;“学出模型”是 1 万张图训练的伯努利混合。)

  • 随机噪声和反色被完美抓出(低一百多 bit)。
  • “噪声更大”的 AUC 很高(0.971),但误报率压到 1% 时只抓到 2/3:正常图里本来就有噪声偏多的,两组分数有重叠。AUC 高 ≠ 实际可用的检出率高。
  • “对角线""两个形状叠加”这种语义上的异常只抓到 9% 和 24%:模型总能把它们解释成”某个熟悉的形状 + 几个翻转”。学出来的伯努利混合更差(对角线 AUC 只有 0.625):它的原型本来就是模糊的,什么都能”解释”一点。
  • 空白画布几乎抓不到:真实模型下 AUC 0.616(两组分数几乎重合),学出来的模型下 AUC 0.248——它给空白画布的概率比正常图还高。一张什么都没画的图在像素层面”很简单”,而简单的图恰好容易拿到高概率。Nalisnick et al. (2019) 在真实的深度生成模型上发现了同样的现象:在 CIFAR-10 上训练的模型,给”更简单”的 SVHN 门牌号图片更高的似然。基于似然的异常检测会系统性地漏掉”简单”的异常——第 15 讲(评估)还会回到这个问题。

“最可能”≠“典型”。 §2.4 里干净模板的概率比典型样本高 13.8 bit,可我们几乎从来采不到它。代码 04 第 2 部分算清楚了为什么:

翻转像素数 kkP(恰好翻 k 个)P(\text{恰好翻 } k \text{ 个})这样的图有几张(每个配置)其中一张的 log⁡2p(x)≈\log_2 p(x) \approx
00.03751−11.79
10.126464−16.04
20.20962,016−20.29
30.227941,664−24.54
40.1829635,376−28.79
50.11557,624,512−33.03
60.059874,974,368−37.28

每多翻一个像素,单张图的概率降低约 4.25 bit(log⁡20.950.05\log_2 \frac{0.95}{0.05}),但”这样的图”的数量增加几十倍。单张最可能的图(k=0k = 0)只占 3.75% 的样本,最常见的是翻 3 个——数量弥补了每张概率低的劣势。所以样本的 −log⁡2p(x)-\log_2 p(x) 集中在熵附近的一条带里(平均 25.64,标准差 7.24),叫做典型集(typical set);177 张干净模板的 −log⁡2p(x)-\log_2 p(x) 在 11.8–12.4 之间,落在这条带的最左端之外。

像素世界只有 64 个像素,干净模板还占 3.75% 的样本,算不上异常。维数越高,这个现象越极端(同样 5% 的噪声):

画布像素数 DDP(一个都不翻)P(\text{一个都不翻})翻转个数的平均标准差标准差 / 平均
像素世界 8×86410−1.410^{-1.4}3.21.70.545
MNIST 大小 28×2878410−17.510^{-17.5}39.26.10.156
32×32×33,07210−68.410^{-68.4}153.612.10.079
256×256×3196,60810−4379.710^{-4379.7}9830.496.60.010

在 MNIST 大小的画布上,“一张干净图”的概率是 10−17.510^{-17.5}——永远不会被采到;翻转个数的相对波动按 1/D1/\sqrt{D} 缩小,典型集越来越窄。高维空间里,“最可能的点”和”典型的点”是两回事。 这有两个直接后果:

  1. “只输出最可能的图”不是好的生成:它产生的是从不出现的”完美”图,不是像数据的图(代码 01 也展示了:干净模板比任何典型样本都”更可能”)。
  2. 在高维里,“概率高得不正常”本身也可以是异常的信号(Nalisnick et al. 2019 提出的典型性检验),这能部分解释上面”空白画布”的问题。

去噪。 把世界样本再以 10% 的概率翻转每个像素,然后求后验”什么样的干净图,加上噪声后最可能变成我看到的样子”:

2000 张图上的去噪数值
观测图 vs 干净模板:不同的像素数8.94
最大后验模板 vs 干净模板:不同的像素数1.59
最大后验配置 = 真实配置 的比例0.717
最大后验形状 = 真实形状 的比例0.832

去噪就是 p(x干净∣y观测)∝p(y∣x) p(x)p(x_{\text{干净}} \mid y_{\text{观测}}) \propto p(y \mid x)\, p(x):生成模型 p(x)p(x) 在这里扮演先验,它知道”干净的图长什么样”,于是能把噪声和笔画分开。

补全。 只看到上半张图,从 p(下半张∣上半张)p(\text{下半张} \mid \text{上半张}) 采样。上半张信息不足的一个例子(后验概率 > 1% 的配置有 62 个):

观测(??=缺失)    采样补全 1         采样补全 2         采样补全 3         采样补全 4         后验平均
· · · ████· · ·    · · · ████· · ·    · · · ████· · ·    · · · ████· · ·    · · · ████· · ·    · · · ████· · ·
· · · · · · · ·    · · · · · · · ·    · · · · · · · ·    · · · · · · · ·    · · · · · · · ·    · · · · · · · ·
██· · · · · ██·    ██· · · · · ██·    ██· · · · · ██·    ██· · · · · ██·    ██· · · · · ██·    ██· · · · · ██·
· · · · · · · ·    · · · · · · · ·    · · · · · · · ·    · · · · · · · ·    · · · · · · · ·    · · · · · · · ·
????????????????   · · · · · · · ·    · · · · · · · ·    · ██· · · · · ·    · · · · · · ██·    ░░░░░░░░░░░░░░░░
????????????????   ████████· · · ·    · · · · · · · ·    · ██· · · · · ·    · · · · · · ██·    ░░░░░░░░░░░░░░░░
????????????????   · · · · ██· · ·    · · ████████· ·    · ██· · · · · ·    · · · · · · · ·    ░░░░░░░░░░░░░░░░
????????????????   · · · · · · · ·    · · · · · · · ·    · ██· · · · · ·    · · · · · · · ·    ░░░░░░░░░░░░░░░░

上半张只有几个噪声像素,所以形状可能在下半张的任何地方:每次采样给出一条不同位置的横线、一条竖线……都合理(采样 200 次得到 193 种不同的补全)。而后验平均——所有可能补全的加权平均——是一团灰色,不是任何一张合法的图。用均方误差训练一个”补全网络”学到的正是这个平均(第 4 讲会证明:均方误差的最优解是条件期望),所以结果模糊。上半张信息充分时(例如一个完整的方框在上半张),各次采样只在零星的噪声像素上不同。生成模型给出的是分布:每个样本都清晰、合理,多次采样展示出不确定性本身。

4.5 语音与音频

  • WaveNet(第 31 页,van den Oord et al. 2016):逐个采样点生成语音波形的自回归模型(第 3 讲),比当时的参数式和拼接式语音合成自然得多;也能生成音乐。
  • 扩散模型做 TTS(第 32 页,Betker 2023,Better speech synthesis through scaling,即 TorToise)。
  • 音频超分辨率(第 33 页,Kuleshov et al. 2017):P(高采样率信号∣低采样率信号)P(\text{高采样率信号} \mid \text{低采样率信号})。

4.6 语言

  • 语言生成(第 34 页,Radford et al. 2019,GPT-2):P(下一个词∣前面的词)P(\text{下一个词} \mid \text{前面的词})——这就是自回归模型(第 3 讲)。
  • ChatGPT(第 35 页):slide 上是 ChatGPT 回答”怎样在 CS236 拿 A+“的一大段建议。一个生成模型,加上指令对齐,就成了通用助手。
  • 机器翻译(第 36 页):P(英文∣中文)P(\text{英文} \mid \text{中文}),条件生成模型。
  • 代码生成(第 37 页,OpenAI Codex)。

文本是离散数据。本课大部分时间讨论连续数据(图像),离散数据的特殊困难在第 17、18 讲。

4.7 视频、决策与科学

  • 视频生成(第 38–40 页):从文字描述生成短视频,例如”堤坝突然决口,洪水涌出”。
  • 模仿学习(第 41 页,Li et al. 2017;Janner et al. 2022,Diffuser):P(动作∣过去的观测)P(\text{动作} \mid \text{过去的观测})。人类示范往往是多峰的(同一个场景下可以向左绕也可以向右绕),生成模型能表示这种多峰性,普通回归会把它们平均成”撞上去”。
  • 分子生成(第 42 页):生成满足某些性质的分子结构。

4.8 深度伪造与社会影响

原课第 43–44 页:“Which image is real?”——生成模型已经能造出人眼分不出真假的人脸、声音和视频。这带来了虚假信息、冒名、版权等一系列社会问题。原课没有展开,但它提醒我们:“能以假乱真”既是这门课追求的技术目标,也是它最大的风险来源。 检测生成内容(§4.4 的异常检测只是很初步的一步)、给生成内容加水印、训练数据的版权和隐私(第 15 讲会谈到”背诵训练集”),都是活跃的研究方向。


5. 路线图与核心挑战 · Roadmap and key challenges

原课第 45 页列出了这门课的三个核心挑战,外加一个目标:

  1. 表示(Representation):怎样对很多个随机变量的联合分布建模?需要紧凑的表示。
  2. 学习(Learning):比较两个概率分布的”正确”方式是什么?
  3. 推断(Inference):怎样把生成过程反过来(例如”视觉是逆向图形学”)?
  4. 无监督学习:从原始数据里恢复高层描述(特征)。

5.1 表示:维数灾难

nn 个二值像素可以组成 2n2^n 张图。要用一张表完整地描述它们的联合分布,需要 2n−12^n - 1 个数(减 1 是因为概率之和必须是 1)。像素世界里 n=64n = 64:264−1≈1.8×10192^{64} - 1 \approx 1.8 \times 10^{19} 个数——而这个世界的”说明书”只有 177 个模板 + 4 个形状概率 + 1 个噪声水平。一张 28×28 的黑白 MNIST 图有 27842^{784} 种可能,远远超过宇宙中原子的个数(约 1080≈226610^{80} \approx 2^{266})。

所以生成模型必须给分布加上结构,用远少于 2n2^n 的参数描述它。§2.2 的光谱已经展示了几种结构:独立性(64 个参数,但假设错了)、混合模型(2079 个参数)、已知的生成过程(177 个参数)。第 2 讲会系统地讨论:独立性、链式法则、条件独立、贝叶斯网络,以及”用神经网络参数化条件分布”——后者是所有深度生成模型的起点。

5.2 学习:怎样比较两个分布

训练一个生成模型就是让 pθp_\theta 靠近 pdatap_{\text{data}}。但”靠近”用什么来量?代码 05 拿两把尺子量了 9 个模型:

  • 尺子 1:似然。测试图上的平均 −log⁡2pθ(x)-\log_2 p_\theta(x),比真实分布多出来的部分 ≈ KL(pdata∥pθ)\mathrm{KL}(p_{\text{data}} \Vert p_\theta)。它需要模型能算 pθ(x)p_\theta(x)——第 3–8 讲(自回归、VAE、流)用这把尺子训练。
  • 尺子 2:判别器。训练一个小神经网络区分”真样本”和”模型样本”,看它在新样本上的准确率:0.5 = 分不出来,1.0 = 一眼看穿。它只需要模型能采样——这就是两样本检验(two-sample test),也是 GAN 的核心想法(第 9–10 讲)。
模型尺子 1:比真实多 bit尺子 2:判别器准确率照抄训练图的比例
真实分布(另一批样本)0.000.5210.013
模板 + 数据0.160.5190.009
图形引擎(ε 猜成 2%)1.500.6650.056
伯努利混合 K=326.080.7180.001
独立像素10.030.8530.000
查表(背诵 1000 张,有放回)44.520.7210.985
查表(背诵 1 万张,不重复)42.160.4911.000
模式坍塌(只画横线)10.090.7240.018
1% 真样本 + 99% 噪声6.640.9940.000

(训练集 1000 张;尺子 1 用 2000 张测试图,尺子 2 用另外 2000 张真样本,瞎猜的准确率在 0.5 ± 0.02 左右波动。)

两把尺子在多数模型上意见一致,但在三个模型上”打架”——这三个例子值得记住,因为它们会在全课反复出现:

  1. 背诵训练集:样本完美,似然极差。 从 1 万张训练图里不重复地抽样时,判别器准确率 0.491,和瞎猜一样——每个样本都是一张货真价实的真样本。似然却一眼看穿:多用 42 bit(没见过的测试图几乎拿不到概率)。有意思的是,只背 1000 张、有放回抽样时,判别器准确率是 0.721:2000 个样本里只有 877 张不同的图,测试时的假样本很多正是判别器训练时见过的那几张——它学会的是”这几张图是假的”,检测的是重复,不是”不像”。要从样本上发现背诵,得专门去查”照抄率”。
  2. 1% 真样本 + 99% 噪声:似然不错,样本极差。 它的对数似然最多只比真实分布差 log⁡2100=6.64\log_2 100 = 6.64 bit(练习 5 证明),比”独立像素”还好;可它 99% 的样本是垃圾,判别器准确率 0.994。这是 Theis, van den Oord & Bethge (2016) 的例子,原课第 9 讲会引用:对不完美的模型,似然好不一定样本好,反之亦然。
  3. 模式坍塌:每张样本都完美,但缺了 70% 的数据。 两把尺子都发现了(10.09 bit、准确率 0.724)。注意理论上最好的判别器能到 0.85(练习 7),这个小分类器只学到 0.72:判别器的能力有限,“准确率接近 0.5”只能说明”这个判别器分不出来”,不能证明两个分布相同。

结论:没有一把尺子是万能的。 似然(KL 散度)对”没覆盖到的数据”极其敏感——漏掉一个模式就要付出巨大代价;判别器对”生成了不像的样本”敏感。用哪把尺子训练,就会得到偏向哪种错误的模型。这条线索贯穿全课:KL 散度与最大似然(第 4 讲)、GAN 与 ff-散度、Wasserstein 距离(第 9–10 讲)、Fisher 散度与得分匹配(第 12–13 讲)、评估(第 15 讲)。

5.3 推断:怎样把生成过程反过来

§2.5 已经展示了:生成容易,推断难。推断不只是”从图读出形状”这一个用途——缺失数据的边缘化(§3.3)、去噪和补全(§4.4)、给一张图打分(p(x)=∑zp(x,z)p(x) = \sum_z p(x, z) 本身就是一次推断),全都需要对隐变量求和或积分。本课的模型家族在推断上的选择各不相同:自回归模型干脆没有隐变量(p(x)p(x) 精确可算,但没有天然的特征);VAE 用编码器近似推断;流模型让推断精确但要求网络可逆;GAN 不做推断。

5.4 无监督表示学习

最后一个目标是从原始数据里恢复高层描述——不需要任何标签。像素世界的后验 p(z∣x)p(z \mid x) 读出了”形状、位置、大小”;真实世界里,我们希望模型自动发现”物体、姿态、光照、风格”这样的因素。这比分类更难评价:什么样的表示才算”好”?第 15 讲会讨论聚类、重构、解耦等评价方法;第 5–6 讲的 VAE 是最直接的”学表示”的生成模型。

5.5 把三个问题写成一个式子

回到课程笔记的式子 min⁡θ∈Md(pdata,pθ)\min_{\theta \in \mathcal{M}} d(p_{\text{data}}, p_\theta),三个核心问题分别是:

  1. 模型族 M\mathcal{M} 怎么表示?(表示)
  2. 距离 dd 选什么?(学习的目标函数)
  3. 用什么优化过程最小化它?(学习的算法)

再加上学好以后的三种推断查询:密度估计 pθ(x)p_\theta(x)、采样 x∼pθx \sim p_\theta、表示学习。课程笔记特别强调:没有一种模型族能把所有推断任务都做得又高效又准确,这些取舍正是模型种类这么多的原因;而且,样本质量和表示质量的定量评价至今仍是开放问题。


6. 课程地图:模型家族 · The landscape

原课第 46 页的课程大纲按模型家族组织:

  • 完全观测的、基于似然的模型:自回归模型、流模型
  • 隐变量模型:变分学习、摊销推断、变分自编码器
  • 隐式生成模型:两样本检验、嵌入、ff-散度、生成对抗网络
  • 能量模型
  • 基于得分的扩散生成模型

“学习算法、理论和应用。“下表把每个家族放进本讲的框架里(”✓“表示这个家族天然支持,”△“表示能做但要付出代价或只能近似,”✗“表示不支持):

家族讲次算 p(x)p(x)采样隐表示 zz学习用的”距离”主要代价
自回归模型3✓ 精确△ 逐个维度,慢✗KL(最大似然)采样慢、要选顺序
变分自编码器5–6△ 只有下界✓ 快✓ 近似推断KL 的下界(ELBO)似然不精确、样本偏模糊
归一化流7–8✓ 精确✓ 快✓ 精确推断KL(最大似然)网络必须可逆、维数不能变
生成对抗网络9–10✗✓ 快✗(需另加编码器)JS / ff-散度 / Wasserstein(判别器)训练不稳定、模式坍塌
能量模型11–12△ 差一个常数△ 要 MCMC✗KL(对比散度)、Fisher、NCE配分函数、采样慢
得分 / 扩散模型13–14、16△(概率流 ODE 可精确算,但贵)△ 多步,慢△Fisher 散度(去噪得分匹配)/ ELBO采样步数多

这张表就是全课的”问题链”:

  • 自回归模型似然精确,但没有隐变量、采样慢 →
  • VAE 有了隐变量和快速采样,却只能优化似然的下界 →
  • 流模型既有隐变量又有精确似然,代价是网络必须可逆 →
  • 干脆不要似然(GAN),只比较样本,换来训练不稳定 →
  • 不要归一化常数(能量模型),模型最灵活,换来采样和训练都要 MCMC →
  • 只学对数密度的梯度(得分模型),绕开归一化常数 →
  • 扩散模型把这些想法汇合在一起:它既是层级 VAE,又是多尺度的得分模型,还能写成连续的流(第 16 讲)。
  • 最后两讲处理离散数据:离散隐变量的梯度估计(第 17 讲),以及离散数据上的扩散模型(第 18 讲)。中间的第 15 讲专门讨论怎样评价生成模型——§5.2 的”两把尺子打架”只是开始。

7. 2023 年之后 · Since 2023

原课是 2023 年秋季的。之后两三年,深度生成模型的格局又有了不少变化。下面列出和本课内容关系最密切的几条(细节在对应的讲次里展开):

  • 扩散与流匹配成为图像、视频生成的主流架构。 Stable Diffusion 3(2024)用”整流流(rectified flow)+ Transformer”取代了 U-Net 上的 DDPM;FLUX(2024)延续了这条路线。流匹配(flow matching)把第 7–8 讲的流模型和第 16 讲的扩散模型统一成”学一个向量场”——本仓库的 MIT6.S184 专门讲这一套。
  • 视频生成。 OpenAI 的 Sora(2024 年 2 月)、Meta 的 Movie Gen(2024)、Google 的 Veo 系列:在压缩后的时空潜空间里做扩散 / 流匹配,用 Diffusion Transformer 当网络。
  • 少步生成。 一致性模型(consistency models)、各种蒸馏方法把扩散模型的采样从几十上百步压缩到一两步(第 16 讲的”加速采样”)。
  • 自回归图像模型的复兴。 VAR(“预测下一个尺度”,NeurIPS 2024 最佳论文)等工作让自回归模型在图像生成上重新具有竞争力;2025 年起,多模态大模型(例如 GPT-4o 的原生图像生成)把图像和文字放进同一个自回归模型。第 3 讲的”自回归 vs 其他家族”之争并没有结束。
  • 离散扩散语言模型。 第 18 讲的客座讲者 Aaron Lou 与 Chenlin Meng、Stefano Ermon 合作的 SEDD(Discrete Diffusion Modeling by Estimating the Ratios of the Data Distribution)获得 ICML 2024 最佳论文;之后的 MDLM、LLaDA(2025)把掩码扩散语言模型做到了数十亿参数,Inception Labs 的 Mercury 和 Google 的 Gemini Diffusion(2025)展示了扩散语言模型在生成速度上的优势。
  • 科学中的生成模型。 AlphaFold 3(2024)用扩散模块生成蛋白质复合物结构;GenCast(2024)用扩散模型做集合天气预报。§4.7 的”分子生成”已经成了一个大领域。
  • 背诵、版权与评估。 Carlini et al. (2023) 从 Stable Diffusion 里提取出了近乎原样的训练图片——§5.2”背诵训练集”的问题在真实大模型上确实存在。怎样评价一个生成模型(第 15 讲)仍然是开放问题,人类偏好评测和专门的基准越来越重要。

不变的是这门课的骨架:无论模型多大,问题仍然是怎样表示 p(x)p(x)、用什么距离学习它、怎样从中采样和推断。


8. 小结 · Summary

  1. 统计生成模型就是一个概率分布 p(x)p(x);从中采样就生成了新数据。学习 = 在模型族 M\mathcal{M} 里找离 pdatap_{\text{data}} 最近的 pθp_\theta,而 pdatap_{\text{data}} 只能通过训练样本接触。
  2. 生成模型 = 数据 + 先验知识。 先验总是必要的(数据永远不够),但有一条从”图形引擎”到”从数据学习”的光谱。像素世界里:数据少时强先验最好;正确的先验 + 数据是最好的组合;先验错了数据救不回来;弱先验需要更多数据但能一直进步;完全不做假设就完全不会泛化。
  3. 生成模型是数据模拟器,有三种用途: 采样(可加控制信号做条件生成)、密度估计(打分)、推断 / 表示学习(从数据反推高层描述)。生成容易、推断难;“视觉是逆向图形学”。
  4. 判别式模型只学 p(y∣x)p(y \mid x),简单而强大,但它说不出 xx 本身像不像(对噪声图反而最自信)、处理不了缺失数据、不能生成 xx。判别式模型是最简单的条件生成模型;本课关心的是输出高维的条件分布。
  5. 生成模型的应用几乎都是”条件采样”或”算概率”:文生图、逆问题(超分辨率、补全、上色、医学成像)、异常检测、语音、语言、代码、视频、模仿学习、分子。
  6. 两个反直觉的事实: 高维里”最可能的数据”不是”典型的数据”(典型集);似然好不等于样本好,样本好也不等于似然好(背诵 vs 99% 噪声)。基于似然的异常检测会漏掉”简单”的异常。
  7. 三个核心挑战: 表示(维数灾难:2n−12^n - 1 个参数)、学习(怎样比较两个分布)、推断(怎样把生成反过来)。每个模型家族都在这三点上做了不同的取舍,这就是全课的路线图。

9. 常见误区 · Common pitfalls

  1. “生成模型就是能生成图片 / 文字的模型。” 生成只是三种用途之一。一个好的生成模型同样能给数据打分(异常检测、压缩)和做推断(补全、去噪、表示学习)。有些家族(GAN)能生成却不能打分,有些(能量模型)能打分却很难生成。
  2. “概率越高的样本越好。” 高维里概率最高的数据(干净模板、全白的图)恰恰不典型。“只输出最可能的结果”会得到从不出现的”完美”数据;文本生成里,贪心解码常常输出重复、乏味的句子,也是同一个道理。
  3. “似然高 = 模型好 = 样本好。” 1% 真样本 + 99% 噪声的模型似然只差 6.64 bit,样本却 99% 是垃圾;背诵训练集的模型样本完美,似然却极差。似然和样本质量是两个不同的指标(第 15 讲)。
  4. “判别器分不出来,说明两个分布相同。” 判别器的能力有限(模式坍塌的例子里只学到 0.72,理论最优 0.85);它还可能靠”记住训练时见过的假样本”来分辨,检测的是重复而不是”不像”。
  5. “判别式模型输出的概率可以当作置信度。” 对远离训练数据的输入,判别式模型常常最自信(噪声图上 1.000)。它没有”这些都不是”的选项,也不知道 xx 本身是否正常。
  6. “有了足够多的数据,就不需要先验。” 数据永远是有限的,而可能的数据空间是指数级的。深度学习并没有去掉先验,只是把它换成了网络结构、训练目标、生成顺序这些更隐蔽的形式。先验错了(“模板缺十字”),数据再多也救不回来。
  7. “判别式模型 vs 生成式模型,一定是生成式更省数据。” 这取决于模型族是否匹配数据。像素世界里,学出来的生成式分类器准确率并不比神经网络高,优势在 log loss 和缺失数据上。
  8. “后验平均就是最好的补全。” 后验平均(均方误差的最优解)是所有可能补全的平均,在多峰的情况下是一张模糊的、不合法的图。要合理的补全,应该从后验里采样。

10. 练习 · Exercises

练习 1(参数计数) (a) 一个 RGB 像素有三个通道、每个通道 256 种取值。完整描述一个像素颜色的联合分布需要多少个参数? (b) 像素世界的 8×88 \times 8 黑白图,完整的概率表需要多少个参数?像素世界本身用多少个数就描述了这个分布? (c) 如果假设 64 个像素相互独立,需要多少个参数?代价是什么?

参考答案

(a) 2563−1=16,777,215256^3 - 1 = 16{,}777{,}215(原课第 2 讲第 5 页)。减 1 是因为概率之和必须为 1,最后一个概率由其余的决定。

(b) 264−1≈1.8×10192^{64} - 1 \approx 1.8 \times 10^{19}。像素世界用 177 个模板(这是”先验知识”,不算可学的参数)+ 4 个形状概率(独立的只有 3 个)+ 1 个噪声水平,就完整描述了这个分布。代码 02 里”模板 + 数据”模型学 177 个配置概率(176 个独立)+ 1 个噪声水平。

(c) 64 个参数。代价是”像素独立”这个假设是错的:采出来的样本是”撒胡椒面”,测试 bits 比真实分布多约 10 bit/图(代码 02)。

练习 2(贝叶斯公式) 用 §3.1 表格里的 p(y)p(y) 和 p(x∣y)p(x \mid y) 手算 p(x)p(x) 和 p(横线∣x)p(\text{横线} \mid x),核对表格。如果把先验改成四种形状等概率(各 0.25),p(横线∣x)p(\text{横线} \mid x) 变成多少?

参考答案

p(x)=0.3×1.112e-13+0.2×5.601e-14+0.3×1.017e-16+0.2×3.311e-15=3.336e-14+1.120e-14+3.05e-17+6.62e-16≈4.527e-14p(x) = 0.3 \times 1.112\text{e-}13 + 0.2 \times 5.601\text{e-}14 + 0.3 \times 1.017\text{e-}16 + 0.2 \times 3.311\text{e-}15 = 3.336\text{e-}14 + 1.120\text{e-}14 + 3.05\text{e-}17 + 6.62\text{e-}16 \approx 4.527\text{e-}14;p(横线∣x)=3.336e-14/4.527e-14≈0.737p(\text{横线} \mid x) = 3.336\text{e-}14 / 4.527\text{e-}14 \approx 0.737。

先验均匀时,p(y)p(y) 在分子分母里约掉,p(横线∣x)=1.112e-131.112e-13+5.601e-14+1.017e-16+3.311e-15≈1.1121.7062≈0.652p(\text{横线} \mid x) = \frac{1.112\text{e-}13}{1.112\text{e-}13 + 5.601\text{e-}14 + 1.017\text{e-}16 + 3.311\text{e-}15} \approx \frac{1.112}{1.7062} \approx 0.652。先验从 0.3 : 0.2 变成 1 : 1,横线的优势变小了,但似然的比值(约 2 : 1)仍然让横线胜出。

练习 3(缺失数据的边缘化) 伯努利混合 p(x)=∑kπk∏i=1Dμk,ixi(1−μk,i)1−xip(x) = \sum_k \pi_k \prod_{i=1}^D \mu_{k,i}^{x_i}(1 - \mu_{k,i})^{1 - x_i}。证明:若像素集合 MM 缺失,则 p(x观测)=∑kπk∏i∉Mμk,ixi(1−μk,i)1−xi,p(x_{\text{观测}}) = \sum_k \pi_k \prod_{i \notin M} \mu_{k,i}^{x_i}(1 - \mu_{k,i})^{1 - x_i}, 即”把缺失像素从乘积里拿掉”。这个结论对任意的生成模型都成立吗?

参考答案

p(x观测)=∑xMp(x观测,xM)=∑kπk∏i∉M[⋯ ]⋅∏i∈M∑xi∈{0,1}μk,ixi(1−μk,i)1−xip(x_{\text{观测}}) = \sum_{x_M} p(x_{\text{观测}}, x_M) = \sum_k \pi_k \prod_{i \notin M} [\cdots] \cdot \prod_{i \in M} \sum_{x_i \in \{0,1\}} \mu_{k,i}^{x_i}(1 - \mu_{k,i})^{1 - x_i}。交换求和与乘积之所以可以,是因为给定 kk 时各像素独立、乘积可以按像素分开;每个缺失像素的求和等于 μk,i+(1−μk,i)=1\mu_{k,i} + (1 - \mu_{k,i}) = 1。

对一般的生成模型不成立:如果给定隐变量后像素之间仍然相关(例如自回归模型 p(xi∣x<i)p(x_i \mid x_{<i})),缺失像素会影响后面像素的条件分布,必须真的对 2∣M∣2^{|M|} 种取值求和(或者用采样近似)。“边缘化在原理上总是可以做的,但是否高效取决于模型结构”——这是第 2 讲讨论条件独立的动机之一,也是第 3 讲自回归模型的一个弱点。

练习 4(典型集) 翻转像素个数 k∼Binomial(64,0.05)k \sim \text{Binomial}(64, 0.05)。 (a) 证明 kk 最可能的取值是 3。 (b) 一张”翻了 kk 个像素”的图(只算它自己那个配置)的 log⁡2p(x)\log_2 p(x) 随 kk 怎样变化?每多翻一个像素降低多少 bit? (c) 解释为什么”单张概率最高的图”和”最常被采到的那类图”不一样。

参考答案

(a) 二项分布的众数是 ⌊(n+1)p⌋=⌊65×0.05⌋=⌊3.25⌋=3\lfloor (n+1)p \rfloor = \lfloor 65 \times 0.05 \rfloor = \lfloor 3.25 \rfloor = 3。也可以看相邻项之比:P(k+1)P(k)=64−kk+1⋅0.050.95\frac{P(k+1)}{P(k)} = \frac{64 - k}{k + 1} \cdot \frac{0.05}{0.95},k=2k = 2 时为 623×0.0526≈1.09>1\frac{62}{3} \times 0.0526 \approx 1.09 > 1,k=3k = 3 时为 614×0.0526≈0.80<1\frac{61}{4} \times 0.0526 \approx 0.80 < 1。

(b) log⁡2p(x)≈log⁡2p(z)+klog⁡20.05+(64−k)log⁡20.95\log_2 p(x) \approx \log_2 p(z) + k \log_2 0.05 + (64 - k)\log_2 0.95,每多翻一个像素变化 log⁡20.05−log⁡20.95=−log⁡219≈−4.25\log_2 0.05 - \log_2 0.95 = -\log_2 19 \approx -4.25 bit。

(c) “恰好翻 kk 个”的总概率 = 单张图的概率 × 这样的图的张数 (64k)\binom{64}{k}。单张概率随 kk 指数下降(每次除以 19),张数却随 kk 增长(kk 小时每次乘以约 64/k64/k)。两者的乘积在 k=3k = 3 达到最大。高维里张数的增长压倒一切,所以典型的样本远离单张概率最高的点。

练习 5(似然好、样本差) 模型 pθ(x)=w⋅pdata(x)+(1−w)⋅q(x)p_\theta(x) = w \cdot p_{\text{data}}(x) + (1 - w) \cdot q(x),其中 qq 是任意分布。证明 Epdata[−log⁡2pθ(x)]≤H(pdata)+log⁡21w\mathbb{E}_{p_{\text{data}}}[-\log_2 p_\theta(x)] \leq H(p_{\text{data}}) + \log_2 \frac{1}{w}。w=0.01w = 0.01 时这个上界是多少?和代码 05 的 6.64 对比。

参考答案

因为 (1−w)q(x)≥0(1 - w)q(x) \geq 0,所以 pθ(x)≥w⋅pdata(x)p_\theta(x) \geq w \cdot p_{\text{data}}(x),取对数:−log⁡2pθ(x)≤−log⁡2pdata(x)+log⁡21w-\log_2 p_\theta(x) \leq -\log_2 p_{\text{data}}(x) + \log_2 \frac{1}{w}。对 pdatap_{\text{data}} 求期望即得。w=0.01w = 0.01 时上界是 H+log⁡2100=H+6.64H + \log_2 100 = H + 6.64 bit。代码 05 的 6.64 几乎正好等于上界,因为噪声分布 q=2−64q = 2^{-64} 在真实图上的贡献相对于 w⋅pdata(x)≈0.01×2−25w \cdot p_{\text{data}}(x) \approx 0.01 \times 2^{-25} 可以忽略。这个例子说明:似然对”多生成了垃圾”不敏感——只要模型把一小部分概率留给真实数据,似然就不会太差。

练习 6(背诵的代价) 查表模型 p(x)=(1−λ)count(x)N+λ⋅2−64p(x) = (1 - \lambda)\frac{\text{count}(x)}{N} + \lambda \cdot 2^{-64},λ=0.01\lambda = 0.01。一张没在训练集里出现过的测试图,−log⁡2p(x)-\log_2 p(x) 是多少?代码 02 里 N=100N = 100 时查表的测试 bits 是 70.54,和你的答案比较,差别来自哪里?

参考答案

没见过的图:−log⁡2(0.01×2−64)=64+log⁡2100≈70.64-\log_2(0.01 \times 2^{-64}) = 64 + \log_2 100 \approx 70.64 bit。实际测试 bits 70.54 略低,因为少数测试图恰好在训练集里出现过——主要是一个像素都没翻的干净模板(占样本的 3.75%,同一个模板很容易重复),它们拿到了 (1−λ)countN(1 - \lambda)\frac{\text{count}}{N} 的高概率。

练习 7(最优判别器) 模式坍塌的模型只生成横线(横线的真实分布),真实数据里横线占 30%。真样本和假样本各一半,最好的判别器准确率是多少?为什么代码 05 里的小分类器只学到 0.72?

参考答案

看到非横线:只可能是真样本,判”真”必对;看到横线:真样本里横线占 30%,假样本里占 100%,而且两边横线的分布完全相同(所以从图本身看不出区别),所以判”假”更优(后验概率 0.5×10.5×1+0.5×0.3≈0.77\frac{0.5 \times 1}{0.5 \times 1 + 0.5 \times 0.3} \approx 0.77)。准确率 =0.5×P真(非横线)+0.5×P假(横线)=0.5×0.7+0.5×1=0.85= 0.5 \times P_{\text{真}}(\text{非横线}) + 0.5 \times P_{\text{假}}(\text{横线}) = 0.5 \times 0.7 + 0.5 \times 1 = 0.85。小分类器要先学会”识别横线”——一个位置不固定、带噪声的形状,它只用 1000 + 1000 张图、400 步训练,识别得并不完美(代码 03 里,即使是专门的分类器,1000 张训练图时也只有 0.85 的准确率)。这说明两样本检验的结论受判别器能力的限制。

练习 8(动手:改一改世界) 把 pixel_world.py 里的 DEFAULT_EPS 从 0.05 改成 0.15,重新运行 01_data_simulator.py 和 02_data_plus_prior.py。在运行之前先预测:(a) 世界的熵 H(X)H(X) 会变大还是变小?H(X∣Z)H(X \mid Z) 变成多少?(b) 推断的准确率(最大后验配置 = 真实配置)会怎样变化?(c) “独立像素”和真实分布的差距会变大还是变小?运行后核对你的预测。(做完记得改回 0.05——后面的讲次依赖这个默认值。)

参考答案(预测的思路)

(a) 变大。H(X∣Z)=64×h(0.15)=64×0.610≈39.0H(X \mid Z) = 64 \times h(0.15) = 64 \times 0.610 \approx 39.0 bit(原来 18.3)。H(Z)H(Z) 不变(7.45),H(Z∣X)H(Z \mid X) 会变大(噪声大,推断更不确定),所以 H(X)H(X) 约增加 20 bit。

(b) 下降。噪声越大,形状越难辨认(代码 04 的去噪实验里,相对模板的总翻转概率 0.14 时,配置准确率只有 0.717,形状准确率 0.832;ε=0.15\varepsilon = 0.15 的情形与之类似)。

(c) 变小。噪声越大,数据越接近”每个像素独立地随机”,独立像素这个错误假设的代价就越小;极端情况 ε→0.5\varepsilon \to 0.5 时数据就是纯噪声,独立像素模型完全正确。具体数字以你的运行为准。

练习 9(思考:应用用到的是哪种能力) 对下面每个应用,说出它主要用到生成模型的哪种能力(采样 / 条件采样 / 密度估计 / 推断):(a) 文生图;(b) PixelDefend 检测对抗样本;(c) 图像补全;(d) 用 VAE 的隐变量做聚类;(e) 用语言模型给句子打分、选出最通顺的翻译;(f) 稀疏视角 CT 重建。

参考答案

(a) 条件采样 p(图∣文字)p(\text{图} \mid \text{文字})。(b) 密度估计(低 p(x)p(x) = 可疑),再加一步”往高概率区域移动”。(c) 条件采样 p(x缺失∣x观测)p(x_{\text{缺失}} \mid x_{\text{观测}}),需要能对观测部分做推断。(d) 推断 / 表示学习(q(z∣x)q(z \mid x))。(e) 密度估计(比较候选句子的 p(句子∣原文)p(\text{句子} \mid \text{原文}))。(f) 条件采样 / 后验推断:p(x∣y)∝p(y∣x)p(x)p(x \mid y) \propto p(y \mid x)p(x),前向模型 p(y∣x)p(y \mid x) 来自物理,生成模型提供先验 p(x)p(x)。


11. 延伸阅读 · Further reading

课程材料

本讲的几个关键论点

  • 判别式 vs 生成式:Ng & Jordan, On Discriminative vs. Generative Classifiers: A comparison of logistic regression and naive Bayes, NeurIPS 2001(发表于 2002 年的论文集)
  • 似然与样本质量的脱节:Theis, van den Oord & Bethge, A note on the evaluation of generative models, ICLR 2016
  • 似然与异常检测、典型集:Nalisnick, Matsukawa, Teh, Gorur & Lakshminarayanan, Do Deep Generative Models Know What They Don’t Know?, ICLR 2019;Nalisnick et al., Detecting Out-of-Distribution Inputs to Deep Generative Models Using Typicality, 2019
  • 用生成模型防御对抗样本:Song, Kim, Nowozin, Ermon & Kushman, PixelDefend, ICLR 2018
  • 用生成模型做医学成像逆问题:Song, Shen, Xing & Ermon, Solving Inverse Problems in Medical Imaging with Score-Based Generative Models, ICLR 2022
  • 从笔画到图像:Meng, He, Song, Song, Wu, Zhu & Ermon, SDEdit, ICLR 2022
  • 扩散模型里的训练数据提取:Carlini et al., Extracting Training Data from Diffusion Models, USENIX Security 2023

综述

  • Bond-Taylor, Leach, Long & Willcocks, Deep Generative Modelling: A Comparative Review of VAEs, GANs, Normalizing Flows, Energy-Based and Autoregressive Models, IEEE TPAMI 2022——和本讲 §6 的表格同样的思路,比较各家族的取舍
  • Kevin Murphy, Probabilistic Machine Learning: Advanced Topics(2023),第四部分 Generation——深度生成模型的教科书式总结

12. 下一讲预告 · Next lecture

§5.1 说,生成模型的第一个难题是表示:nn 个二值变量的联合分布需要 2n−12^n - 1 个参数。第 2 讲(原课 Lecture 2 Background)系统地回答”怎样用少得多的参数表示一个联合分布”:

  • 独立性(nn 个参数,但太强)、链式法则(仍是 2n−12^n - 1)、条件独立(马尔可夫链只要 2n−12n - 1);
  • 贝叶斯网络:有向无环图 + 每个节点一个条件概率分布;按拓扑顺序的祖先采样;
  • 生成式 vs 判别式的两种分解 p(y)p(x∣y)p(y)p(x \mid y) 和 p(x)p(y∣x)p(x)p(y \mid x);朴素贝叶斯 vs 逻辑回归——本讲 §3.2 留下的”谁更省数据”在那里展开;
  • 用神经网络参数化条件分布——从”贝叶斯网络假设条件独立”到”神经模型假设条件分布的函数形式”,这一步通向第 3 讲的自回归模型,也是所有深度生成模型的起点。
← 返回课程目录