前置讲 P1 · 概率与向量微积分工具箱 · Probability & Vector Calculus Toolbox

Generative AI with Stochastic Differential Equations · 预备知识 1。个人学习讲义与配套实验,按主题整理并持续修订。

课程源码 ZIP ↓

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

本篇目录

对应 Maps to:MIT 6.S184 原课讲义(Holderrieth & Erives, An Introduction to Flow Matching and Diffusion Models, 2026 版)附录 A(概率回顾:随机向量、条件密度与条件期望),以及正课里隐含使用的向量微积分(散度、拉普拉斯算子、变量替换、分部积分)。 依据说明:原课的先修要求是”线性代数、多元微积分和基础概率论”,讲义只用两页附录 A 回顾概率。本讲按”正课里真正会用到什么”重新组织:§1–§4 对应附录 A 并扩充;§5–§6 的向量微积分是本讲义补充的,它们在第 2 讲(连续性方程)、第 3 讲(Fokker–Planck 方程、得分匹配)里会用到。所有例子和实验都是本讲义设计的。 配套代码 Code:code/prereq1/(6 个脚本;numpy + PyTorch + matplotlib;每个脚本 1–7 秒) 建议阅读时间:第 1 讲之前或同时读;第 2 讲之前必须读完(尤其 §4 条件期望)。预计 3 小时(含运行代码)。


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

0.1 为什么需要这一讲

流匹配和扩散模型的推导,翻来覆去只用到少数几样数学工具。问题是,它们往往以一种初学者不熟悉的方式出现:

  • 第 2 讲的”边缘向量场”是一个条件期望 E[ ut(x∣z)∣x ]\mathbb{E}[\,u_t(x \mid z) \mid x\,];
  • 第 2 讲的核心定理”条件流匹配损失 = 流匹配损失 + 常数”,本质上是均方误差的一个分解;
  • 第 2 讲的”连续性方程”∂tpt=−div⁡(ptut)\partial_t p_t = -\operatorname{div}(p_t u_t) 需要你知道散度是什么意思;
  • 第 3 讲的 Fokker–Planck 方程多了一个拉普拉斯算子;
  • 第 3 讲的得分函数是对数密度的梯度,而高斯的得分是一个简单的线性函数。

这一讲把这些工具逐个讲清楚,并且每个工具都配一个数值实验:你可以亲眼看到”回归学到的是条件期望""散度等于单位面积的净流出”这些说法在数字上成立。

0.2 学习目标 Learning goals

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

  1. 把期望理解成”使平均平方距离最小的常数”,会用蒙特卡洛估计期望,知道误差按 1/N1/\sqrt{N} 缩小、且不随维数指数增长。
  2. 熟练使用高斯分布:重参数化、线性变换、独立高斯相加、方差趋于 0 的极限(狄拉克 δ)、得分函数;知道高维高斯的样本集中在半径 d\sqrt{d} 的薄壳上。
  3. 区分联合、边缘、条件分布,会用贝叶斯公式算后验;理解为什么”从边缘分布采样”容易而”算边缘密度”困难。
  4. 区分 E[X∣Y=y]\mathbb{E}[X \mid Y = y](一个函数)和 E[X∣Y]\mathbb{E}[X \mid Y](一个随机变量);理解用均方误差做回归,学到的是条件期望;能写出并证明均方误差的分解式。
  5. 理解梯度、雅可比矩阵、散度、拉普拉斯算子的几何意义,会用自动求导计算它们;会用乘积法则和分部积分。
  6. 写出变量替换公式,理解流的”瞬时变量替换” ddtlog⁡pt(Xt)=−div⁡ut(Xt)\frac{d}{dt}\log p_t(X_t) = -\operatorname{div}u_t(X_t)。

0.3 本讲地图 Map

§1  随机向量、期望与蒙特卡洛                    ← 代码 01
§2  高斯分布:重参数化、相加、δ、得分、肥皂泡    ← 代码 02
§3  联合、边缘、条件与贝叶斯                    ← 代码 03
§4  条件期望:回归学到的是什么(最重要)        ← 代码 04
§5  向量微积分:梯度、散度、拉普拉斯、分部积分  ← 代码 05
§6  变量替换与流的瞬时变量替换                  ← 代码 06
§7  工具 → 正课里在哪用
§8  小结   §9  常见误区   §10 练习   §11 延伸阅读   §12 下一篇预告

0.4 记号 Notation

记号意思
X,Y,ZX, Y, Z随机变量 / 随机向量(大写)
x,y,zx, y, z它们的取值(小写)
pX(x)p_X(x),简写 p(x)p(x)XX 的概率密度函数
X∼pX \sim pXX 服从分布 pp
N(μ,σ2Id)\mathcal{N}(\mu, \sigma^2 I_d)均值 μ\mu、每维方差 σ2\sigma^2、各维独立的 dd 维高斯(“各向同性”)
⟨x,y⟩=∑ixiyi\langle x, y\rangle = \sum_i x_i y_i,∥x∥=⟨x,x⟩\lVert x\rVert = \sqrt{\langle x, x\rangle}内积与欧氏范数
∇f\nabla f,JuJ_u,div⁡u\operatorname{div} u,Δf\Delta f梯度、雅可比矩阵、散度、拉普拉斯算子(§5)

1. 随机向量、期望与蒙特卡洛 · Random vectors & Monte Carlo

1.1 随机向量与密度

这门课里,数据是 Rd\mathbb{R}^d 里的向量,所以我们处理的是随机向量 X=(X1,…,Xd)∈RdX = (X_1, \dots, X_d) \in \mathbb{R}^d。它的分布用概率密度函数(PDF)pX:Rd→R≥0p_X: \mathbb{R}^d \to \mathbb{R}_{\ge 0} 描述:

P(X∈A)=∫ApX(x) dx,∫pX(x) dx=1.P(X \in A) = \int_A p_X(x)\,dx,\qquad \int p_X(x)\,dx = 1.

密度本身不是概率:pX(x)p_X(x) 可以大于 1(§2.4 里会看到密度为 398.9 的高斯)。只有对一块区域积分,才得到概率。一个直观的理解是:pX(x)⋅(一小块面积)≈p_X(x)\cdot(\text{一小块面积})\approx 落在这一小块里的概率。

1.2 期望:最小二乘意义下最接近 XX 的常数

期望通常定义为加权平均 E[X]=∫x pX(x) dx\mathbb{E}[X] = \int x\,p_X(x)\,dx。原课讲义附录 A 给了另一个等价的定义,这门课里它更有用:

E[X]=arg⁡min⁡z∈Rd∫∥x−z∥2pX(x) dx=arg⁡min⁡zE∥X−z∥2.\mathbb{E}[X] = \arg\min_{z \in \mathbb{R}^d} \int \lVert x - z\rVert^2 p_X(x)\,dx = \arg\min_z \mathbb{E}\lVert X - z\rVert^2.

期望是”离 XX 平均平方距离最近的那个常数”。 证明只需展开:

E∥X−z∥2=E∥X−EX∥2+∥EX−z∥2,\mathbb{E}\lVert X - z\rVert^2 = \mathbb{E}\lVert X - \mathbb{E}X\rVert^2 + \lVert \mathbb{E}X - z\rVert^2,

(交叉项 2⟨E[X−EX], EX−z⟩=02\langle \mathbb{E}[X - \mathbb{E}X],\ \mathbb{E}X - z\rangle = 0)。第一项与 zz 无关,第二项在 z=EXz = \mathbb{E}X 时为 0。

01 号脚本第 1 部分在一个偏斜的指数分布(均值 2、方差 4、中位数 2ln⁡2≈1.3862\ln 2 \approx 1.386)上验证了这个分解:

zz011.386(中位数)2(均值)34
E(X−z)2\mathbb{E}(X - z)^27.9094.9264.3093.9434.9607.977

最小值出现在均值处,最小值等于方差(不是 0);网格搜索的最优点 1.995 与样本均值 1.995 相同。如果把平方距离换成绝对距离 E∣X−z∣\mathbb{E}\lvert X - z\rvert,最优的常数就变成中位数。用什么损失,决定了学到的是什么统计量:这门课所有训练目标都是均方误差,所以学到的都是某种(条件)均值。§4 会把这一点推到”条件”的情形,那是本讲最重要的结论。

