AI Hero Club

扩散模型与 Flow Matching · 第 4 章

已自行标记完成0 / 8

仅保存在当前浏览器;完成标记不代表通过项目验收。

本章提纲 9 个小节
全课目录 8 章
完整课程计划 ↗
扩散模型与 Flow Matching / 课程计划 ↗

CHAPTER 04 / 8建议学习 180 分钟

Score、去噪恒等式与概率流ODE

同一密度演化为什么对应两种 score 系数:概率流 ODE 中的二分之一与反向 SDE 中的一?

本章要解决的 3 个问题
  • 推导条件score的后验平均与平均去噪式
  • 从测试函数展开得到密度演化
  • 核对反向SDE与概率流ODE的方向和系数
课程项目 ZIP ↓

任务:区分密度梯度、平均去噪与随机反向漂移

本章用连续时间 rr 表示从数据向噪声的正向过程,与下一章流项目从噪声向数据的 tt 不同。对一个严格正且可微的密度 pr(x)p_r(x),定义 score 为 sr(x)=∇xlog⁡pr(x)s_r(x)=\nabla_x\log p_r(x),即对空间坐标求对数密度梯度。它给出局部密度增长最快的方向,不是样本质量评分,也不是概率本身。不同时间有不同密度,因此同一个位置的 score 也依赖时间。

先考虑条件加噪 Xr=arZ+σrϵX_r=a_r Z+\sigma_r\epsilon,其中 ZZ 为干净数据、ϵ\epsilon 为独立标准正态,标量 ara_r 与 σr\sigma_r 已知,且当前 σr>0\sigma_r>0。固定干净值 zz 后,条件密度是均值 arza_rz、协方差 σr2I\sigma_r^2I 的高斯。对其对数的二次项求导,得到条件 score 为负的残差除方差,即 −(x−arz)/σr2-(x-a_rz)/\sigma_r^2,也等于 −ϵ/σr-\epsilon/\sigma_r。

一、条件监督为何能学习边缘score

边缘密度是把条件密度对干净数据分布积分。假设可交换微分与积分,先对这个积分求梯度,再除以边缘密度。把每项乘除同一个条件密度,就出现干净数据在观察到 xx 后的后验权重。由此得到边缘 score 等于条件 score 的后验平均,而不是所有干净样本条件 score 的无权平均。这个推导既解释了去噪监督,也指出在低密度点作估计可能受样本不足影响。

sr(x)=E[−ϵσr | Xr=x],E[Z∣Xr=x]=x+σr2sr(x)ars_r(x)=\mathbb E\left[-\frac{\epsilon}{\sigma_r}\,\middle|\,X_r=x\right],\qquad \mathbb E[Z\mid X_r=x]=\frac{x+\sigma_r^2s_r(x)}{a_r}
右边的去噪式另需 a_r≠0;它返回后验均值,不保证是某个真实簇中心。

第二式只需把原加噪关系在给定当前点时取条件期望,并用第一式替换噪声均值,再移项。若用平方误差训练一个函数逼近条件 score 标签,条件期望的正交投影性质保证理想最优函数为边缘 score。实际网络可能有容量和优化误差,训练平均误差小也不保证所有空间位置准确;特别是采样轨迹进入训练覆盖不足的区域时,局部错误会积累。

当使用噪声网络参数化 score 时,除以 σr\sigma_r 会让 score MSE 相当于按 1/σr21/\sigma_r^2 加权的噪声 MSE。靠近零噪声端,这个权重可能很大,甚至在端点不可定义。不同时间加权不是无关紧要的实现细节。我们只在正噪声的内部时刻使用这些恒等式;端点值若存在,应通过已证明的极限或单独的模型约定处理,不能把无穷权重直接交给优化器。

算例一:平均去噪不是识别隐藏答案

设某时刻 ar=0.6a_r=0.6、噪声方差为零点六四,观察值为零点六;一个已知精确 score 在这里等于负零点五。则噪声条件均值是负标准差乘 score,即负零点八乘负零点五,得到零点四。干净条件均值为零点六加零点六四乘负零点五,再除零点六,等于约零点四六六六六七。将它与条件噪声均值代回加噪关系,得到零点二八加零点三二,恰好为观察值零点六。

