Lecture 2 · 背景:表示概率分布——贝叶斯网络、生成式与判别式、神经网络参数化 · Background: Representing Probability Distributions

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

课程源码 ZIP ↓

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

本篇目录

对应 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

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

  1. 数清楚表示一个联合分布需要多少个参数:一个 RGB 像素 2563−1256^3 - 1 个,nn 个二值像素 2n−12^n - 1 个;解释为什么链式法则本身不省参数,而独立和条件独立能带来指数级的节省。
  2. 写出贝叶斯网络的定义(有向无环图 + 每个节点一张条件概率表),说明为什么 CPT 的乘积一定是合法的分布;会计算联合概率、做祖先采样、读出图蕴含的条件独立,并解释”解释消除”。
  3. 区分生成式分解 p(y) p(x∣y)p(y)\,p(x \mid y) 和判别式分解 p(x) p(y∣x)p(x)\,p(y \mid x);推导出伯努利朴素贝叶斯的决策函数也是线性的,因而它和逻辑回归构成一对”生成–判别对”;说出两者在数据量、模型假设、证据重复、缺失数据上的取舍。
  4. 解释”用函数代替表格”:逻辑回归和神经网络怎样用远少于 2k2^k 的参数表示一个有 kk 个父节点的条件分布,各自的代价是什么(偏差 vs 方差);这一步是所有深度生成模型的起点。
  5. 处理连续变量:密度函数、连续变量的链式法则;混合高斯、“均匀 + 高斯”、以及 VAE 的雏形 Z→XZ \to X——理解”每个条件分布都是高斯,边缘分布却可以是任何形状”。

0.2 先修与本讲范围 Prerequisites & scope