1.3 无意识统计学家定律(LOTUS)

要算 E[f(X)]\mathbb{E}[f(X)],不需要先求出 f(X)f(X) 的分布,直接对 XX 的密度积分即可:

E[f(X)]=∫f(x) pX(x) dx.\mathbb{E}[f(X)] = \int f(x)\,p_X(x)\,dx.

这个名字(law of the unconscious statistician)来自一个玩笑:它太自然了,人们”无意识”地就这么用了。01 号脚本第 2 部分在 X∼N(1,0.52)X \sim \mathcal{N}(1, 0.5^2) 上对 f=x,x2,sin⁡x,exf = x, x^2, \sin x, e^x 比较了数值积分、蒙特卡洛和闭式解,三者一致(例如 E[eX]=e1.125=3.0802\mathbb{E}[e^X] = e^{1.125} = 3.0802,数值积分 3.080217、100 万样本的蒙特卡洛 3.081730)。我们从没求过 eXe^X 的分布(它是对数正态分布)。

1.4 蒙特卡洛估计:只要会采样,就能估计期望

如果只有 XX 的样本 x1,…,xNx_1, \dots, x_N(这正是生成式建模的处境:只有数据集),就用样本平均来估计期望:

E[f(X)]≈1N∑i=1Nf(xi).\mathbb{E}[f(X)] \approx \frac{1}{N}\sum_{i=1}^N f(x_i).

这叫蒙特卡洛估计。它是无偏的,误差的标准差是

Var⁡[f(X)]/N.\sqrt{\operatorname{Var}[f(X)] / N}.

01 号脚本第 3 部分用 NN 个标准高斯样本估计 E[X2]=1\mathbb{E}[X^2] = 1,每个 NN 重复 200 次:

NN101001,00010,000100,000
估计的标准差0.4250.1420.0420.01390.0042
理论 2/N\sqrt{2/N}0.4470.1410.0450.01410.0045

样本数翻 100 倍,误差只缩小 10 倍。训练神经网络时,每个小批量上的损失就是这样一个带噪声的蒙特卡洛估计;批量越大,梯度的噪声越小。

1.5 维数灾难:为什么一切都要建立在”采样”上

在 dd 维空间里用网格做数值积分,每维取 10 个点就需要 10d10^d 个点:d=12288d = 12288(一张 64×64 的彩色小图)时是 101228810^{12288},宇宙里的原子数也不过约 108010^{80}。蒙特卡洛的误差 Var⁡f/N\sqrt{\operatorname{Var}f/N} 却只通过 Var⁡f\operatorname{Var} f 依赖维数。01 号脚本第 4 部分用 1000 个样本估计 E∥X∥2/d\mathbb{E}\lVert X\rVert^2/d(真值 1):

维数 dd110100100012288
10 次估计的标准差0.0350.0110.00280.00130.0002

误差甚至随 dd 变小(高维时 ∥X∥2/d\lVert X\rVert^2/d 高度集中在 1 附近,见 §2.6)。这就是为什么生成模型的所有训练目标都写成”对数据、噪声、时间的期望”:训练时只需要会采样,从不需要在空间里做积分。

📌 代码 01:python3 01_expectation_and_monte_carlo.py。


2. 高斯分布 · The Gaussian

2.1 密度与重参数化

dd 维各向同性高斯的密度是

N(x;μ,σ2Id)=(2πσ2)−d/2exp⁡(−∥x−μ∥22σ2),log⁡N(x;μ,σ2Id)=−∥x−μ∥22σ2−d2log⁡(2πσ2).\mathcal{N}(x; \mu, \sigma^2 I_d) = (2\pi\sigma^2)^{-d/2}\exp\Big(-\frac{\lVert x - \mu\rVert^2}{2\sigma^2}\Big),\qquad \log\mathcal{N}(x; \mu, \sigma^2 I_d) = -\frac{\lVert x - \mu\rVert^2}{2\sigma^2} - \frac{d}{2}\log(2\pi\sigma^2).

从它采样的标准方法是重参数化:

ϵ∼N(0,Id) ⟹ x=μ+σϵ∼N(μ,σ2Id).\epsilon \sim \mathcal{N}(0, I_d)\ \Longrightarrow\ x = \mu + \sigma\epsilon \sim \mathcal{N}(\mu, \sigma^2 I_d).

即”从标准高斯采样 + 一个确定的变换”。这门课里它无处不在:第 2 讲的 xt=αtz+βtϵx_t = \alpha_t z + \beta_t\epsilon,第 5 讲 VAE 的 z=μϕ(x)+σϕ(x)ϵz = \mu_\phi(x) + \sigma_\phi(x)\epsilon。02 号脚本第 1 部分核对了手写公式与 torch.distributions 的对数密度(最大差 8.9×10−168.9\times10^{-16}),并用 20 万个重参数化样本恢复了均值和标准差。

2.2 线性变换与 Cholesky 采样

若 X∼N(μ,Σ)X \sim \mathcal{N}(\mu, \Sigma),则 Y=AX+b∼N(Aμ+b, AΣA⊤)Y = AX + b \sim \mathcal{N}(A\mu + b,\ A\Sigma A^\top):高斯经过线性变换仍是高斯。反过来,任何协方差矩阵 Σ\Sigma 都能分解成 Σ=LL⊤\Sigma = LL^\top(Cholesky 分解,LL 是下三角矩阵),于是 Z=Lϵ∼N(0,Σ)Z = L\epsilon \sim \mathcal{N}(0, \Sigma)。只要会采标准高斯,就能采任意高斯。02 号脚本第 2 部分:A=(201.50.5)A = \begin{pmatrix}2 & 0\\ 1.5 & 0.5\end{pmatrix} 时 YY 的样本协方差 (3.982.982.982.48)\begin{pmatrix}3.98 & 2.98\\ 2.98 & 2.48\end{pmatrix},公式 AA⊤=(4332.5)AA^\top = \begin{pmatrix}4 & 3\\ 3 & 2.5\end{pmatrix}。

这门课里的高斯几乎都是各向同性的 σ2I\sigma^2 I:各维独立、方差相同,计算最简单。

2.3 独立高斯相加:高斯概率路径的核心计算

若 z∼N(m,s2)z \sim \mathcal{N}(m, s^2)、ϵ∼N(0,1)\epsilon \sim \mathcal{N}(0, 1) 独立,则

x=αz+βϵ∼N(αm, α2s2+β2).x = \alpha z + \beta\epsilon \sim \mathcal{N}\big(\alpha m,\ \alpha^2 s^2 + \beta^2\big).

均值相加,方差相加(系数要平方)。02 号脚本第 3 部分取 m=4m = 4、s=0.4s = 0.4,并让 α=t\alpha = t、β=1−t\beta = 1 - t(第 1、2 讲的”CondOT 路径”):

tt00.250.50.751
样本均值 / 公式 αm\alpha m−0.0005 / 00.9996 / 11.9997 / 22.9997 / 33.9998 / 4
样本方差 / 公式 α2s2+β2\alpha^2 s^2 + \beta^21.007 / 10.577 / 0.5730.292 / 0.2900.154 / 0.1530.160 / 0.160

tt 从 0 到 1,分布从 N(0,1)\mathcal{N}(0, 1) 连续地移到 N(4,0.42)\mathcal{N}(4, 0.4^2)。第 1 讲”理想向量场”所用的分布路径 ptp_t(五个高斯成分),每个成分就是这样算出来的。

高斯的相加与高维的肥皂泡

2.4 方差趋于 0:狄拉克 δ

N(z,β2)\mathcal{N}(z, \beta^2) 在 β→0\beta \to 0 时会怎样?02 号脚本第 4 部分(z=1.3z = 1.3):

β\beta10.10.010.0010
zz 处的密度0.44.039.9398.9∞
P(∣X−z∣>0.01)P(\lvert X - z\rvert > 0.01)0.9920.9210.3150.0000.000

