对应 Maps to:Stanford CS236 Deep Generative Models(Fall 2023,Stefano Ermon),Lecture 2 · 2023-10-02 · Background(slides:
cs236_lecture2.pdf,标题 Representation,29 页)。 依据说明:本讲按原课 slides 的顺序展开:学习一个生成模型的三个目标 → 离散分布与参数计数 → 独立与条件独立 → 贝叶斯网络 → 生成式 vs 判别式(朴素贝叶斯 vs 逻辑回归)→ 神经模型 → 连续变量。学生网络的 CPT 数字取自 Koller & Friedman《Probabilistic Graphical Models》(原课 slide 12–14 用的是同一个例子)。Ng & Jordan (2002) 的生成–判别对比、像素世界和邮件世界上的全部实验是本讲义补充的。 配套代码 Code:code/lecture02/(PyTorch;2 个模块 + 5 个演示脚本,每个都在 3 秒以内;用到第 1 讲的pixel_world.py、baselines.py、console.py) 预计阅读时间:3 小时(含运行代码)
0. 本讲导航 · How to read this lecture
0.1 学习目标 Learning goals
学完这一讲,你应该能够:
- 数清楚表示一个联合分布需要多少个参数:一个 RGB 像素 个, 个二值像素 个;解释为什么链式法则本身不省参数,而独立和条件独立能带来指数级的节省。
- 写出贝叶斯网络的定义(有向无环图 + 每个节点一张条件概率表),说明为什么 CPT 的乘积一定是合法的分布;会计算联合概率、做祖先采样、读出图蕴含的条件独立,并解释”解释消除”。
- 区分生成式分解 和判别式分解 ;推导出伯努利朴素贝叶斯的决策函数也是线性的,因而它和逻辑回归构成一对”生成–判别对”;说出两者在数据量、模型假设、证据重复、缺失数据上的取舍。
- 解释”用函数代替表格”:逻辑回归和神经网络怎样用远少于 的参数表示一个有 个父节点的条件分布,各自的代价是什么(偏差 vs 方差);这一步是所有深度生成模型的起点。
- 处理连续变量:密度函数、连续变量的链式法则;混合高斯、“均匀 + 高斯”、以及 VAE 的雏形 ——理解”每个条件分布都是高斯,边缘分布却可以是任何形状”。
0.2 先修与本讲范围 Prerequisites & scope
| 默认你已经会 Assumed | 本讲只给直觉,后面几讲再展开 Previewed only |
|---|---|
| 第 1 讲:生成模型 = ;像素世界;判别式 vs 生成式的直觉 | 自回归模型(第 3 讲:本讲 §5 的”神经条件分布”用到每一个像素上) |
| 概率:条件概率、贝叶斯公式、期望、高斯分布 | 最大似然估计为什么是”数数”(第 4 讲) |
| 逻辑回归()的基本概念 | 隐变量模型的学习与推断(第 5–6 讲:本讲 §6.4 只是”VAE 的样子”) |
| d-分离的完整规则(CS228 的内容;本课只用到很简单的图) |
原课把这一讲叫”Background”:它是概率图模型(CS228)和神经网络的速成课。Ermon 在 slide 15 说:“In this class, graphical models will be simple (e.g., only 2 or 3 random vectors).”——本课不需要复杂的图,但需要两样东西:用结构省参数的思路,和用神经网络表示条件分布的思路。
0.3 本讲地图 Map
§1 学习一个生成模型:三个目标;第一个问题是“怎样表示 p(x)”
§2 离散分布与维数灾难:伯努利、类别分布;参数计数;独立、链式法则、条件独立 ← 代码 01
§3 贝叶斯网络:定义;学生网络;条件独立与解释消除;祖先采样;像素世界是一个 BN ← 代码 02
§4 生成式 vs 判别式:朴素贝叶斯与逻辑回归;生成–判别对;学习曲线; ← 代码 03
重复的证据;缺失的特征
§5 神经模型:用函数代替表格;异或;表 vs 逻辑回归 vs 神经网络 ← 代码 04
§6 连续变量:密度与链式法则;混合高斯;均匀 + 高斯;VAE 的雏形 ← 代码 05
§7 2023 年之后
§8–12 小结、常见误区、练习、延伸阅读、下一讲预告
0.4 记号 Notation
| 符号 | 含义 |
|---|---|
| 随机变量 的取值集合,例如 或 | |
| , | 伯努利分布(有偏的硬币)、类别分布(有偏的 面骰子) |
| 给定 时 与 条件独立: | |
| 有向无环图(DAG),每个节点对应一个随机变量 | |
| , | 节点 的父节点集合;父节点的取值 |
| CPT / CPD | 条件概率表 / 条件概率分布 |
| 逻辑(sigmoid)函数 | |
| 条件互信息(bit); |
0.5 关于数字 · About the numbers
讲义里的实验数字全部来自配套代码在作者机器上的实际输出(macOS,PyTorch 单线程 CPU),重复运行逐字节相同。有几处结果和写代码之前的预期不同——最重要的一处:在像素世界上,逻辑回归在每一个训练集大小上都赢了朴素贝叶斯,没有出现教科书式的”小数据时生成式更好”;为了看到那个经典的交叉,又加了一个”邮件世界”。这些情况都记录在 代码 README 的”关于实验结果”里。
1. 学习一个生成模型 · Learning a generative model
原课第 3 页把第 1 讲的目标说得更具体:给定一组训练样本(例如狗的照片),我们想学一个概率分布 ,使得
- 生成:如果采样 , 应该看起来像一只狗;
- 密度估计: 像狗时 高,否则低(可以用来做异常检测);
- 无监督表示学习:学到这些图片的共同点,例如耳朵、尾巴(特征)。
然后 Ermon 提出整门课的第一个问题:怎样表示 ?(第二个问题是怎样学它,那是第 4 讲。)
“表示”听起来像是一个技术细节,其实是生成建模里最根本的取舍。第 1 讲 §5.1 已经说过: 个二值像素的联合分布如果直接列成一张表,需要 个数。本讲要回答的就是:怎样用远少于 的参数,描述一个足够丰富的分布。答案有两条路:
- 结构:假设某些变量之间条件独立——贝叶斯网络(§2–§3);
- 函数形式:假设条件分布是某种带参数的函数——逻辑回归、神经网络(§5)。
深度生成模型主要走第二条路,但第一条路的思维方式(“谁依赖谁”)贯穿全课。
2. 离散分布与维数灾难 · Discrete distributions and the curse of dimensionality
2.1 最基本的两个分布
- 伯努利分布(有偏的硬币):,规定 ,则 。写作 。采样 = 掷一枚有偏的硬币。1 个参数。
- 类别分布(有偏的 面骰子):,规定 ,。写作 。 个参数(最后一个由”和为 1”决定)。
2.2 联合分布:参数个数的爆炸
原课第 5 页:一个像素的颜色由三个离散随机变量组成,红、绿、蓝通道各有 256 种取值。从 采样就随机生成了一个颜色。描述这个联合分布需要多少个参数?——一个像素就要一千六百多万个数。
第 6 页: 个二值像素 (黑或白)可以组成 张不同的图,描述联合分布需要 个参数。代码 01 第 1 部分把这些数列了出来:
| 表示 | 独立参数个数 |
|---|---|
| 一个 RGB 像素 | |
| 4×4 = 16 个二值像素,完整联合表 | |
| 8×8 = 64 个二值像素,完整联合表 | |
| 28×28 = 784 个二值像素(MNIST),完整联合表 | |
| 个像素,假设相互独立 | |
| 个像素,链式法则 + 每个条件一张完整的表 | |
| 个像素,马尔可夫链 | |
| 个像素,贝叶斯网络,每个节点最多 个父节点 |
2.3 独立性:从指数到线性,但太强了
如果 相互独立,
种状态只需要 个数就能描述(每个像素一个”黑的概率”)。原课第 7 页的评价是:独立性假设太强了,模型不太可能有用——从它采样时每个像素独立地选颜色,得到的是一张噪声图。第 1 讲的代码 02 已经看到了:“独立像素”模型的样本是”撒胡椒面”,测试 bits 比真实分布多 10 bit。
2.4 两个基本规则
原课第 8 页列出了整门课反复使用的两条规则:
- 链式法则:;
- 贝叶斯公式:。
2.5 链式法则不省参数,条件独立才省
用链式法则写出 个像素的联合分布:
如果每个条件分布都用一张完整的表表示,需要多少参数?代码 01 第 2 部分逐项数了 的情形:
| 因子 | 父节点取值组合 | 参数 |
|---|---|---|
| 1 种 | 1 | |
| 2 种 | 2 | |
| 4 种 | 4 | |
| 8 种 | 8 | |
| 合计 |
一般地是 ——和完整的联合表一样多。原课第 9 页的原话:” is still exponential, chain rule does not buy us anything.” 这一点很重要:链式法则对任何分布都成立,不需要任何假设;正因为如此,它也没有省下任何东西。
省参数要靠额外的假设。假设 (“下一个像素只依赖上一个像素”,即马尔可夫链),链式法则里的每个因子都被简化:
参数个数变成 。指数级的节省!
这里的思维方式值得记住:先用链式法则写出一个总是正确的分解,再根据对问题的理解,把每个条件分布里”不重要的”条件变量删掉。 删掉哪些,就是在做建模假设。
2.6 实验:在像素世界里比较这些表示
数参数只是一半;另一半是:这些表示在数据上到底表现怎样?代码 01 在像素世界里真的训练了它们(每个条件分布用”数数 + 拉普拉斯平滑”估计,第 4 讲会说明这就是最大似然)。
4×4 小块。 只看图中央的 16 个像素(65,536 种状态)——小到可以列完整的联合表。真实的分布 由像素世界把其余 48 个像素精确地边缘化掉得到(9.187 bit / 小块)。表中是测试集上比真实分布多用的 bit 数:
| 表示 | N=100 | N=1,000 | N=10,000 | N=100,000 | 参数个数 |
|---|---|---|---|---|---|
| 完整联合表(查表 + 1% 均匀) | 7.784 | 3.050 | 0.770 | 0.153 | 65,535 |
| 链式法则 + 每个条件一张完整的表 | 2.789 | 1.214 | 0.412 | 0.103 | 65,535 |
| 独立像素 | 1.958 | 1.875 | 1.873 | 1.872 | 16 |
| 马尔可夫链(光栅顺序) | 1.497 | 1.335 | 1.324 | 1.322 | 31 |
| 贝叶斯网络:左 + 上 | 1.155 | 0.872 | 0.851 | 0.847 | 49 |
| 贝叶斯网络:左 + 左上 + 上 + 右上 | 1.236 | 0.705 | 0.643 | 0.633 | 139 |
这张表浓缩了”表示”这个问题的全部张力:
- 完整的表没有任何假设,所以只要数据足够多,它最终最好( 时只差 0.15 bit)。但它需要海量数据: 时差 7.8 bit。16 个像素已经要十万张图;64 个像素( 格)就完全没希望了。
- 参数个数相同,平滑方式也很重要。“链式法则 + 完整的表”和”完整联合表”参数一样多(都是 ),只是”没见过的情况分多少概率”的方式不同:前者在每个条件分布里各加伪计数,小数据时好得多(2.79 vs 7.78)。
- 独立像素不随数据变好(停在 1.87 bit):假设错了,数据再多也没用。
- 马尔可夫链只看”前一个像素”,而光栅顺序里”前一个”只是左边的邻居——竖线上下相连的信息它看不到。
- 局部贝叶斯网络用几十个参数,小数据时最好( 时”左 + 上”只差 1.16 bit);数据多了以后被完整的表超过:条件独立只是近似成立(一条横线的第 4 个像素不只取决于它左边和上边的邻居)。
这是第 4 讲偏差–方差取舍的第一个例子:假设越强(参数越少),需要的数据越少,但可能永远到不了真实分布(偏差);假设越弱(参数越多),最终能到达真实分布,但小数据时估计得很差(方差)。
整张 8×8 图。 完整的表不可能了,只剩带结构的表示(真实熵 25.58 bit / 图):
| 贝叶斯网络(父节点) | N=1,000 | N=10,000 | N=100,000 | 参数个数 |
|---|---|---|---|---|
| 独立像素 | 9.98 | 9.94 | 9.94 | 64 |
| 马尔可夫链(光栅顺序) | 7.82 | 7.75 | 7.75 | 127 |
| 左 + 上 | 6.06 | 5.94 | 5.93 | 225 |
| 左 + 左上 + 上 + 右上 | 5.57 | 5.20 | 5.15 | 771 |
| 左 2 + 上 2 + 两个对角 | 4.47 | 3.62 | 3.47 | 2,575 |
父节点越多、越”对路”,误差越小。样本最能说明问题(五个模型用同一串随机数采样,所以同一位置的样本彼此相像,差别完全来自条件分布):马尔可夫链的样本是一段段横向的”笔画”;加上”上边”这个父节点,竖线也连起来了;六邻居的网络已经能画出一些小方框,但也会画出世界里没有的东西——6 个像素长的横线(真实的横线只有 4 个像素)、方框旁边粘着一段线。要知道”这条线已经画了 4 个像素、该停了”,每个像素得看见左边 4 个像素;要画出完整的形状,需要看到更远的上下文。“局部看起来对”不等于”整体是一个形状”。
可是父节点每多一个,CPT 就大一倍:六邻居已经 2,575 个参数,再加下去很快就重新爆炸。第 3 讲的办法是:让每个像素以前面所有像素为父节点,但不用表,改用函数(§5)。
3. 贝叶斯网络 · Bayesian networks
3.1 条件参数化代替联合参数化
原课第 10 页的核心想法:用条件参数化(conditional parameterization)代替联合参数化(joint parameterization)。 对每个随机变量 ,指定一个条件分布 ,其中 是一小组变量;然后把联合分布定义为
但不是随便选 都行:乘出来必须是一个合法的概率分布。保证合法的条件是:它必须对应某个链式法则分解,只是因子被条件独立假设简化了。——这就引出了”有向无环图”。
3.2 定义
原课第 11 页:一个贝叶斯网络由一个有向无环图(directed acyclic graph, DAG) 给出,其中
- 每个随机变量 对应一个节点 ;
- 每个节点有一个条件概率分布(CPD),给出这个变量在父节点各种取值下的概率。
图 叫做贝叶斯网络的结构。它定义的联合分布是
为什么一定合法? 因为 DAG 没有环,所以一定存在一个拓扑顺序(每个节点都排在它的父节点后面)。按这个顺序写链式法则, 里的条件变量一定包含 ;贝叶斯网络假设”只有父节点重要”,把其余的删掉。所以上面的乘积就是一个”被简化的链式法则”,自然是合法的分布。(另一种看法:按拓扑顺序从最后一个变量开始,依次对它求和,每次求和都等于 1,见练习 2。)
参数是经济的:每张 CPT 的大小对 是指数级的,对 不是。
3.3 例子:学生网络
原课第 12–14 页的例子(Koller & Friedman 的经典例子):
难度 D 智力 I
\ / \
↘ ↙ ↘
成绩 G SAT 分数 S
|
↓
推荐信 L
联合分布按图分解为
代码 02 用了教科书里的 CPT 数字(例如 ,,聪明的学生在容易的课上得 A 的概率 0.9)。几个要点:
- 算任意一个完整赋值的概率,只要把 5 个 CPT 条目乘起来:。整张 48 格的联合表之和恰好是 1。
- 参数:15 vs 47。 CPT 的独立参数是 个;不加结构的联合表需要 个。变量一多,这个差距是指数级的。
3.4 图蕴含的条件独立
原课第 14 页:按链式法则,任何分布都可以写成
和贝叶斯网络的分解比较,我们额外假设了:;;。图结构蕴含了条件独立。
代码 02 第 3 部分用条件互信息把它们精确地验证了一遍(等于 0 ⇔ 条件独立):
| 关系 | 图里 | 条件互信息 (bit) |
|---|---|---|
| 蕴含 | 0.000000 | |
| 蕴含 | 0.000000 | |
| 蕴含 | 0.000000 | |
| 蕴含 | 0.000000 | |
| 与 ,给定 | 不蕴含 | 0.040264 |
| 与 ,给定 | 不蕴含 | 0.009015 |
| 与 | 不蕴含(经过 相连) | 0.115909 |
| 与 | 不蕴含(经过 相连) | 0.090672 |
最有意思的是第五行:难度和智力本来独立,可一旦知道了成绩,它们就相关了。 具体数字:
| 查询 | 概率 |
|---|---|
| 0.300 | |
| 0.079 | |
| 0.109 | |
| 0.400 | |
| 0.629 | |
| 0.870 | |
| 0.140 | |
| 0.723 |
成绩是 C,学生聪明的可能性从 0.3 跌到 0.079;但如果再告诉你这门课很难,“成绩差”就被难度”解释”掉了一部分,聪明的可能性回升到 0.109。反过来,聪明的学生拿了 C,课程很难的概率高达 0.870。这叫解释消除(explaining away): 是一个”汇连”(v-结构),观察汇点(或它的后代 )会让原本独立的两个父节点相关。最后两行展示了证据怎样沿着图传播:推荐信弱让人怀疑学生不聪明(0.140),可 SAT 分数高这个更直接的证据又把它拉回 0.723。
两点提醒:
- 图只告诉我们哪些独立”一定成立”;没有画出的独立,在具体的 CPT 下一般不成立(表里那些非零的数)。
- 判断任意一条条件独立是否被图蕴含的完整规则叫 d-分离,是 CS228 的内容。本课的图都很简单(两三个随机向量),用不到它。
3.5 祖先采样
原课 slide 15 的总结里有一句:“Can sample from the joint by sampling from the CPDs according to the DAG ordering.” 这就是祖先采样(ancestral sampling):按拓扑顺序,先抽没有父节点的变量(、),再根据已经抽到的父节点取值抽 、,最后抽 。每个变量只需要”查表 + 掷一次骰子”,不需要算整张联合表。代码 02 第 2 部分抽了 20 万个样本,48 种赋值的频率和精确联合概率的最大误差是 0.0017(每一格频率的标准差最多 0.0011,48 格里最大的误差是它的 2–3 倍,属于正常的随机波动)。
第 1 讲的图形引擎(先 、再 )就是祖先采样;第 3 讲的自回归模型(逐个像素)也是。
3.6 像素世界也是一个贝叶斯网络
第 1 讲的像素世界可以画成一个贝叶斯网络:(配置)(像素)。每个像素只有一个父节点 ——这是”朴素贝叶斯式”的结构。代码 02 第 4 部分算了像素 (3,3) 和其他像素的互信息:
| 另一个像素 | ||
|---|---|---|
| (3,4) 右边紧挨着 | 0.0415 | 0 |
| (4,3) 下面紧挨着 | 0.0307 | 0 |
| (4,4) 右下对角 | 0.0000 | 0 |
| (3,6) 同一行、隔 2 个 | 0.0012 | 0 |
| (6,3) 同一列、隔 2 个 | 0.0004 | 0 |
| (7,7) 右下角 | 0.0007 | 0 |
| (0,0) 左上角 | 0.0000 | 0 |
- 给定 ,任意两个像素都条件独立(第三列全是 0)。第 1 讲里缺失像素能”直接从乘积里拿掉”,就是因为这个条件独立。
- 不给定 ,邻近的像素相关,远处的像素几乎无关:“同一个形状的笔画”把它们连在一起;右边紧挨着的像素比下面紧挨着的更相关,因为横线比竖线常见。
- 互信息的绝对值都不大(每个像素大多是白的,本身的熵只有零点几 bit),但 64 个像素的全部相关性合起来——总相关 bit——恰好就是独立像素模型在数据无限多时比真实分布多付的 bit 数(§2.6 的约 10 bit)。
这揭示了隐变量的作用:一个隐变量 就能产生所有这些复杂的相关性,而且在给定 时一切都变简单了。这是第 5 讲(隐变量模型)的出发点。
3.7 小结(原课 slide 15)
- 贝叶斯网络由 给出, 是一组定义在 的节点上的局部条件概率分布;
- 用图结构高效地表示分布;
- 任意赋值的概率 = CPD 的乘积;
- 按 DAG 的顺序从 CPD 采样,就得到联合分布的样本;
- 从图的性质可以读出一些条件独立。
4. 生成式 vs 判别式 · Generative vs discriminative
4.1 朴素贝叶斯:一个生成式分类器
原课第 16–17 页:把邮件分成垃圾邮件()和正常邮件()。用 给词表里的单词编号, 表示第 个单词出现在邮件里。邮件按某个分布 生成。朴素贝叶斯假设给定 时单词条件独立:
从训练数据估计参数(数数),用贝叶斯公式预测:
“这些独立性假设合理吗?“原课的回答是一句名言:“Nearly all probabilistic models are ‘wrong’, but many are nonetheless useful.”(几乎所有概率模型都是”错的”,但其中很多仍然有用。)
4.2 两种分解
原课第 18 页:链式法则给出两种写法,
对应两个贝叶斯网络:(生成式)和 (判别式)。如果我们只需要 来做预测:
- 生成式模型要指定 / 学习 和 ,再用贝叶斯公式算出 ;
- 判别式模型只要估计条件分布 。我们永远不需要建模、学习或使用 ! 所以叫”判别式”模型:它只在给定 时用来判别 的标签。
第 19 页进一步说: 是一个随机向量,所以两种分解展开以后是
两边各要做一个选择:生成式模型里 很简单,但 怎样参数化?(朴素贝叶斯的回答:假设 。)判别式模型里 怎样参数化?(逻辑回归的回答见下一节;前面那一长串 根本不用管,因为 总是给定的。)
4.3 逻辑回归
原课第 21–22 页:判别式模型假设 ,这不再是一张表,而是 的一个带参数的函数(回归)。它必须在 0 和 1 之间,以某种简单而合理的方式依赖 ,由一个 维的参数向量 完全确定(紧凑的表示)。线性依赖:令 ,
性质:决策边界 关于 是线性的;等概率线是直线。
4.4 朴素贝叶斯也是线性的:生成–判别对
把朴素贝叶斯的对数联合概率展开(伯努利特征,):
所以 ——和(多类)逻辑回归一模一样的形式。代码 03 第 1 部分在像素世界上验证:按定义算出的朴素贝叶斯后验和 的最大差是 。
这意味着朴素贝叶斯和逻辑回归是同一个模型族,区别只在于怎样选参数:
- 朴素贝叶斯最大化联合似然 ——每个参数可以单独”数数”,有闭式解;
- 逻辑回归最大化条件似然 ——参数直接为分类服务,要用梯度优化。
Ng & Jordan (2002) 把这样一对模型叫做”生成–判别对”(generative–discriminative pair),并分析了它们的取舍。
4.5 学习曲线:谁需要的数据更少?
Ng & Jordan 的结论是:生成式的朴素贝叶斯更快地接近它的渐近误差(需要的样本数随特征数对数增长),判别式的逻辑回归渐近误差更低(需要的样本数随特征数线性增长)。所以经常出现”小数据时朴素贝叶斯好、大数据时逻辑回归好”的交叉。代码 03 第 2 部分在三个世界里画了学习曲线(每个 重复 5 次取平均):
(a) 像素世界,4 分类(朴素贝叶斯的”像素条件独立”假设错得很厉害):
| N | 朴素贝叶斯 准确率 | 逻辑回归 准确率 | 朴素贝叶斯 log loss | 逻辑回归 log loss |
|---|---|---|---|---|
| 8 | 0.251 | 0.265 | 7.682 | 4.255 |
| 20 | 0.315 | 0.332 | 5.304 | 2.783 |
| 100 | 0.425 | 0.459 | 2.356 | 1.955 |
| 1000 | 0.506 | 0.553 | 1.608 | 1.467 |
| 10000 | 0.515 | 0.566 | 1.480 | 1.428 |
(贝叶斯最优:准确率 0.984、log loss 0.081;只按 猜:0.300、1.971。)
(b) 邮件世界,朴素贝叶斯的假设完全正确(数据就是按”给定 单词独立”生成的):
| N | 朴素贝叶斯 准确率 | 逻辑回归 准确率 |
|---|---|---|
| 10 | 0.720 | 0.698 |
| 50 | 0.826 | 0.807 |
| 300 | 0.867 | 0.859 |
| 3000 | 0.878 | 0.877 |
(c) 邮件世界 + “bank”的 3 个拷贝(假设轻微地错):
| N | 朴素贝叶斯 准确率 | 逻辑回归 准确率 |
|---|---|---|
| 10 | 0.704 | 0.630 |
| 50 | 0.802 | 0.786 |
| 100 | 0.827 | 0.830 |
| 300 | 0.823 | 0.860 |
| 3000 | 0.825 | 0.877 |
三个世界给出了三种结果,合起来正是 Ng & Jordan 的完整图景:
- 假设完全正确时(b),朴素贝叶斯在小数据时更好,数据多了两者收敛到同一水平——它本来就是正确的模型,只是参数是”数”出来的,估计得更快。
- 假设轻微地错时(c),出现了经典的交叉: 时朴素贝叶斯更好, 时逻辑回归反超,之后差距拉大。
- 假设错得很厉害时(a),逻辑回归在每一个 上都赢。“学得快”的优势还没体现出来,就被”学错了”抵消了。而且朴素贝叶斯在小数据时的 log loss 极差( 时 7.7 bit):64 个相关的像素证据被当作独立证据相乘,概率被推向 0 或 1。(两者在像素世界上都只有约 0.5 的准确率——线性分类器本身就不适合位置不固定的形状,这是 §5 要解决的问题。)
结论:“生成式更省数据”不是定律,而是”生成式假设对不对”和”数据有多少”之间的取舍。
4.6 判别式模型的强大之处:重复的证据
原课第 23 页:逻辑回归不像朴素贝叶斯那样假设 ,这在很多应用里差别很大。例如垃圾邮件分类中,令 ,。无论是不是垃圾邮件,它们总是一起出现,即 。朴素贝叶斯学到 ,于是把证据算了两遍;逻辑回归则不会。
代码 03 第 3 部分在邮件世界里给”bank”加了 个完全相同的拷贝( 训练,5000 测试):
| bank 的拷贝数 | 朴素贝叶斯 准确率 | log loss | bank 总权重 | 逻辑回归 准确率 | log loss | bank 总权重 |
|---|---|---|---|---|---|---|
| 0 | 0.873 | 0.423 | 2.30 | 0.877 | 0.441 | 1.72 |
| 1 | 0.862 | 0.486 | 4.60 | 0.877 | 0.440 | 1.91 |
| 3 | 0.817 | 0.850 | 9.19 | 0.876 | 0.439 | 2.02 |
| 10 | 0.748 | 2.852 | 25.28 | 0.876 | 0.439 | 2.10 |
(“bank 总权重”= 出现 bank 让垃圾邮件的 log-odds 增加多少。)
朴素贝叶斯的 bank 总权重按 倍增长(2.30 → 4.60 → 9.19 → 25.28):一封含 bank 的正常邮件会被极其自信地判成垃圾邮件,log loss 从 0.42 恶化到 2.85,准确率也从 0.873 跌到 0.748。逻辑回归的总权重几乎不变(1.72 → 2.10),准确率和 log loss 纹丝不动:它把同一份证据分摊到 个拷贝上。
(slide 23 说逻辑回归会把 或 设成 0。严格地说,没有正则化时 确定、但怎样分摊是不确定的;代码里加了 L2 正则化,所以权重被平均分摊。结论一样:证据只算一次。)
4.7 生成式模型仍然有用:缺失数据
原课第 24 页:只有当 总是被完整观测时,条件模型才可用。 当某些 没被观测到时,生成式模型可以把它们边缘化掉,算出 。代码 03 第 4 部分在邮件世界里随机隐藏一半单词:
| 情形 | 朴素贝叶斯 | 逻辑回归 |
|---|---|---|
| 什么都不缺 | 0.879 | 0.876 |
| 一半缺失:朴素贝叶斯边缘化 / 逻辑回归填 0 | 0.798 | 0.773 |
| 一半缺失:逻辑回归填训练集平均值 | 0.794 |
生成式模型的边缘化是精确的:。判别式模型在训练时从没见过”缺了一半”的输入,只能先填空。这和第 1 讲 §3.3 在像素世界上的发现一致。
5. 神经模型:用函数代替表格 · Neural models
5.1 从线性到非线性
原课第 25–26 页:判别式模型假设 。线性依赖 可能太简单了。非线性依赖:令 是输入的一个非线性变换(特征),
更灵活,参数也更多()。重复几次就得到一个神经网络。
5.2 异或:线性模型表示不了的东西
代码 04 第 1 部分的例子: 如果 ,否则 0.1(“异或”)。2000 个样本,三种表示:
| 父节点取值 | 真实 | 表(4 格) | 逻辑回归(3 个参数) | 神经网络(2 层 × 16) |
|---|---|---|---|---|
| 0.10 | 0.118 | 0.517 | 0.132 | |
| 0.90 | 0.913 | 0.523 | 0.911 | |
| 0.90 | 0.874 | 0.474 | 0.882 | |
| 0.10 | 0.098 | 0.479 | 0.094 |
表能表示任何条件分布;逻辑回归只能表示”随 单调变化”的关系,对四种情况都只能说 0.5 左右;加一层非线性特征,神经网络就能表示异或。
5.3 12 个父节点:表 vs 逻辑回归 vs 神经网络
只有 2 个父节点时表最简单。父节点一多呢?代码 04 第 2 部分让 依赖 12 个二值父节点(真实的 logit 含一个异或项、一个”与”项和若干线性项),真实的条件熵 bit 可以对 4096 种 精确算出。表中是测试集上比真实条件熵多用的 bit 数:
| 条件分布的表示 | N=100 | N=1,000 | N=10,000 | N=100,000 | 参数个数 |
|---|---|---|---|---|---|
| 表 | 0.356 | 0.329 | 0.179 | 0.032 | 4,096 |
| 逻辑回归 | 0.372 | 0.277 | 0.267 | 0.267 | 13 |
| 神经网络(几乎不加正则) | 2.454 | 1.112 | 0.024 | 0.012 | 1,538 |
| 神经网络 + L2 正则 0.01 | 0.665 | 0.050 | 0.023 | 0.019 | 1,538 |
| (训练集覆盖了表的几成格子) | 2% | 22% | 91% | 100% |
- 表是”没有偏差、方差巨大”的极端: 时只覆盖了 2% 的格子,没见过的一律猜 0.5; 时每格都见过几十次,误差才降到 0.032。
- 逻辑回归是”没有方差、偏差巨大”的另一个极端:学得最快,但很快停在 0.267——它表示不了异或和”与”。
- 神经网络在中间,但它的表现强烈依赖于正则化:几乎不加正则时,它在小数据上是最差的( 时 2.45 bit, 时 1.11 bit)——1538 个参数、训练 1500 步,把训练集背了下来,在没见过的输入上过度自信。加上 L2 正则(权重衰减 0.01)后, 时只差 0.050 bit,是所有方法中最好的。数据足够多时两者一样好。
这个实验预告了第 4 讲的主题:灵活的模型族需要数据或正则化来约束。 它也预告了第 3 讲: 有 个父节点,用表需要 格( 时是 ),用逻辑回归就是 FVSBN,用神经网络就是 NADE、MADE、PixelCNN、Transformer。
5.4 贝叶斯网络 vs 神经模型
原课第 27 页把三种做法并排放在一起(以 4 个变量为例):
- 链式法则:完全一般,不需要任何假设(指数大小,没有免费的午餐);
- 贝叶斯网络:假设条件独立,条件分布用表表示;
- 神经模型:假设条件分布的特定函数形式。“足够深的神经网络可以逼近任何函数”,所以这个假设比条件独立温和得多。
深度生成模型几乎都选择第三条路。第 3 讲的自回归模型就是”链式法则 + 每个条件分布一个神经网络”。
6. 连续变量 · Continuous variables
6.1 密度函数与链式法则
原课第 28 页:如果 是连续随机变量,通常用它的概率密度函数 来表示。这个函数没法再列成一张表,通常考虑带参数的密度:
- 高斯:,;
- 均匀:,;
- 多元高斯:。
链式法则、贝叶斯公式等照样成立,例如 。代码 05 第 1 部分在一个二维高斯(,,相关系数 )上逐点核对: 和 在 81×81 的网格上最大差 。条件分布 仍是高斯:均值随 线性变化(斜率 ),标准差缩小为 ——知道了 ,对 的不确定性变小了。
所以贝叶斯网络照样可以有连续节点(以及连续、离散混合的节点)。原课第 29 页给了三个 的例子,代码 05 把它们都实现了。
6.2 两个高斯的混合
参数是 。代码里取 ,,,,。5 万个祖先采样的直方图和 的理论比例一致:一个窄而高的峰在 ,一个宽而矮的峰在 。后验 回答”这个点来自哪个成分”——就是聚类:
| −2.0 | 0.5588 | 0.000 |
| −1.0 | 0.0808 | 0.065 |
| −0.5 | 0.0224 | 0.723 |
| 0.0 | 0.0390 | 0.995 |
| 1.5 | 0.1197 | 1.000 |
后验从接近 0 迅速变到接近 1:“软”分配只发生在两峰之间一个窄窄的过渡区里。5 个参数表示了一个双峰的分布:简单分布的混合可以很复杂。第 5 讲会用 EM 算法从数据学习这些参数。
6.3 均匀 + 高斯:一个连续的隐变量
参数是 。边缘分布是一个积分 ,这里恰好有闭式解 ( 是标准正态的累积分布函数)。代码 05 第 3 部分(,,)的直方图和闭式解一致:一个平台,两边是被噪声抹平的边缘。它可以看成”无穷多个高斯的混合”。一般情况下这种积分算不出来——这就是第 5 讲的核心难题。
6.4 变分自编码器的雏形
其中 和 是参数分别为 、 的神经网络。原课第 29 页特别提醒:“Even if are very deep (flexible), functional form is still Gaussian.”(即使 、 非常深,条件分布的函数形式仍然是高斯。)
代码 05 第 4 部分用两个手工指定权重的小网络演示了这句话的另一面:
| −2.0 | −1.5 | −1.0 | −0.5 | 0.0 | 0.5 | 1.0 | 1.5 | 2.0 | |
|---|---|---|---|---|---|---|---|---|---|
| −0.50 | −0.48 | −0.15 | 1.46 | 0.00 | −1.46 | 0.15 | 0.48 | 0.50 | |
| 0.67 | 0.40 | 0.27 | 0.22 | 0.20 | 0.22 | 0.27 | 0.40 | 0.67 |
- 每一个条件分布 都是高斯,但边缘分布 有三个峰(在 、、 附近;直方图和数值积分一致)——它是”无穷多个高斯的混合”,可以是多峰的、偏斜的,完全不像高斯。条件分布形式简单,边缘分布却可以非常灵活:这正是隐变量模型的威力。
- 后验 可以有好几个峰:在 网格上精确计算,、、 的后验各有 3 个峰。 不是单调的,同一个 可以由好几个不同的 生成。真实的 VAE 里 有几十上百维,这个后验既算不出来、形状又复杂——第 5–6 讲用变分推断去近似它。
- 二维版本:同一个一维的 ,解码成二维的 ,样本集中在一条弯曲的曲线附近。一维的隐变量经过解码器,变成了二维空间里的一维”流形”。真实图像也被认为集中在高维像素空间里的低维流形附近(第 13 讲的”流形假设”)。
7. 2023 年之后 · Since 2023
本讲是背景课,内容本身不会过时;但它的两个核心思想在 2023 年之后的模型里有一些值得一提的新形态:
- “链式法则 + 神经条件分布”成了最成功的生成模型配方。 大语言模型就是 §5.4 第三行的样子:,每个条件分布由同一个 Transformer 给出。第 3 讲细讲。
- 条件独立假设以新的面目回来了。 掩码扩散语言模型(MDLM、LLaDA 等,第 18 讲)为了加速,在一步里并行地生成多个 token,并假设”给定当前的上下文,这几个 token 相互独立”——这和朴素贝叶斯是同一种假设。当被同时生成的 token 强相关时(例如一个短语的前后两个词),这个假设就会出错,生成不连贯的组合;“每步并行生成多少个 token”因此成了质量与速度的取舍。§4.6 “把相关的证据当独立”的问题,在这里变成了”把相关的 token 当独立”。
- 生成式分类器的复兴。 用一个训练好的条件生成模型 加贝叶斯公式做分类,又成了研究话题:例如用文生图扩散模型做零样本分类(Li et al., Your Diffusion Model is Secretly a Zero-Shot Classifier, ICCV 2023),以及用语言模型给候选答案打分。§4 的生成–判别取舍(生成式模型对分布外的输入更”诚实”、能处理缺失信息,但更难训练)仍然适用。
8. 小结 · Summary
- 表示是第一个问题。 个二值变量的联合分布需要 个参数;独立性降到 (太强);链式法则本身不省参数;省参数要靠额外的假设——条件独立(贝叶斯网络)或函数形式(神经网络)。
- 贝叶斯网络 = 有向无环图 + 每个节点一张 CPT,。它一定是合法的分布(被简化的链式法则);参数对父节点个数指数级、对变量个数线性;任意赋值的概率是 CPT 的乘积;按拓扑顺序祖先采样;图蕴含条件独立,汇连结构会产生”解释消除”。
- 像素世界是一个朴素贝叶斯式的网络 :给定 像素独立,不给定 像素相关;全部相关性合起来(总相关 9.99 bit)正是独立像素模型的误差。一个隐变量就能产生复杂的相关性。
- 生成式 vs 判别式: vs 。伯努利朴素贝叶斯的决策函数也是线性的,和逻辑回归构成生成–判别对,区别只在拟合准则(联合似然 vs 条件似然)。生成式在假设正确时更省数据;假设轻微地错时出现交叉;假设错得厉害时判别式处处更好。朴素贝叶斯会重复计算相关的证据;生成式模型能精确地边缘化缺失的变量。
- 神经模型用函数代替表格:逻辑回归(偏差大、方差小)、表(偏差小、方差大)、神经网络(灵活,但需要数据或正则化)。“链式法则 + 神经条件分布”就是第 3 讲的自回归模型。
- 连续变量用带参数的密度表示,链式法则照样成立。混合高斯、“均匀 + 高斯”、VAE 雏形都是 的贝叶斯网络:条件分布形式简单(高斯),边缘分布却可以非常复杂;代价是边缘似然和后验都需要积分,一般算不出来(第 5–6 讲)。
9. 常见误区 · Common pitfalls
- “用链式法则分解以后,模型就变简单了。” 链式法则对任何分布都成立,它本身不省任何参数;最后一个因子 就有 个参数。省参数的永远是额外的假设。
- “贝叶斯网络的箭头表示因果关系。” 箭头表示的是分解方式和条件独立结构。同一个分布可以用不同方向的图表示(例如 和 都能表示任何二元联合分布);把箭头解释成因果需要额外的假设(因果推断的内容)。
- “两个变量独立,那么知道第三个变量以后它们仍然独立。” 解释消除就是反例:难度和智力独立,但给定成绩以后相关。反过来,相关的变量给定第三个变量后也可以变得独立(像素在给定 时独立)。
- “朴素贝叶斯的假设是错的,所以它一定比逻辑回归差。” 在小数据时,一个”错但简单”的模型常常更好(邮件世界 (c) 中 时)。不过也不要走向另一个极端:假设错得厉害时(像素世界),它可能处处更差。
- “朴素贝叶斯和逻辑回归是两种不同形式的分类器。” 对伯努利特征,它们的决策函数是同一种形式(softmax 线性函数),区别只在怎样选参数。
- “神经网络越灵活越好。” 没有足够的数据或正则化,灵活的模型在小数据上可能是最差的(代码 04: 时 2.45 bit,比表和逻辑回归都差得多)。
- “条件分布是高斯,所以整个模型是高斯的。” VAE 的 是高斯,但 可以是多峰的、任意形状的。
- “逻辑回归会把重复特征中的一个权重设为 0。” 没有正则化时,重复特征的权重只有总和是确定的,怎样分摊是不确定的;加 L2 正则时权重被平均分摊。无论哪种情况,证据只被算一次。
10. 练习 · Exercises
练习 1(参数计数) (a) 验证学生网络的独立参数是 15 个、完整联合表是 47 个。 (b) 如果把成绩 改成 5 个等级(A–E),两个数字分别变成多少? (c) 一个 8×8 的像素网络,每个像素以”左 + 上”两个邻居为父节点(边界上的像素父节点更少)。有多少个参数?和代码 01 的 225 核对。
参考答案
(a) :1;:1;:父节点 有 4 种组合,每行 个参数,共 8;:2 行 × 1 = 2;:3 行 × 1 = 3。合计 15。联合表:。
(b) :;:5 行 × 1 = 5;合计 。联合表:。
(c) 左上角像素没有父节点:;第一行其余 7 个像素只有左邻居:;第一列其余 7 个只有上邻居:;其余 49 个有两个父节点:。合计 。(PixelBN.n_params 数的是”每种父节点取值下 的个数” ,对二值变量就是独立参数的个数。)
练习 2(贝叶斯网络一定是合法分布) 证明学生网络的乘积 对所有 48 种赋值求和等于 1。提示:按拓扑顺序的逆序依次求和。
参考答案
先对 求和:(CPT 的每一行和为 1),乘积里的这一项消失。再对 求和:。再对 :。最后 ,。每次求和的变量都是”没有其他因子依赖它”的叶子——这正是按拓扑逆序的意义;如果图里有环,就找不到这样的叶子,证明也就失败了。
练习 3(解释消除) 用学生网络的 CPT 手算 和 。然后用贝叶斯公式算 ,和代码 02 的 0.079 核对。
参考答案
;。 。
练习 4(朴素贝叶斯是线性的) 对二分类、伯努利特征的朴素贝叶斯,推导 ,写出 和 的表达式。如果把第 1 个特征复制 份, 怎样变化?
参考答案
。 所以 ,。 复制 份后,每个拷贝的 和原特征一样,所以每个拷贝的 也一样,“出现这个特征”对 log-odds 的总贡献变成 ——代码 03 第 3 部分的 2.30 → 4.60 → 9.19 → 25.28( 时是 )。
练习 5(马尔可夫链的方向) 代码 01 里光栅顺序的马尔可夫链(每个像素的父节点是前一个像素)比”左 + 上”差了约 1.8 bit。(a) 解释为什么它学不到竖线。(b) 如果改用”列优先”的顺序(先走完第一列,再走第二列),马尔可夫链会学会什么、学不会什么?(c) 能不能只用一个父节点,同时捕捉横向和纵向的笔画?
参考答案
(a) 光栅顺序里像素 的”前一个”是它左边的邻居(行首的像素的”前一个”是上一行的最后一个像素,几乎无关)。竖线的笔画是上下相连的,而上方的邻居在光栅顺序里隔了 8 个位置,不是父节点。
(b) 列优先时”前一个”是上方的邻居:它会学会竖线,学不会横线。由于横线(30%)比竖线(20%)常见,预计列优先的马尔可夫链会比光栅顺序差一些。可以把 01_representations.py 第 4 部分的父节点改成 [[i - 8] if i >= 8 else [] for i in range(64)] 试一试(这等价于”只有上方邻居”)。
(c) 不能:一个二值父节点只能携带 1 bit 信息,无法同时告诉你”左边亮”和”上边亮”。要么增加父节点(CPT 变大),要么用隐变量(例如”这一笔是横还是竖”)——后者就是像素世界真实的结构。
练习 6(混合高斯的后验) 对 §6.2 的混合高斯,写出 的表达式。在哪个 处后验恰好等于 0.5?(列出方程即可,可以数值求解。)
参考答案
。后验等于 0.5 ⇔ 。取对数:,是关于 的二次方程,在 之间有一个根(约 ,与表中 时 0.065、 时 0.723 一致);因为两个方差不同,二次方程在左边远处还有另一个根(约 ):方差大的成分在远处”尾巴更重”,后验又会翻回去。
练习 7(均匀 + 高斯的边缘密度) 推导 §6.3 的闭式解 。当 时它变成什么?当 时呢?
参考答案
,再用 化成题目中的形式。 时退化为 的密度; 时近似为以 为中心、标准差约 的高斯(均匀分布的宽度可以忽略)。
练习 8(动手:给马尔可夫链”换方向”)
按练习 5 (b) 的提示修改 01_representations.py 第 4 部分的父节点,加一行”只有上方邻居”和一行”上方邻居 + 上方第二个邻居”。运行之前先预测它们和”马尔可夫链(光栅顺序)“的排序,运行后核对。
参考答案(预测的思路)
“只有上方邻居”捕捉竖向的笔画(竖线和方框的左右两边),丢掉横向的;“光栅顺序”相反。横向笔画更多(横线 30%,方框的上下边),所以预计”只有上方邻居”略差于光栅马尔可夫链。“上方两个邻居”能多知道”这条竖线已经画了几个像素”,会比”只有上方邻居”好,但仍然看不到横向的结构。具体数字以你的运行为准。
练习 9(思考:判别式模型的”生成”版本) 原课第 1 讲说”判别式模型是一个非常简单的条件生成模型”。用本讲 §4.2 的两种分解解释:判别式模型和生成式模型都表示了联合分布 吗?如果判别式模型也想回答”缺失特征时的 “,它还缺什么?
参考答案
判别式分解 原则上也表示了联合分布,但判别式模型只学了 , 那部分根本没建模(“我们永远不需要建模 ”)。要回答 ,它还需要 ——也就是 的生成模型。所以”处理缺失数据”本质上要求对 建模。
11. 延伸阅读 · Further reading
原课材料
- CS236 Fall 2023 Lecture 2 slides:https://deepgenerativemodels.github.io/assets/slides/cs236_lecture2.pdf
- CS236 课程笔记 Autoregressive Models 的开头(链式法则与参数计数):https://deepgenerativemodels.github.io/notes/autoregressive/
概率图模型
- Koller & Friedman, Probabilistic Graphical Models: Principles and Techniques(MIT Press, 2009),第 3 章(贝叶斯网络表示;学生网络的出处)
- Stanford CS228 课程笔记(Probabilistic Graphical Models):https://ermongroup.github.io/cs228-notes/——Ermon 组维护,“Bayesian networks”一节正好接着本讲往下讲 d-分离
生成式 vs 判别式
- Ng & Jordan, On Discriminative vs. Generative Classifiers: A comparison of logistic regression and naive Bayes, NeurIPS 2001(本讲 §4.4–4.5 的出处)
- Bishop, Pattern Recognition and Machine Learning(2006),§4.2–4.3(概率生成模型与概率判别模型)
- Li, Prabhudesai, Duggal, Brown & Pathak, Your Diffusion Model is Secretly a Zero-Shot Classifier, ICCV 2023
神经条件分布与隐变量模型的预告
- Goodfellow, Bengio & Courville, Deep Learning,第 16 章(深度学习中的结构化概率模型)
- Kingma & Welling, Auto-Encoding Variational Bayes, ICLR 2014(§6.4 的 模型)
12. 下一讲预告 · Next lecture
§5 把”用函数代替表格”用在了一个条件分布上。第 3 讲(原课 Lecture 3 Autoregressive Models)把它用到每一个像素上:
- 每个条件分布是一个逻辑回归:FVSBN(参数 );
- 换成共享权重的单层神经网络:NADE(参数线性于 );
- 用一个带掩码的自编码器一次算出所有条件:MADE;
- 用 RNN、注意力和 Transformer 处理越来越长的历史;用掩码卷积处理图像:PixelRNN、PixelCNN;用扩张卷积处理语音:WaveNet。
我们会在像素世界上把它们全部训练一遍,和真实熵 25.59 bit 比一比,看看”链式法则 + 神经网络”离真实分布能有多近——以及它们为什么采样很慢、为什么没有天然的特征。