默认你已经会 Assumed本讲只给直觉,后面几讲再展开 Previewed only
第 1 讲:生成模型 = p(x)p(x);像素世界;判别式 vs 生成式的直觉自回归模型(第 3 讲:本讲 §5 的”神经条件分布”用到每一个像素上)
概率:条件概率、贝叶斯公式、期望、高斯分布最大似然估计为什么是”数数”(第 4 讲)
逻辑回归(σ(α0+∑iαixi)\sigma(\alpha_0 + \sum_i \alpha_i x_i))的基本概念隐变量模型的学习与推断(第 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

符号含义
Val(X)\text{Val}(X)随机变量 XX 的取值集合,例如 {0,1}\{0, 1\} 或 {0,…,255}\{0, \dots, 255\}
X∼Ber(p)X \sim \text{Ber}(p),Y∼Cat(p1,…,pm)Y \sim \text{Cat}(p_1, \dots, p_m)伯努利分布(有偏的硬币)、类别分布(有偏的 mm 面骰子)
X⊥Y∣ZX \perp Y \mid Z给定 ZZ 时 XX 与 YY 条件独立:p(x,y∣z)=p(x∣z) p(y∣z)p(x, y \mid z) = p(x \mid z)\,p(y \mid z)
G=(V,E)G = (V, E)有向无环图(DAG),每个节点对应一个随机变量
Pa(i)\text{Pa}(i),xPa(i)x_{\text{Pa}(i)}节点 ii 的父节点集合;父节点的取值
CPT / CPD条件概率表 / 条件概率分布 p(xi∣xPa(i))p(x_i \mid x_{\text{Pa}(i)})
σ(z)=1/(1+e−z)\sigma(z) = 1 / (1 + e^{-z})逻辑(sigmoid)函数
I(A;B∣C)I(A; B \mid C)条件互信息(bit);=0  ⟺  A⊥B∣C= 0 \iff A \perp B \mid C

0.5 关于数字 · About the numbers

讲义里的实验数字全部来自配套代码在作者机器上的实际输出(macOS,PyTorch 单线程 CPU),重复运行逐字节相同。有几处结果和写代码之前的预期不同——最重要的一处:在像素世界上,逻辑回归在每一个训练集大小上都赢了朴素贝叶斯,没有出现教科书式的”小数据时生成式更好”;为了看到那个经典的交叉,又加了一个”邮件世界”。这些情况都记录在 代码 README 的”关于实验结果”里。


1. 学习一个生成模型 · Learning a generative model

原课第 3 页把第 1 讲的目标说得更具体:给定一组训练样本(例如狗的照片),我们想学一个概率分布 p(x)p(x),使得

  1. 生成:如果采样 xnew∼p(x)x_{\text{new}} \sim p(x),xnewx_{\text{new}} 应该看起来像一只狗;
  2. 密度估计:xx 像狗时 p(x)p(x) 高,否则低(可以用来做异常检测);
  3. 无监督表示学习:学到这些图片的共同点,例如耳朵、尾巴(特征)。

然后 Ermon 提出整门课的第一个问题:怎样表示 p(x)p(x)?(第二个问题是怎样学它,那是第 4 讲。)

“表示”听起来像是一个技术细节,其实是生成建模里最根本的取舍。第 1 讲 §5.1 已经说过:nn 个二值像素的联合分布如果直接列成一张表,需要 2n−12^n - 1 个数。本讲要回答的就是:怎样用远少于 2n2^n 的参数,描述一个足够丰富的分布。答案有两条路:

  • 结构:假设某些变量之间条件独立——贝叶斯网络(§2–§3);
  • 函数形式:假设条件分布是某种带参数的函数——逻辑回归、神经网络(§5)。

深度生成模型主要走第二条路,但第一条路的思维方式(“谁依赖谁”)贯穿全课。


2. 离散分布与维数灾难 · Discrete distributions and the curse of dimensionality

2.1 最基本的两个分布

  • 伯努利分布(有偏的硬币):Val(X)={正面,反面}\text{Val}(X) = \{\text{正面}, \text{反面}\},规定 P(X=正面)=pP(X = \text{正面}) = p,则 P(X=反面)=1−pP(X = \text{反面}) = 1 - p。写作 X∼Ber(p)X \sim \text{Ber}(p)。采样 = 掷一枚有偏的硬币。1 个参数。
  • 类别分布(有偏的 mm 面骰子):Val(Y)={1,…,m}\text{Val}(Y) = \{1, \dots, m\},规定 P(Y=i)=piP(Y = i) = p_i,∑ipi=1\sum_i p_i = 1。写作 Y∼Cat(p1,…,pm)Y \sim \text{Cat}(p_1, \dots, p_m)。m−1m - 1 个参数(最后一个由”和为 1”决定)。

2.2 联合分布:参数个数的爆炸

原课第 5 页:一个像素的颜色由三个离散随机变量组成,红、绿、蓝通道各有 256 种取值。从 p(R,G,B)p(R, G, B) 采样就随机生成了一个颜色。描述这个联合分布需要多少个参数?256×256×256−1=16,777,215256 \times 256 \times 256 - 1 = 16{,}777{,}215——一个像素就要一千六百多万个数。

第 6 页:nn 个二值像素 X1,…,XnX_1, \dots, X_n(黑或白)可以组成 2n2^n 张不同的图,描述联合分布需要 2n−12^n - 1 个参数。代码 01 第 1 部分把这些数列了出来:

表示独立参数个数
一个 RGB 像素2563−1=16,777,215256^3 - 1 = 16{,}777{,}215
4×4 = 16 个二值像素,完整联合表216−1=65,5352^{16} - 1 = 65{,}535
8×8 = 64 个二值像素,完整联合表264−1≈1.84×10192^{64} - 1 \approx 1.84 \times 10^{19}
28×28 = 784 个二值像素(MNIST),完整联合表≈10236\approx 10^{236}
nn 个像素,假设相互独立nn
nn 个像素,链式法则 + 每个条件一张完整的表1+2+⋯+2n−1=2n−11 + 2 + \dots + 2^{n-1} = 2^n - 1
nn 个像素,马尔可夫链2n−12n - 1
nn 个像素,贝叶斯网络,每个节点最多 kk 个父节点≤n⋅2k\leq n \cdot 2^k

2.3 独立性:从指数到线性,但太强了

如果 X1,…,XnX_1, \dots, X_n 相互独立,

p(x1,…,xn)=p(x1) p(x2)⋯p(xn),p(x_1, \dots, x_n) = p(x_1)\,p(x_2) \cdots p(x_n),

2n2^n 种状态只需要 nn 个数就能描述(每个像素一个”黑的概率”)。原课第 7 页的评价是:独立性假设太强了,模型不太可能有用——从它采样时每个像素独立地选颜色,得到的是一张噪声图。第 1 讲的代码 02 已经看到了:“独立像素”模型的样本是”撒胡椒面”,测试 bits 比真实分布多 10 bit。

2.4 两个基本规则

原课第 8 页列出了整门课反复使用的两条规则:

  1. 链式法则:p(S1∩S2∩⋯∩Sn)=p(S1) p(S2∣S1)⋯p(Sn∣S1∩⋯∩Sn−1)p(S_1 \cap S_2 \cap \cdots \cap S_n) = p(S_1)\,p(S_2 \mid S_1) \cdots p(S_n \mid S_1 \cap \cdots \cap S_{n-1});
  2. 贝叶斯公式:p(S1∣S2)=p(S1∩S2)p(S2)=p(S2∣S1) p(S1)p(S2)p(S_1 \mid S_2) = \dfrac{p(S_1 \cap S_2)}{p(S_2)} = \dfrac{p(S_2 \mid S_1)\,p(S_1)}{p(S_2)}。

2.5 链式法则不省参数,条件独立才省

用链式法则写出 nn 个像素的联合分布:

p(x1,…,xn)=p(x1) p(x2∣x1) p(x3∣x1,x2)⋯p(xn∣x1,…,xn−1).p(x_1, \dots, x_n) = p(x_1)\,p(x_2 \mid x_1)\,p(x_3 \mid x_1, x_2) \cdots p(x_n \mid x_1, \dots, x_{n-1}).

如果每个条件分布都用一张完整的表表示,需要多少参数?代码 01 第 2 部分逐项数了 n=4n = 4 的情形:

因子父节点取值组合参数
p(x1)p(x_1)1 种1
p(x2∣x1)p(x_2 \mid x_1)2 种2
p(x3∣x1,x2)p(x_3 \mid x_1, x_2)4 种4
p(x4∣x1,x2,x3)p(x_4 \mid x_1, x_2, x_3)8 种8
合计15=24−115 = 2^4 - 1

一般地是 1+2+⋯+2n−1=2n−11 + 2 + \dots + 2^{n-1} = 2^n - 1——和完整的联合表一样多。原课第 9 页的原话:”2n−12^n - 1 is still exponential, chain rule does not buy us anything.” 这一点很重要:链式法则对任何分布都成立,不需要任何假设;正因为如此,它也没有省下任何东西。

省参数要靠额外的假设。假设 Xi+1⊥X1,…,Xi−1∣XiX_{i+1} \perp X_1, \dots, X_{i-1} \mid X_i(“下一个像素只依赖上一个像素”,即马尔可夫链),链式法则里的每个因子都被简化:

p(x1,…,xn)=p(x1) p(x2∣x1) p(x3∣x2)⋯p(xn∣xn−1),p(x_1, \dots, x_n) = p(x_1)\,p(x_2 \mid x_1)\,p(x_3 \mid x_2) \cdots p(x_n \mid x_{n-1}),

参数个数变成 1+2(n−1)=2n−11 + 2(n - 1) = 2n - 1。指数级的节省!

这里的思维方式值得记住:先用链式法则写出一个总是正确的分解,再根据对问题的理解,把每个条件分布里”不重要的”条件变量删掉。 删掉哪些,就是在做建模假设。

2.6 实验:在像素世界里比较这些表示

数参数只是一半;另一半是:这些表示在数据上到底表现怎样?代码 01 在像素世界里真的训练了它们(每个条件分布用”数数 + 拉普拉斯平滑”估计,第 4 讲会说明这就是最大似然)。

4×4 小块。 只看图中央的 16 个像素(65,536 种状态)——小到可以列完整的联合表。真实的分布 p(x小块)p(x_{\text{小块}}) 由像素世界把其余 48 个像素精确地边缘化掉得到(9.187 bit / 小块)。表中是测试集上比真实分布多用的 bit 数:

表示N=100N=1,000N=10,000N=100,000参数个数
完整联合表(查表 + 1% 均匀)7.7843.0500.7700.15365,535
链式法则 + 每个条件一张完整的表2.7891.2140.4120.10365,535
独立像素1.9581.8751.8731.87216
马尔可夫链(光栅顺序)1.4971.3351.3241.32231
贝叶斯网络:左 + 上1.1550.8720.8510.84749
贝叶斯网络:左 + 左上 + 上 + 右上1.2360.7050.6430.633139

这张表浓缩了”表示”这个问题的全部张力:

  • 完整的表没有任何假设,所以只要数据足够多,它最终最好(N=100,000N = 100{,}000 时只差 0.15 bit)。但它需要海量数据:N=100N = 100 时差 7.8 bit。16 个像素已经要十万张图;64 个像素(101910^{19} 格)就完全没希望了。
  • 参数个数相同,平滑方式也很重要。“链式法则 + 完整的表”和”完整联合表”参数一样多(都是 216−12^{16} - 1),只是”没见过的情况分多少概率”的方式不同:前者在每个条件分布里各加伪计数,小数据时好得多(2.79 vs 7.78)。
  • 独立像素不随数据变好(停在 1.87 bit):假设错了,数据再多也没用。
  • 马尔可夫链只看”前一个像素”,而光栅顺序里”前一个”只是左边的邻居——竖线上下相连的信息它看不到。
  • 局部贝叶斯网络用几十个参数,小数据时最好(N=100N = 100 时”左 + 上”只差 1.16 bit);数据多了以后被完整的表超过:条件独立只是近似成立(一条横线的第 4 个像素不只取决于它左边和上边的邻居)。

这是第 4 讲偏差–方差取舍的第一个例子:假设越强(参数越少),需要的数据越少,但可能永远到不了真实分布(偏差);假设越弱(参数越多),最终能到达真实分布,但小数据时估计得很差(方差)。

整张 8×8 图。 完整的表不可能了,只剩带结构的表示(真实熵 25.58 bit / 图):

贝叶斯网络(父节点)N=1,000N=10,000N=100,000参数个数
独立像素9.989.949.9464
马尔可夫链(光栅顺序)7.827.757.75127
左 + 上6.065.945.93225
左 + 左上 + 上 + 右上5.575.205.15771
左 2 + 上 2 + 两个对角4.473.623.472,575

父节点越多、越”对路”,误差越小。样本最能说明问题(五个模型用同一串随机数采样,所以同一位置的样本彼此相像,差别完全来自条件分布):马尔可夫链的样本是一段段横向的”笔画”;加上”上边”这个父节点,竖线也连起来了;六邻居的网络已经能画出一些小方框,但也会画出世界里没有的东西——6 个像素长的横线(真实的横线只有 4 个像素)、方框旁边粘着一段线。要知道”这条线已经画了 4 个像素、该停了”,每个像素得看见左边 4 个像素;要画出完整的形状,需要看到更远的上下文。“局部看起来对”不等于”整体是一个形状”。

可是父节点每多一个,CPT 就大一倍:六邻居已经 2,575 个参数,再加下去很快就重新爆炸。第 3 讲的办法是:让每个像素以前面所有像素为父节点,但不用表,改用函数(§5)。


3. 贝叶斯网络 · Bayesian networks

3.1 条件参数化代替联合参数化

原课第 10 页的核心想法:用条件参数化(conditional parameterization)代替联合参数化(joint parameterization)。 对每个随机变量 XiX_i,指定一个条件分布 p(xi∣xAi)p(x_i \mid x_{A_i}),其中 XAiX_{A_i} 是一小组变量;然后把联合分布定义为

p(x1,…,xn)=∏ip(xi∣xAi).p(x_1, \dots, x_n) = \prod_i p(x_i \mid x_{A_i}).

但不是随便选 AiA_i 都行:乘出来必须是一个合法的概率分布。保证合法的条件是:它必须对应某个链式法则分解,只是因子被条件独立假设简化了。——这就引出了”有向无环图”。

3.2 定义

原课第 11 页:一个贝叶斯网络由一个有向无环图(directed acyclic graph, DAG)G=(V,E)G = (V, E) 给出,其中

  1. 每个随机变量 XiX_i 对应一个节点 i∈Vi \in V;
  2. 每个节点有一个条件概率分布(CPD)p(xi∣xPa(i))p(x_i \mid x_{\text{Pa}(i)}),给出这个变量在父节点各种取值下的概率。

图 GG 叫做贝叶斯网络的结构。它定义的联合分布是

p(x1,…,xn)=∏i∈Vp(xi∣xPa(i)).p(x_1, \dots, x_n) = \prod_{i \in V} p(x_i \mid x_{\text{Pa}(i)}).

为什么一定合法? 因为 DAG 没有环,所以一定存在一个拓扑顺序(每个节点都排在它的父节点后面)。按这个顺序写链式法则,p(xi∣x1,…,xi−1)p(x_i \mid x_1, \dots, x_{i-1}) 里的条件变量一定包含 Pa(i)\text{Pa}(i);贝叶斯网络假设”只有父节点重要”,把其余的删掉。所以上面的乘积就是一个”被简化的链式法则”,自然是合法的分布。(另一种看法:按拓扑顺序从最后一个变量开始,依次对它求和,每次求和都等于 1,见练习 2。)

参数是经济的:每张 CPT 的大小对 ∣Pa(i)∣|\text{Pa}(i)| 是指数级的,对 ∣V∣|V| 不是。

3.3 例子:学生网络

原课第 12–14 页的例子(Koller & Friedman 的经典例子):

   难度 D        智力 I
       \        /     \
        ↘      ↙       ↘
         成绩 G         SAT 分数 S
            |
            ↓
         推荐信 L

联合分布按图分解为

p(d,i,g,s,l)=p(d) p(i) p(g∣i,d) p(s∣i) p(l∣g).p(d, i, g, s, l) = p(d)\,p(i)\,p(g \mid i, d)\,p(s \mid i)\,p(l \mid g).

代码 02 用了教科书里的 CPT 数字(例如 p(D=难)=0.4p(D = \text{难}) = 0.4,p(I=高)=0.3p(I = \text{高}) = 0.3,聪明的学生在容易的课上得 A 的概率 0.9)。几个要点:

  • 算任意一个完整赋值的概率,只要把 5 个 CPT 条目乘起来:p(D=难,I=高,G=A,S=高,L=强)=0.4×0.3×0.5×0.8×0.9=0.0432p(D{=}\text{难}, I{=}\text{高}, G{=}A, S{=}\text{高}, L{=}\text{强}) = 0.4 \times 0.3 \times 0.5 \times 0.8 \times 0.9 = 0.0432。整张 48 格的联合表之和恰好是 1。
  • 参数:15 vs 47。 CPT 的独立参数是 1+1+4×2+2×1+3×1=151 + 1 + 4 \times 2 + 2 \times 1 + 3 \times 1 = 15 个;不加结构的联合表需要 2×2×3×2×2−1=472 \times 2 \times 3 \times 2 \times 2 - 1 = 47 个。变量一多,这个差距是指数级的。

3.4 图蕴含的条件独立

原课第 14 页:按链式法则,任何分布都可以写成

p(d,i,g,s,l)=p(d) p(i∣d) p(g∣i,d) p(s∣i,d,g) p(l∣g,d,i,s).p(d, i, g, s, l) = p(d)\,p(i \mid d)\,p(g \mid i, d)\,p(s \mid i, d, g)\,p(l \mid g, d, i, s).

和贝叶斯网络的分解比较,我们额外假设了:D⊥ID \perp I;S⊥{D,G}∣IS \perp \{D, G\} \mid I;L⊥{I,D,S}∣GL \perp \{I, D, S\} \mid G。图结构蕴含了条件独立。

代码 02 第 3 部分用条件互信息把它们精确地验证了一遍(等于 0 ⇔ 条件独立):

关系图里条件互信息 (bit)
D⊥ID \perp I蕴含0.000000
S⊥{D,G}∣IS \perp \{D, G\} \mid I蕴含0.000000
L⊥{I,D,S}∣GL \perp \{I, D, S\} \mid G蕴含0.000000
S⊥L∣GS \perp L \mid G蕴含0.000000
DD 与 II,给定 GG不蕴含0.040264
DD 与 II,给定 LL不蕴含0.009015
SS 与 GG不蕴含(经过 II 相连)0.115909
LL 与 II不蕴含(经过 GG 相连)0.090672

最有意思的是第五行:难度和智力本来独立,可一旦知道了成绩,它们就相关了。 具体数字:

查询概率
p(I=高)p(I = \text{高})0.300
p(I=高∣G=C)p(I = \text{高} \mid G = C)0.079
p(I=高∣G=C,D=难)p(I = \text{高} \mid G = C, D = \text{难})0.109
p(D=难)p(D = \text{难})0.400
p(D=难∣G=C)p(D = \text{难} \mid G = C)0.629
p(D=难∣G=C,I=高)p(D = \text{难} \mid G = C, I = \text{高})0.870
p(I=高∣L=弱)p(I = \text{高} \mid L = \text{弱})0.140
p(I=高∣L=弱,S=高)p(I = \text{高} \mid L = \text{弱}, S = \text{高})0.723

成绩是 C,学生聪明的可能性从 0.3 跌到 0.079;但如果再告诉你这门课很难,“成绩差”就被难度”解释”掉了一部分,聪明的可能性回升到 0.109。反过来,聪明的学生拿了 C,课程很难的概率高达 0.870。这叫解释消除(explaining away):D→G←ID \to G \leftarrow I 是一个”汇连”(v-结构),观察汇点(或它的后代 LL)会让原本独立的两个父节点相关。最后两行展示了证据怎样沿着图传播:推荐信弱让人怀疑学生不聪明(0.140),可 SAT 分数高这个更直接的证据又把它拉回 0.723。

两点提醒:

  1. 图只告诉我们哪些独立”一定成立”;没有画出的独立,在具体的 CPT 下一般不成立(表里那些非零的数)。
  2. 判断任意一条条件独立是否被图蕴含的完整规则叫 d-分离,是 CS228 的内容。本课的图都很简单(两三个随机向量),用不到它。

3.5 祖先采样

原课 slide 15 的总结里有一句:“Can sample from the joint by sampling from the CPDs according to the DAG ordering.” 这就是祖先采样(ancestral sampling):按拓扑顺序,先抽没有父节点的变量(DD、II),再根据已经抽到的父节点取值抽 GG、SS,最后抽 LL。每个变量只需要”查表 + 掷一次骰子”,不需要算整张联合表。代码 02 第 2 部分抽了 20 万个样本,48 种赋值的频率和精确联合概率的最大误差是 0.0017(每一格频率的标准差最多 0.0011,48 格里最大的误差是它的 2–3 倍,属于正常的随机波动)。

第 1 讲的图形引擎(先 zz、再 xx)就是祖先采样;第 3 讲的自回归模型(逐个像素)也是。

3.6 像素世界也是一个贝叶斯网络

第 1 讲的像素世界可以画成一个贝叶斯网络:ZZ(配置)→X1,X2,…,X64\to X_1, X_2, \dots, X_{64}(像素)。每个像素只有一个父节点 ZZ——这是”朴素贝叶斯式”的结构。代码 02 第 4 部分算了像素 (3,3) 和其他像素的互信息:

另一个像素I(Xi;Xj)I(X_i; X_j)I(Xi;Xj∣Z)I(X_i; X_j \mid Z)
(3,4) 右边紧挨着0.04150
(4,3) 下面紧挨着0.03070
(4,4) 右下对角0.00000
(3,6) 同一行、隔 2 个0.00120
(6,3) 同一列、隔 2 个0.00040
(7,7) 右下角0.00070
(0,0) 左上角0.00000
  • 给定 ZZ,任意两个像素都条件独立(第三列全是 0)。第 1 讲里缺失像素能”直接从乘积里拿掉”,就是因为这个条件独立。
  • 不给定 ZZ,邻近的像素相关,远处的像素几乎无关:“同一个形状的笔画”把它们连在一起;右边紧挨着的像素比下面紧挨着的更相关,因为横线比竖线常见。
  • 互信息的绝对值都不大(每个像素大多是白的,本身的熵只有零点几 bit),但 64 个像素的全部相关性合起来——总相关 ∑iH(Xi)−H(X)=35.584−25.591=9.993\sum_i H(X_i) - H(X) = 35.584 - 25.591 = 9.993 bit——恰好就是独立像素模型在数据无限多时比真实分布多付的 bit 数(§2.6 的约 10 bit)。

这揭示了隐变量的作用:一个隐变量 ZZ 就能产生所有这些复杂的相关性,而且在给定 ZZ 时一切都变简单了。这是第 5 讲(隐变量模型)的出发点。

3.7 小结(原课 slide 15)

  • 贝叶斯网络由 (G,P)(G, P) 给出,PP 是一组定义在 GG 的节点上的局部条件概率分布;
  • 用图结构高效地表示分布;
  • 任意赋值的概率 = CPD 的乘积;
  • 按 DAG 的顺序从 CPD 采样,就得到联合分布的样本;
  • 从图的性质可以读出一些条件独立。

4. 生成式 vs 判别式 · Generative vs discriminative

4.1 朴素贝叶斯:一个生成式分类器

原课第 16–17 页:把邮件分成垃圾邮件(Y=1Y = 1)和正常邮件(Y=0Y = 0)。用 1:n1{:}n 给词表里的单词编号,Xi=1X_i = 1 表示第 ii 个单词出现在邮件里。邮件按某个分布 p(Y,X1,…,Xn)p(Y, X_1, \dots, X_n) 生成。朴素贝叶斯假设给定 YY 时单词条件独立:

p(y,x1,…,xn)=p(y)∏i=1np(xi∣y).p(y, x_1, \dots, x_n) = p(y) \prod_{i=1}^n p(x_i \mid y).

从训练数据估计参数(数数),用贝叶斯公式预测:

p(Y=1∣x1,…,xn)=p(Y=1)∏ip(xi∣Y=1)∑y∈{0,1}p(Y=y)∏ip(xi∣Y=y).p(Y = 1 \mid x_1, \dots, x_n) = \frac{p(Y = 1) \prod_i p(x_i \mid Y = 1)}{\sum_{y \in \{0, 1\}} p(Y = y) \prod_i p(x_i \mid Y = y)}.

“这些独立性假设合理吗?“原课的回答是一句名言:“Nearly all probabilistic models are ‘wrong’, but many are nonetheless useful.”(几乎所有概率模型都是”错的”,但其中很多仍然有用。)

4.2 两种分解

原课第 18 页:链式法则给出两种写法,

p(Y,X)=p(X∣Y) p(Y)=p(Y∣X) p(X),p(Y, X) = p(X \mid Y)\,p(Y) = p(Y \mid X)\,p(X),

对应两个贝叶斯网络:Y→XY \to X(生成式)和 X→YX \to Y(判别式)。如果我们只需要 p(Y∣X)p(Y \mid X) 来做预测:

  • 生成式模型要指定 / 学习 p(Y)p(Y) 和 p(X∣Y)p(X \mid Y),再用贝叶斯公式算出 p(Y∣X)p(Y \mid X);
  • 判别式模型只要估计条件分布 p(Y∣X)p(Y \mid X)。我们永远不需要建模、学习或使用 p(X)p(X)! 所以叫”判别式”模型:它只在给定 XX 时用来判别 YY 的标签。

第 19 页进一步说:XX 是一个随机向量,所以两种分解展开以后是

生成式:p(Y,X)=p(Y) p(X1∣Y) p(X2∣Y,X1)⋯p(Xn∣Y,X1,…,Xn−1),判别式:p(Y,X)=p(X1) p(X2∣X1)⋯p(Xn∣X1,…,Xn−1) p(Y∣X1,…,Xn).\begin{aligned} \text{生成式:}\quad & p(Y, X) = p(Y)\,p(X_1 \mid Y)\,p(X_2 \mid Y, X_1) \cdots p(X_n \mid Y, X_1, \dots, X_{n-1}), \\ \text{判别式:}\quad & p(Y, X) = p(X_1)\,p(X_2 \mid X_1) \cdots p(X_n \mid X_1, \dots, X_{n-1})\,p(Y \mid X_1, \dots, X_n). \end{aligned}

两边各要做一个选择:生成式模型里 p(Y)p(Y) 很简单,但 p(Xi∣Xpa(i),Y)p(X_i \mid X_{\text{pa}(i)}, Y) 怎样参数化?(朴素贝叶斯的回答:假设 Xi⊥X−i∣YX_i \perp X_{-i} \mid Y。)判别式模型里 p(Y∣X)p(Y \mid X) 怎样参数化?(逻辑回归的回答见下一节;前面那一长串 p(Xi∣… )p(X_i \mid \dots) 根本不用管,因为 XX 总是给定的。)

4.3 逻辑回归

原课第 21–22 页:判别式模型假设 p(Y=1∣x;α)=f(x,α)p(Y = 1 \mid x; \alpha) = f(x, \alpha),这不再是一张表,而是 xx 的一个带参数的函数(回归)。它必须在 0 和 1 之间,以某种简单而合理的方式依赖 x1,…,xnx_1, \dots, x_n,由一个 n+1n + 1 维的参数向量 α\alpha 完全确定(紧凑的表示)。线性依赖:令 z(α,x)=α0+∑i=1nαixiz(\alpha, x) = \alpha_0 + \sum_{i=1}^n \alpha_i x_i,

p(Y=1∣x;α)=σ(z(α,x)),σ(z)=11+e−z.p(Y = 1 \mid x; \alpha) = \sigma(z(\alpha, x)), \qquad \sigma(z) = \frac{1}{1 + e^{-z}}.

性质:决策边界 p(Y=1∣x)>0.5p(Y = 1 \mid x) > 0.5 关于 xx 是线性的;等概率线是直线。

4.4 朴素贝叶斯也是线性的:生成–判别对

把朴素贝叶斯的对数联合概率展开(伯努利特征,θc,i=p(xi=1∣y=c)\theta_{c,i} = p(x_i = 1 \mid y = c)):

log⁡p(y=c,x)=log⁡p(y=c)+∑i[xilog⁡θc,i+(1−xi)log⁡(1−θc,i)]=log⁡p(y=c)+∑ilog⁡(1−θc,i)⏟bc+∑ixilog⁡θc,i1−θc,i⏟wc,i.\log p(y = c, x) = \log p(y = c) + \sum_i \big[x_i \log \theta_{c,i} + (1 - x_i) \log (1 - \theta_{c,i})\big] = \underbrace{\log p(y = c) + \sum_i \log(1 - \theta_{c,i})}_{b_c} + \sum_i x_i \underbrace{\log \frac{\theta_{c,i}}{1 - \theta_{c,i}}}_{w_{c,i}}.

所以 p(y∣x)=softmax(x⊤W+b)p(y \mid x) = \text{softmax}(x^\top W + b)——和(多类)逻辑回归一模一样的形式。代码 03 第 1 部分在像素世界上验证:按定义算出的朴素贝叶斯后验和 softmax(xW+b)\text{softmax}(xW + b) 的最大差是 3.4×10−153.4 \times 10^{-15}。

这意味着朴素贝叶斯和逻辑回归是同一个模型族,区别只在于怎样选参数:

  • 朴素贝叶斯最大化联合似然 ∑nlog⁡p(xn,yn)\sum_n \log p(x_n, y_n)——每个参数可以单独”数数”,有闭式解;
  • 逻辑回归最大化条件似然 ∑nlog⁡p(yn∣xn)\sum_n \log p(y_n \mid x_n)——参数直接为分类服务,要用梯度优化。

Ng & Jordan (2002) 把这样一对模型叫做”生成–判别对”(generative–discriminative pair),并分析了它们的取舍。

4.5 学习曲线:谁需要的数据更少?

Ng & Jordan 的结论是:生成式的朴素贝叶斯更快地接近它的渐近误差(需要的样本数随特征数对数增长),判别式的逻辑回归渐近误差更低(需要的样本数随特征数线性增长)。所以经常出现”小数据时朴素贝叶斯好、大数据时逻辑回归好”的交叉。代码 03 第 2 部分在三个世界里画了学习曲线(每个 NN 重复 5 次取平均):

(a) 像素世界,4 分类(朴素贝叶斯的”像素条件独立”假设错得很厉害):

N朴素贝叶斯 准确率逻辑回归 准确率朴素贝叶斯 log loss逻辑回归 log loss
80.2510.2657.6824.255
200.3150.3325.3042.783
1000.4250.4592.3561.955
10000.5060.5531.6081.467
100000.5150.5661.4801.428

(贝叶斯最优:准确率 0.984、log loss 0.081;只按 p(y)p(y) 猜:0.300、1.971。)

(b) 邮件世界,朴素贝叶斯的假设完全正确(数据就是按”给定 yy 单词独立”生成的):

N朴素贝叶斯 准确率逻辑回归 准确率
100.7200.698
500.8260.807
3000.8670.859
30000.8780.877

(c) 邮件世界 + “bank”的 3 个拷贝(假设轻微地错):

N朴素贝叶斯 准确率逻辑回归 准确率
100.7040.630
500.8020.786
1000.8270.830
3000.8230.860
30000.8250.877

三个世界给出了三种结果,合起来正是 Ng & Jordan 的完整图景:

  • 假设完全正确时(b),朴素贝叶斯在小数据时更好,数据多了两者收敛到同一水平——它本来就是正确的模型,只是参数是”数”出来的,估计得更快。
  • 假设轻微地错时(c),出现了经典的交叉:N<100N < 100 时朴素贝叶斯更好,N≥100N \geq 100 时逻辑回归反超,之后差距拉大。
  • 假设错得很厉害时(a),逻辑回归在每一个 NN 上都赢。“学得快”的优势还没体现出来,就被”学错了”抵消了。而且朴素贝叶斯在小数据时的 log loss 极差(N=8N = 8 时 7.7 bit):64 个相关的像素证据被当作独立证据相乘,概率被推向 0 或 1。(两者在像素世界上都只有约 0.5 的准确率——线性分类器本身就不适合位置不固定的形状,这是 §5 要解决的问题。)

结论:“生成式更省数据”不是定律,而是”生成式假设对不对”和”数据有多少”之间的取舍。

4.6 判别式模型的强大之处:重复的证据

原课第 23 页:逻辑回归不像朴素贝叶斯那样假设 Xi⊥X−i∣YX_i \perp X_{-i} \mid Y,这在很多应用里差别很大。例如垃圾邮件分类中,令 X1=1["bank" 出现]X_1 = \mathbb{1}[\text{"bank" 出现}],X2=1["account" 出现]X_2 = \mathbb{1}[\text{"account" 出现}]。无论是不是垃圾邮件,它们总是一起出现,即 X1=X2X_1 = X_2。朴素贝叶斯学到 p(X1∣Y)=p(X2∣Y)p(X_1 \mid Y) = p(X_2 \mid Y),于是把证据算了两遍;逻辑回归则不会。

代码 03 第 3 部分在邮件世界里给”bank”加了 kk 个完全相同的拷贝(N=2000N = 2000 训练,5000 测试):

bank 的拷贝数 kk朴素贝叶斯 准确率log lossbank 总权重逻辑回归 准确率log lossbank 总权重
00.8730.4232.300.8770.4411.72
10.8620.4864.600.8770.4401.91
30.8170.8509.190.8760.4392.02
100.7482.85225.280.8760.4392.10

(“bank 总权重”= 出现 bank 让垃圾邮件的 log-odds 增加多少。)

朴素贝叶斯的 bank 总权重按 (k+1)(k + 1) 倍增长(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 纹丝不动:它把同一份证据分摊到 k+1k + 1 个拷贝上。

(slide 23 说逻辑回归会把 α1\alpha_1 或 α2\alpha_2 设成 0。严格地说,没有正则化时 α1+α2\alpha_1 + \alpha_2 确定、但怎样分摊是不确定的;代码里加了 L2 正则化,所以权重被平均分摊。结论一样:证据只算一次。)

4.7 生成式模型仍然有用:缺失数据

原课第 24 页:只有当 XX 总是被完整观测时,条件模型才可用。 当某些 XiX_i 没被观测到时,生成式模型可以把它们边缘化掉,算出 p(Y∣Xevidence)p(Y \mid X_{\text{evidence}})。代码 03 第 4 部分在邮件世界里随机隐藏一半单词:

情形朴素贝叶斯逻辑回归
什么都不缺0.8790.876
一半缺失:朴素贝叶斯边缘化 / 逻辑回归填 00.7980.773
一半缺失:逻辑回归填训练集平均值0.794

生成式模型的边缘化是精确的:p(y∣x观测)∝p(y)∏i 观测到p(xi∣y)p(y \mid x_{\text{观测}}) \propto p(y) \prod_{i\ \text{观测到}} p(x_i \mid y)。判别式模型在训练时从没见过”缺了一半”的输入,只能先填空。这和第 1 讲 §3.3 在像素世界上的发现一致。


5. 神经模型:用函数代替表格 · Neural models

5.1 从线性到非线性

原课第 25–26 页:判别式模型假设 p(Y=1∣x;α)=f(x,α)p(Y = 1 \mid x; \alpha) = f(x, \alpha)。线性依赖 σ(α0+∑iαixi)\sigma(\alpha_0 + \sum_i \alpha_i x_i) 可能太简单了。非线性依赖:令 h(A,b,x)=f(Ax+b)h(A, b, x) = f(Ax + b) 是输入的一个非线性变换(特征),

pNeural(Y=1∣x;α,A,b)=σ(α0+∑i=1hαihi).p_{\text{Neural}}(Y = 1 \mid x; \alpha, A, b) = \sigma\Big(\alpha_0 + \sum_{i=1}^h \alpha_i h_i\Big).

更灵活,参数也更多(A,b,αA, b, \alpha)。重复几次就得到一个神经网络。

5.2 异或:线性模型表示不了的东西

代码 04 第 1 部分的例子:p(y=1∣x1,x2)=0.9p(y = 1 \mid x_1, x_2) = 0.9 如果 x1≠x2x_1 \neq x_2,否则 0.1(“异或”)。2000 个样本,三种表示:

父节点取值真实表(4 格)逻辑回归(3 个参数)神经网络(2 层 × 16)
x1=0,x2=0x_1 = 0, x_2 = 00.100.1180.5170.132
x1=0,x2=1x_1 = 0, x_2 = 10.900.9130.5230.911
x1=1,x2=0x_1 = 1, x_2 = 00.900.8740.4740.882
x1=1,x2=1x_1 = 1, x_2 = 10.100.0980.4790.094

表能表示任何条件分布;逻辑回归只能表示”随 x1,x2x_1, x_2 单调变化”的关系,对四种情况都只能说 0.5 左右;加一层非线性特征,神经网络就能表示异或。

5.3 12 个父节点:表 vs 逻辑回归 vs 神经网络

只有 2 个父节点时表最简单。父节点一多呢?代码 04 第 2 部分让 yy 依赖 12 个二值父节点(真实的 logit 含一个异或项、一个”与”项和若干线性项),真实的条件熵 H(Y∣X)=0.6407H(Y \mid X) = 0.6407 bit 可以对 4096 种 xx 精确算出。表中是测试集上比真实条件熵多用的 bit 数:

条件分布的表示N=100N=1,000N=10,000N=100,000参数个数
表0.3560.3290.1790.0324,096
逻辑回归0.3720.2770.2670.26713
神经网络(几乎不加正则)2.4541.1120.0240.0121,538
神经网络 + L2 正则 0.010.6650.0500.0230.0191,538
(训练集覆盖了表的几成格子)2%22%91%100%
  • 表是”没有偏差、方差巨大”的极端:N=100N = 100 时只覆盖了 2% 的格子,没见过的一律猜 0.5;N=100,000N = 100{,}000 时每格都见过几十次,误差才降到 0.032。
  • 逻辑回归是”没有方差、偏差巨大”的另一个极端:学得最快,但很快停在 0.267——它表示不了异或和”与”。
  • 神经网络在中间,但它的表现强烈依赖于正则化:几乎不加正则时,它在小数据上是最差的(N=100N = 100 时 2.45 bit,N=1000N = 1000 时 1.11 bit)——1538 个参数、训练 1500 步,把训练集背了下来,在没见过的输入上过度自信。加上 L2 正则(权重衰减 0.01)后,N=1000N = 1000 时只差 0.050 bit,是所有方法中最好的。数据足够多时两者一样好。

这个实验预告了第 4 讲的主题:灵活的模型族需要数据或正则化来约束。 它也预告了第 3 讲:p(xi∣x1,…,xi−1)p(x_i \mid x_1, \dots, x_{i-1}) 有 i−1i - 1 个父节点,用表需要 2i−12^{i-1} 格(i=64i = 64 时是 101910^{19}),用逻辑回归就是 FVSBN,用神经网络就是 NADE、MADE、PixelCNN、Transformer。

5.4 贝叶斯网络 vs 神经模型

原课第 27 页把三种做法并排放在一起(以 4 个变量为例):

完全一般(链式法则):p(x1,x2,x3,x4)=p(x1) p(x2∣x1) p(x3∣x1,x2) p(x4∣x1,x2,x3)贝叶斯网络:p(x1,x2,x3,x4)≈p(x1) p(x2∣x1) p(x3∣x1,x2) p(x4∣x1,x2,x3)神经模型:p(x1,x2,x3,x4)≈p(x1) p(x2∣x1) pNeural(x3∣x1,x2) pNeural(x4∣x1,x2,x3)\begin{aligned} \text{完全一般(链式法则):}\quad & p(x_1, x_2, x_3, x_4) = p(x_1)\,p(x_2 \mid x_1)\,p(x_3 \mid x_1, x_2)\,p(x_4 \mid x_1, x_2, x_3) \\ \text{贝叶斯网络:}\quad & p(x_1, x_2, x_3, x_4) \approx p(x_1)\,p(x_2 \mid x_1)\,p(x_3 \mid \cancel{x_1}, x_2)\,p(x_4 \mid x_1, \cancel{x_2, x_3}) \\ \text{神经模型:}\quad & p(x_1, x_2, x_3, x_4) \approx p(x_1)\,p(x_2 \mid x_1)\,p_{\text{Neural}}(x_3 \mid x_1, x_2)\,p_{\text{Neural}}(x_4 \mid x_1, x_2, x_3) \end{aligned}
  • 链式法则:完全一般,不需要任何假设(指数大小,没有免费的午餐);
  • 贝叶斯网络:假设条件独立,条件分布用表表示;
  • 神经模型:假设条件分布的特定函数形式。“足够深的神经网络可以逼近任何函数”,所以这个假设比条件独立温和得多。

深度生成模型几乎都选择第三条路。第 3 讲的自回归模型就是”链式法则 + 每个条件分布一个神经网络”。


6. 连续变量 · Continuous variables

6.1 密度函数与链式法则

原课第 28 页:如果 XX 是连续随机变量,通常用它的概率密度函数 pX:R→R+p_X: \mathbb{R} \to \mathbb{R}_+ 来表示。这个函数没法再列成一张表,通常考虑带参数的密度:

  • 高斯:X∼N(μ,σ)X \sim \mathcal{N}(\mu, \sigma),pX(x)=1σ2πe−(x−μ)2/2σ2p_X(x) = \dfrac{1}{\sigma\sqrt{2\pi}} e^{-(x - \mu)^2 / 2\sigma^2};
  • 均匀:X∼U(a,b)X \sim U(a, b),pX(x)=1b−a1[a≤x≤b]p_X(x) = \dfrac{1}{b - a}\mathbb{1}[a \leq x \leq b];
  • 多元高斯:pX(x)=1(2π)n∣Σ∣exp⁡(−12(x−μ)⊤Σ−1(x−μ))p_X(x) = \dfrac{1}{\sqrt{(2\pi)^n |\Sigma|}} \exp\big(-\tfrac{1}{2}(x - \mu)^\top \Sigma^{-1} (x - \mu)\big)。

链式法则、贝叶斯公式等照样成立,例如 pX,Y,Z(x,y,z)=pX(x) pY∣X(y∣x) pZ∣{X,Y}(z∣x,y)p_{X,Y,Z}(x, y, z) = p_X(x)\,p_{Y \mid X}(y \mid x)\,p_{Z \mid \{X, Y\}}(z \mid x, y)。代码 05 第 1 部分在一个二维高斯(σx=1\sigma_x = 1,σy=2\sigma_y = 2,相关系数 ρ=0.7\rho = 0.7)上逐点核对:p(x,y)p(x, y) 和 p(x) p(y∣x)p(x)\,p(y \mid x) 在 81×81 的网格上最大差 5.6×10−175.6 \times 10^{-17}。条件分布 p(y∣x)p(y \mid x) 仍是高斯:均值随 xx 线性变化(斜率 ρσy/σx=1.40\rho\sigma_y/\sigma_x = 1.40),标准差缩小为 σy1−ρ2=1.43\sigma_y\sqrt{1 - \rho^2} = 1.43——知道了 xx,对 yy 的不确定性变小了。

所以贝叶斯网络照样可以有连续节点(以及连续、离散混合的节点)。原课第 29 页给了三个 Z→XZ \to X 的例子,代码 05 把它们都实现了。

6.2 两个高斯的混合

Z∼Bernoulli(p),X∣(Z=0)∼N(μ0,σ0),X∣(Z=1)∼N(μ1,σ1).Z \sim \text{Bernoulli}(p), \qquad X \mid (Z = 0) \sim \mathcal{N}(\mu_0, \sigma_0), \qquad X \mid (Z = 1) \sim \mathcal{N}(\mu_1, \sigma_1).

参数是 p,μ0,σ0,μ1,σ1p, \mu_0, \sigma_0, \mu_1, \sigma_1。代码里取 p=0.3p = 0.3,μ0=−2\mu_0 = -2,σ0=0.5\sigma_0 = 0.5,μ1=1.5\mu_1 = 1.5,σ1=1\sigma_1 = 1。5 万个祖先采样的直方图和 p(x)=∑zp(z) p(x∣z)p(x) = \sum_z p(z)\,p(x \mid z) 的理论比例一致:一个窄而高的峰在 −2-2,一个宽而矮的峰在 1.51.5。后验 p(Z=1∣x)p(Z = 1 \mid x) 回答”这个点来自哪个成分”——就是聚类:

xxp(x)p(x)p(Z=1∣x)p(Z = 1 \mid x)
−2.00.55880.000
−1.00.08080.065
−0.50.02240.723
0.00.03900.995
1.50.11971.000

后验从接近 0 迅速变到接近 1:“软”分配只发生在两峰之间一个窄窄的过渡区里。5 个参数表示了一个双峰的分布:简单分布的混合可以很复杂。第 5 讲会用 EM 算法从数据学习这些参数。

6.3 均匀 + 高斯:一个连续的隐变量

Z∼U(a,b),X∣(Z=z)∼N(z,σ).Z \sim U(a, b), \qquad X \mid (Z = z) \sim \mathcal{N}(z, \sigma).

参数是 a,b,σa, b, \sigma。边缘分布是一个积分 p(x)=∫U(z;a,b) N(x;z,σ2) dzp(x) = \int U(z; a, b)\,\mathcal{N}(x; z, \sigma^2)\,dz,这里恰好有闭式解 [Φ(x−aσ)−Φ(x−bσ)]/(b−a)\big[\Phi\big(\tfrac{x - a}{\sigma}\big) - \Phi\big(\tfrac{x - b}{\sigma}\big)\big] / (b - a)(Φ\Phi 是标准正态的累积分布函数)。代码 05 第 3 部分(a=−1a = -1,b=2b = 2,σ=0.3\sigma = 0.3)的直方图和闭式解一致:一个平台,两边是被噪声抹平的边缘。它可以看成”无穷多个高斯的混合”。一般情况下这种积分算不出来——这就是第 5 讲的核心难题。

6.4 变分自编码器的雏形

Z∼N(0,1),X∣(Z=z)∼N(μθ(z), eσϕ(z)),Z \sim \mathcal{N}(0, 1), \qquad X \mid (Z = z) \sim \mathcal{N}\big(\mu_\theta(z),\, e^{\sigma_\phi(z)}\big),

其中 μθ:R→R\mu_\theta: \mathbb{R} \to \mathbb{R} 和 σϕ\sigma_\phi 是参数分别为 θ\theta、ϕ\phi 的神经网络。原课第 29 页特别提醒:“Even if μθ,σϕ\mu_\theta, \sigma_\phi are very deep (flexible), functional form is still Gaussian.”(即使 μθ\mu_\theta、σϕ\sigma_\phi 非常深,条件分布的函数形式仍然是高斯。)

代码 05 第 4 部分用两个手工指定权重的小网络演示了这句话的另一面:

zz−2.0−1.5−1.0−0.50.00.51.01.52.0
μθ(z)\mu_\theta(z)−0.50−0.48−0.151.460.00−1.460.150.480.50
σϕ(z)\sigma_\phi(z)0.670.400.270.220.200.220.270.400.67
  • 每一个条件分布 p(x∣z)p(x \mid z) 都是高斯,但边缘分布 p(x)=∫p(z) p(x∣z) dzp(x) = \int p(z)\,p(x \mid z)\,dz 有三个峰(在 −1.4-1.4、00、1.41.4 附近;直方图和数值积分一致)——它是”无穷多个高斯的混合”,可以是多峰的、偏斜的,完全不像高斯。条件分布形式简单,边缘分布却可以非常灵活:这正是隐变量模型的威力。
  • 后验 p(z∣x)p(z \mid x) 可以有好几个峰:在 zz 网格上精确计算,x=−1.0x = -1.0、0.00.0、0.60.6 的后验各有 3 个峰。μθ\mu_\theta 不是单调的,同一个 xx 可以由好几个不同的 zz 生成。真实的 VAE 里 zz 有几十上百维,这个后验既算不出来、形状又复杂——第 5–6 讲用变分推断去近似它。
  • 二维版本:同一个一维的 zz,解码成二维的 x=(μ1(z),μ2(z))+小噪声x = (\mu_1(z), \mu_2(z)) + \text{小噪声},样本集中在一条弯曲的曲线附近。一维的隐变量经过解码器,变成了二维空间里的一维”流形”。真实图像也被认为集中在高维像素空间里的低维流形附近(第 13 讲的”流形假设”)。

7. 2023 年之后 · Since 2023

本讲是背景课,内容本身不会过时;但它的两个核心思想在 2023 年之后的模型里有一些值得一提的新形态:

  • “链式法则 + 神经条件分布”成了最成功的生成模型配方。 大语言模型就是 §5.4 第三行的样子:p(x)=∏ipNeural(xi∣x<i)p(x) = \prod_i p_{\text{Neural}}(x_i \mid x_{<i}),每个条件分布由同一个 Transformer 给出。第 3 讲细讲。
  • 条件独立假设以新的面目回来了。 掩码扩散语言模型(MDLM、LLaDA 等,第 18 讲)为了加速,在一步里并行地生成多个 token,并假设”给定当前的上下文,这几个 token 相互独立”——这和朴素贝叶斯是同一种假设。当被同时生成的 token 强相关时(例如一个短语的前后两个词),这个假设就会出错,生成不连贯的组合;“每步并行生成多少个 token”因此成了质量与速度的取舍。§4.6 “把相关的证据当独立”的问题,在这里变成了”把相关的 token 当独立”。
  • 生成式分类器的复兴。 用一个训练好的条件生成模型 p(x∣y)p(x \mid y) 加贝叶斯公式做分类,又成了研究话题:例如用文生图扩散模型做零样本分类(Li et al., Your Diffusion Model is Secretly a Zero-Shot Classifier, ICCV 2023),以及用语言模型给候选答案打分。§4 的生成–判别取舍(生成式模型对分布外的输入更”诚实”、能处理缺失信息,但更难训练)仍然适用。

8. 小结 · Summary

  1. 表示是第一个问题。 nn 个二值变量的联合分布需要 2n−12^n - 1 个参数;独立性降到 nn(太强);链式法则本身不省参数;省参数要靠额外的假设——条件独立(贝叶斯网络)或函数形式(神经网络)。
  2. 贝叶斯网络 = 有向无环图 + 每个节点一张 CPT,p(x)=∏ip(xi∣xPa(i))p(x) = \prod_i p(x_i \mid x_{\text{Pa}(i)})。它一定是合法的分布(被简化的链式法则);参数对父节点个数指数级、对变量个数线性;任意赋值的概率是 CPT 的乘积;按拓扑顺序祖先采样;图蕴含条件独立,汇连结构会产生”解释消除”。
  3. 像素世界是一个朴素贝叶斯式的网络 Z→X1,…,X64Z \to X_1, \dots, X_{64}:给定 ZZ 像素独立,不给定 ZZ 像素相关;全部相关性合起来(总相关 9.99 bit)正是独立像素模型的误差。一个隐变量就能产生复杂的相关性。
  4. 生成式 vs 判别式:p(y)p(x∣y)p(y)p(x \mid y) vs p(x)p(y∣x)p(x)p(y \mid x)。伯努利朴素贝叶斯的决策函数也是线性的,和逻辑回归构成生成–判别对,区别只在拟合准则(联合似然 vs 条件似然)。生成式在假设正确时更省数据;假设轻微地错时出现交叉;假设错得厉害时判别式处处更好。朴素贝叶斯会重复计算相关的证据;生成式模型能精确地边缘化缺失的变量。
  5. 神经模型用函数代替表格:逻辑回归(偏差大、方差小)、表(偏差小、方差大)、神经网络(灵活,但需要数据或正则化)。“链式法则 + 神经条件分布”就是第 3 讲的自回归模型。
  6. 连续变量用带参数的密度表示,链式法则照样成立。混合高斯、“均匀 + 高斯”、VAE 雏形都是 Z→XZ \to X 的贝叶斯网络:条件分布形式简单(高斯),边缘分布却可以非常复杂;代价是边缘似然和后验都需要积分,一般算不出来(第 5–6 讲)。

9. 常见误区 · Common pitfalls

  1. “用链式法则分解以后,模型就变简单了。” 链式法则对任何分布都成立,它本身不省任何参数;最后一个因子 p(xn∣x1,…,xn−1)p(x_n \mid x_1, \dots, x_{n-1}) 就有 2n−12^{n-1} 个参数。省参数的永远是额外的假设。
  2. “贝叶斯网络的箭头表示因果关系。” 箭头表示的是分解方式和条件独立结构。同一个分布可以用不同方向的图表示(例如 Y→XY \to X 和 X→YX \to Y 都能表示任何二元联合分布);把箭头解释成因果需要额外的假设(因果推断的内容)。
  3. “两个变量独立,那么知道第三个变量以后它们仍然独立。” 解释消除就是反例:难度和智力独立,但给定成绩以后相关。反过来,相关的变量给定第三个变量后也可以变得独立(像素在给定 ZZ 时独立)。
  4. “朴素贝叶斯的假设是错的,所以它一定比逻辑回归差。” 在小数据时,一个”错但简单”的模型常常更好(邮件世界 (c) 中 N<100N < 100 时)。不过也不要走向另一个极端:假设错得厉害时(像素世界),它可能处处更差。
  5. “朴素贝叶斯和逻辑回归是两种不同形式的分类器。” 对伯努利特征,它们的决策函数是同一种形式(softmax 线性函数),区别只在怎样选参数。
  6. “神经网络越灵活越好。” 没有足够的数据或正则化,灵活的模型在小数据上可能是最差的(代码 04:N=100N = 100 时 2.45 bit,比表和逻辑回归都差得多)。
  7. “条件分布是高斯,所以整个模型是高斯的。” VAE 的 p(x∣z)p(x \mid z) 是高斯,但 p(x)=∫p(z)p(x∣z) dzp(x) = \int p(z)p(x \mid z)\,dz 可以是多峰的、任意形状的。
  8. “逻辑回归会把重复特征中的一个权重设为 0。” 没有正则化时,重复特征的权重只有总和是确定的,怎样分摊是不确定的;加 L2 正则时权重被平均分摊。无论哪种情况,证据只被算一次。

10. 练习 · Exercises

练习 1(参数计数) (a) 验证学生网络的独立参数是 15 个、完整联合表是 47 个。 (b) 如果把成绩 GG 改成 5 个等级(A–E),两个数字分别变成多少? (c) 一个 8×8 的像素网络,每个像素以”左 + 上”两个邻居为父节点(边界上的像素父节点更少)。有多少个参数?和代码 01 的 225 核对。

参考答案

(a) DD:1;II:1;GG:父节点 (I,D)(I, D) 有 4 种组合,每行 3−1=23 - 1 = 2 个参数,共 8;SS:2 行 × 1 = 2;LL:3 行 × 1 = 3。合计 15。联合表:2×2×3×2×2−1=472 \times 2 \times 3 \times 2 \times 2 - 1 = 47。

(b) GG:4×(5−1)=164 \times (5 - 1) = 16;LL:5 行 × 1 = 5;合计 1+1+16+2+5=251 + 1 + 16 + 2 + 5 = 25。联合表:2×2×5×2×2−1=792 \times 2 \times 5 \times 2 \times 2 - 1 = 79。

(c) 左上角像素没有父节点:20=12^0 = 1;第一行其余 7 个像素只有左邻居:7×21=147 \times 2^1 = 14;第一列其余 7 个只有上邻居:7×2=147 \times 2 = 14;其余 49 个有两个父节点:49×4=19649 \times 4 = 196。合计 1+14+14+196=2251 + 14 + 14 + 196 = 225。(PixelBN.n_params 数的是”每种父节点取值下 p(xi=1)p(x_i = 1) 的个数” =∑i2∣Pa(i)∣= \sum_i 2^{|\text{Pa}(i)|},对二值变量就是独立参数的个数。)

练习 2(贝叶斯网络一定是合法分布) 证明学生网络的乘积 p(d)p(i)p(g∣i,d)p(s∣i)p(l∣g)p(d)p(i)p(g \mid i, d)p(s \mid i)p(l \mid g) 对所有 48 种赋值求和等于 1。提示:按拓扑顺序的逆序依次求和。

参考答案

先对 ll 求和:∑lp(l∣g)=1\sum_l p(l \mid g) = 1(CPT 的每一行和为 1),乘积里的这一项消失。再对 ss 求和:∑sp(s∣i)=1\sum_s p(s \mid i) = 1。再对 gg:∑gp(g∣i,d)=1\sum_g p(g \mid i, d) = 1。最后 ∑ip(i)=1\sum_i p(i) = 1,∑dp(d)=1\sum_d p(d) = 1。每次求和的变量都是”没有其他因子依赖它”的叶子——这正是按拓扑逆序的意义;如果图里有环,就找不到这样的叶子,证明也就失败了。

练习 3(解释消除) 用学生网络的 CPT 手算 p(G=C∣I=高)p(G = C \mid I = \text{高}) 和 p(G=C∣I=一般)p(G = C \mid I = \text{一般})。然后用贝叶斯公式算 p(I=高∣G=C)p(I = \text{高} \mid G = C),和代码 02 的 0.079 核对。

参考答案

p(G=C∣I=高)=0.6×0.02+0.4×0.2=0.092p(G = C \mid I = \text{高}) = 0.6 \times 0.02 + 0.4 \times 0.2 = 0.092;p(G=C∣I=一般)=0.6×0.3+0.4×0.7=0.46p(G = C \mid I = \text{一般}) = 0.6 \times 0.3 + 0.4 \times 0.7 = 0.46。 p(I=高∣G=C)=0.3×0.0920.3×0.092+0.7×0.46=0.02760.0276+0.322≈0.079p(I = \text{高} \mid G = C) = \dfrac{0.3 \times 0.092}{0.3 \times 0.092 + 0.7 \times 0.46} = \dfrac{0.0276}{0.0276 + 0.322} \approx 0.079。

练习 4(朴素贝叶斯是线性的) 对二分类、伯努利特征的朴素贝叶斯,推导 log⁡p(Y=1∣x)p(Y=0∣x)=w0+∑iwixi\log \dfrac{p(Y = 1 \mid x)}{p(Y = 0 \mid x)} = w_0 + \sum_i w_i x_i,写出 w0w_0 和 wiw_i 的表达式。如果把第 1 个特征复制 kk 份,ww 怎样变化?

参考答案

log⁡p(Y=1∣x)p(Y=0∣x)=log⁡p(Y=1)p(Y=0)+∑i[xilog⁡θ1iθ0i+(1−xi)log⁡1−θ1i1−θ0i]\log \dfrac{p(Y=1 \mid x)}{p(Y=0 \mid x)} = \log \dfrac{p(Y=1)}{p(Y=0)} + \sum_i \Big[x_i \log \dfrac{\theta_{1i}}{\theta_{0i}} + (1 - x_i) \log \dfrac{1 - \theta_{1i}}{1 - \theta_{0i}}\Big]。 所以 wi=log⁡θ1i(1−θ0i)θ0i(1−θ1i)w_i = \log \dfrac{\theta_{1i}(1 - \theta_{0i})}{\theta_{0i}(1 - \theta_{1i})},w0=log⁡p(Y=1)p(Y=0)+∑ilog⁡1−θ1i1−θ0iw_0 = \log \dfrac{p(Y=1)}{p(Y=0)} + \sum_i \log \dfrac{1 - \theta_{1i}}{1 - \theta_{0i}}。 复制 kk 份后,每个拷贝的 θ\theta 和原特征一样,所以每个拷贝的 ww 也一样,“出现这个特征”对 log-odds 的总贡献变成 (k+1)w1(k + 1) w_1——代码 03 第 3 部分的 2.30 → 4.60 → 9.19 → 25.28(k=10k = 10 时是 11×2.30=25.311 \times 2.30 = 25.3)。

练习 5(马尔可夫链的方向) 代码 01 里光栅顺序的马尔可夫链(每个像素的父节点是前一个像素)比”左 + 上”差了约 1.8 bit。(a) 解释为什么它学不到竖线。(b) 如果改用”列优先”的顺序(先走完第一列,再走第二列),马尔可夫链会学会什么、学不会什么?(c) 能不能只用一个父节点,同时捕捉横向和纵向的笔画?

参考答案

(a) 光栅顺序里像素 ii 的”前一个”是它左边的邻居(行首的像素的”前一个”是上一行的最后一个像素,几乎无关)。竖线的笔画是上下相连的,而上方的邻居在光栅顺序里隔了 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 的混合高斯,写出 p(Z=1∣x)p(Z = 1 \mid x) 的表达式。在哪个 xx 处后验恰好等于 0.5?(列出方程即可,可以数值求解。)

参考答案

p(Z=1∣x)=p N(x;μ1,σ12)(1−p) N(x;μ0,σ02)+p N(x;μ1,σ12)p(Z = 1 \mid x) = \dfrac{p\,\mathcal{N}(x; \mu_1, \sigma_1^2)}{(1 - p)\,\mathcal{N}(x; \mu_0, \sigma_0^2) + p\,\mathcal{N}(x; \mu_1, \sigma_1^2)}。后验等于 0.5 ⇔ (1−p)N(x;−2,0.25)=p N(x;1.5,1)(1 - p)\mathcal{N}(x; -2, 0.25) = p\,\mathcal{N}(x; 1.5, 1)。取对数:log⁡0.7−log⁡0.5−(x+2)20.5=log⁡0.3−(x−1.5)22\log 0.7 - \log 0.5 - \frac{(x + 2)^2}{0.5} = \log 0.3 - \frac{(x - 1.5)^2}{2},是关于 xx 的二次方程,在 [−1,−0.5][-1, -0.5] 之间有一个根(约 x≈−0.62x \approx -0.62,与表中 x=−1x = -1 时 0.065、x=−0.5x = -0.5 时 0.723 一致);因为两个方差不同,二次方程在左边远处还有另一个根(约 x≈−5.71x \approx -5.71):方差大的成分在远处”尾巴更重”,后验又会翻回去。

练习 7(均匀 + 高斯的边缘密度) 推导 §6.3 的闭式解 p(x)=[Φ(x−aσ)−Φ(x−bσ)]/(b−a)p(x) = \big[\Phi\big(\tfrac{x - a}{\sigma}\big) - \Phi\big(\tfrac{x - b}{\sigma}\big)\big] / (b - a)。当 σ→0\sigma \to 0 时它变成什么?当 σ≫b−a\sigma \gg b - a 时呢?

参考答案

p(x)=∫ab1b−a N(x;z,σ2) dz=1b−a∫abN(z;x,σ2) dz=1b−a[Φ(b−xσ)−Φ(a−xσ)]p(x) = \int_a^b \frac{1}{b - a}\,\mathcal{N}(x; z, \sigma^2)\,dz = \frac{1}{b - a}\int_a^b \mathcal{N}(z; x, \sigma^2)\,dz = \frac{1}{b - a}\big[\Phi\big(\tfrac{b - x}{\sigma}\big) - \Phi\big(\tfrac{a - x}{\sigma}\big)\big],再用 Φ(−t)=1−Φ(t)\Phi(-t) = 1 - \Phi(t) 化成题目中的形式。σ→0\sigma \to 0 时退化为 U(a,b)U(a, b) 的密度;σ≫b−a\sigma \gg b - a 时近似为以 (a+b)/2(a + b)/2 为中心、标准差约 σ\sigma 的高斯(均匀分布的宽度可以忽略)。

练习 8(动手:给马尔可夫链”换方向”) 按练习 5 (b) 的提示修改 01_representations.py 第 4 部分的父节点,加一行”只有上方邻居”和一行”上方邻居 + 上方第二个邻居”。运行之前先预测它们和”马尔可夫链(光栅顺序)“的排序,运行后核对。

参考答案(预测的思路)

“只有上方邻居”捕捉竖向的笔画(竖线和方框的左右两边),丢掉横向的;“光栅顺序”相反。横向笔画更多(横线 30%,方框的上下边),所以预计”只有上方邻居”略差于光栅马尔可夫链。“上方两个邻居”能多知道”这条竖线已经画了几个像素”,会比”只有上方邻居”好,但仍然看不到横向的结构。具体数字以你的运行为准。

练习 9(思考:判别式模型的”生成”版本) 原课第 1 讲说”判别式模型是一个非常简单的条件生成模型”。用本讲 §4.2 的两种分解解释:判别式模型和生成式模型都表示了联合分布 p(x,y)p(x, y) 吗?如果判别式模型也想回答”缺失特征时的 p(y∣x观测)p(y \mid x_{\text{观测}})“,它还缺什么?

参考答案

判别式分解 p(x,y)=p(x) p(y∣x)p(x, y) = p(x)\,p(y \mid x) 原则上也表示了联合分布,但判别式模型只学了 p(y∣x)p(y \mid x),p(x)p(x) 那部分根本没建模(“我们永远不需要建模 p(X)p(X)”)。要回答 p(y∣x观测)=∑x缺失p(y∣x观测,x缺失) p(x缺失∣x观测)p(y \mid x_{\text{观测}}) = \sum_{x_{\text{缺失}}} p(y \mid x_{\text{观测}}, x_{\text{缺失}})\,p(x_{\text{缺失}} \mid x_{\text{观测}}),它还需要 p(x缺失∣x观测)p(x_{\text{缺失}} \mid x_{\text{观测}})——也就是 xx 的生成模型。所以”处理缺失数据”本质上要求对 xx 建模。


11. 延伸阅读 · Further reading

原课材料

概率图模型

  • 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 的 Z→XZ \to X 模型)

12. 下一讲预告 · Next lecture

§5 把”用函数代替表格”用在了一个条件分布上。第 3 讲(原课 Lecture 3 Autoregressive Models)把它用到每一个像素上:

p(x1,…,x784)=p(x1) plogit(x2∣x1) plogit(x3∣x1,x2)⋯plogit(xn∣x1,…,xn−1).p(x_1, \dots, x_{784}) = p(x_1)\,p_{\text{logit}}(x_2 \mid x_1)\,p_{\text{logit}}(x_3 \mid x_1, x_2) \cdots p_{\text{logit}}(x_n \mid x_1, \dots, x_{n-1}).
  • 每个条件分布是一个逻辑回归:FVSBN(参数 ≈n2/2\approx n^2/2);
  • 换成共享权重的单层神经网络:NADE(参数线性于 nn);
  • 用一个带掩码的自编码器一次算出所有条件:MADE;
  • 用 RNN、注意力和 Transformer 处理越来越长的历史;用掩码卷积处理图像:PixelRNN、PixelCNN;用扩张卷积处理语音:WaveNet。

我们会在像素世界上把它们全部训练一遍,和真实熵 25.59 bit 比一比,看看”链式法则 + 神经网络”离真实分布能有多近——以及它们为什么采样很慢、为什么没有天然的特征。

← 返回课程目录