峰越来越高(总面积始终是 1),概率越来越集中。β=0\beta = 0 时 X≡zX \equiv z:采样”永远返回 zz“。这个分布叫狄拉克 δ 分布 δz\delta_z。它没有通常意义下的密度函数(“在 zz 处无穷大、别处为 0、积分为 1”),但作为分布完全合法:你知道怎样从它采样,也知道它的期望 E[f(X)]=f(z)\mathbb{E}[f(X)] = f(z)。第 2 讲的条件概率路径 pt(⋅∣z)=N(αtz,βt2I)p_t(\cdot \mid z) = \mathcal{N}(\alpha_t z, \beta_t^2 I) 正是靠 β1=0\beta_1 = 0 在 t=1t = 1 时收缩成 δz\delta_z。

2.5 得分函数:对数密度的梯度

对上面的对数密度求梯度:

∇xlog⁡N(x;μ,σ2I)=−x−μσ2.\nabla_x \log\mathcal{N}(x; \mu, \sigma^2 I) = -\frac{x - \mu}{\sigma^2}.

这叫高斯的得分函数(score)。它是一支指向均值的箭头,长度 = 距离 / σ2/\ \sigma^2:离得越远、分布越窄,箭头越长;在均值处为 0。02 号脚本第 5 部分用自动求导核对了这个公式(μ=(1,1)\mu = (1, 1),σ=0.5\sigma = 0.5:在 (1,3)(1, 3) 处得分是 (0,−8)(0, -8),在 (−1,−1)(-1, -1) 处是 (8,8)(8, 8))。

注意,对数密度里的归一化常数 −d2log⁡(2πσ2)-\frac{d}{2}\log(2\pi\sigma^2) 与 xx 无关,求梯度时消失了:算得分函数不需要知道归一化常数。对于一般的分布 p(x)=p~(x)/Cp(x) = \tilde p(x)/C,归一化常数 C=∫p~C = \int\tilde p 往往是最难算的部分,而 ∇log⁡p=∇log⁡p~\nabla\log p = \nabla\log\tilde p 根本用不到它。这是得分函数在第 3 讲大显身手的原因之一。

2.6 高维高斯的”肥皂泡”

标准高斯的密度在原点最高。那么高维时,样本是不是大多在原点附近?02 号脚本第 6 部分:

维数 dd1210100100012288
d\sqrt{d}1.001.413.1610.0031.62110.85
∥ϵ∥\lVert\epsilon\rVert 的平均0.791.263.099.9831.61110.83
∥ϵ∥\lVert\epsilon\rVert 的标准差0.600.660.700.700.710.72
∥ϵ∥<0.5d\lVert\epsilon\rVert < 0.5\sqrt{d} 的比例0.390.220.010000

dd 大时没有任何样本靠近原点:∥ϵ∥\lVert\epsilon\rVert 集中在 d\sqrt{d} 附近,宽度约 0.7(与 dd 无关),相对宽度趋于 0。原因是体积:半径在 [r,r+dr][r, r + dr] 之间的球壳体积正比于 rd−1r^{d-1},离原点远一点的地方虽然密度低,但”地方大得多”。两者的乘积在 r≈dr \approx \sqrt{d} 处最大。

这和第 1 讲 §1.4 “最可能的点 ≠ 典型的点”是同一件事。对图像来说:一张纯噪声图(d≈1.2d \approx 1.2 万)几乎确定落在这个薄壳上,生成过程就是把薄壳上的点一步步搬到数据所在的地方。

📌 代码 02:python3 02_gaussians.py。


3. 联合、边缘、条件与贝叶斯 · Joint, marginal, conditional

3.1 定义

两个随机向量 X,YX, Y 的联合密度 pX,Y(x,y)p_{X,Y}(x, y) 描述它们一起取值的规律。由它可以得到:

  • 边缘密度(对另一个变量积分):pX(x)=∫pX,Y(x,y) dyp_X(x) = \int p_{X,Y}(x, y)\,dy,pY(y)=∫pX,Y(x,y) dxp_Y(y) = \int p_{X,Y}(x, y)\,dx;
  • 条件密度(固定一个变量、重新归一化):pX∣Y(x∣y)=pX,Y(x,y)pY(y)p_{X \mid Y}(x \mid y) = \dfrac{p_{X,Y}(x, y)}{p_Y(y)}(要求 pY(y)>0p_Y(y) > 0);
  • 贝叶斯公式(把条件反过来):pY∣X(y∣x)=pX∣Y(x∣y) pY(y)pX(x)p_{Y \mid X}(y \mid x) = \dfrac{p_{X \mid Y}(x \mid y)\,p_Y(y)}{p_X(x)}。

在生成模型的语境里,pYp_Y 常被叫做先验,pX∣Yp_{X\mid Y} 叫似然,pY∣Xp_{Y \mid X} 叫后验。

3.2 高斯混合:一个两步的联合分布

高斯混合 p(x)=∑kwk N(x;mk,sk2)p(x) = \sum_k w_k\,\mathcal{N}(x; m_k, s_k^2) 其实是一个联合分布的边缘:先抽标签 k∼p(k)=wkk \sim p(k) = w_k,再抽 x∼p(x∣k)=N(mk,sk2)x \sim p(x \mid k) = \mathcal{N}(m_k, s_k^2)。对 kk 求和就得到 p(x)p(x)。看到 xx 之后,它来自哪个成分?贝叶斯公式给出后验

p(k∣x)=wk N(x;mk,sk2)∑jwj N(x;mj,sj2).p(k \mid x) = \frac{w_k\,\mathcal{N}(x; m_k, s_k^2)}{\sum_j w_j\,\mathcal{N}(x; m_j, s_j^2)}.

03 号脚本第 1 部分(权重 0.5/0.3/0.2,中心 −2/0/2.5,标准差 0.7)抽了 40 万个 (k,x)(k, x),在 x0x_0 附近数各标签的频率,和公式比较:

x0x_0−2−1011.52.5
样本频率0.989/0.011/0.0000.626/0.374/0.0000.025/0.974/0.0010.001/0.842/0.1570.000/0.295/0.7050.000/0.003/0.997
贝叶斯公式0.990/0.010/0.0000.625/0.375/0.0000.027/0.972/0.0010.000/0.843/0.1570.000/0.295/0.7050.000/0.003/0.997

离某个中心近时后验几乎确定,两个成分之间则”两边都有可能”。第 1 讲里高斯混合的得分函数和理想向量场,都是按这个后验对各成分加权平均。

3.3 连续隐变量:高斯的后验

再看一个连续的例子:Z∼N(0,1)Z \sim \mathcal{N}(0, 1),X=Z+σϵX = Z + \sigma\epsilon。(Z,X)(Z, X) 是联合高斯,后验也是高斯:

p(z∣x)=N(x1+σ2, σ21+σ2).p(z \mid x) = \mathcal{N}\Big(\frac{x}{1 + \sigma^2},\ \frac{\sigma^2}{1 + \sigma^2}\Big).

03 号脚本第 2 部分用 100 万个样本验证(例如 σ=3\sigma = 3、x=1x = 1:样本里 ZZ 的均值 0.127、公式 0.100;方差 0.904、公式 0.900)。直觉是:噪声小时,后验均值 ≈x\approx x(“看到什么就是什么”);噪声大时,后验均值被拉向先验的均值 0(“观测不可信,宁可相信先验”)。“从带噪声的观测 xx 猜原来的干净 zz“就是去噪,第 2、3 讲的核心对象。

3.4 边缘分布:采样容易,算密度难

p(x)=∫p(x∣z) pdata(z) dzp(x) = \int p(x \mid z)\,p_{\text{data}}(z)\,dz 这种形式的边缘分布,在第 2 讲里会反复出现(“边缘概率路径”)。它有一个关键的不对称性:

  • 采样很容易:先抽一个 z∼pdataz \sim p_{\text{data}}(从数据集里随便挑一个),再抽 x∼p(x∣z)x \sim p(x \mid z)(比如加一点高斯噪声)。这叫祖先采样(ancestral sampling)。
  • 算密度很难:要对所有 zz 积分。如果 pdatap_{\text{data}} 用一个有 NN 个点的数据集代替,代价 ∝N\propto N;如果 pdatap_{\text{data}} 是真实的连续分布,这个积分根本写不出来。

