来源:Song 等,2021,arXiv:2011.13456,§4.3(概率流 ODE 的两个用处:精确似然、可逆编码)+ 附录 D。
记号:沿用前面。本节主角是 §6 那条确定性、可逆的概率流 ODE;记它的速度场为 $h(x,t)=f-\tfrac12 g^2\nabla\log p_t$(就是 §6 那条 ODE 的右边)。
读法:§8.1 先讲清「精确似然」这四个字本身;§8.2 概率流 ODE 怎么把它算出来(散度、Hutchinson 各一个折叠);§8.3 可逆编码与隐空间编辑。难的推理都在折叠里,主线读下来不卡。
---
## §8.1 「精确似然」是什么
似然(人话:模型给一张具体图打的可能性得分)。一个生成模型学到的是一个分布 $p_{\text{模型}}$;把任意一张图 $x_0$ 代进去,得到的密度值 $p_{\text{模型}}(x_0)$ 就是这张图的似然——「在这个模型看来,这张图有多像它会生成的东西」。一维版早就会:知道分布是 $N(0,\sigma^2)$,把一个点代进密度公式就得一个数;图像同理,只是维度高、分布是网络学出来的。
它干嘛用:给模型打分。拿一批测试图,算平均 $\log p_{\text{模型}}$——模型把概率质量铺得越像真实数据,这个数越高。论文报的 2.99 bits/dim 就是它的单位换算:对数密度折算成「平均每个像素要用多少比特编码」(换算带负号,方向反过来:bits/dim 越低越好)。此外还能比较两个模型谁学得像、判断一张图在模型眼里正常不正常。
「精确」对着什么说:对着「只能估下界」说。很多生成模型的训练目标只是 $\log p$ 的一个下界(DDPM 的训练目标就是一例):能保证真值不低于某个数,但差多少不知道,报出来的是保守分。**概率流 ODE 给的不是下界——它能把 $\log p_{\text{模型}}(x_0)$ 本身算出来,误差只剩数值积分的精度。**凭什么能,§8.2 讲。
---
## §8.2 怎么算:瞬时变量替换
这一步:给出那条公式和三步算法;两个新对象(散度、Hutchinson)各进一个折叠。
**概率流 ODE 是确定、可逆的变换(§6):每张图沿它积分到 $T$ 有唯一落点,且 $T$ 端分布是已知高斯。**剩下只需要一条「密度沿轨迹怎么变」的公式(连续标准化流的经典结果,论文直接引用):
> [!danger] Score-SDE 论文 · 瞬时变量替换公式(精确似然,§4.3)
> 沿 ODE $\dot x=h(x,t)$ 走,样本所在点的对数密度,变化率等于速度场的散度取负:
> $\frac{\mathrm d}{\mathrm dt}\log p_t\big(x(t)\big)=-\nabla\!\cdot h(x,t)$
> 把它沿轨迹从 $0$ 积到 $T$,就能用 $T$ 时刻已知的高斯密度,精确反推出 $0$ 时刻那张数据图的密度 $\log p_0(x_0)$。
算法三步:**把数据点 $x_0$ 沿 ODE 积到 $x_T$($x_T$ 服从已知高斯,密度可直接写出);一路把 $-\nabla\!\cdot h$ 累加;两者相加就是精确的 $\log p_0(x_0)$**。
> [!note]- 散度 $\nabla\!\cdot h$ 是什么(就是附A §A.6 那个散度,从一维重讲)
> 一维先看:$\nabla\!\cdot h$ 就是 $\dfrac{\partial h}{\partial x}$——速度随位置的变化率。它管的事:你脚下这一小段是被拉开还是被压紧。若前面的点走得比你快、后面的比你慢($\dfrac{\partial h}{\partial x}>0$),这一小段就被拉开;点还是那些点、占的地盘变大,密度就降。点数守恒 ⇒ 密度 × 地盘 = 常数(附A §A.1 的记账),所以对数密度的变化率 = 负的拉伸率:
> $\frac{\mathrm d}{\mathrm dt}\log p=-\frac{\partial h}{\partial x}\qquad\text{(一维版的瞬时变量替换)}$
> 升维:每个方向各有一份拉伸率 $\dfrac{\partial h_i}{\partial x_i}$,总拉伸率是各方向加总:
> $\nabla\!\cdot h=\sum_i\frac{\partial h_i}{\partial x_i}$
> 这正是附A §A.6 升维时出现的那个散度(各方向净流出之和),同一个东西。
> 为什么难算:图像有 $D$ 个维度(百万级),$D$ 份 $\dfrac{\partial h_i}{\partial x_i}$ 每份都要对网络求一次导——算一张图的密度要做上百万次求导,太贵。便宜的算法在下一个折叠。
> [!note]- Hutchinson 迹估计(人话:用随机向量抽查,代替逐项求导;Hutchinson 是提出者的人名)
> 先备两个词。把「每个输出分量对每个输入分量的偏导」排成一张表,这张表叫雅可比矩阵(人话:谁对谁的导数的总表;记 $A$,$A_{ij}=\dfrac{\partial h_i}{\partial x_j}$)。表的对角线加总有个名字叫迹(trace,记 $\mathrm{tr}$)。上个折叠要算的散度,正是这张表的对角线加总:$\nabla\!\cdot h=\mathrm{tr}(A)$。
> Hutchinson 的恒等式:取随机向量 $v$,各分量独立、均值 $0$、方差 $1$(例如各分量等概率取 $\pm1$),则
> $\mathrm{tr}(A)=\mathbb E_v\big[v^\top A\,v\big]$
> 为什么成立(期望逐项,§3.4 Itô 折叠第 5 步同款动作):$v^\top Av=\sum_{i,j}A_{ij}\,v_i v_j$;取期望,$i\neq j$ 的项 $\mathbb E[v_iv_j]=\mathbb E[v_i]\,\mathbb E[v_j]=0$(独立、均值零)全部归零,$i=j$ 的项 $\mathbb E[v_i^2]=1$ 存活,剩下 $\sum_i A_{ii}=\mathrm{tr}(A)$。
> 便宜在哪:$v^\top Av$ 里真正要算的是 $Av$,它是「向量 × 雅可比」的整体,自动微分一次反传直接给出——用不着把 $D$ 条对角线逐条求出来。抽几个 $v$ 求平均即可,无偏。论文实际算 bits/dim 用的就是这招。
这条通道要的三样:变换确定、可逆、散度可算——概率流 ODE 全满足。反向 SDE 带随机,同一起点每次落点不同,构不成「一张图 ↔ 一个密度」的对应,走不了这条通道——这正是 §6 那句「一一对应是 ODE 的本钱」的兑现处。
---
## §8.3 可逆编码与隐空间编辑
这一步:用「确定可逆」这条性质,做插值和编辑。
概率流 ODE 是确定的:同一张图 $x_0$ 正向积分,每次都得到同一个隐变量 $x_T$(反向 SDE 带随机,同一张图每次积分落点不同)。**正向积分 = 编码(图 → 隐变量),反向积分 = 解码(隐变量 → 图),两个方向严格互逆。于是每张图有一个唯一确定的隐表示**(论文称「uniquely identifiable encoding」)。
有了这个可逆编码,就能做隐空间操作:
- 插值/变形:把两张图各自编码成 $x_T^{(1)}、x_T^{(2)}$,在隐空间里沿直线插值,再解码回去,得到两张图之间语义平滑的过渡(是有意义的渐变,而非像素淡入淡出)。
- 编辑:在隐空间里沿某方向移动一点再解码,对应图像上一处有意义的改变。
直觉:映射确定、可逆、且随噪声尺度平滑,隐空间里「挨得近」对应图像上「像得多」,所以在隐空间里动手脚是受控的。
---
## 本节一条线
似然 = 模型给一张图打的密度得分;「精确」= 给的是真值本身,而非下界。概率流 ODE 因确定可逆,用瞬时变量替换 $\frac{\mathrm d}{\mathrm dt}\log p_t=-\nabla\!\cdot h$ 把数据点积到已知高斯、一路累加散度,得到精确 $\log p_0(x_0)$(散度 = 各方向拉伸率之和 = 雅可比的迹,Hutchinson 用随机向量把算迹变成一次反传),论文以此报 2.99 bits/dim。可逆还给出唯一编码:正向积分编码、反向解码,隐空间里可做语义插值与编辑。这两条红利都靠「确定可逆 + 散度可算」,反向 SDE 因带随机而没有。下一节(§9)回到工程:把 score 网络调强、刷结果。