这个检查只证明后验平均满足均值关系,不能证明实际抽到的干净点就是零点四六六六六七。在双峰数据的中心,后验均值还可能位于两个模式之间的低密度区域。直接一次输出这个均值,通常会使分布过度收缩;多步生成需要更新整个随机状态分布,而不是把每个时刻都压成一个最可能答案。去噪估计与完整生成过程承担不同责任。

二、由随机微分方程得到密度演化

令正向随机过程满足 dXr=fr(Xr)dr+grdWrdX_r=f_r(X_r)dr+g_r dW_r。其中 frf_r 是漂移向量,grg_r 是只依赖时间的标量扩散系数,WrW_r 为各坐标独立的布朗运动;其短时间增量均值为零、协方差为时间间隔乘单位阵。随机项的典型尺度是时间间隔的平方根,不是时间间隔本身。这里不涉及状态相关扩散矩阵,后者需要额外的散度项,不能直接沿用本章公式。

把一段随机位移逐项变成密度方程

先只做一维推导。空间坐标是x,当前时间是r,短间隔记作Δr。扩散系数g_r只依赖时间;漂移f_r(x)可以依赖位置。假设系数足够光滑、过程有有限的局部矩,且接下来的Taylor余项在取期望并除以Δr后趋于零。布朗增量满足E[ΔW]=0、E[(ΔW)²]=Δr;这不是把随机项替换为零,因为平方项会保留下来。将短时增量的系数冻结在当前状态时,ΔX=f_r(x)Δr+g_rΔW加上高阶项。

E[ΔX∣x]=fr(x)Δr+o(Δr),E[(ΔX)2∣x]=gr2Δr+o(Δr)\mathbb E[\Delta X\mid x]=f_r(x)\Delta r+o(\Delta r),\qquad \mathbb E[(\Delta X)^2\mid x]=g_r^2\Delta r+o(\Delta r)
漂移平方为O(Δr²);漂移与布朗项的交叉期望为零到一阶,所以一阶二次矩只留下g²。

选择一个二次可微的测试函数φ,它不是密度,而是用来观察随机位置的任意平滑量,例如位置或位置平方。展开φ(x+ΔX):常数项φ(x),一次项φ′(x)ΔX,二次项为二分之一φ″(x)(ΔX)²。先对当前x的条件分布取期望,再减φ(x)、除以Δr并取极限。这个极限定义正向生成算子L_r作用于函数φ;它把一个观察量变成该观察量的瞬时条件变化率。

Lrϕ=frϕ′+gr22ϕ′′,ddrE[ϕ(Xr)]=∫pr(x)Lrϕ(x) dxL_r\phi=f_r\phi^{\prime}+\frac{g_r^2}{2}\phi^{\prime\prime},\qquad \frac{d}{dr}\mathbb E[\phi(X_r)]=\int p_r(x)L_r\phi(x)\,dx
二分之一来自Taylor二阶项,不来自任选的去噪权重。

现在将导数从φ移到密度。记[f p φ]边界项为零,可以让φ有紧支撑,或要求各函数在无穷远衰减得足够快。一次分部积分使∫pfφ′=−∫(fp)′φ;扩散项连续做两次分部积分,∫pφ″=∫p″φ,两个负号抵消。定义伴随算子L_r*作用于密度p为−(f_r p)′+(g_r²/2)p″。星号在这里是相对于积分配对的伴随,不是复共轭。

∫pLrϕ dx=∫ϕLr∗p dx,∂rp=Lr∗p=−(frp)′+gr22p′′\int pL_r\phi\,dx=\int\phi L_r^*p\,dx,\qquad \partial_r p=L_r^*p=-(f_rp)^{\prime}+\frac{g_r^2}{2}p^{\prime\prime}
等式对足够丰富的测试函数成立,从而给出弱形式密度方程;光滑时可读成逐点等式。

最后使用s=p′/p,即p′=ps,将扩散项写成(g²/2)(ps)′。于是密度方程成为∂r p=−[p(f−g²s/2)]′,恰好是确定性搬运速度v=f−g²s/2的连续性方程。原随机过程与ODE不是同一条路径;在相同初始密度、解存在且密度演化具有所需唯一性条件下,它们有相同的单时刻边缘。这里明确导入这种存在性与唯一性条件,而不靠一次Taylor展开证明所有随机过程定理。