03 号脚本第 3 部分对 1000 个点计时:数据集从 100 个点增加到 100 万个点,采样的时间始终在毫秒以下,算密度的时间从几毫秒增加到 3–4 秒(具体数字随机器而变)。第 2 讲的流匹配之所以可行,正因为它只需要从边缘分布采样,从不需要算它的密度。

📌 代码 03:python3 03_joint_marginal_conditional.py。


4. 条件期望:回归学到的是什么 · Conditional expectation

这是本讲最重要的一节。第 2 讲的核心定理,几乎就是本节结论的直接应用。

4.1 两个不同的对象

条件期望函数:对每个 yy(pY(y)>0p_Y(y) > 0),

E[X∣Y=y]=∫x pX∣Y(x∣y) dx.\mathbb{E}[X \mid Y = y] = \int x\,p_{X \mid Y}(x \mid y)\,dx.

它是一个函数 Rd→Rd\mathbb{R}^d \to \mathbb{R}^d:给一个 yy,返回”Y=yY = y 时 XX 的平均值”。把这个函数记作 g⋆(y)g_\star(y),再代入随机变量 YY,得到

E[X∣Y]=g⋆(Y),\mathbb{E}[X \mid Y] = g_\star(Y),

它是一个随机变量。原课讲义特意提醒:这两个东西都常被叫做”条件期望”,但它们是不同的对象。前者是函数,后者是随机变量。

4.2 回归学到的是条件期望

§1.2 说期望是”最接近 XX 的常数”。条件期望是它的推广:在所有以 YY 为输入的函数里,E[X∣Y=⋅ ]\mathbb{E}[X \mid Y = \cdot\,] 是最接近 XX 的那个:

g⋆=arg⁡min⁡g: Rd→Rd E∥X−g(Y)∥2.g_\star = \arg\min_{g:\,\mathbb{R}^d \to \mathbb{R}^d}\ \mathbb{E}\lVert X - g(Y)\rVert^2.

证明:把期望写成 ∫(∫∥x−g(y)∥2p(x∣y) dx)p(y) dy\int\big(\int\lVert x - g(y)\rVert^2 p(x \mid y)\,dx\big)p(y)\,dy。对每个固定的 yy,括号里的部分只依赖 g(y)g(y) 这一个向量,由 §1.2,它在 g(y)=E[X∣Y=y]g(y) = \mathbb{E}[X \mid Y = y] 时最小。每个 yy 都取到最小,整体就最小。

这正是监督学习里的回归:训练样本是 (yi,xi)(y_i, x_i) 对,损失是均方误差,模型 gg 学到的就是条件期望。哪怕每个目标 xix_i 都很嘈杂,只要样本足够多、模型足够灵活,学到的就是那个”干净”的条件均值。

04 号脚本第 1–2 部分的例子:Y∼Unif(−3,3)Y \sim \mathrm{Unif}(-3, 3),X=2sin⁡Y+X = 2\sin Y + 噪声(噪声的标准差从左边的 0.3 增大到右边的 1.8)。20 万个样本上,分箱平均和 9 次多项式回归都准确地恢复了 2sin⁡y2\sin y(多项式回归与真值的均方差只有 1.0×10−41.0\times10^{-4}):

yy−2.5−1.5−0.5+0.5+1.5+2.5
真值 2sin⁡y2\sin y−1.197−1.995−0.959+0.959+1.995+1.197
多项式回归−1.196−1.995−0.960+0.951+1.984+1.196

损失降不到 0:回归的均方误差是 1.286,而不可约的部分 E[Var⁡(X∣Y)]\mathbb{E}[\operatorname{Var}(X \mid Y)] 约为 1.289(两者的差别是抽样误差)。再好的 gg 也消不掉每个 yy 处的噪声。第 2 讲训练流匹配模型时,损失曲线也会”卡在”一个正数上,那不是没训练好,而是这一项。

回归与去噪

4.3 均方误差的分解

对任意函数 gg,

 E∥X−g(Y)∥2=E∥X−E[X∣Y]∥2⏟与 g 无关的常数+E∥E[X∣Y]−g(Y)∥2 \boxed{\ \mathbb{E}\lVert X - g(Y)\rVert^2 = \underbrace{\mathbb{E}\lVert X - \mathbb{E}[X \mid Y]\rVert^2}_{\text{与 } g \text{ 无关的常数}} + \mathbb{E}\lVert \mathbb{E}[X \mid Y] - g(Y)\rVert^2\ }

证明:在 X−g(Y)=(X−E[X∣Y])+(E[X∣Y]−g(Y))X - g(Y) = \big(X - \mathbb{E}[X\mid Y]\big) + \big(\mathbb{E}[X\mid Y] - g(Y)\big) 两边取平方的期望,交叉项是

2 E⟨X−E[X∣Y], E[X∣Y]−g(Y)⟩.2\,\mathbb{E}\big\langle X - \mathbb{E}[X \mid Y],\ \mathbb{E}[X \mid Y] - g(Y)\big\rangle.

先对固定的 YY 求条件期望:第二个因子只依赖 YY,可以提出来;第一个因子的条件期望是 E[X∣Y]−E[X∣Y]=0\mathbb{E}[X \mid Y] - \mathbb{E}[X \mid Y] = 0。所以交叉项为 0。

04 号脚本第 3 部分用 100 万个样本对五个候选函数验证:

候选 ggE(X−g)2\mathbb{E}(X - g)^2常数项E(E[X∣Y]−g)2\mathbb{E}(\mathbb{E}[X\mid Y] - g)^2两项之和
2sin⁡y2\sin y(最优)1.28841.28840.00001.2884
003.38081.28842.09433.3827
yy2.23291.28840.94402.2324
2sin⁡y+0.52\sin y + 0.51.54061.28840.25001.5384
1.5sin⁡y1.5\sin y1.41881.28840.13091.4193

(约 0.002 的出入是抽样误差。)这个分解的含义非常深远:

“让 gg 拟合嘈杂的 XX“和”让 gg 拟合干净的 E[X∣Y]\mathbb{E}[X \mid Y]“,两个损失只差一个与 gg 无关的常数。所以它们的最优解相同、对 gg 的参数的梯度也完全相同。

第 2 讲里,XX 换成条件向量场 ut(x∣z)u_t(x \mid z)(嘈杂,但有公式,因为它只依赖一个数据点),E[X∣Y]\mathbb{E}[X \mid Y] 换成边缘向量场 ut(x)u_t(x)(干净,但算不出来,因为它要对所有数据点求后验平均)。于是”对着条件向量场做回归”就等价于”对着边缘向量场做回归”。这就是原课讲义定理 12(条件流匹配损失 = 流匹配损失 + 常数)的全部秘密。第 3 讲的去噪得分匹配也是同一个道理。

4.4 塔式法则

E[E[X∣Y]]=E[X].\mathbb{E}\big[\mathbb{E}[X \mid Y]\big] = \mathbb{E}[X].

先在每个 yy 上求平均,再对 yy 求平均,等于直接对 XX 求平均。推导只需把定义代进去:∫(∫x p(x∣y) dx)p(y) dy=∬x p(x,y) dx dy=∫x p(x) dx\int\big(\int x\,p(x \mid y)\,dx\big)p(y)\,dy = \iint x\,p(x, y)\,dx\,dy = \int x\,p(x)\,dx。04 号脚本第 4 部分:E[X]\mathbb{E}[X] 的样本估计 +0.00144,E[2sin⁡Y]\mathbb{E}[2\sin Y] 的样本估计 +0.00141(精确值 0)。

还有一个常用的性质:E[f(X,Y)∣Y=y]=∫f(x,y) p(x∣y) dx\mathbb{E}[f(X, Y) \mid Y = y] = \int f(x, y)\,p(x \mid y)\,dx,即条件期望里的 LOTUS。第 2 讲证明”边缘化技巧”时,会反复用到”先对 zz 条件、再对 zz 平均”这种两步写法。

4.5 最优去噪器 = 后验均值

