对应 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
学完这一讲,你应该能够:
- 用自己的话说清楚什么是(统计)生成模型:它就是一个概率分布 ;它为什么叫”生成”模型;“数据 + 先验知识”是什么意思,以及为什么先验总是必要的、但多少可以不同。
- 把生成模型看成一个数据模拟器,说出它的三种用途——采样(生成新数据)、密度估计(给任意数据打分)、表示学习 / 推断(从数据反推隐藏的高层描述),并解释”视觉是逆向图形学”这句话。
- 区分判别式模型 和生成式模型 ,用贝叶斯公式把它们联系起来;说出判别式模型为什么简单、强大,又在哪三件事上无能为力(不知道 本身像不像、处理不了缺失数据、生成不了 );理解”判别式模型是最简单的条件生成模型”。
- 列举生成模型的主要应用(图像 / 文生图、逆问题、异常检测、语音、语言、代码、视频、模仿学习、分子),并指出每个应用用到的是生成模型的哪种能力。
- 解释两个反直觉的事实:概率最高的数据不等于典型的数据;似然好不等于样本好,样本好也不等于似然好。
- 说出全课的三个核心挑战——表示、学习、推断——以及模型家族地图(自回归、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(全课统一)
| 符号 | 含义 | 本讲的例子 |
|---|---|---|
| 一个数据点(一张图展平成的向量) | 像素世界里 | |
| 数据分布:世界”真正”生成数据的方式,看不见 | 像素世界的图形引擎 | |
| 训练集:从 独立抽出的 个样本 | 张图 | |
| , | 参数为 的模型分布;所有可选的 组成模型族 | 伯努利混合、独立像素…… |
| 标签或条件 | 形状类别:横线 / 竖线 / 方框 / 十字 | |
| 隐变量:没被观测到的高层描述 | 形状 + 位置 + 大小(177 种配置) | |
| ,bit | 以 2 为底的对数概率; = 用这个模型压缩 需要的比特数 | 典型图约 |
| 熵:,“平均需要多少 bit” | 像素世界 bit / 图 | |
| bits/dim | 每个维度(像素)的平均 bit 数 = | 像素世界 |
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 的特点是概率的、“家族全景”的视角——同一个问题(怎样表示和学习 ),每个模型家族给出了什么回答,它们之间是什么关系。
0.6 关于数字 · About the numbers
讲义里的实验数字全部来自配套代码在作者机器上的实际输出(macOS,PyTorch 单线程 CPU)。所有脚本固定随机种子,同一台机器上重复运行输出逐字节相同;换一台机器或换 PyTorch 版本,个别数字可能在最后一位有差别,结论不变。有几处结果和我写代码之前的预期不一样(例如”全白的图概率比典型样本还高”),讲义按实际结果写,这些情况都记录在 代码 README 的”关于实验结果”里。
1. 从”理解”到”创造” · From understanding to creating
1.1 AI 的挑战:理解复杂、非结构化的输入
原课第一页 slide 列了四个领域:计算机视觉、自然语言处理、机器人、语音。它们有一个共同的难点:输入是复杂的、非结构化的。一张照片是几百万个像素值,一段语音是每秒几万个采样点,一句话是一串离散符号。它们不像数据库里的表格那样,每一列都有明确的含义;“这张照片里有一只猫”这条信息,散落在成千上万个像素的组合关系里。
传统的做法是判别式的:给定输入 ,直接学一个函数预测我们关心的那一点信息 (“有没有猫""这句话是正面还是负面”)。这在很多任务上非常成功(第 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 讲)有一个解码器(,生成)和一个编码器(,推断);
- 归一化流(第 7–8 讲)的生成和推断是同一个可逆函数的两个方向;
- GAN(第 9–10 讲)只有生成器,推断要另想办法(BiGAN);
- 扩散模型(第 16 讲)的”加噪”和”去噪”也是一对生成与推断。
1.4 本讲的玩具世界:像素世界
为了把这些想法变成可以动手验证的东西,本讲义造了一个知道真相的小世界(共享模块 pixel_world.py,后面很多讲都会用)。它就是一个微缩版的”图形引擎”:
- 选形状:横线 30%、竖线 20%、方框 30%、十字 20%;
- 选位置和大小:在这种形状所有不出画布的摆法里均匀地选一个。形状 + 位置 + 大小合起来叫一个配置 ,一共 177 种(横线 40 种、竖线 40 种、方框 61 种(边长 3 或 4)、十字 36 种);
- 渲染:把配置画到 的黑白画布上,得到一张干净的”模板”;
- 加噪声:每个像素独立地以 的概率翻转(黑变白、白变黑),模拟扫描噪声和笔迹抖动。
用代码 01 生成的几张图(██ 是黑色笔画,· 是白色背景):
十字 中心(4,4) 横线 行2 列2-5 4×4方框 左上(1,1) 3×3方框 左上(1,2)
· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ·
· · · · · · · ██ ██· · · · · · · · ████████· · · · · · ████· · ·
· · ██· · · · · · · ████████· · · ██· · ██· ██· · · ██· ██· · ·
· · · · ████· · · · · · · · · ██ ████· ████· · · · · ██████· · ·
· · · ██████· · · · · · · · · · · ████████· · · · · · · · · · ·
· · · · ██· · · · · · ██· · · · · ██· · · · · · · ████· · · · ·
· · · · · · · · · · · · · · · · · · ██· · · · · · · · · · · · ·
· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ██·
它相当于一个缩小版的”二值化 MNIST”(原课第 3 讲起反复用 28×28 的黑白手写数字做例子)。关键的区别是:对 MNIST,我们永远不知道真实的 ;而在像素世界里,因为 只有 177 种,
其中 在模板的笔画处是 、背景处是 。这个求和只有 177 项,可以精确地算出来。于是任何一张图的真实概率、“这张图是怎么画出来的”后验分布、这个世界的熵(任何模型都不可能超越的满分)都是已知的。后面每一个实验都拿模型和这个”标准答案”比。
为什么要用一个玩具世界? 真实数据的 不可知,我们只能看到模型之间的相对好坏,而看不到”离最好还差多远”。玩具世界牺牲了真实感,换来了可验证性。代价是:凡是结论依赖于” 可以枚举”的地方(例如精确推断),讲义都会说明真实世界里为什么做不到。
2. 统计生成模型 · Statistical generative models
2.1 定义:一个概率分布
原课第 6 页给出了这门课的核心定义:
一个统计生成模型就是一个概率分布 。
- 它的输入是一个数据点 (一张图),输出是一个标量概率 ;
- 它之所以叫”生成”模型,是因为从 里采样就生成了新的数据。
这个定义看起来平淡,但它把一个模糊的目标(“让计算机会画画”)变成了一个精确的数学问题(“找到一个分布,使它和数据的分布尽量接近”)。课程笔记把它写成:
其中 是模型族(所有候选分布), 是两个分布之间的某种”距离”,而 只能通过训练集 接触到。这个式子里的三个要素——模型族怎么表示、距离怎么选、怎么优化——就是全课的三个核心问题(§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 种画法,不知道世界上有十字 | 同上 |
| 伯努利混合 | 只假设”每张图是 32 个原型之一,再加独立噪声” | 32 个原型本身 |
| 独立像素 | 假设 64 个像素互相独立(错误的假设) | 每个像素黑的概率 |
| 查表 | 不做任何假设 | 数一数每张图出现了几次(再留 1% 的概率给没见过的图) |
尺子是 5000 张没见过的测试图上的平均 ,减去真实分布在同一批图上的值(这个差就是 KL 散度的估计,第 4 讲详细解释;0 = 和真实分布一样好):
| 模型(先验从强到弱) | N=20 | N=100 | N=1000 | N=10000 | 参数个数 |
|---|---|---|---|---|---|
| 图形引擎(纯先验) | 1.57 | 1.57 | 1.57 | 1.57 | 0 |
| 模板 + 数据 | 0.71 | 0.91 | 0.18 | 0.02 | 177 |
| 模板缺十字 + 数据 | 1.96 | 2.01 | 1.38 | 1.25 | 141 |
| 伯努利混合 K=32 | 15.48 | 10.36 | 6.17 | 4.62 | 2079 |
| 独立像素 | 11.53 | 10.46 | 10.06 | 10.00 | 64 |
| 查表 | 44.87 | 44.81 | 44.38 | 42.25 | 9685(随数据增长) |
这张表几乎把”数据 + 先验”的所有要点都展示出来了:
- 数据少时,先验为王。 时,一张数据都不看的图形引擎只比真实分布差 1.57 bit/图,远好于伯努利混合(15.48)和独立像素(11.53)。但它也永远停在 1.57——它不学习,数据再多也没用。
- 正确的先验 + 数据 = 最好的组合。 “模板 + 数据”只用 20 张图就把噪声水平学到了 0.0477(真实 0.05),误差降到 0.71;数据多了以后逼近 0( 时 0.02)。图形引擎的 1.57 bit 主要就是猜错的噪声水平造成的。
- 先验错了,数据救不回来。 “模板缺十字”在 时仍差 1.25 bit。拆开看,误差全部在十字图上:每张十字图多付 7.2 bit(只能解释成”某个别的形状 + 很多翻转”),而其他形状的图反而少付 0.21 bit——本该留给十字的概率被分给了它们。概率的总量是 1,此消彼长。“独立像素”也是一样:参数最少,但”像素独立”这个假设是错的,误差停在 10 bit。
- 弱先验需要更多数据,但能一直进步。 伯努利混合起点最差( 时比独立像素还差 4 bit),但误差一路下降, 时超过了独立像素。这正是”统计生成模型”的路线:**用更灵活的模型族 + 更多的数据,代替人写的先验。**深度生成模型把这条路走到了极致——神经网络是一个极其灵活的模型族,配合海量数据。
- 完全不做假设,就完全不会泛化。 查表在训练集上的成绩”好得不可能”( 时训练集上只要 6.66 bit/图,远低于真实熵 25.7),测试集上却最差(70.5 bit/图):没见过的图一律只拿到 的概率。它的参数个数随数据增长(非参数模型),却什么规律都没学到。这是最极端的过拟合(第 4 讲)。
还有一个细节值得注意:“模板 + 数据”从 到 反而略差(0.71 → 0.91)。原因是 100 张图只覆盖了一部分配置,EM 算法给没见过的配置只留了很小的概率,测试时恰好遇到它们就要多付 bit。“怎样给没见过的东西留概率”(平滑、正则化)是第 4 讲要讨论的取舍。
深度生成模型在光谱上的位置:它们是”弱先验 + 海量数据”的那一端,但先验并没有消失,只是换了形式——卷积网络假设”局部的模式在图中任何位置都一样”(平移等变),自回归模型假设一个生成顺序,扩散模型假设”逐步去噪”的结构……第 3–18 讲的每个家族,本质上都是在选择一种”合适的先验”。
2.3 生成模型 = 数据模拟器
原课第 7–12 页用一组动画讲了同一个想法:生成模型就是一个数据生成过程的模拟器(data simulator)。
控制信号 ──→ ┌─────────────┐ ──→ 新的数据点 (生成 / 采样)
│ 数据模拟器 │
候选的数据点 ──→ │ = 统计模型 │ ──→ 概率值 (打分 / 密度估计)
│ = 生成模型 │
└─────────────┘
把这个模拟器和 Lecture 2 开头列出的”学习一个生成模型的三个目标”对应起来(以”狗的图片”为例):
- 生成(generation / sampling): 应该看起来像一只狗。
- 密度估计(density estimation): 在 像狗时高、不像时低——可以用来做异常检测。
- 无监督表示学习(unsupervised representation learning):学到这些图片的共同点(耳朵、尾巴……),即特征。
代码 01 在像素世界里把三件事都做了一遍。
生成就是按图形引擎的步骤依次抽样:先 ,再 。这种”按箭头方向依次采样”叫祖先采样(ancestral sampling),第 2 讲会在贝叶斯网络里正式定义它。几乎所有深度生成模型的采样都是这个结构:“先抽一个简单的随机量,再用一个函数把它变成数据”——VAE 的 解码器、流模型的 可逆网络、GAN 的 生成器、扩散模型的噪声 逐步去噪。
控制信号让我们指定”生成什么”。代码 01 第 4 部分演示了三种:只画十字、只在左上角 4×4 区域里画(满足条件的配置有 17 个)、只画 4×4 的大方框。在像素世界里,控制信号做的事很简单:不改变”怎样画”和”怎样加噪声”,只是限制(或重新加权)“画什么”,即 。文生图模型 是同一件事的大规模版本——原课把它写成 ,文字描述就是一个极其丰富的控制信号。
2.4 打分:为什么永远用对数概率
给一张图打分,就是算 。代码 01 第 3 部分给 6 张图打了分:
一张真实样本 它的干净模板 样本再多翻 6 个像素 全白的图 随机噪声图 两个形状叠在一起
· · · · · · · · · · · · · · · · · ██· · · · · · · · · · · · · · · ██████· ██· · ████████· · · ·
· · · · · · ██· · · · · · · · · · · · · · · ██· · · · · · · · · · ██· · · · · · · · · · · · · ·
· · · · · · ██· · · · · · · · · ██· · · · · ████ · · · · · · · · ██· · ████· · ██ · · · · · · · ·
· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ██████· ██· ██· · · · · · · · ·
· · ██· · · · · · · · · · · · · · · ██· · · ██· · · · · · · · · · ████· · ████· · · · · · · · ·
██· · · · · · · · · · · · · · · ██· · ██· · · · · · · · · · · · · · · ██· ██████ · · · · · · ██·
· · ████████· · · · ████████· · · · ████████· · · · · · · · · · · · ██████████· · · · · · ██████
· · · · · · · · · · · · · · · · · · · ██· · · · · · · · · · · · · ██████· ██· ██ · · · · · · ██·
| 图 | 比典型图高多少 bit | ||
|---|---|---|---|
| 一张真实样本 | −28.78 | 2.17e−09 | −3.20 |
| 它的干净模板 | −11.79 | 2.83e−04 | +13.79 |
| 样本再多翻 6 个像素 | −50.36 | 6.92e−16 | −24.78 |
| 全白的图 | −22.70 | 1.47e−07 | +2.88 |
| 随机噪声图 | −121.70 | 2.31e−37 | −96.12 |
| 两个形状叠在一起 | −29.12 | 1.71e−09 | −3.54 |
(“典型图”取 2 万个样本的平均 ,也就是这个世界的熵的相反数。)
几个要点:
- 真实样本的概率也小得惊人( 量级)。可能的图太多( 张),概率被摊得极薄。真实的图像模型更夸张:好的模型在 CIFAR-10( 维)上大约是 3 bits/dim,一张图的概率约为 。所以生成模型永远在对数空间里计算: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 推断:逆向图形学
第三种用途是推断:给一张图,问”它是怎样被画出来的”。在像素世界里,这就是后验分布
代码 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。
这说明两件事。第一,从像素读出高层描述是可能的:大多数图的后验几乎全部集中在真实配置上——这就是”表示学习”想要的东西, 是一个比 64 个像素紧凑得多、也有意义得多的描述。第二,推断的正确输出是一个分布,而不是一个答案:有的图被噪声弄得真正模棱两可(那张”最模棱两可的图”里,真实的竖线有两个笔画像素被噪声擦掉了),此时任何方法都不可能确定答案;即使是”知道真相”的贝叶斯推断,配置准确率也只有 95%——这就是这个世界里任何方法的上限。
推断的代价。为什么像素世界能精确推断?因为分母只有 177 项。代码 01 第 6 部分列了一张表:
| 设定 | 的取值个数 | 精确推断要做的计算 | 结论 |
|---|---|---|---|
| 像素世界 | 177 | 177 × 64 = 11,328 次乘加 / 图 | 精确 |
| = 10 个二值开关 | 约 65,536 次 / 图 | 还能枚举 | |
| = 100 个二值开关 | 宇宙寿命也算不完 | 必须近似 | |
| = 512 维连续向量(典型的 VAE) | 不可数 | 一个 512 维积分 | 必须近似 |
生成总是容易的(一次前向计算),推断往往是难的(要对所有可能的 求和或积分)。真实世界的”配置”——物体、姿态、光照、材质——是高维、连续的,精确推断不可能。本课的很多模型都是在回答”推断太难怎么办”:VAE 用一个编码器网络去近似后验(第 5–6 讲);归一化流让生成过程可逆,推断变成一次反向计算(第 7–8 讲);GAN 干脆不做推断(第 9–10 讲)。
3. 判别式 vs 生成式 · Discriminative vs generative
3.1 两种建模对象,一个贝叶斯公式
原课第 16–17 页的例子:区分”卧室”和”餐厅”的照片。
- 判别式模型(discriminative):图像 是给定的,目标是决策边界,通过条件分布 实现。例子:逻辑回归、卷积网络。
- 生成式模型(generative): 不是给定的,需要 和 的联合分布 。
两者由贝叶斯公式联系:
代码 03 第 1 部分在像素世界里把这个公式的每一项都算了出来(一张真实形状是竖线、但看起来有点像横线的图):
| 形状 | ||||
|---|---|---|---|---|
| 横线 | 0.30 | 1.112e−13 | 3.337e−14 | 0.737 |
| 竖线 | 0.20 | 5.601e−14 | 1.120e−14 | 0.247 |
| 方框 | 0.30 | 1.017e−16 | 3.052e−17 | 0.001 |
| 十字 | 0.20 | 3.311e−15 | 6.622e−16 | 0.015 |
| 合计 | 1.00 | 4.527e−14 = | 1.000 |
联合概率 都是 量级的数——它描述的是”这张图恰好长这样(并且是这一类)“的概率;条件概率 却是 0.74、0.25 这样的”正常”数字。两者只差一个分母 。判别式模型直接学最后一列;生成式模型学前面几列。有了前面几列,最后一列可以算出来;反过来不行。(顺便说一句:这张图的真实形状是竖线,但贝叶斯最优的判断是”横线”——它确实更像横线。贝叶斯最优不等于每次都对。)
3.2 判别式模型为什么简单,又为什么强
原课第 17 页总结了判别式的优势: 很简单; 总是给定的,所以不需要建模 。 想想看要建模的东西有多大:像素世界里 只有 4 种取值(最多 bit 的不确定性,按真实频率算是 1.97 bit),而 有 64 个像素(约 25.6 bit)。判别式模型把”建模 “这个最难的部分整个跳过了。
代码 03 第 2 部分比较了三个从数据学出来的分类器(测试集 5000 张):
| 分类器 | N=20 | N=100 | N=1000 | N=10000 |
|---|---|---|---|---|
| 判别式:逻辑回归(线性) | 0.364 | 0.465 | 0.550 | 0.565 |
| 判别式:神经网络(2 层隐藏层) | 0.330 | 0.479 | 0.846 | 0.921 |
| 生成式:每类一个伯努利混合() | 0.278 | 0.484 | 0.814 | 0.902 |
| 贝叶斯最优(真实生成模型 + 贝叶斯公式) | 0.984 |
(数字是测试准确率;总是猜最常见的类是 0.30。)
- 线性逻辑回归停在 0.565,数据再多也没用:同一种形状可以出现在任何位置,“哪些像素亮”和形状之间不是线性关系。模型族太简单——欠拟合。
- 神经网络随数据增长快速变好(0.33 → 0.48 → 0.85 → 0.92),这是判别式模型的强项:只要 的信息,不必理解 的全部。但小数据时它在没见过的图上过度自信: 时测试 log loss 4.70 bit,比”只按 瞎猜”(1.97 bit)还差。
- 学出来的生成式分类器(先学 ,再用贝叶斯公式)准确率和神经网络差不多、略低( 时 0.902 vs 0.921),但小数据时 log loss 好得多( 时 3.31 vs 4.70 bit):它的概率来自”这张图在每一类下有多可能”,不像神经网络那样盲目自信。
“生成式模型更省数据、判别式模型渐近更好”是一个经典结论(Ng & Jordan 2002,对比朴素贝叶斯和逻辑回归),但它取决于两个模型族各自和数据的匹配程度。第 2 讲会在原课的框架里(朴素贝叶斯 vs 逻辑回归、“重复证据被算两遍”)把它讲清楚。
3.3 判别式模型做不到的三件事
既然判别式模型这么好用,为什么还要生成式模型?代码 03 的后三部分给出了三个答案。
(一)它说不出”这张图根本不像任何形状”。 给两个判别式模型喂 1000 张随机噪声图:
| 正常测试图 | 随机噪声图 | |
|---|---|---|
| 逻辑回归:最大类别概率的平均 | 0.491 | 1.000 |
| 神经网络:最大类别概率的平均 | 0.969 | 1.000 |
| 真实生成模型:平均 | −25.7 | −119.9 |
| 学出来的生成式分类器:平均 | −29.8 | −96.0 |
两个判别式模型对噪声图比对正常图还自信。原因很简单:噪声图平均有 31.9 个黑像素,正常图只有 8.5 个;logit 随黑像素的个数一起变大,softmax 被推到饱和。判别式模型的输出永远是”四选一”,没有”这些都不是”的选项;离训练数据越远,它的外推越离谱。而生成式模型能直接说出 本身有多”正常”——噪声图的对数概率比正常图低几十到近百 bit。
(二)缺失数据。 原课第 17 页:“Therefore it cannot handle missing data.” 设想有一半像素看不见。生成式模型的做法是边缘化:
对”给定隐变量时像素独立”的模型(像素世界、伯努利混合),这个求和恰好就是把缺失的像素从乘积里拿掉——一行代码。判别式模型只见过完整的图,只能先”填空”再分类:
| 缺失方式 | 真实模型边缘化 | 学出的生成式边缘化 | 神经网络·缺失填 0 | 神经网络·填平均值 |
|---|---|---|---|---|
| 只看到左半边 | 0.682 | 0.614 | 0.553 | 0.587 |
| 每张图随机丢一半像素 | 0.784 | 0.676 | 0.462 | 0.599 |
完整图上神经网络比学出的生成式分类器还略好(0.921 vs 0.902);一旦缺了像素,形势就反过来了,“随机丢一半”时差距最大(0.676 vs 最多 0.599)。如果事先知道缺失方式,可以专门为它重新训练一个判别式模型:只看左半边时重训的神经网络得到 0.628,甚至略好于学出的生成式模型(0.614)。但这只对这一种掩码有效——64 个像素有 种缺失方式,不可能每种训练一个;生成式模型一个模型就处理了所有缺失方式。另外,真实模型(0.682 / 0.784)比学出的生成式模型高出一截:边缘化本身是精确的,误差来自 学得不够好。
(三)它不能反过来生成 。 生成式模型可以从 采样,画出”一张十字""一张横线”;判别式模型 没有关于 的任何知识,做不到。
3.4 条件生成模型
原课第 19 页把这件事推广了一步:
- 类别条件生成模型 :给定类别,生成这一类的图;
- 用丰富的附加信息做条件常常更有用:——这就是文生图;
- 而判别式模型是一个非常简单的条件生成模型:——它”生成”的是 ,而 只有几种取值。
这个视角把”判别”和”生成”统一了起来:所有模型都在学某个条件分布 ,区别在于输出有多复杂。输出是一个类别标签(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 生成的咖啡馆微缩模型。这是条件采样 。
- 从笔画到图像(第 13 页,Meng, He, Song et al., ICLR 2022,即 SDEdit):给一张粗糙的涂鸦,生成一张写实的图——同样是条件采样,条件是”大致的布局和颜色”。
4.2 逆问题
原课第 26–30 页列了一组逆问题(inverse problems):观测到的是”坏掉的”数据,要恢复原来的数据。
| 任务 | 写成条件分布 | 例子 |
|---|---|---|
| 超分辨率 | Menon et al. 2020(PULSE) | |
| 补全(inpainting) | Liu et al. 2018 | |
| 上色 | Antic 2020(DeOldify) | |
| 图像编辑 | Kawar et al. 2023(Imagic) | |
| 医学成像(稀疏视角 CT) | Song et al. 2022 |
为什么逆问题需要生成模型?因为它们都是一对多的:一张低清图对应很多张合理的高清图,一张遮挡的图有很多种合理的补全。判别式地”回归出一个答案”只能得到所有合理答案的平均——模糊的图;生成模型给出的是一个分布,从中采样得到清晰、合理的答案(§4.4 有实验)。医学成像的例子还展示了另一种结构:观测过程(“前向模型”)由物理模拟给出,生成模型只负责提供”真实的人体截面图长什么样”这个先验。
4.3 异常检测
原课第 15 页(Song et al., ICLR 2018,PixelDefend):在交通标志上训练一个生成模型,正常的交通标志拿到高概率,加了对抗扰动的图拿到低概率——用 检测异常输入,再把它”拉回”高概率区域,就能防御对抗攻击。这用到的是密度估计能力。
4.4 在像素世界里试一试:异常检测、典型集、去噪、补全
代码 04 在像素世界里把上面三类应用都做了一遍,结果比预想的更有教育意义。
异常检测。 造了六种”异常”输入(每种 1000 张),用 打分,分数越低越可疑。AUC 衡量”随机拿一张正常图和一张异常图,正常图分数更高的概率”;检出率是在”只冤枉 1% 的正常图”时抓到的异常比例。
| 输入 | 平均 | 真实模型 AUC | 检出率 | 学出模型 AUC | 检出率 |
|---|---|---|---|---|---|
| 噪声更大(ε = 15%) | −50.9 | 0.971 | 0.666 | 0.945 | 0.505 |
| 随机噪声图 | −121.0 | 1.000 | 1.000 | 1.000 | 1.000 |
| 世界里没有的形状:对角线 | −38.0 | 0.896 | 0.091 | 0.625 | 0.008 |
| 两个形状叠在一起 | −39.4 | 0.891 | 0.239 | 0.855 | 0.225 |
| 黑白反色 | −195.7 | 1.000 | 1.000 | 1.000 | 1.000 |
| 空白画布 + 噪声(没有形状) | −28.1 | 0.616 | 0.001 | 0.248 | 0.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 部分算清楚了为什么:
| 翻转像素数 | 这样的图有几张(每个配置) | 其中一张的 | |
|---|---|---|---|
| 0 | 0.0375 | 1 | −11.79 |
| 1 | 0.1264 | 64 | −16.04 |
| 2 | 0.2096 | 2,016 | −20.29 |
| 3 | 0.2279 | 41,664 | −24.54 |
| 4 | 0.1829 | 635,376 | −28.79 |
| 5 | 0.1155 | 7,624,512 | −33.03 |
| 6 | 0.0598 | 74,974,368 | −37.28 |
每多翻一个像素,单张图的概率降低约 4.25 bit(),但”这样的图”的数量增加几十倍。单张最可能的图()只占 3.75% 的样本,最常见的是翻 3 个——数量弥补了每张概率低的劣势。所以样本的 集中在熵附近的一条带里(平均 25.64,标准差 7.24),叫做典型集(typical set);177 张干净模板的 在 11.8–12.4 之间,落在这条带的最左端之外。
像素世界只有 64 个像素,干净模板还占 3.75% 的样本,算不上异常。维数越高,这个现象越极端(同样 5% 的噪声):
| 画布 | 像素数 | 翻转个数的平均 | 标准差 | 标准差 / 平均 | |
|---|---|---|---|---|---|
| 像素世界 8×8 | 64 | 3.2 | 1.7 | 0.545 | |
| MNIST 大小 28×28 | 784 | 39.2 | 6.1 | 0.156 | |
| 32×32×3 | 3,072 | 153.6 | 12.1 | 0.079 | |
| 256×256×3 | 196,608 | 9830.4 | 96.6 | 0.010 |
在 MNIST 大小的画布上,“一张干净图”的概率是 ——永远不会被采到;翻转个数的相对波动按 缩小,典型集越来越窄。高维空间里,“最可能的点”和”典型的点”是两回事。 这有两个直接后果:
- “只输出最可能的图”不是好的生成:它产生的是从不出现的”完美”图,不是像数据的图(代码 01 也展示了:干净模板比任何典型样本都”更可能”)。
- 在高维里,“概率高得不正常”本身也可以是异常的信号(Nalisnick et al. 2019 提出的典型性检验),这能部分解释上面”空白画布”的问题。
去噪。 把世界样本再以 10% 的概率翻转每个像素,然后求后验”什么样的干净图,加上噪声后最可能变成我看到的样子”:
| 2000 张图上的去噪 | 数值 |
|---|---|
| 观测图 vs 干净模板:不同的像素数 | 8.94 |
| 最大后验模板 vs 干净模板:不同的像素数 | 1.59 |
| 最大后验配置 = 真实配置 的比例 | 0.717 |
| 最大后验形状 = 真实形状 的比例 | 0.832 |
去噪就是 :生成模型 在这里扮演先验,它知道”干净的图长什么样”,于是能把噪声和笔画分开。
补全。 只看到上半张图,从 采样。上半张信息不足的一个例子(后验概率 > 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):。
4.6 语言
- 语言生成(第 34 页,Radford et al. 2019,GPT-2):——这就是自回归模型(第 3 讲)。
- ChatGPT(第 35 页):slide 上是 ChatGPT 回答”怎样在 CS236 拿 A+“的一大段建议。一个生成模型,加上指令对齐,就成了通用助手。
- 机器翻译(第 36 页):,条件生成模型。
- 代码生成(第 37 页,OpenAI Codex)。
文本是离散数据。本课大部分时间讨论连续数据(图像),离散数据的特殊困难在第 17、18 讲。
4.7 视频、决策与科学
- 视频生成(第 38–40 页):从文字描述生成短视频,例如”堤坝突然决口,洪水涌出”。
- 模仿学习(第 41 页,Li et al. 2017;Janner et al. 2022,Diffuser):。人类示范往往是多峰的(同一个场景下可以向左绕也可以向右绕),生成模型能表示这种多峰性,普通回归会把它们平均成”撞上去”。
- 分子生成(第 42 页):生成满足某些性质的分子结构。
4.8 深度伪造与社会影响
原课第 43–44 页:“Which image is real?”——生成模型已经能造出人眼分不出真假的人脸、声音和视频。这带来了虚假信息、冒名、版权等一系列社会问题。原课没有展开,但它提醒我们:“能以假乱真”既是这门课追求的技术目标,也是它最大的风险来源。 检测生成内容(§4.4 的异常检测只是很初步的一步)、给生成内容加水印、训练数据的版权和隐私(第 15 讲会谈到”背诵训练集”),都是活跃的研究方向。
5. 路线图与核心挑战 · Roadmap and key challenges
原课第 45 页列出了这门课的三个核心挑战,外加一个目标:
- 表示(Representation):怎样对很多个随机变量的联合分布建模?需要紧凑的表示。
- 学习(Learning):比较两个概率分布的”正确”方式是什么?
- 推断(Inference):怎样把生成过程反过来(例如”视觉是逆向图形学”)?
- 无监督学习:从原始数据里恢复高层描述(特征)。
5.1 表示:维数灾难
个二值像素可以组成 张图。要用一张表完整地描述它们的联合分布,需要 个数(减 1 是因为概率之和必须是 1)。像素世界里 : 个数——而这个世界的”说明书”只有 177 个模板 + 4 个形状概率 + 1 个噪声水平。一张 28×28 的黑白 MNIST 图有 种可能,远远超过宇宙中原子的个数(约 )。
所以生成模型必须给分布加上结构,用远少于 的参数描述它。§2.2 的光谱已经展示了几种结构:独立性(64 个参数,但假设错了)、混合模型(2079 个参数)、已知的生成过程(177 个参数)。第 2 讲会系统地讨论:独立性、链式法则、条件独立、贝叶斯网络,以及”用神经网络参数化条件分布”——后者是所有深度生成模型的起点。
5.2 学习:怎样比较两个分布
训练一个生成模型就是让 靠近 。但”靠近”用什么来量?代码 05 拿两把尺子量了 9 个模型:
- 尺子 1:似然。测试图上的平均 ,比真实分布多出来的部分 ≈ 。它需要模型能算 ——第 3–8 讲(自回归、VAE、流)用这把尺子训练。
- 尺子 2:判别器。训练一个小神经网络区分”真样本”和”模型样本”,看它在新样本上的准确率:0.5 = 分不出来,1.0 = 一眼看穿。它只需要模型能采样——这就是两样本检验(two-sample test),也是 GAN 的核心想法(第 9–10 讲)。
| 模型 | 尺子 1:比真实多 bit | 尺子 2:判别器准确率 | 照抄训练图的比例 |
|---|---|---|---|
| 真实分布(另一批样本) | 0.00 | 0.521 | 0.013 |
| 模板 + 数据 | 0.16 | 0.519 | 0.009 |
| 图形引擎(ε 猜成 2%) | 1.50 | 0.665 | 0.056 |
| 伯努利混合 K=32 | 6.08 | 0.718 | 0.001 |
| 独立像素 | 10.03 | 0.853 | 0.000 |
| 查表(背诵 1000 张,有放回) | 44.52 | 0.721 | 0.985 |
| 查表(背诵 1 万张,不重复) | 42.16 | 0.491 | 1.000 |
| 模式坍塌(只画横线) | 10.09 | 0.724 | 0.018 |
| 1% 真样本 + 99% 噪声 | 6.64 | 0.994 | 0.000 |
(训练集 1000 张;尺子 1 用 2000 张测试图,尺子 2 用另外 2000 张真样本,瞎猜的准确率在 0.5 ± 0.02 左右波动。)
两把尺子在多数模型上意见一致,但在三个模型上”打架”——这三个例子值得记住,因为它们会在全课反复出现:
- 背诵训练集:样本完美,似然极差。 从 1 万张训练图里不重复地抽样时,判别器准确率 0.491,和瞎猜一样——每个样本都是一张货真价实的真样本。似然却一眼看穿:多用 42 bit(没见过的测试图几乎拿不到概率)。有意思的是,只背 1000 张、有放回抽样时,判别器准确率是 0.721:2000 个样本里只有 877 张不同的图,测试时的假样本很多正是判别器训练时见过的那几张——它学会的是”这几张图是假的”,检测的是重复,不是”不像”。要从样本上发现背诵,得专门去查”照抄率”。
- 1% 真样本 + 99% 噪声:似然不错,样本极差。 它的对数似然最多只比真实分布差 bit(练习 5 证明),比”独立像素”还好;可它 99% 的样本是垃圾,判别器准确率 0.994。这是 Theis, van den Oord & Bethge (2016) 的例子,原课第 9 讲会引用:对不完美的模型,似然好不一定样本好,反之亦然。
- 模式坍塌:每张样本都完美,但缺了 70% 的数据。 两把尺子都发现了(10.09 bit、准确率 0.724)。注意理论上最好的判别器能到 0.85(练习 7),这个小分类器只学到 0.72:判别器的能力有限,“准确率接近 0.5”只能说明”这个判别器分不出来”,不能证明两个分布相同。
结论:没有一把尺子是万能的。 似然(KL 散度)对”没覆盖到的数据”极其敏感——漏掉一个模式就要付出巨大代价;判别器对”生成了不像的样本”敏感。用哪把尺子训练,就会得到偏向哪种错误的模型。这条线索贯穿全课:KL 散度与最大似然(第 4 讲)、GAN 与 -散度、Wasserstein 距离(第 9–10 讲)、Fisher 散度与得分匹配(第 12–13 讲)、评估(第 15 讲)。
5.3 推断:怎样把生成过程反过来
§2.5 已经展示了:生成容易,推断难。推断不只是”从图读出形状”这一个用途——缺失数据的边缘化(§3.3)、去噪和补全(§4.4)、给一张图打分( 本身就是一次推断),全都需要对隐变量求和或积分。本课的模型家族在推断上的选择各不相同:自回归模型干脆没有隐变量( 精确可算,但没有天然的特征);VAE 用编码器近似推断;流模型让推断精确但要求网络可逆;GAN 不做推断。
5.4 无监督表示学习
最后一个目标是从原始数据里恢复高层描述——不需要任何标签。像素世界的后验 读出了”形状、位置、大小”;真实世界里,我们希望模型自动发现”物体、姿态、光照、风格”这样的因素。这比分类更难评价:什么样的表示才算”好”?第 15 讲会讨论聚类、重构、解耦等评价方法;第 5–6 讲的 VAE 是最直接的”学表示”的生成模型。
5.5 把三个问题写成一个式子
回到课程笔记的式子 ,三个核心问题分别是:
- 模型族 怎么表示?(表示)
- 距离 选什么?(学习的目标函数)
- 用什么优化过程最小化它?(学习的算法)
再加上学好以后的三种推断查询:密度估计 、采样 、表示学习。课程笔记特别强调:没有一种模型族能把所有推断任务都做得又高效又准确,这些取舍正是模型种类这么多的原因;而且,样本质量和表示质量的定量评价至今仍是开放问题。
6. 课程地图:模型家族 · The landscape
原课第 46 页的课程大纲按模型家族组织:
- 完全观测的、基于似然的模型:自回归模型、流模型
- 隐变量模型:变分学习、摊销推断、变分自编码器
- 隐式生成模型:两样本检验、嵌入、-散度、生成对抗网络
- 能量模型
- 基于得分的扩散生成模型
“学习算法、理论和应用。“下表把每个家族放进本讲的框架里(”✓“表示这个家族天然支持,”△“表示能做但要付出代价或只能近似,”✗“表示不支持):
| 家族 | 讲次 | 算 | 采样 | 隐表示 | 学习用的”距离” | 主要代价 |
|---|---|---|---|---|---|---|
| 自回归模型 | 3 | ✓ 精确 | △ 逐个维度,慢 | ✗ | KL(最大似然) | 采样慢、要选顺序 |
| 变分自编码器 | 5–6 | △ 只有下界 | ✓ 快 | ✓ 近似推断 | KL 的下界(ELBO) | 似然不精确、样本偏模糊 |
| 归一化流 | 7–8 | ✓ 精确 | ✓ 快 | ✓ 精确推断 | KL(最大似然) | 网络必须可逆、维数不能变 |
| 生成对抗网络 | 9–10 | ✗ | ✓ 快 | ✗(需另加编码器) | JS / -散度 / 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 讲)仍然是开放问题,人类偏好评测和专门的基准越来越重要。
不变的是这门课的骨架:无论模型多大,问题仍然是怎样表示 、用什么距离学习它、怎样从中采样和推断。
8. 小结 · Summary
- 统计生成模型就是一个概率分布 ;从中采样就生成了新数据。学习 = 在模型族 里找离 最近的 ,而 只能通过训练样本接触。
- 生成模型 = 数据 + 先验知识。 先验总是必要的(数据永远不够),但有一条从”图形引擎”到”从数据学习”的光谱。像素世界里:数据少时强先验最好;正确的先验 + 数据是最好的组合;先验错了数据救不回来;弱先验需要更多数据但能一直进步;完全不做假设就完全不会泛化。
- 生成模型是数据模拟器,有三种用途: 采样(可加控制信号做条件生成)、密度估计(打分)、推断 / 表示学习(从数据反推高层描述)。生成容易、推断难;“视觉是逆向图形学”。
- 判别式模型只学 ,简单而强大,但它说不出 本身像不像(对噪声图反而最自信)、处理不了缺失数据、不能生成 。判别式模型是最简单的条件生成模型;本课关心的是输出高维的条件分布。
- 生成模型的应用几乎都是”条件采样”或”算概率”:文生图、逆问题(超分辨率、补全、上色、医学成像)、异常检测、语音、语言、代码、视频、模仿学习、分子。
- 两个反直觉的事实: 高维里”最可能的数据”不是”典型的数据”(典型集);似然好不等于样本好,样本好也不等于似然好(背诵 vs 99% 噪声)。基于似然的异常检测会漏掉”简单”的异常。
- 三个核心挑战: 表示(维数灾难: 个参数)、学习(怎样比较两个分布)、推断(怎样把生成反过来)。每个模型家族都在这三点上做了不同的取舍,这就是全课的路线图。
9. 常见误区 · Common pitfalls
- “生成模型就是能生成图片 / 文字的模型。” 生成只是三种用途之一。一个好的生成模型同样能给数据打分(异常检测、压缩)和做推断(补全、去噪、表示学习)。有些家族(GAN)能生成却不能打分,有些(能量模型)能打分却很难生成。
- “概率越高的样本越好。” 高维里概率最高的数据(干净模板、全白的图)恰恰不典型。“只输出最可能的结果”会得到从不出现的”完美”数据;文本生成里,贪心解码常常输出重复、乏味的句子,也是同一个道理。
- “似然高 = 模型好 = 样本好。” 1% 真样本 + 99% 噪声的模型似然只差 6.64 bit,样本却 99% 是垃圾;背诵训练集的模型样本完美,似然却极差。似然和样本质量是两个不同的指标(第 15 讲)。
- “判别器分不出来,说明两个分布相同。” 判别器的能力有限(模式坍塌的例子里只学到 0.72,理论最优 0.85);它还可能靠”记住训练时见过的假样本”来分辨,检测的是重复而不是”不像”。
- “判别式模型输出的概率可以当作置信度。” 对远离训练数据的输入,判别式模型常常最自信(噪声图上 1.000)。它没有”这些都不是”的选项,也不知道 本身是否正常。
- “有了足够多的数据,就不需要先验。” 数据永远是有限的,而可能的数据空间是指数级的。深度学习并没有去掉先验,只是把它换成了网络结构、训练目标、生成顺序这些更隐蔽的形式。先验错了(“模板缺十字”),数据再多也救不回来。
- “判别式模型 vs 生成式模型,一定是生成式更省数据。” 这取决于模型族是否匹配数据。像素世界里,学出来的生成式分类器准确率并不比神经网络高,优势在 log loss 和缺失数据上。
- “后验平均就是最好的补全。” 后验平均(均方误差的最优解)是所有可能补全的平均,在多峰的情况下是一张模糊的、不合法的图。要合理的补全,应该从后验里采样。
10. 练习 · Exercises
练习 1(参数计数) (a) 一个 RGB 像素有三个通道、每个通道 256 种取值。完整描述一个像素颜色的联合分布需要多少个参数? (b) 像素世界的 黑白图,完整的概率表需要多少个参数?像素世界本身用多少个数就描述了这个分布? (c) 如果假设 64 个像素相互独立,需要多少个参数?代价是什么?
参考答案
(a) (原课第 2 讲第 5 页)。减 1 是因为概率之和必须为 1,最后一个概率由其余的决定。
(b) 。像素世界用 177 个模板(这是”先验知识”,不算可学的参数)+ 4 个形状概率(独立的只有 3 个)+ 1 个噪声水平,就完整描述了这个分布。代码 02 里”模板 + 数据”模型学 177 个配置概率(176 个独立)+ 1 个噪声水平。
(c) 64 个参数。代价是”像素独立”这个假设是错的:采出来的样本是”撒胡椒面”,测试 bits 比真实分布多约 10 bit/图(代码 02)。
练习 2(贝叶斯公式) 用 §3.1 表格里的 和 手算 和 ,核对表格。如果把先验改成四种形状等概率(各 0.25), 变成多少?
参考答案
;。
先验均匀时, 在分子分母里约掉,。先验从 0.3 : 0.2 变成 1 : 1,横线的优势变小了,但似然的比值(约 2 : 1)仍然让横线胜出。
练习 3(缺失数据的边缘化) 伯努利混合 。证明:若像素集合 缺失,则 即”把缺失像素从乘积里拿掉”。这个结论对任意的生成模型都成立吗?
参考答案
。交换求和与乘积之所以可以,是因为给定 时各像素独立、乘积可以按像素分开;每个缺失像素的求和等于 。
对一般的生成模型不成立:如果给定隐变量后像素之间仍然相关(例如自回归模型 ),缺失像素会影响后面像素的条件分布,必须真的对 种取值求和(或者用采样近似)。“边缘化在原理上总是可以做的,但是否高效取决于模型结构”——这是第 2 讲讨论条件独立的动机之一,也是第 3 讲自回归模型的一个弱点。
练习 4(典型集) 翻转像素个数 。 (a) 证明 最可能的取值是 3。 (b) 一张”翻了 个像素”的图(只算它自己那个配置)的 随 怎样变化?每多翻一个像素降低多少 bit? (c) 解释为什么”单张概率最高的图”和”最常被采到的那类图”不一样。
参考答案
(a) 二项分布的众数是 。也可以看相邻项之比:, 时为 , 时为 。
(b) ,每多翻一个像素变化 bit。
(c) “恰好翻 个”的总概率 = 单张图的概率 × 这样的图的张数 。单张概率随 指数下降(每次除以 19),张数却随 增长( 小时每次乘以约 )。两者的乘积在 达到最大。高维里张数的增长压倒一切,所以典型的样本远离单张概率最高的点。
练习 5(似然好、样本差) 模型 ,其中 是任意分布。证明 。 时这个上界是多少?和代码 05 的 6.64 对比。
参考答案
因为 ,所以 ,取对数:。对 求期望即得。 时上界是 bit。代码 05 的 6.64 几乎正好等于上界,因为噪声分布 在真实图上的贡献相对于 可以忽略。这个例子说明:似然对”多生成了垃圾”不敏感——只要模型把一小部分概率留给真实数据,似然就不会太差。
练习 6(背诵的代价) 查表模型 ,。一张没在训练集里出现过的测试图, 是多少?代码 02 里 时查表的测试 bits 是 70.54,和你的答案比较,差别来自哪里?
参考答案
没见过的图: bit。实际测试 bits 70.54 略低,因为少数测试图恰好在训练集里出现过——主要是一个像素都没翻的干净模板(占样本的 3.75%,同一个模板很容易重复),它们拿到了 的高概率。
练习 7(最优判别器) 模式坍塌的模型只生成横线(横线的真实分布),真实数据里横线占 30%。真样本和假样本各一半,最好的判别器准确率是多少?为什么代码 05 里的小分类器只学到 0.72?
参考答案
看到非横线:只可能是真样本,判”真”必对;看到横线:真样本里横线占 30%,假样本里占 100%,而且两边横线的分布完全相同(所以从图本身看不出区别),所以判”假”更优(后验概率 )。准确率 。小分类器要先学会”识别横线”——一个位置不固定、带噪声的形状,它只用 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) 世界的熵 会变大还是变小? 变成多少?(b) 推断的准确率(最大后验配置 = 真实配置)会怎样变化?(c) “独立像素”和真实分布的差距会变大还是变小?运行后核对你的预测。(做完记得改回 0.05——后面的讲次依赖这个默认值。)
参考答案(预测的思路)
(a) 变大。 bit(原来 18.3)。 不变(7.45), 会变大(噪声大,推断更不确定),所以 约增加 20 bit。
(b) 下降。噪声越大,形状越难辨认(代码 04 的去噪实验里,相对模板的总翻转概率 0.14 时,配置准确率只有 0.717,形状准确率 0.832; 的情形与之类似)。
(c) 变小。噪声越大,数据越接近”每个像素独立地随机”,独立像素这个错误假设的代价就越小;极端情况 时数据就是纯噪声,独立像素模型完全正确。具体数字以你的运行为准。
练习 9(思考:应用用到的是哪种能力) 对下面每个应用,说出它主要用到生成模型的哪种能力(采样 / 条件采样 / 密度估计 / 推断):(a) 文生图;(b) PixelDefend 检测对抗样本;(c) 图像补全;(d) 用 VAE 的隐变量做聚类;(e) 用语言模型给句子打分、选出最通顺的翻译;(f) 稀疏视角 CT 重建。
参考答案
(a) 条件采样 。(b) 密度估计(低 = 可疑),再加一步”往高概率区域移动”。(c) 条件采样 ,需要能对观测部分做推断。(d) 推断 / 表示学习()。(e) 密度估计(比较候选句子的 )。(f) 条件采样 / 后验推断:,前向模型 来自物理,生成模型提供先验 。
11. 延伸阅读 · Further reading
课程材料
- CS236 课程笔记 Introduction:https://deepgenerativemodels.github.io/notes/introduction/(学习 = 最小化分布间的距离;三个核心问题;三种推断查询)
- CS236 Fall 2023 Lecture 1 slides:https://deepgenerativemodels.github.io/assets/slides/cs236_lecture1_2023.pptx
- Goodfellow, Bengio & Courville, Deep Learning(原课推荐的参考书),第 20 章 Deep Generative Models:https://www.deeplearningbook.org/
- Grover & Ermon, Tutorial on Deep Generative Models, IJCAI 2018:https://ermongroup.github.io/generative-models/
本讲的几个关键论点
- 判别式 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 说,生成模型的第一个难题是表示: 个二值变量的联合分布需要 个参数。第 2 讲(原课 Lecture 2 Background)系统地回答”怎样用少得多的参数表示一个联合分布”:
- 独立性( 个参数,但太强)、链式法则(仍是 )、条件独立(马尔可夫链只要 );
- 贝叶斯网络:有向无环图 + 每个节点一个条件概率分布;按拓扑顺序的祖先采样;
- 生成式 vs 判别式的两种分解 和 ;朴素贝叶斯 vs 逻辑回归——本讲 §3.2 留下的”谁更省数据”在那里展开;
- 用神经网络参数化条件分布——从”贝叶斯网络假设条件独立”到”神经模型假设条件分布的函数形式”,这一步通向第 3 讲的自回归模型,也是所有深度生成模型的起点。