对光滑测试函数 ϕ(x)\phi(x),二阶Taylor展开后取条件期望。一次漂移给出 f⋅∇ϕf\cdot\nabla\phi,布朗增量的二阶矩给出一半 g2Δϕg^2\Delta\phi;更高阶项在时间间隔趋零后消失。再对当前密度积分,并在边界项消失时分部积分,将导数从测试函数移到密度,得到Fokker–Planck方程。符号 ∇⋅\nabla\cdot 是向量场的散度,Δ\Delta 是各坐标二阶导数之和。

∂rpr=−∇ ⁣⋅(frpr)+12gr2Δpr=−∇ ⁣⋅[(fr−12gr2sr)pr]\partial_r p_r=-\nabla\!\cdot(f_rp_r)+\tfrac12g_r^2\Delta p_r=-\nabla\!\cdot\left[\left(f_r-\tfrac12g_r^2s_r\right)p_r\right]
使用 p∇log p=∇p,把扩散项写成概率流的散度。

于是确定性ODE速度 vr=fr−12gr2srv_r=f_r-\tfrac12g_r^2s_r 满足同一密度连续性方程,在相同起始分布及足够正则条件下可具有相同的单时刻边缘。这叫概率流ODE。它不表示单条ODE轨迹等于原随机轨迹,也不表示两种过程的联合时间分布相同。构造不同随机路径却匹配边缘是可能的;本课评价样本分布时关心边缘,但解释路径时不能省略差别。

三、反向时间和二分之一不能弄混

反向生成算子的乘积展开:一整份score从哪里来

仍取一维且g只依赖时间。令反向时间u=R−r增大,给定当前位置后,用短步贝叶斯条件核重排正向转移。在正密度与足够正则的条件下,这个反向过程的局部生成算子可以写成下面的伴随组合。这个组合公式是本节导入的时间反演结果;我们接下来完整执行其中的微分代数,而不把一般时间反演存在性当作已经由基本导数证明。

Lˉuϕ=Lr∗(prϕ)−ϕLr∗prpr,r=R−u\bar L_u\phi=\frac{L_r^*(p_r\phi)-\phi L_r^*p_r}{p_r},\qquad r=R-u
分母是给定当前位置的密度;p_r>0才允许逐点除法。

先展开漂移部分。−(fpφ)′+φ(fp)′=−(fp)′φ−fpφ′+φ(fp)′=−fpφ′。再展开扩散部分:(pφ)″=p″φ+2p′φ′+pφ″;减去φp″后,常数密度二阶导数项消失,剩2p′φ′+pφ″。乘上原来的g²/2,交叉项的系数二与Taylor的一半抵消,所以出现g²p′φ′。

Lr∗(pϕ)−ϕLr∗p=(−fp+gr2p′)ϕ′+gr22pϕ′′L_r^*(p\phi)-\phi L_r^*p=(-fp+g_r^2p^{\prime})\phi^{\prime}+\frac{g_r^2}{2}p\phi^{\prime\prime}
每个消去项和留下的交叉项都来自乘积求导;这里不能把g²误变成g²/2。
Lˉuϕ=(−fr+gr2sr)ϕ′+gr22ϕ′′\bar L_u\phi=(-f_r+g_r^2s_r)\phi^{\prime}+\frac{g_r^2}{2}\phi^{\prime\prime}
与生成算子“漂移×φ′+扩散平方/2×φ″”对照,读出反向SDE漂移与扩散。

因此反向SDE漂移是−f+g²s,并保留扩散g;反向概率流ODE直接反向原ODE时间,漂移为−f+g²s/2且没有布朗项。两者都能给反向密度,但补偿扩散的工作不同。如果g依赖空间,前面把g²移到微分外的步骤失效,会增加导数项,不能把这组式子原样套用。