把 §3.3 和 §4.2 合起来:如果 X=Z+σϵX = Z + \sigma\epsilon,那么用均方误差训练一个”去噪器” g(x)≈Zg(x) \approx Z,学到的就是后验均值 E[Z∣X=x]\mathbb{E}[Z \mid X = x]。04 号脚本第 5 部分让 ZZ 来自三峰分布(中心 −2、0.5、3,权重 0.5/0.3/0.2,标准差 0.3),比较样本估计和闭式解(每格是”样本 / 闭式”):

噪声 σ\sigmax=−2x = -2x=−0.75x = -0.75x=0.5x = 0.5x=1.75x = 1.75x=3x = 3
0.1−2.00 / −2.00−0.81 / −0.78+0.50 / +0.50+1.73 / +1.73+3.00 / +3.00
1−1.92 / −1.92−1.02 / −1.03+0.39 / +0.38+1.52 / +1.51+2.80 / +2.82
3−0.97 / −0.98−0.63 / −0.61−0.18 / −0.16+0.31 / +0.34+0.82 / +0.86

(图见上方右图。)噪声小时,去噪器几乎是恒等映射(只把 xx 往所在峰的中心拉 10%);噪声中等时,它变成被抹平的”台阶”:先判断 xx 来自哪个峰,再输出那个峰附近的值;两峰之间它输出一个加权平均(x=1.75x = 1.75 时是 +1.51),落在任何峰都不在的地方。噪声大时,输出被强烈地压向 E[Z]=−0.25\mathbb{E}[Z] = -0.25。

**第 2 讲的理想向量场、第 3 讲的去噪得分匹配,学的都是这样的后验均值。**当你在第 2 讲看到”一步生成会得到模糊的平均”时,回想这张图:在噪声很大的时刻,最优的预测就是把所有可能性平均起来。

📌 代码 04:python3 04_conditional_expectation.py。


5. 向量微积分 · Vector calculus

5.1 梯度与雅可比矩阵

标量函数 f:Rd→Rf: \mathbb{R}^d \to \mathbb{R} 的梯度 ∇f=(∂f/∂x1,…,∂f/∂xd)\nabla f = (\partial f/\partial x_1, \dots, \partial f/\partial x_d) 是一个向量,指向 ff 增加最快的方向,长度是增加的速率。向量场 u:Rd→Rdu: \mathbb{R}^d \to \mathbb{R}^d 的雅可比矩阵 JuJ_u 的第 (i,j)(i, j) 个元素是 ∂ui/∂xj\partial u_i/\partial x_j:第 ii 行就是第 ii 个输出分量的梯度。它描述 uu 在一点附近的线性近似:u(x+δ)≈u(x)+Ju(x) δu(x + \delta) \approx u(x) + J_u(x)\,\delta。

三种计算方法(05 号脚本第 1 部分):手推公式、自动求导(PyTorch 的 torch.autograd,给出机器精度的精确值)、有限差分 ∂f/∂xi≈(f(x+εei)−f(x−εei))/(2ε)\partial f/\partial x_i \approx (f(x + \varepsilon e_i) - f(x - \varepsilon e_i))/(2\varepsilon)(有约 10−1010^{-10} 的误差,但几乎不可能写错,适合当”标准答案”)。对 f=sin⁡(x1)x22+e0.3x1x2f = \sin(x_1)x_2^2 + e^{0.3x_1x_2} 在 (0.7,−1.2)(0.7, -1.2) 处,三者给出的梯度一致到小数点后 9–10 位。

5.2 散度:单位面积的净流出

向量场的散度是雅可比矩阵的迹:

div⁡u(x)=∑i=1d∂ui∂xi(x).\operatorname{div} u(x) = \sum_{i=1}^d \frac{\partial u_i}{\partial x_i}(x).

公式看起来很抽象,它的几何意义却很直观:在 xx 周围画一个小圆(高维时是小球),算流出它的净通量,再除以它的面积(体积),在半径趋于 0 时就是散度:

div⁡u(x)=lim⁡r→01πr2∮∥y−x∥=ru(y)⋅n(y) ds(d=2).\operatorname{div}u(x) = \lim_{r \to 0}\frac{1}{\pi r^2}\oint_{\lVert y - x\rVert = r} u(y)\cdot n(y)\,ds\qquad(d = 2).

05 号脚本第 2 部分在点 (0.7,−1.2)(0.7, -1.2) 处,用半径 0.001 的圆数值计算通量:

向量场手算散度雅可比的迹通量 / 面积
源 u=xu = x+2+2+2.0000
汇 u=−xu = -x−2−2−2.0000
旋转 u=(−x2,x1)u = (-x_2, x_1)000.0000
剪切 u=(x2,0)u = (x_2, 0)000.0000
u=(x1x2, sin⁡x1+x22)u = (x_1x_2,\ \sin x_1 + x_2^2)3x2=−3.63x_2 = -3.6−3.6−3.6000

散度为正,这一点是”源”:流出多于流入,粒子在这里散开;为负是”汇”:粒子在这里聚拢;为 0:流进多少流出多少(旋转、剪切只是”搬动”,不改变疏密)。

第 2 讲的连续性方程 ∂tpt=−div⁡(ptut)\partial_t p_t = -\operatorname{div}(p_t u_t) 就是用散度写的质量守恒:ptutp_t u_t 是”概率的流量”(密度 × 速度),某处的概率密度增加的速度 = 流入该处的净流量。

5.3 拉普拉斯算子:周围的平均比中心高多少

Δf=div⁡∇f=∑i=1d∂2f∂xi2\Delta f = \operatorname{div}\nabla f = \sum_{i=1}^d \frac{\partial^2 f}{\partial x_i^2}

(海森矩阵的迹)。它的几何意义:在二维里,半径为 rr 的小圆上 ff 的平均值满足

圆周平均−f(中心)≈r24 Δf(中心).\text{圆周平均} - f(\text{中心}) \approx \frac{r^2}{4}\,\Delta f(\text{中心}).

Δf>0\Delta f > 0:中心比周围低(像碗底);Δf<0\Delta f < 0:中心比周围高(像山顶);Δf=0\Delta f = 0:中心恰好等于周围的平均。05 号脚本第 3 部分对 x12+x22x_1^2 + x_2^2(Δf=4\Delta f = 4)、x12−x22x_1^2 - x_2^2(Δf=0\Delta f = 0)和高斯形状 e−∥x∥2/2e^{-\lVert x\rVert^2/2} 验证了这个关系:高斯形状在峰顶 Δf=−2\Delta f = -2,在 (1.5,0.5)(1.5, 0.5) 处 Δf=+0.1433\Delta f = +0.1433(圆周平均法给出 +0.1432)。

热方程 ∂tp=σ22Δp\partial_t p = \frac{\sigma^2}{2}\Delta p 于是有一个直观的意思:峰顶(Δp<0\Delta p < 0)被削低,谷底(Δp>0\Delta p > 0)被填高,分布越来越平滑。这就是”扩散”。第 3 讲的 Fokker–Planck 方程 ∂tpt=−div⁡(ptut)+σt22Δpt\partial_t p_t = -\operatorname{div}(p_t u_t) + \frac{\sigma_t^2}{2}\Delta p_t 就是”连续性方程 + 热方程”:漂移搬运概率,噪声把它抹平。

5.4 乘积法则与分部积分

乘积法则:div⁡(p u)=∇p⋅u+p div⁡u\operatorname{div}(p\,u) = \nabla p \cdot u + p\,\operatorname{div}u。“密度乘以速度”的散度拆成两部分:密度不均匀带来的流动,加上速度场本身的发散。05 号脚本第 4 部分在一点上验证,两边都是 −1.2097133346。

分部积分:如果 fgf g 在 ±∞\pm\infty 处趋于 0,则

∫f(x) g′(x) dx=−∫f′(x) g(x) dx.\int f(x)\,g'(x)\,dx = -\int f'(x)\,g(x)\,dx.

它能把导数从一个函数”挪”到另一个函数上(高维的版本是 ∫f ∂ig=−∫(∂if) g\int f\,\partial_i g = -\int(\partial_i f)\,g,以及散度定理 ∫fdiv⁡v=−∫∇f⋅v\int f\operatorname{div}v = -\int\nabla f\cdot v)。05 号脚本取 f=sin⁡x+xf = \sin x + x、g=e−x2/2g = e^{-x^2/2},两边都是 −4.02697518。原课讲义附录 B 证明 Fokker–Planck 方程、第 3 讲推导得分匹配时,都靠这一招。

