对应 Maps to:Stanford CS236 Deep Generative Models(Fall 2023,Stefano Ermon),Lecture 4 · 2023-10-09 · Maximum Likelihood Learning(slides:
cs236_lecture4.pdf,25 页)。 依据说明:本讲按原课 slides 的顺序展开:学习的设定与”什么是最好”→ KL 散度及其压缩解释 → 期望对数似然与最大似然 → 蒙特卡洛估计 → 抛硬币的 MLE → 自回归模型的 MLE、梯度下降与随机梯度下降 → 经验风险、过拟合、偏差–方差 → 条件生成模型 → 回顾。前向 / 反向 KL 的对比、Huffman 编码、“训练似然过于乐观”、早停与集成等是本讲义补充的;全部实验在第 1 讲的像素世界上进行,用第 3 讲训练好的自回归模型——因为像素世界的熵已知,可以把 KL 散度真正算出来。 配套代码 Code:code/lecture04/(PyTorch;1 个小模块 + 4 个演示脚本,每个都在 25 秒以内;代码 02、03 读取第 3 讲缓存的模型) 预计阅读时间:3 小时(含运行代码)
0. 本讲导航 · How to read this lecture
0.1 学习目标 Learning goals
学完这一讲,你应该能够:
- 说清楚学习生成模型的设定(数据分布、独立同分布的数据集、模型族),以及为什么”精确地学到 “一般做不到;“最好的模型”取决于用途。
- 写出 KL 散度的定义,用 Jensen 不等式证明它非负、当且仅当两分布相等时为 0;说明它不对称;用压缩解释它(“用错了编码多付的比特”)。
- 推导 最小化 ⇔ 最大化期望对数似然;说明为什么”概率接近 0 的样本权重极大”、为什么我们不知道离最优还差多远;理解**前向 KL 的”模式覆盖”**和反向 KL 的”模式寻找”。
- 用蒙特卡洛估计近似期望:无偏、收敛、方差 ;知道训练之后训练集上的平均似然为什么过于乐观。
- 写出抛硬币的 MLE();说明 MLE 等价于最小化”经验分布到模型”的 KL。
- 写出自回归模型的对数似然分解;说明没有参数共享时每个条件可以分开优化;推导随机梯度下降的梯度是全批量梯度的无偏估计,并理解批大小的取舍。
- 解释过拟合、偏差、方差,以及三类对策(更小的模型 / 权重共享、正则化、验证集);说明条件生成模型为什么只需要条件似然。
0.2 先修与本讲范围 Prerequisites & scope
| 默认你已经会 Assumed | 本讲只给直觉,后面几讲再展开 Previewed only |
|---|---|
| 第 1–3 讲:像素世界、贝叶斯网络、自回归模型(FVSBN、NADE、MADE、RNN、Transformer、PixelCNN) | 隐变量模型的似然(第 5 讲:似然算不出来时怎么办) |
| 期望、方差、对数的基本性质;梯度下降的基本概念 | 似然以外的”距离”:JS 散度、-散度、Wasserstein(第 9–10 讲)、Fisher 散度(第 12–13 讲) |
| 评估生成模型的全部方法(第 15 讲) |
0.3 本讲地图 Map
§1 学习的设定:数据分布、数据集、模型族;“什么是最好”;学习 = 密度估计
§2 KL 散度:定义、非负性、不对称;压缩的解释;前向 KL 与反向 KL ← 代码 01
§3 最大似然:KL 分解;期望对数似然 → 经验对数似然;抛硬币; ← 代码 02
像素世界上的 KL;概率接近 0 的样本
§4 蒙特卡洛估计:无偏、收敛、方差;训练似然的乐观偏差 ← 代码 03
§5 自回归模型的 MLE:似然的分解;梯度下降与随机梯度下降 ← 代码 02、03
§6 经验风险与过拟合:偏差–方差;正则化、早停、更小的模型 ← 代码 04
§7 条件生成模型;回顾 ← 代码 04
§8 2023 年之后
§9–13 小结、常见误区、练习、延伸阅读、下一讲预告
0.4 记号 Notation
| 符号 | 含义 |
|---|---|
| , | 数据分布;参数为 的模型分布 |
| 训练集, 个独立同分布(IID)的样本 | |
| 经验分布:每个训练样本概率 | |
| 或 | KL 散度 |
| , | 熵 ;交叉熵 |
| , | 似然 ;对数似然 |
| 蒙特卡洛估计 | |
| , | 小批量大小;学习率 |
0.5 关于数字 · About the numbers
数据与第 3 讲相同:像素世界的 10,000 张训练图、2,000 张验证图、5,000 张测试图;真实分布在测试集上平均 25.52 bit/图,在训练集上平均 25.61 bit/图。“比真实多 bit”在测试集上减前者、在训练集上减后者。所有数字来自作者机器的实际输出(单线程 CPU,重复运行逐字节相同)。有几处结果和预期不同(例如小批量 SGD 里批越小越好、500 张图时最小的模型最好),讲义按实际结果写,并记录在 代码 README 的”关于实验结果”里。
1. 学习的设定 · The learning setting
1.1 设定
原课第 3 页:
- 假设领域由某个底层分布 支配;
- 给定一个数据集 ,包含从 抽出的 个样本;每个样本是对(一部分)变量的一个赋值,例如 ,或者像素的亮度;
- 标准假设:样本是独立同分布(IID)的;
- 给定一个模型族 ,任务是在其中学到一个”好的”分布。例如 可以是”某个固定图结构的所有贝叶斯网络(CPT 任取)“,或者”所有可能的逻辑回归参数下的 FVSBN”( = 所有逻辑回归系数拼成的向量)。
1.2 学习的目标,以及为什么一般做不到
原课第 4 页:学习的目标是返回一个精确地刻画了 的模型 。这一般做不到,原因有二:
- 数据有限,只能粗略地近似真实分布。用 784 个二值变量表示一张图,可能的状态有 个;即使有 个训练样本,覆盖也极其稀疏。
- 计算上的原因。
所以我们想在模型族里选一个**“最好的”近似**。可什么是”最好”?
1.3 “最好”取决于用途
原课第 5 页列了三种用途:
- 密度估计:我们关心完整的分布,以后可以算任何想要的条件概率;
- 具体的预测任务:用分布来做预测——这封邮件是不是垃圾邮件?结构化预测:预测视频的下一帧,给图配描述;
- 结构或知识发现:我们关心模型本身——某些基因怎样相互作用?什么导致了癌症?(“Take CS 228”)
本课主要关心第一种:学习 = 密度估计(第 6 页)。我们想学到完整的分布,以后就能回答任何概率推断问题;也就是要让 尽可能”接近” 。怎样衡量”接近”?
2. KL 散度 · KL divergence
2.1 定义与基本性质
原课第 7 页:两个分布 和 之间的 Kullback–Leibler 散度(KL 散度)定义为
非负性: 对所有 成立,当且仅当 时等号成立。证明只用 Jensen 不等式( 是凸函数,凸函数的期望 ≥ 期望的凸函数):
不对称:一般 。
代码 01 第 1 部分抽了 10 万对随机的 6 点分布,没有一个 KL 是负的(最小值 0.0021 bit); 时恰好为 0。一个不对称的例子:,, bit, bit—— 在 几乎不出现的第三个结果上放了 0.33 的概率,代价很大。KL 不满足对称性和三角不等式,所以不是数学意义上的”距离”,叫”散度”。
2.2 压缩的解释
原课第 7–8 页:KL 散度衡量的是用一个为 优化的压缩编码去描述来自 的样本,平均要多用多少比特。
为什么压缩和概率有关?因为要压缩,最好知道数据来自什么分布。例如 是一枚均匀硬币的抛掷结果,大约 50 个正面、50 个反面;最优的方案是正面记 0、反面记 1,平均每次 1 bit,不可能更好。如果硬币有偏、,就应该用更少的比特表示正面、更多的比特表示反面——把多次抛掷打包,HHHH(常见)用短码、TTTT(罕见)用长码。就像摩尔斯电码:E = •,A = •−,Q = −−•−,常见的字母码短。
代码 01 第 2 部分真的写出了 Huffman 编码(,熵 bit / 次):
| 打包几次抛掷 | 符号个数 | Huffman 平均 bit / 次 |
|---|---|---|
| 1 | 2 | 1.0000 |
| 2 | 4 | 0.6450 |
| 3 | 8 | 0.5327 |
| 4 | 16 | 0.4925 |
| 6 | 64 | 0.4702 |
| 8 | 256 | 0.4758 |
打包越多,平均码长越接近熵(不一定单调,但 Huffman 保证不超过 )。用”为错误分布 设计的编码”去压缩来自 的数据:
| 编码按 设计 | 理想码长 | 比熵多用 | Huffman()比最优多用 | |
|---|---|---|---|---|
| 0.90 | 0.4690 | 0.0000 | 0.0000 | 0.0000 |
| 0.70 | 0.6368 | 0.1678 | 0.1678 | 0.1436 |
| 0.50 | 1.0000 | 0.5310 | 0.5310 | 0.5242 |
| 0.99 | 0.6774 | 0.2084 | 0.2084 | 0.0392 |
理想码长 的平均就是交叉熵 ,而且
“比熵多用”和 KL 两列逐位相同。KL = 用错了分布带来的额外比特。 一个细节:真实的 Huffman 码长是整数、符号个数有限,过于极端的设计()被”截断”了,实际浪费反而比理想值小得多(0.039 vs 0.208)。KL 精确描述的是理想编码(例如码长可以是小数的算术编码)的代价。
2.3 前向 KL 与反向 KL
KL 不对称,那么用 还是 去拟合,结果会一样吗?代码 01 第 3 部分用一个高斯 去拟合一个双峰分布 :
| 拟合方式 | ||||
|---|---|---|---|---|
| 最小化 (前向 KL = 最大似然) | 0.00 | 2.57 | 1.099 | 3.242 |
| 最小化 (反向 KL) | −2.50 | 0.60 | 24.047 | 1.000 |
- 前向 KL :只要 有质量的地方 很小,代价就巨大。于是 必须覆盖两个峰,只好把均值放在中间、方差撑大(恰好就是匹配 的均值和方差,练习 5)。结果约 30% 的样本落在 里,而 在这里的质量只有 0.002。这叫模式覆盖(mode covering)。
- 反向 KL :只惩罚 放了质量、 却没有的地方。 待在一个峰上就很好——它恰好等于左边那个成分, bit (在那个峰上 是 的 2 倍)。这叫模式寻找(mode seeking):样本都很像,但只覆盖一半的数据;从 的角度看,右峰在 下概率为 0, 高达 24 bit。
下一节会看到:最大似然 = 最小化前向 KL,所以似然训练的模型倾向于”宁可多覆盖,也不漏掉”。第 5–6 讲的变分推断用反向 KL,第 9–10 讲的 GAN 用 JS 散度和其他散度——它们犯错的方式各不相同。第 1 讲 §5.2 “两把尺子打架”的现象,根源就在这里。
3. 最大似然 · Maximum likelihood
3.1 KL 分解:熵是常数
原课第 9–10 页:用 KL 散度衡量 和 的”接近程度”:
它为 0 当且仅当两个分布相同;它衡量用 代替 的”压缩损失”(比特)。展开:
第一项和 无关(它是 )。所以最小化 KL 散度等价于最大化期望对数似然:
原课在这一页写了三点评论,每一点都值得记住:
- 它要求 给来自 的样本高概率,以反映真实分布。
- 因为有 , 的样本在目标里权重极大(§3.4)。
- 虽然现在可以比较模型了,但因为忽略了熵 ,我们不知道离最优还有多远。
还有一个问题:一般我们不知道 。
3.2 像素世界:把 KL 真正算出来
真实数据上只能看到交叉熵 ;像素世界知道每张图的真实 ,于是能把 KL 的两项分开。代码 02 第 2 部分用第 3 讲的 7 个模型:
| 模型(按交叉熵排序) | 交叉熵 | ± 标准误 | KL 估计 = 交叉熵 − 熵 | ± 标准误(配对) |
|---|---|---|---|---|
| GRU | 26.346 | 0.108 | 0.826 | 0.023 |
| PixelCNN | 26.357 | 0.105 | 0.837 | 0.019 |
| RNN | 26.433 | 0.107 | 0.913 | 0.023 |
| Transformer | 27.078 | 0.111 | 1.558 | 0.031 |
| MADE | 29.235 | 0.110 | 3.715 | 0.047 |
| NADE | 29.410 | 0.109 | 3.890 | 0.050 |
| FVSBN | 30.169 | 0.110 | 4.649 | 0.059 |
(熵 在这 5000 张测试图上是 25.520 bit。)
- 按交叉熵排名和按 KL 排名完全一样:熵是一个与模型无关的常数,比较模型时可以不管它。
- 但只看交叉熵,永远不知道离最优还差多远:GRU 的 26.35 bit 可能已经接近最优,也可能还差很远。只有知道真相,才算得出 KL ≈ 0.83 bit。
- 比较模型要用配对的差:交叉熵本身的标准误约 0.1 bit(每张图的 bits 波动很大),而两个模型在同一批测试图上的差,标准误只有 0.02–0.06 bit。GRU 和 PixelCNN 相差 0.011 bit,在这个精度下分不出高下。
3.3 经验对数似然与最大似然
原课第 11 页:用经验对数似然近似期望对数似然:
最大似然学习就是
等价地,最大化数据的似然 (IID 假设让联合概率变成乘积)。
一个有用的视角:经验对数似然恰好是 ,其中 是经验分布(每个训练样本概率 )。所以 MLE = 最小化 ——用模型去逼近训练数据的经验分布。这也预告了过拟合:如果模型族足够大,最好的 就是 本身(第 1 讲的”查表”模型)。
3.4 抛硬币
原课第 14–15 页:两种结果,正面 H 和反面 T;数据 ;模型族是所有 上的分布:,。数据的似然是
代码 02 第 1 部分:
| 似然 | 对数似然 | ||
|---|---|---|---|
| 0.20 | 0.00512 | −5.275 | 0.5510 |
| 0.50 | 0.03125 | −3.466 | 0.0290 |
| 0.60 | 0.03456 | −3.365 | 0.0000 |
| 0.70 | 0.03087 | −3.478 | 0.0326 |
| 0.99 | 0.00010 | −9.240 | 1.6953 |
闭式解:,恰好是正面出现的比例;此时经验分布到模型的 KL 恰好为 0。 的似然极小:数据里有两个 T,模型却几乎不允许 T 出现。
3.5 “概率接近 0 的样本权重极大”
代码 02 第 3 部分把这句话量化了。先看 GRU(最好的模型)在每张测试图上比真实分布多用的 bit:
| 测试图 | 占总的”多用 bit”的比例 |
|---|---|
| 最差的 1%(50 张) | 0.127 |
| 最差的 5%(250 张) | 0.348 |
| 最差的 10%(500 张) | 0.500 |
| 最差的 50%(2500 张) | 1.049 |
最差的 10% 测试图贡献了一半的误差(另有 20.8% 的测试图上 GRU 的概率反而比真实分布还高,所以最差的 50% 加起来超过 100%)。最”意外”的三张图都是 4×4 的方框,噪声恰好改变了方框的结构(内部被填、一条边被延长、角被擦掉):真实分布知道”这是一个方框加几个翻转”,GRU 给的概率低得多,每张多付 16–23 bit。
再看极端情况:画法和形状频率都正确、只有噪声水平不同的模板模型:
| 模型 | 测试:比真实多 bit/图 | 最差一张图的 bit |
|---|---|---|
| 噪声 ε = 0.05(正确) | 0.00 | 54.5 |
| 噪声 ε = 0.01 | 3.75 | 74.7 |
| 噪声 ε = | 23.91 | 140.4 |
| 噪声 ε = (几乎不允许噪声) | 108.03 | 406.1 |
的形状决定了一切:概率从 0.01 降到 0.0001,代价从 6.6 bit 涨到 13.3 bit;概率 → 0 时代价 → ∞。只要有一张测试图概率为 0,平均对数似然就是 。 所以最大似然训练的模型都不敢给任何东西概率 0,宁可把概率摊得宽一些——这正是 §2.3 前向 KL 的”模式覆盖”。
4. 蒙特卡洛估计 · Monte Carlo estimation
4.1 主要想法
原课第 12 页:
- 把感兴趣的量表示成某个随机变量的期望:;
- 从 里抽 个样本 ;
- 用样本平均估计期望:。
注意 本身是一个随机变量(换一批样本,它就变)。
4.2 性质
原课第 13 页:
- 无偏:;
- 收敛:由大数定律, 时 ;
- 方差:——增加样本数就能降低估计的方差。
代码 03 第 1 部分用它估计像素世界的熵 bit:
| 每个估计用的样本数 | 重复次数 | 估计的平均 | 估计的标准差 | 理论 |
|---|---|---|---|---|
| 1 | 2000 | 25.512 | 7.241 | 7.283 |
| 10 | 2000 | 25.572 | 2.267 | 2.303 |
| 100 | 2000 | 25.566 | 0.717 | 0.728 |
| 1000 | 500 | 25.590 | 0.224 | 0.230 |
无论 多小,估计的平均都等于真实值(无偏);标准差和 吻合:样本数扩大 100 倍,误差只缩小 10 倍。§3.3 的经验对数似然,就是期望对数似然的蒙特卡洛估计(样本 = 训练集)。
4.3 一个陷阱:训练之后,训练集上的似然过于乐观
蒙特卡洛估计无偏的前提是:样本和 无关。可是 MLE 恰恰是用训练集选出了 ——之后再用同一个训练集估计 ,就不再无偏了。代码 03 第 2 部分(FVSBN,不同的训练集大小):
| 训练集大小 | 训练集:比真实多 bit | 测试集:比真实多 bit | 测试 − 训练 |
|---|---|---|---|
| 50 | −19.29 | 46.41 | 65.70 |
| 300 | −1.38 | 14.25 | 15.62 |
| 2000 | 3.75 | 5.28 | 1.53 |
| 10000 | 4.35 | 4.65 | 0.30 |
时,模型在训练集上的概率比真实分布还高 19 bit——它记住了这 50 张图;测试集上却差了 46 bit。训练集上的平均对数似然是一个过于乐观的估计,因为参数正是为了让这些样本的似然变大而选出来的。所以评价模型必须用没参与训练的数据(原课 slide 23 的”validation set”)。
5. 自回归模型的最大似然 · MLE for autoregressive models
5.1 似然的分解
原课第 16 页:给定一个 个变量的自回归模型
是所有条件分布的参数。训练数据 ,似然分解为
目标是 。和抛硬币不同,这里一般没有闭式解。
5.2 没有参数共享时,可以分开优化
原课第 18 页:对 求梯度,
**如果没有参数共享,每个条件 可以分开优化。**实际中参数往往是共享的(NADE、PixelRNN、PixelCNN 等)。
代码 02 第 4 部分验证了这一点:FVSBN 的 64 个逻辑回归,分别用 64 个独立的 L-BFGS 训练,和把它们的损失加起来、对整个下三角矩阵一起训练,得到的训练集 bits 都是 29.9466、测试误差都是 4.6414,系数矩阵最大差 (优化器的收敛精度)。每个小问题都是凸的、最优解唯一,所以总目标的最优解就是各个小问题最优解的拼接。
5.3 梯度下降
原课第 17 页:
- 随机初始化 ;
- 用反向传播计算 ;
- 。
这是一个非凸优化问题(对神经网络而言),但实践中通常效果很好。
5.4 随机梯度下降:梯度也是蒙特卡洛估计
原课第 19 页:如果 很大呢?
梯度本身是一个期望——于是可以用蒙特卡洛估计:随机抽一个(或一小批),
这就是随机梯度下降(SGD)。代码 03 第 3 部分在 FVSBN 上量了小批量梯度的误差:
| 参数所在的位置 | 批大小 | ‖全批量梯度‖ | 相对平方误差 | 100 个小批量梯度的平均与 的余弦 |
|---|---|---|---|---|
| 刚初始化 | 1 | 3.760 | 4.813 | 0.978 |
| 刚初始化 | 16 | 3.760 | 0.306 | 0.998 |
| 刚初始化 | 256 | 3.760 | 0.019 | 1.000 |
| 训练好以后 | 1 | 0.015 | 144999 | 0.009 |
| 训练好以后 | 16 | 0.015 | 8174 | 0.088 |
| 训练好以后 | 256 | 0.015 | 485 | 0.406 |
- 相对平方误差和 成反比( 扩大 16 倍,误差缩小约 16 倍):小批量梯度的方差 = 单样本梯度的方差 / 。
- 在初始点,小批量梯度的平均和全批量梯度方向一致:小批量梯度是无偏的。
- 训练好以后,全批量梯度几乎为 0(已在最优点附近),可单个样本的梯度并不小——相对误差高达几十万倍,连 100 个 的小批量梯度的平均,和 的余弦也只有 0.4。“无偏”只保证平均起来是对的,不保证有限个样本就准:在最优点附近,SGD 的每一步主要是噪声。这就是训练后期要减小学习率的原因(第 3 讲的训练用余弦衰减到 0)。
梯度下降 vs SGD(代码 03 第 4 部分,FVSBN,学习率 0.5 的普通 SGD,表中是测试集上比真实多的 bit):
| 方法 | 看过 1 遍数据 | 3 遍 | 10 遍 | 30 遍 | 30 遍的总步数 |
|---|---|---|---|---|---|
| 梯度下降() | 38.32 | 38.01 | 36.95 | 34.19 | 30 |
| SGD() | 35.52 | 30.69 | 20.83 | 12.32 | 600 |
| SGD() | 20.80 | 12.32 | 7.98 | 5.63 | 6,000 |
| SGD() | 8.01 | 5.65 | 4.69 | 4.65 | 60,000 |
看同样多的数据(同样的计算量),小批量 SGD 远远领先:梯度下降每看一遍数据只走一步,SGD 走 步——每一步的方向有噪声,但平均来说是对的,而且步数多得多。在这个设置里, 看 1 遍数据就到了 8 bit、30 遍时和 Adam 训练的结果一样(4.65)。但 要走 6 万步;在 GPU 这样的并行硬件上,算 500 个样本的梯度几乎和算 5 个一样快,按”墙上时间”算大批量往往更划算。批大小是”步数""每步的质量”和”硬件效率”之间的取舍。
6. 经验风险与过拟合 · Empirical risk and overfitting
6.1 经验风险最小化很容易过拟合
原课第 20 页:经验风险最小化很容易过拟合数据。极端的例子:数据就是模型(记住全部训练数据)。可是数据只是一个样本,通常还有大量从没见过的样本;模型应该在这些”没见过”的样本上泛化得好。所以我们通常要限制所搜索的分布的假设空间。
§3.3 已经说过,MLE = 最小化 ;如果模型族包含经验分布本身,MLE 的答案就是”把训练集背下来”——第 1 讲的”查表”模型在训练集上只要 6.66 bit/图(远低于真实熵),测试集上却要 70.5 bit/图。
6.2 偏差–方差权衡
原课第 21–22 页:
- 如果假设空间非常有限,即使有无限的数据也可能表示不了 。这种限制叫偏差(bias):学习受限于它能多接近目标分布。
- 如果选一个表达能力很强的假设类,可能更好地表示数据;但数据少时,多个模型都能很好地拟合,甚至比真实模型拟合得还好;而且 的微小扰动会带来非常不同的估计。这种限制叫方差(variance)。
- 选择假设类时存在内在的偏差–方差权衡:学习的误差来自两者。slide 22 用多项式回归画了三张图:线性(欠拟合)、高次多项式(过拟合)、低次多项式(恰当)。
代码 04 第 1 部分用 MADE 的隐藏层宽度 当作”模型容量”:
| 宽度 | 参数个数 | 训练集 | 训练:比真实多 | 测试:比真实多 | 测试 − 训练 |
|---|---|---|---|---|---|
| 8 | 741 | 500 | 9.85 | 10.77 | 0.92 |
| 8 | 741 | 10000 | 10.47 | 10.52 | 0.06 |
| 64 | 6,358 | 500 | 2.99 | 11.99 | 9.00 |
| 64 | 6,358 | 10000 | 7.44 | 7.63 | 0.19 |
| 512 | 169,233 | 500 | −13.65 | 44.90 | 58.55 |
| 512 | 169,233 | 10000 | 1.77 | 3.23 | 1.46 |
- **小模型()**训练和测试几乎一样,但两者都差;数据从 500 加到 1 万,测试误差只从 10.77 降到 10.52——假设空间太小:偏差。
- **大模型()**在 500 张图上严重过拟合:训练集上比真实分布还好 13.65 bit,测试集上差 44.90 bit;同一个模型在 1 万张图上测试误差降到 3.23——灵活的模型需要更多数据:方差。
- 最好的容量取决于数据量:500 张图时最小的模型最好(10.77 / 11.99 / 44.90);1 万张图时越大越好(10.52 / 7.63 / 3.23)。
方差到底是什么样子? 代码 04 第 2 部分把同一种模型在 5 个互不相交的训练集(每个 500 张)上各训练一次,看它们对同一批测试图给出的概率:
| 宽度 | 单个模型:比真实多 bit | 同一张图在 5 个模型间的标准差 | 5 个模型的混合:比真实多 bit |
|---|---|---|---|
| 16 | 10.52 | 1.88 | 9.59 |
| 256 | 26.53 | 13.30 | 13.70 |
小模型的 5 个”版本”看法很接近(标准差 1.88 bit)——方差小、偏差大。大模型换一个训练集,同一张测试图的 bits 平均要变化 13.3 bit——这就是 slide 21 说的” 的微小扰动会带来非常不同的估计”。把 5 个大模型混合起来(概率取平均),误差从 26.53 降到 13.70 bit:平均掉了一部分方差,这就是集成(ensemble)的原理;小模型的方差本来就小,混合只从 10.52 降到 9.59。(集成等于用了 5 倍的数据;把 2500 张图合在一起训练一个模型通常更好。)
6.3 怎样避免过拟合
原课第 23 页:
- 硬约束,例如选一个表达能力更弱的模型族:参数更少的小网络;权重共享(NADE 相对每个条件各自一套参数、卷积相对全连接);
- 对”更简单”的模型的软偏好:奥卡姆剃刀。给目标函数加正则项:;
- 在留出的验证集上评估泛化性能。
代码 04 第 3 部分: 的 MADE,只有 500 张训练图:
| 做法 | 训练:比真实多 | 测试:比真实多 |
|---|---|---|
| 不加约束(L2 正则 ) | −13.65 | 44.90 |
| L2 正则 | −13.03 | 28.88 |
| L2 正则 | −4.86 | 10.46 |
| 早停(验证集最好的是第 200 步) | 4.37 | 10.22 |
| 换一个小模型() | 2.99 | 11.99 |
三类办法都把测试误差从 44.90 拉回到 10–12 bit 左右。早停那次训练的验证集曲线是:第 100 步 36.37、第 200 步 36.12、第 300 步 37.98、第 500 步 44.79、第 1000 步 61.98、第 2000 步 71.07(验证集上的平均 bits,真实分布约 25.6)——只有前 200 步在学真正的结构,之后就开始背训练集。500 张图对 17 万个参数实在太少,什么办法都只能救回一部分;第 1 部分里同一个模型有 1 万张图时只差 3.23 bit。数据是最好的正则化。
7. 条件生成模型与回顾 · Conditional generative models and recap
7.1 条件生成模型
原课第 24 页:假设我们想在给定一些变量 的条件下生成另一些变量 ,例如文字转语音。我们集中建模 ,用条件损失函数
因为损失只依赖 ,只需估计条件分布,不需要联合分布。
代码 04 第 4 部分:只想要 。条件似然训练只在下半张的 32 个像素上算损失;联合似然训练在全部 64 个像素上算:
| 宽度 | 训练集 | 联合似然训练: 比真实多 bit | 条件似然训练 |
|---|---|---|---|
| 16 | 1000 | 5.770 | 5.753 |
| 16 | 10000 | 5.751 | 5.710 |
| 128 | 1000 | 6.310 | 6.369 |
| 128 | 10000 | 3.412 | 3.301 |
两种训练差别很小,哪个更好取决于容量和数据量。原因是:在自回归模型里,联合似然本来就是”上半张的项 + 下半张的项”之和,下半张的条件分布在两种训练里都被直接优化,区别只在于共享的隐藏单元要不要分一部分去建模上半张。真实的条件生成任务(文字 → 语音、图 → 描述)里,输入 往往极其复杂,建模 既困难又没有必要——这时只学 的优势就大得多。第 1 讲说”判别式模型是最简单的条件生成模型”,它用的正是条件似然。
7.2 回顾(原课 slide 25)
- 对自回归模型,算 很容易;理想情况下,各个条件 可以并行计算(不像 RNN);
- 所以很自然地用最大似然训练它们;
- 更高的对数似然不一定意味着更好看的样本(第 1 讲 §5.2:背诵训练集的模型样本完美、似然极差;1% 真样本 + 99% 噪声的模型似然不错、样本极差);
- 其他衡量相似度的方式也是可能的——生成对抗网络(GAN,第 9–10 讲)。
8. 2023 年之后 · Since 2023
- 最大似然仍是大模型预训练的核心目标。 大语言模型的预训练损失就是”下一个 token 的交叉熵”——§5.1 的自回归 MLE;困惑度(perplexity)是 。规模定律(scaling laws,Kaplan et al. 2020;Chinchilla,Hoffmann et al. 2022)描述的正是这个交叉熵怎样随参数、数据和算力下降。§3.2 的教训在那里同样适用:交叉熵可以比较模型,但没人知道语言的”真实熵”有多低(规模定律的拟合里有一个”不可约损失”项,就是在估计它)。
- “语言建模就是压缩”。 §2.2 的压缩解释被认真地用到了大模型上:Delétang et al.(ICLR 2024,Language Modeling Is Compression)用大语言模型配合算术编码去压缩文本、图像和音频,压缩率超过了 PNG、FLAC 等专用压缩器。似然 = 码长,这不只是一个比喻。
- 只靠最大似然不够。 似然高不等于样本好(§7.2):最大似然训练的语言模型用贪心或束搜索解码时容易重复、乏味(Holtzman et al. 2020 的”神经文本退化”),于是有了 top-p 采样等解码方法;预训练之后还要用指令微调和人类反馈强化学习(RLHF)做”后训练”,目标不再是似然。这和 §2.3 的”前向 KL 模式覆盖”一脉相承:MLE 让模型覆盖人类文本的全部分布,包括低质量的部分;后训练把它往”想要的”那部分推。
- 扩散模型的训练目标也是似然的界。 第 16 讲会看到,DDPM 的损失是对数似然的变分下界(ELBO)的一个加权版本;流匹配可以看成另一种方式的”拟合分布”。“最大似然 / KL”仍然是理解这些目标的起点。
9. 小结 · Summary
- 学习 = 在模型族里找最接近 的分布;数据有限、计算有限,精确学到一般做不到。“最好”取决于用途;本课关心密度估计。
- KL 散度 ,等号当且仅当 (Jensen);不对称;等于用 的编码压缩 的样本多付的比特(交叉熵 = 熵 + KL)。前向 KL 模式覆盖,反向 KL 模式寻找。
- 最小化 ⇔ 最大化期望对数似然(熵是常数)。代价: 的样本权重极大;不知道离最优多远。像素世界上,GRU 的 KL ≈ 0.83 bit,最差的 10% 测试图贡献了一半的误差;给任何一张图概率 0,平均对数似然就是 。
- 最大似然估计用经验平均代替期望,等价于最小化”经验分布到模型”的 KL;抛硬币 时 。
- 蒙特卡洛估计无偏、收敛、方差 ;但训练之后训练集上的平均似然过于乐观( 时训练集上比真实分布还好 19 bit,测试集上差 46 bit),所以要用验证集 / 测试集评价。
- 自回归模型的对数似然是各条件对数似然之和;没有参数共享时可以分开优化(FVSBN:64 个逻辑回归分开训练 = 一起训练);一般没有闭式解,用梯度下降。SGD 的小批量梯度是全批量梯度的无偏估计,方差 ∝ 1/B;按看过的数据量算,SGD 远快于梯度下降;在最优点附近 SGD 主要是噪声。
- 过拟合与偏差–方差:小模型偏差大、方差小;大模型数据少时方差大(换一个训练集,同一张图的 bits 变化 13 bit);最好的容量取决于数据量。对策:更小的模型 / 权重共享、正则化、早停(验证集)、更多数据、集成。
- 条件生成模型只需条件似然 。更高的似然不一定意味着更好的样本,这引出了不用似然的方法(GAN)。
10. 常见误区 · Common pitfalls
- “KL 散度是两个分布之间的距离。” 它不对称、不满足三角不等式; 和 可以差很多(§2.1:0.681 vs 0.854;§2.3:1.1 vs 24 bit)。
- “最大似然 = 最小化 KL,所以似然最高的模型就离真实分布最近。” 只在同一份数据上比较模型时成立;单看似然不知道离最优还差多远,因为熵未知。
- “训练集上的似然越高越好。” 训练集上的平均似然在训练之后是过于乐观的估计; 时模型在训练集上甚至比真实分布还”好”。要看测试集 / 验证集。
- “蒙特卡洛估计无偏,所以一个样本就够了。” 无偏只说明平均正确; 时估计的标准差是 7 bit。要看方差。
- “小批量梯度有噪声,所以 SGD 比梯度下降差。” 按计算量算,SGD 通常好得多(同样看 1 遍数据:GD 38.3 vs 的 SGD 8.0 bit)。噪声的问题主要在最优点附近,用衰减学习率解决。
- “模型越大越好。” 取决于数据量:500 张图时最小的 MADE 最好,17 万参数的 MADE 测试误差高达 44.9 bit。
- “模型可以对罕见的东西给概率 0,反正它很少出现。” 只要测试集里出现一次,对数似然就是 。最大似然天然惩罚”过于自信”。
- “条件生成模型和联合模型给出的条件分布一定差很多。” 对自回归模型,联合似然本来就包含了条件分布的项,两种训练差别很小(§7.1);条件似然的优势在输入 很复杂、很难建模时才明显。
11. 练习 · Exercises
练习 1(KL 的非负性) 用 Jensen 不等式证明 。等号什么时候成立?如果某个 满足 而 , 是多少?反过来 、 呢?
参考答案
。Jensen 的等号要求 在 的支撑上是常数,加上第二个不等号要求 的质量全在 的支撑上,合起来就是 。、 时那一项是 ,所以 (这就是 §3.5 “概率为 0 的样本”);、 时那一项按约定是 ,不受影响——这正是前向 KL 不在乎” 多放了质量”的原因。
练习 2(交叉熵 = 熵 + KL) 证明 。对 、 手算三个量,和代码 01 的表核对。
参考答案
。数值:;;。
练习 3(类别分布的 MLE) 面骰子,参数 ()。数据里第 面出现了 次,共 次。用拉格朗日乘子法证明 MLE 是 。第 2 讲里”数数”得到的 CPT 为什么就是最大似然估计?
参考答案
最大化 ,约束 。拉格朗日函数 对 求导:;代入约束得 。贝叶斯网络的对数似然按节点、按父节点取值分解成许多独立的”骰子”(每一行 CPT 一个),每个骰子的 MLE 就是”这一行里各取值出现的比例”——数数。拉普拉斯平滑相当于在数数之前给每个取值加上伪计数(贝叶斯观点下,“每个取值加 1”是均匀 Dirichlet 先验下参数的后验均值)。
练习 4(MLE = 最小化经验分布的 KL) 证明 。如果模型族包含 本身,MLE 的答案是什么?这和第 1 讲的”查表”模型有什么关系?
参考答案
,第一项与 无关,第二项恰好是 。如果 ,KL 的最小值 0 在 处取到:MLE 的答案就是”把训练集背下来、其余一律概率 0”。第 1 讲的查表模型几乎就是它(只留了 1% 给没见过的图,否则测试似然是 )。这是过拟合最纯粹的形式(slide 20 “the data is the model”)。
练习 5(前向 KL 拟合高斯 = 矩匹配) 证明:在所有高斯 中,最小化 的解是 、。和代码 01 的 、 核对( 是两个 的等权混合)。
参考答案
。对 求导得 ;代入后对 求导:。混合分布的均值是 0,方差 = 成分方差 + 成分均值的方差 = ,。
练习 6(需要多少测试图?) 单张测试图的 标准差约 7.3 bit。(a) 要让测试 bits 的标准误降到 0.01 bit,需要多少张测试图?(b) 两个模型在同一批图上的 bits 之差,标准差约 1.6 bit(代码 02:GRU 的配对标准误 0.023 × √5000 ≈ 1.6)。要把差的标准误降到 0.01 bit,需要多少张?
参考答案
(a) 万张。(b) 张。配对比较需要的样本少 20 倍——两个模型在”难图”上一起难、“易图”上一起易,差值的波动小得多。
练习 7(训练似然的乐观偏差,最极端的情形) 抛硬币,只抛一次,结果是 H。(a) MLE 是多少?训练集上的对数似然是多少?(b) 真实的 ,这个 MLE 模型在测试集上的期望对数似然是多少?(c) 加一个伪计数()以后呢?
参考答案
(a) ;训练集对数似然 (完美)。(b) 测试时出现 T 的概率是 0.4,而模型给 T 概率 0,期望对数似然 。(c) ,期望对数似然 nat,有限。平滑(正则化)牺牲一点训练集上的似然,换来了泛化。
练习 8(小批量梯度无偏) 设全批量梯度 ,小批量梯度 ,其中 独立地从 均匀抽取。证明 ,并且 。这解释了代码 03 第 3 部分的哪个现象?
参考答案
,所以 。 是 个独立、均值为 0 的向量的平均,方差(这里是期望平方范数)是单个的 。代码 03 的相对平方误差在 扩大 16 倍时缩小约 16 倍(4.81 → 0.31 → 0.019)。在最优点附近 而单样本梯度的方差不为 0,所以相对误差爆炸。
练习 9(动手:正则化太强会怎样)
在 04_overfitting.py 第 3 部分的 for wd in [0.0, 1e-3, 1e-2] 里加上 1e-1 和 1.0,重新运行(多花约 20 秒)。运行前先预测:训练误差和测试误差会怎样变化?
参考答案(预测的思路)
继续增大,参数被压向 0:模型越来越接近”所有 logit 都只有偏置”——即独立像素模型。训练误差会上升(不再能背训练集,最后接近独立像素的约 10 bit),测试误差先继续下降(过拟合被抑制)、然后上升(欠拟合,偏差占主导)。两者会在某个 附近交汇。具体数字以你的运行为准。
12. 延伸阅读 · Further reading
原课材料
- CS236 Fall 2023 Lecture 4 slides:https://deepgenerativemodels.github.io/assets/slides/cs236_lecture4.pdf
- CS228 课程笔记 Learning in directed models(最大似然、贝叶斯网络的参数估计):https://ermongroup.github.io/cs228-notes/
信息论与 KL
- Cover & Thomas, Elements of Information Theory(2006),第 2 章(熵、KL)、第 5 章(数据压缩、Huffman 编码)
- MacKay, Information Theory, Inference, and Learning Algorithms(2003),第 4–6 章;免费电子版:https://www.inference.org.uk/itila/
最大似然、偏差–方差、优化
- Murphy, Probabilistic Machine Learning: An Introduction(2022),第 4 章(参数估计)
- Bottou, Curtis & Nocedal, Optimization Methods for Large-Scale Machine Learning, SIAM Review 2018(SGD 的理论与实践)
- Minka, Divergence measures and message passing(2005)——前向 / 反向 KL 与其他散度的经典对比
2023 年之后
- Hoffmann et al., Training Compute-Optimal Large Language Models(Chinchilla), NeurIPS 2022
- Delétang et al., Language Modeling Is Compression, ICLR 2024
- Holtzman, Buys, Du, Forbes & Choi, The Curious Case of Neural Text Degeneration, ICLR 2020
13. 下一讲预告 · Next lecture
第 3–4 讲的自回归模型有一个共同点:所有变量都是可见的, 可以精确计算,所以最大似然很直接。但它们”没有天然的办法得到特征”(第 3 讲 §6.5)。第 5 讲(原课 Lecture 5,进入 VAEs)引入隐变量 :
- 动机:数据里有大量看不见的变化因素(形状、位置、姿态、光照……),把它们显式地建模成 ;
- 混合高斯与”简单分布的混合 = 复杂分布”(第 2 讲 §6 的延续);
- 边际似然 难算——第 3 讲代码 05 的”逆着顺序的条件”就是一个预演:朴素蒙特卡洛几乎所有样本贡献为零、重要性采样、以及 带来的 Jensen 偏差;
- 证据下界(ELBO):——本讲的 KL 散度在那里扮演主角,而且是反向 KL。
像素世界的真实结构正好是一个隐变量模型(177 个离散的 ),所以下一讲可以把真实的 、后验、ELBO 的差距全都精确地算出来。