为写从噪声回数据的过程,令新时间 u=R−ru=R-r 随生成向前增加。反向扩散保留扩散强度,漂移变为 −fr+gr2sr-f_r+g_r^2s_r。可以用贝叶斯短步转移核证明:反向测试函数生成元等于正向伴随生成元作用于 prϕp_r\phi,减去 ϕ\phi 乘它对 prp_r 的作用,再除 prp_r。展开乘积导数后,漂移项给出负 frf_r,拉普拉斯的交叉导数给出一整份 gr2∇log⁡prg_r^2\nabla\log p_r,剩下扩散生成元不变。这也解释为何不是半份score。

dYu=[−fR−u(Yu)+gR−u2sR−u(Yu)]du+gR−udWˉudY_u=\left[-f_{R-u}(Y_u)+g_{R-u}^2s_{R-u}(Y_u)\right]du+g_{R-u}d\bar W_u
反向SDE的时间 u 增大;反向概率流ODE则把正向 v 直接取负,只有半份score校正。

这个推理要求正密度、可用的条件转移、足够光滑及无问题的边界。若只把正向随机增量乘负号,并不能得到反向布朗路径的正确条件分布;新随机噪声不是训练时原噪声的逐项倒放。把反向ODE漂移与反向SDE噪声混搭,也一般不会保持目标密度,因为其扩散贡献没有得到对应补偿。实现时必须成套固定漂移、扩散和时间方向。

算例二:一个系数错误就改变概率流

取方差保持型正向过程的当前参数为 f(x)=−xf(x)=-x、g2=2g^2=2;设当前边缘是均值零、方差零点二五的一维高斯,所以在 x=1x=1 处score为负四。正向概率流速度是负一减一乘负四,得到三;生成方向的反向ODE速度是负三。反向SDE漂移却为一加二乘负四,得到负七,还要同时加入扩散系数根号二的新噪声。负三与负七不是矛盾,它们描述不同过程。

独立检查方差导数:正向SDE给出方差变化率负二乘零点二五加二,得到一点五。概率流在这个瞬间为每个位置三倍自身,方差变化率为六乘零点二五,也是一点五。因此半份score在ODE中恰好补偿了被移除的随机扩散项。若把整份score用于正向ODE,方差导数将不匹配,这个矩检查比仅观察一条轨迹方向更有辨别力。

另一个极简阳性对照是标准正态的平稳过程:漂移为负的当前位置、扩散平方为二,当前score也是负的当前位置。正向概率流速度因此为零,密度确实保持不变;反向SDE漂移仍为负的当前位置,依靠扩散和收缩平衡维持同一正态。若把半份score误用于反向SDE,漂移变成零而扩散仍存在,结果退化为布朗运动,方差持续增加。这个反例不需要复杂数据,就能检测ODE与SDE系数混搭。

score还带有坐标尺度。若令新坐标等于旧坐标乘一个正标量,密度因变量替换多一个雅可比常数,对数求新坐标梯度后,score大小应除以该标量。它不是可以脱离数据单位直接迁移的任意向量。原坐标的score拿到放大十倍的坐标上直接使用,会使去噪校正不符合变换后的概率模型;标准化参数必须与网络和采样器一起保存。

理论关系与程序检查仍应分工。项目通过对解析混合对数密度自动求空间梯度,并与独立写出的责任度score比较,核对了本任务的score公式。它没有训练score网络,没有进行图像随机逆扩散,也没有证明任意神经向量场都是某个密度的梯度。把一个测试通过写成这些更强的功能,会超出实际调用链提供的证据。