📌 代码 05:python3 05_vector_calculus.py。


6. 变量替换与流的瞬时变量替换 · Change of variables

6.1 变量替换公式

设 f:Rd→Rdf: \mathbb{R}^d \to \mathbb{R}^d 可逆且可微,Y=f(X)Y = f(X)。那么

pY(y)=pX(f−1(y)) ∣det⁡Jf−1(y)∣=pX(x)∣det⁡Jf(x)∣,x=f−1(y).p_Y(y) = p_X\big(f^{-1}(y)\big)\,\big\lvert\det J_{f^{-1}}(y)\big\rvert = \frac{p_X(x)}{\lvert\det J_f(x)\rvert},\qquad x = f^{-1}(y).

直觉:概率质量守恒。ff 把 xx 附近的一小块区域映射到 yy 附近,面积(体积)放大了 ∣det⁡Jf(x)∣\lvert\det J_f(x)\rvert 倍;质量不变,所以密度要缩小同样的倍数。

06 号脚本给了三个层次的例子:

  • 一维:X∼N(0,1)X \sim \mathcal{N}(0, 1),Y=X3+XY = X^3 + X。f′(x)=3x2+1f'(x) = 3x^2 + 1:在 0 附近几乎不拉伸,远处拉伸得厉害。所以 YY 的分布在中间保留了尖峰(y=0y = 0 附近 0.33),两侧被拉稀成长尾,直方图和公式在每个区间都吻合(见下图左)。
  • 二维线性:y=Axy = Ax,det⁡A=1.5\det A = 1.5,密度处处缩小 1.5 倍(再按 A−1A^{-1} 找到原来的位置)。
  • 二维非线性:剪切 y=(x1,x2+1.5sin⁡x1)y = (x_1, x_2 + 1.5\sin x_1) 处处保持面积(det⁡=1\det = 1),密度只是被”搬了家”;拉伸 y=(sinh⁡x1,x2ex1)y = (\sinh x_1, x_2 e^{x_1}) 的放大倍数 cosh⁡x1⋅ex1\cosh x_1 \cdot e^{x_1} 逐点不同。直方图估计和公式在各个测试点吻合到几个百分点(密度很低处样本少,误差更大)。

公式要求 ff 可逆:只有这样,”yy 处的密度”才能追溯到唯一的原像 xx。第 1 讲 §2.5 说过,Lipschitz 向量场的流总是可逆的,所以这个公式对流模型的 ψt\psi_t 总是适用。

变量替换

6.2 流的瞬时变量替换

流模型的映射 ψ1\psi_1 不是一步给出的,而是由一个 ODE 一点点生成的。密度怎样随时间变化?设 Jt=∂ψt(x0)/∂x0J_t = \partial\psi_t(x_0)/\partial x_0 是流的雅可比矩阵。对 ODE ddtψt=ut(ψt)\frac{d}{dt}\psi_t = u_t(\psi_t) 两边对 x0x_0 求导,得 ddtJt=Jut(ψt) Jt\frac{d}{dt}J_t = J_{u_t}(\psi_t)\,J_t。再用矩阵分析里的 Jacobi 公式 ddtlog⁡det⁡Jt=tr⁡(Jt−1ddtJt)\frac{d}{dt}\log\det J_t = \operatorname{tr}\big(J_t^{-1}\tfrac{d}{dt}J_t\big),得到

ddtlog⁡det⁡Jt=tr⁡ Jut(ψt)=div⁡ut(Xt).\frac{d}{dt}\log\det J_t = \operatorname{tr}\,J_{u_t}(\psi_t) = \operatorname{div}u_t(X_t).

体积的对数变化率 = 散度。 结合变量替换公式,沿着一条轨迹 Xt=ψt(X0)X_t = \psi_t(X_0):

log⁡pt(Xt)=log⁡p0(X0)−∫0tdiv⁡us(Xs) ds.\log p_t(X_t) = \log p_0(X_0) - \int_0^t \operatorname{div}u_s(X_s)\,ds.

06 号脚本第 3 部分在一个散度不是常数的二维向量场上验证了两件事:

  1. 用有限差分算终点映射的雅可比行列式,和沿轨迹积分散度,两列一致到小数点后 6 位(例如起点 (0,0)(0, 0):+0.757248+0.757248 和 +0.757248+0.757248);
  2. 让 40 万个 N(0,I)\mathcal{N}(0, I) 粒子”随身携带”自己的密度 log⁡p0(X0)−∫div⁡u\log p_0(X_0) - \int\operatorname{div}u,到 t=1t = 1 时与直方图吻合(例如方格 (1.5,−0.5)(1.5, -0.5):直方图 0.1987、粒子携带的 0.1994)。

上图右:同一批粒子在 t=1t = 1 时按体积变化着色,红色被挤压(密度升高),蓝色被拉开(密度降低)。

6.3 和连续性方程的联系

上面那个式子还可以写成 ddtlog⁡pt(Xt)=−div⁡ut(Xt)\frac{d}{dt}\log p_t(X_t) = -\operatorname{div}u_t(X_t)。它是”跟着粒子走”的视角。换成”站在固定位置看”的视角:由链式法则,ddtpt(Xt)=∂tpt+∇pt⋅ut\frac{d}{dt}p_t(X_t) = \partial_t p_t + \nabla p_t\cdot u_t,令它等于 −ptdiv⁡ut-p_t\operatorname{div}u_t,再用 §5.4 的乘积法则,

∂tpt=−∇pt⋅ut−ptdiv⁡ut=−div⁡(ptut).\partial_t p_t = -\nabla p_t\cdot u_t - p_t\operatorname{div}u_t = -\operatorname{div}(p_t u_t).

这正是第 2 讲的连续性方程。两个视角说的是同一件事:粒子沿向量场走,概率密度就按连续性方程变化。

6.4 为什么不直接学一个可逆映射

既然变量替换公式能精确算出密度,为什么不直接训练一个可逆网络 fθf_\theta,用最大似然 log⁡pX(fθ−1(y))+log⁡∣det⁡Jfθ−1∣\log p_X(f_\theta^{-1}(y)) + \log\lvert\det J_{f_\theta^{-1}}\rvert 来训练?这就是归一化流(normalizing flows)的思路。问题在于行列式:一般的 d×dd\times d 矩阵求行列式要约 d3d^3 次运算(06 号脚本第 4 部分):

数据维数 ddd3d^3存下雅可比矩阵(float64)
28×28 灰度图7844.8e84.9 MB
64×64 彩色图12,2881.9e121.2 GB
256×256 彩色图196,6087.6e15309 GB

归一化流只能用特殊结构(三角形雅可比、耦合层)让行列式变便宜,这限制了网络的表达能力。连续时间的版本(“连续归一化流”)用 §6.2 的公式把行列式换成了散度的积分,但训练时仍要模拟 ODE、算散度,代价也很大。流匹配(第 2 讲)训练时既不需要行列式、也不需要散度、也不需要模拟 ODE,只做回归,这是它能扩展到几十亿参数模型的关键。

📌 代码 06:python3 06_change_of_variables.py。


7. 工具 → 正课里在哪用 · Where each tool shows up

工具本讲第一次在正课里用到
蒙特卡洛估计、“只需要会采样”§1.4–1.5第 2 讲:流匹配损失是对 (t,z,ϵ)(t, z, \epsilon) 的期望
重参数化、独立高斯相加§2.1、§2.3第 1 讲 §3.5(理想向量场);第 2 讲高斯概率路径 xt=αtz+βtϵx_t = \alpha_t z + \beta_t\epsilon
狄拉克 δ§2.4第 2 讲:条件概率路径在 t=1t = 1 时等于 δz\delta_z
高斯的得分函数§2.5第 1 讲 §5.3(朗之万动力学);第 3 讲条件得分
贝叶斯公式、后验§3第 2 讲:边缘向量场 = 条件向量场按后验 p(z∣x)p(z \mid x) 加权平均
采样容易、密度难§3.4第 2 讲:边缘概率路径能采样、算不出密度
回归 = 条件期望§4.2第 2 讲:网络学到边缘向量场;第 3 讲:去噪器 = 后验均值
均方误差分解§4.3第 2 讲定理 12:条件流匹配损失 = 流匹配损失 + 常数;第 3 讲定理 22
塔式法则§4.4第 2 讲边缘化技巧的证明
散度、连续性方程§5.2、§6.3第 2 讲定理 11
拉普拉斯算子、热方程§5.3第 3 讲 Fokker–Planck 方程
分部积分§5.4第 3 讲;原课讲义附录 B
变量替换、瞬时变量替换§6第 2 讲连续性方程的直觉;第 5 讲 VAE 的讨论

8. 小结 · Summary

  1. 期望是使平均平方距离最小的常数;蒙特卡洛用样本平均估计期望,误差 Var⁡f/N\sqrt{\operatorname{Var}f/N},不随维数指数增长。生成模型的训练目标全部写成期望,训练时只需要会采样。
  2. 高斯:重参数化 x=μ+σϵx = \mu + \sigma\epsilon;线性变换后仍是高斯;独立高斯相加时均值相加、方差相加;方差趋于 0 时变成狄拉克 δ;得分 −(x−μ)/σ2-(x - \mu)/\sigma^2 指向均值、与归一化常数无关;高维样本集中在半径 d\sqrt{d} 的薄壳上。
  3. 联合、边缘、条件:边缘 = 对另一个变量积分;条件 = 固定后重新归一化;贝叶斯公式把条件反过来。p(x)=∫p(x∣z)p(z)dzp(x) = \int p(x\mid z)p(z)dz 采样容易、算密度难。
  4. 条件期望 E[X∣Y=y]\mathbb{E}[X \mid Y = y] 是函数,E[X∣Y]\mathbb{E}[X \mid Y] 是随机变量。用均方误差回归,学到的是条件期望;损失的最小值是不可约的条件方差,不是 0。
  5. 均方误差分解:E∥X−g(Y)∥2=常数+E∥E[X∣Y]−g(Y)∥2\mathbb{E}\lVert X - g(Y)\rVert^2 = \text{常数} + \mathbb{E}\lVert\mathbb{E}[X\mid Y] - g(Y)\rVert^2。对嘈杂目标回归与对其条件期望回归,梯度相同。这是第 2 讲定理 12 的核心。
  6. 散度 = 单位体积的净流出;拉普拉斯算子 = 周围平均比中心高多少;乘积法则和分部积分是推导连续性方程、Fokker–Planck 方程的基本工具。
  7. 变量替换:密度 = 原密度 / 体积放大倍数。对流而言,ddtlog⁡pt(Xt)=−div⁡ut(Xt)\frac{d}{dt}\log p_t(X_t) = -\operatorname{div}u_t(X_t),换个视角就是连续性方程。

9. 常见误区 · Common pitfalls

  1. “密度就是概率,所以不能大于 1。” 密度可以任意大(N(z,0.0012)\mathcal{N}(z, 0.001^2) 在 zz 处约为 399);只有对区域积分才得到概率。
  2. “高斯的样本大多在均值附近。” 低维时是,高维时完全不是:样本集中在离均值约 σd\sigma\sqrt{d} 的薄壳上(§2.6)。
  3. ”E[X∣Y]\mathbb{E}[X \mid Y] 是一个数。” 它是 YY 的函数,因而是一个随机变量;E[X∣Y=y]\mathbb{E}[X \mid Y = y] 才是(对固定 yy 的)一个数 / 向量。
  4. “回归的损失降到 0 才算训练好。” 只要目标里有与输入无关的噪声,最小损失就是 E[Var⁡(X∣Y)]>0\mathbb{E}[\operatorname{Var}(X\mid Y)] > 0(§4.2)。第 2 讲的流匹配损失正是这种情况。
  5. “对嘈杂的目标做回归,学到的东西也是嘈杂的。” 只要用均方误差,学到的是目标的条件均值,噪声被平均掉了(§4.2、§4.3)。
  6. “散度为 0 的向量场不移动粒子。” 旋转场的散度为 0,但粒子在转圈。散度为 0 只表示”不改变疏密”(§5.2)。
  7. “变量替换公式对任何映射都成立。” 它要求映射可逆(且可微);多对一的映射要把所有原像的贡献加起来。
  8. “算得分函数要先算出归一化常数。” 不需要:常数的对数在求梯度时消失(§2.5)。

10. 练习 · Exercises

练习 1(期望的最小二乘刻画)。证明 E∥X−z∥2=tr⁡Cov⁡(X)+∥z−EX∥2\mathbb{E}\lVert X - z\rVert^2 = \operatorname{tr}\operatorname{Cov}(X) + \lVert z - \mathbb{E}X\rVert^2。若把损失换成 E∣X−z∣\mathbb{E}\lvert X - z\rvert(一维),最优的 zz 是什么?

参考答案

展开 ∥X−EX+EX−z∥2\lVert X - \mathbb{E}X + \mathbb{E}X - z\rVert^2,交叉项的期望为 0,第一项的期望是各维方差之和 tr⁡Cov⁡(X)\operatorname{tr}\operatorname{Cov}(X)。绝对值损失的最优解是中位数:对 zz 求导,ddzE∣X−z∣=P(X<z)−P(X>z)\frac{d}{dz}\mathbb{E}\lvert X - z\rvert = P(X < z) - P(X > z),令它为 0 得 P(X<z)=1/2P(X < z) = 1/2。

练习 2(高斯相加)。设 z∼N(m,s2Id)z \sim \mathcal{N}(m, s^2 I_d)、ϵ∼N(0,Id)\epsilon \sim \mathcal{N}(0, I_d) 独立,xt=αtz+βtϵx_t = \alpha_t z + \beta_t\epsilon。(a) 写出 xtx_t 的分布。(b) 若 pdata=∑kwk N(mk,sk2I)p_{\text{data}} = \sum_k w_k\,\mathcal{N}(m_k, s_k^2 I),xtx_t 的分布是什么?(c) 对 αt=t\alpha_t = t、βt=1−t\beta_t = 1 - t,哪个时刻 xtx_t 的方差最小(d=1d = 1、单个成分)?

参考答案

(a) N(αtm,(αt2s2+βt2)I)\mathcal{N}(\alpha_t m, (\alpha_t^2 s^2 + \beta_t^2)I)。(b) 先按 wkw_k 选成分,再套用 (a):∑kwk N(αtmk,(αt2sk2+βt2)I)\sum_k w_k\,\mathcal{N}(\alpha_t m_k, (\alpha_t^2 s_k^2 + \beta_t^2)I)——仍是高斯混合,这就是第 1 讲 oracle_fields.py 里的 marginal(t)。(c) 方差 v(t)=t2s2+(1−t)2v(t) = t^2 s^2 + (1 - t)^2,令导数 2ts2−2(1−t)=02ts^2 - 2(1 - t) = 0,得 t⋆=1/(1+s2)t^\star = 1/(1 + s^2),最小方差 s2/(1+s2)s^2/(1 + s^2)。s=0.4s = 0.4 时 t⋆≈0.862t^\star \approx 0.862、最小方差约 0.138,比终点的 s2=0.16s^2 = 0.16 还小:路径中途分布会先”收紧”再”放开”一点(02 号脚本第 3 部分的表里 t=0.75t = 0.75 的方差 0.153 已小于 t=1t = 1 的 0.160)。

练习 3(高斯后验)。设 Z∼N(μ0,τ2)Z \sim \mathcal{N}(\mu_0, \tau^2),X=aZ+σϵX = aZ + \sigma\epsilon。推导 p(z∣x)p(z \mid x),并验证 μ0=0\mu_0 = 0、τ=a=1\tau = a = 1 时退化为 §3.3 的公式。

参考答案