独立运行核对score导数、漂移系数及方差变化率。
from math import log,pi
def log_density(x):return -0.5*log(2*pi*0.25)-x*x/(2*0.25)
h=1e-5
score=(log_density(1+h)-log_density(1-h))/(2*h)
assert abs(score+4)<1e-8
f=-1;g2=2
forward_ode=f-0.5*g2*score
reverse_sde=-f+g2*score
assert abs(forward_ode-3)<1e-8
assert abs(reverse_sde+7)<1e-8
assert abs((-2*0.25+2)-6*0.25)<1e-12
print(score,forward_ode,reverse_sde)
独立运行用方差变化率独立区分反向ODE、反向SDE和故意错系数版本。
# 确定性计算一阶短步矩;不靠有限Monte Carlo噪声掩盖系数错误。
variance=0.25;g2=2.0;h=1e-6
# 此刻f=-x、score=-x/variance=-4x。
forward_ode=-1+g2/(2*variance)  # 3
reverse_ode=-forward_ode       # -3
reverse_sde=1-g2/variance      # -7
rate_forward=((1+h*forward_ode)**2*variance-variance)/h
rate_ode=((1+h*reverse_ode)**2*variance-variance)/h
rate_sde=((1+h*reverse_sde)**2*variance+g2*h-variance)/h
wrong_reverse_sde=1-g2/(2*variance)  # 错把一整份score减成一半
rate_wrong=((1+h*wrong_reverse_sde)**2*variance+g2*h-variance)/h
assert abs(rate_forward-1.5)<2e-5
assert abs(rate_ode+1.5)<2e-5 and abs(rate_sde+1.5)<2e-5
assert abs(rate_wrong+1.5)>1.9
print(dict(forward=rate_forward,reverse_ode=rate_ode,reverse_sde=rate_sde,wrong=rate_wrong))

练习与完整解答

TRY IT YOURSELF

练习一|缩放后的高斯score

密度为均值三、方差四的一维高斯,在 x=1x=1 的score是多少?为什么未知归一化常数不影响结果?

提示 1
先写高斯log密度中依赖x的二次项,常数另放一边。
提示 2
对x求导再代入点位,检查符号是否指向均值;只对位置不变的归一化因子导数为零。
对照参考解答
对数密度中与位置有关的项是负的“位置减三”平方除以八。求导得负的“位置减三”除以四;代入一,得到正零点五,方向指向均值三。归一化常数对位置不变,其对数导数为零,所以score不需要知道常数的数值。但这不意味着任意向量场都来自某个可归一化密度,也不意味着可以忽略时间依赖;这里只是在已有合法高斯密度下求导。

TRY IT YOURSELF

练习二|混合责任度

某位置属于两类的后验权重为0.9和0.1,两类条件score分别为2和−6,求边缘score。直接等权平均有何错误?

提示 1
观察当前x之后,两类仍等可能吗?使用的是先验还是后验权重?
提示 2
逐项按责任度加权条件score,再与等权平均和硬选类比较,检查方向是否可能改变。
对照参考解答
按后验责任度加权,边缘score为零点九乘二加零点一乘负六,得到一点二。直接等权平均得到负二,连方向都相反。因为观察这个位置后,两个类别并不是同等可能;密度求导再除以边缘密度自然产生位置依赖权重。这个解也能用“各条件密度梯度求和,再除总密度”的定义复核。将最近类别硬选为第一类得到二,虽然方向相同,也不是精确的后验平均。

TRY IT YOURSELF

练习三|发现随机离散化的尺度错误

程序用步长h=0.01,将布朗增量写成h乘标准正态。正确随机系数是什么?错误实现的方差少了多少倍?

提示 1
布朗增量的方差应等于h,系数乘Z后方差是系数的平方。
提示 2
分别平方正确与错误系数,比较方差比;可重复独立单步验证随h的线性标度。
对照参考解答
标准布朗增量方差等于时间间隔,所以正确系数是根号零点零一,即零点一;错误系数零点零一导致方差零点零零零一,而正确方差为零点零一,相差一百倍。如果漂移不变而随机扩散被缩小,模拟的是另一条过程,不能期待同一个Fokker–Planck方程。检验时应大量重复单步更新,测增量方差与步长的线性关系,而不是靠一条轨迹看起来“比较平滑”判断正确。

CHECK YOUR UNDERSTANDING

检验理解

先作答,再决定是否展开解析。选择题用于发现理解缺口;独立实现与迁移任务仍需另行检验。

1. score对哪个变量求导?

查看解析定义是空间对数密度梯度。
2. 概率流ODE与原SDE相同什么?

查看解析路径及联合时间分布一般不同。
3. 反向SDE在增加的生成时间里score系数是?

查看解析漂移为−f+g²score,不能与反向ODE混搭。
4. σ为零能直接用噪声除σ训练score吗?

查看解析除零不是数值精度问题,而是公式定义域问题。

自行标记用于记录学习进度,不代表通过项目验收。