(Z,X)(Z, X) 联合高斯,Cov⁡(Z,X)=aτ2\operatorname{Cov}(Z, X) = a\tau^2,Var⁡X=a2τ2+σ2\operatorname{Var}X = a^2\tau^2 + \sigma^2。高斯条件化公式给出 E[Z∣x]=μ0+aτ2a2τ2+σ2(x−aμ0)\mathbb{E}[Z\mid x] = \mu_0 + \frac{a\tau^2}{a^2\tau^2 + \sigma^2}(x - a\mu_0),Var⁡[Z∣x]=τ2−a2τ4a2τ2+σ2=τ2σ2a2τ2+σ2\operatorname{Var}[Z\mid x] = \tau^2 - \frac{a^2\tau^4}{a^2\tau^2 + \sigma^2} = \frac{\tau^2\sigma^2}{a^2\tau^2 + \sigma^2}。代入 μ0=0\mu_0 = 0、τ=a=1\tau = a = 1 得 x1+σ2\frac{x}{1 + \sigma^2} 和 σ21+σ2\frac{\sigma^2}{1 + \sigma^2}。第 1 讲 oracle_fields.py 里”每个成分内的 E[z∣x,k]\mathbb{E}[z \mid x, k]“就是这个公式(a=ta = t、σ=1−t\sigma = 1 - t)。

练习 4(均方误差分解的应用)。设 YY 是输入、XX 是目标,gθg_\theta 是一个网络。证明 ∇θ E∥X−gθ(Y)∥2=∇θ E∥E[X∣Y]−gθ(Y)∥2\nabla_\theta\,\mathbb{E}\lVert X - g_\theta(Y)\rVert^2 = \nabla_\theta\,\mathbb{E}\lVert\mathbb{E}[X\mid Y] - g_\theta(Y)\rVert^2。为什么在实践中我们总是优化左边?

参考答案

由 §4.3 的分解,两者只差一个与 θ\theta 无关的常数,梯度相同。实践中优化左边,是因为左边只需要样本对 (yi,xi)(y_i, x_i) 就能做蒙特卡洛估计,而右边需要知道 E[X∣Y]\mathbb{E}[X\mid Y],这正是我们想学、但不知道的东西。第 2 讲:XX = 条件向量场(有公式),E[X∣Y]\mathbb{E}[X\mid Y] = 边缘向量场(没有公式)。

练习 5(散度)。计算 (a) u(x)=Axu(x) = Ax(AA 是 d×dd\times d 矩阵)的散度;(b) 高斯得分 u(x)=−(x−μ)/σ2u(x) = -(x - \mu)/\sigma^2 的散度;(c) 二维旋转场 u(x)=ω(−x2,x1)u(x) = \omega(-x_2, x_1) 的散度,并解释为什么旋转不改变密度。

参考答案

(a) tr⁡A\operatorname{tr}A。(b) −d/σ2-d/\sigma^2(处处为负,是一个”汇”:沿得分走会让粒子聚拢)。(c) ∂(−ωx2)/∂x1+∂(ωx1)/∂x2=0\partial(-\omega x_2)/\partial x_1 + \partial(\omega x_1)/\partial x_2 = 0:旋转把一小块区域转一个角度,不改变它的面积,所以由 §6.2,log⁡det⁡J\log\det J 不变,密度沿轨迹不变。

练习 6(拉普拉斯算子的平均值性质)。用二阶泰勒展开证明二维中”圆周平均 −f(c)≈r24Δf(c)- f(c) \approx \frac{r^2}{4}\Delta f(c)”。

参考答案

f(c+rn)≈f(c)+r∇f⋅n+r22n⊤Hnf(c + r n) \approx f(c) + r\nabla f\cdot n + \frac{r^2}{2}n^\top H n。在单位圆上对 n=(cos⁡a,sin⁡a)n = (\cos a, \sin a) 平均:一次项平均为 0;n12‾=n22‾=12\overline{n_1^2} = \overline{n_2^2} = \frac{1}{2}、n1n2‾=0\overline{n_1n_2} = 0,所以二次项平均为 r22⋅12(H11+H22)=r24Δf\frac{r^2}{2}\cdot\frac{1}{2}(H_{11} + H_{22}) = \frac{r^2}{4}\Delta f。dd 维时是 r22dΔf\frac{r^2}{2d}\Delta f。

练习 7(线性流的瞬时变量替换)。对 ut(x)=−θxu_t(x) = -\theta x(dd 维)、X0∼N(0,I)X_0 \sim \mathcal{N}(0, I):(a) 由第 1 讲 §2.4,XtX_t 服从什么分布?(b) 用 log⁡pt(Xt)=log⁡p0(X0)−∫0tdiv⁡u\log p_t(X_t) = \log p_0(X_0) - \int_0^t\operatorname{div}u 计算,并核对 (a)。

参考答案

(a) Xt=e−θtX0∼N(0,e−2θtI)X_t = e^{-\theta t}X_0 \sim \mathcal{N}(0, e^{-2\theta t}I)。(b) div⁡u=−θd\operatorname{div}u = -\theta d,所以 log⁡pt(Xt)=log⁡p0(X0)+θdt\log p_t(X_t) = \log p_0(X_0) + \theta d t。用 (a):log⁡pt(Xt)=−∥Xt∥22e−2θt−d2log⁡(2πe−2θt)=−∥X0∥22−d2log⁡2π+θdt\log p_t(X_t) = -\frac{\lVert X_t\rVert^2}{2e^{-2\theta t}} - \frac{d}{2}\log(2\pi e^{-2\theta t}) = -\frac{\lVert X_0\rVert^2}{2} - \frac{d}{2}\log 2\pi + \theta d t,与 (b) 一致。所有粒子都被均匀地挤向原点,密度处处升高 eθdte^{\theta d t} 倍。

练习 8(编程:分布路径上的方差)。修改 02_gaussians.py 第 3 部分,把调度换成 αt=t\alpha_t = t、βt=1−t\beta_t = \sqrt{1 - t}(原课 Lab 2 用的 “SquareRootBeta”),重新打印表格。与 CondOT 路径相比,t=0.5t = 0.5 时的方差有什么不同?

参考答案(提示)

方差 αt2s2+βt2=t2s2+(1−t)\alpha_t^2 s^2 + \beta_t^2 = t^2 s^2 + (1 - t)。t=0.5t = 0.5 时为 0.04+0.5=0.540.04 + 0.5 = 0.54,而 CondOT 路径是 0.04+0.25=0.290.04 + 0.25 = 0.29:1−t\sqrt{1 - t} 让噪声在中途保留得更多、消失得更晚(直到 tt 接近 1 才快速下降)。第 2 讲会比较不同调度对生成轨迹的影响。


11. 延伸阅读 · Further reading

  • 原课讲义附录 A(概率回顾)和附录 B(Fokker–Planck 方程的证明,用到本讲 §5 的分部积分和散度)。
  • 概率论入门:Blitzstein & Hwang, Introduction to Probability(第 2 版,CRC,免费在线),第 7 章(联合分布)和第 9 章(条件期望)讲得非常直观。
  • 多元高斯与条件化:Bishop, Pattern Recognition and Machine Learning,§2.3(高斯的边缘与条件分布,包括练习 3 的公式)。
  • 变量替换与归一化流:Papamakarios et al., Normalizing Flows for Probabilistic Modeling and Inference(JMLR 2021),第 2 节;瞬时变量替换见 Chen et al., Neural Ordinary Differential Equations(NeurIPS 2018)的定理 1。
  • 向量微积分的几何直觉:Schey, Div, Grad, Curl, and All That(Norton),薄薄一本,用流体的语言讲散度、通量和散度定理。
  • 本仓库的相关讲义:CMU10-423 前置讲 P2 概率工具箱从离散时间扩散和 VAE 的角度讲了 KL 散度、ELBO 和重参数化,可与本讲互补。

12. 下一篇预告 · Next

前置讲 P2讲这门课的代码里用到的 PyTorch 工具:张量的形状与广播(以及一个在流匹配代码里极其常见的形状 bug)、自动求导与三种算得分函数的方法、散度的精确计算与随机估计、nn.Module 与训练循环、可复现性,以及怎样画向量场。读完 P2,就可以进入第 2 讲:用本讲的条件期望和均方误差分解,从零推导并实现流匹配。

← 返回课程目录