任务:区分密度梯度、平均去噪与随机反向漂移
本章用连续时间 表示从数据向噪声的正向过程,与下一章流项目从噪声向数据的 不同。对一个严格正且可微的密度 ,定义 score 为 ,即对空间坐标求对数密度梯度。它给出局部密度增长最快的方向,不是样本质量评分,也不是概率本身。不同时间有不同密度,因此同一个位置的 score 也依赖时间。
先考虑条件加噪 ,其中 为干净数据、 为独立标准正态,标量 与 已知,且当前 。固定干净值 后,条件密度是均值 、协方差 的高斯。对其对数的二次项求导,得到条件 score 为负的残差除方差,即 ,也等于 。
一、条件监督为何能学习边缘score
边缘密度是把条件密度对干净数据分布积分。假设可交换微分与积分,先对这个积分求梯度,再除以边缘密度。把每项乘除同一个条件密度,就出现干净数据在观察到 后的后验权重。由此得到边缘 score 等于条件 score 的后验平均,而不是所有干净样本条件 score 的无权平均。这个推导既解释了去噪监督,也指出在低密度点作估计可能受样本不足影响。
第二式只需把原加噪关系在给定当前点时取条件期望,并用第一式替换噪声均值,再移项。若用平方误差训练一个函数逼近条件 score 标签,条件期望的正交投影性质保证理想最优函数为边缘 score。实际网络可能有容量和优化误差,训练平均误差小也不保证所有空间位置准确;特别是采样轨迹进入训练覆盖不足的区域时,局部错误会积累。
当使用噪声网络参数化 score 时,除以 会让 score MSE 相当于按 加权的噪声 MSE。靠近零噪声端,这个权重可能很大,甚至在端点不可定义。不同时间加权不是无关紧要的实现细节。我们只在正噪声的内部时刻使用这些恒等式;端点值若存在,应通过已证明的极限或单独的模型约定处理,不能把无穷权重直接交给优化器。
算例一:平均去噪不是识别隐藏答案
设某时刻 、噪声方差为零点六四,观察值为零点六;一个已知精确 score 在这里等于负零点五。则噪声条件均值是负标准差乘 score,即负零点八乘负零点五,得到零点四。干净条件均值为零点六加零点六四乘负零点五,再除零点六,等于约零点四六六六六七。将它与条件噪声均值代回加噪关系,得到零点二八加零点三二,恰好为观察值零点六。
这个检查只证明后验平均满足均值关系,不能证明实际抽到的干净点就是零点四六六六六七。在双峰数据的中心,后验均值还可能位于两个模式之间的低密度区域。直接一次输出这个均值,通常会使分布过度收缩;多步生成需要更新整个随机状态分布,而不是把每个时刻都压成一个最可能答案。去噪估计与完整生成过程承担不同责任。
二、由随机微分方程得到密度演化
令正向随机过程满足 。其中 是漂移向量, 是只依赖时间的标量扩散系数, 为各坐标独立的布朗运动;其短时间增量均值为零、协方差为时间间隔乘单位阵。随机项的典型尺度是时间间隔的平方根,不是时间间隔本身。这里不涉及状态相关扩散矩阵,后者需要额外的散度项,不能直接沿用本章公式。
把一段随机位移逐项变成密度方程
先只做一维推导。空间坐标是x,当前时间是r,短间隔记作Δr。扩散系数g_r只依赖时间;漂移f_r(x)可以依赖位置。假设系数足够光滑、过程有有限的局部矩,且接下来的Taylor余项在取期望并除以Δr后趋于零。布朗增量满足E[ΔW]=0、E[(ΔW)²]=Δr;这不是把随机项替换为零,因为平方项会保留下来。将短时增量的系数冻结在当前状态时,ΔX=f_r(x)Δr+g_rΔW加上高阶项。
选择一个二次可微的测试函数φ,它不是密度,而是用来观察随机位置的任意平滑量,例如位置或位置平方。展开φ(x+ΔX):常数项φ(x),一次项φ′(x)ΔX,二次项为二分之一φ″(x)(ΔX)²。先对当前x的条件分布取期望,再减φ(x)、除以Δr并取极限。这个极限定义正向生成算子L_r作用于函数φ;它把一个观察量变成该观察量的瞬时条件变化率。
现在将导数从φ移到密度。记[f p φ]边界项为零,可以让φ有紧支撑,或要求各函数在无穷远衰减得足够快。一次分部积分使∫pfφ′=−∫(fp)′φ;扩散项连续做两次分部积分,∫pφ″=∫p″φ,两个负号抵消。定义伴随算子L_r*作用于密度p为−(f_r p)′+(g_r²/2)p″。星号在这里是相对于积分配对的伴随,不是复共轭。
最后使用s=p′/p,即p′=ps,将扩散项写成(g²/2)(ps)′。于是密度方程成为∂r p=−[p(f−g²s/2)]′,恰好是确定性搬运速度v=f−g²s/2的连续性方程。原随机过程与ODE不是同一条路径;在相同初始密度、解存在且密度演化具有所需唯一性条件下,它们有相同的单时刻边缘。这里明确导入这种存在性与唯一性条件,而不靠一次Taylor展开证明所有随机过程定理。
对光滑测试函数 ,二阶Taylor展开后取条件期望。一次漂移给出 ,布朗增量的二阶矩给出一半 ;更高阶项在时间间隔趋零后消失。再对当前密度积分,并在边界项消失时分部积分,将导数从测试函数移到密度,得到Fokker–Planck方程。符号 是向量场的散度, 是各坐标二阶导数之和。
于是确定性ODE速度 满足同一密度连续性方程,在相同起始分布及足够正则条件下可具有相同的单时刻边缘。这叫概率流ODE。它不表示单条ODE轨迹等于原随机轨迹,也不表示两种过程的联合时间分布相同。构造不同随机路径却匹配边缘是可能的;本课评价样本分布时关心边缘,但解释路径时不能省略差别。
三、反向时间和二分之一不能弄混
反向生成算子的乘积展开:一整份score从哪里来
仍取一维且g只依赖时间。令反向时间u=R−r增大,给定当前位置后,用短步贝叶斯条件核重排正向转移。在正密度与足够正则的条件下,这个反向过程的局部生成算子可以写成下面的伴随组合。这个组合公式是本节导入的时间反演结果;我们接下来完整执行其中的微分代数,而不把一般时间反演存在性当作已经由基本导数证明。
先展开漂移部分。−(fpφ)′+φ(fp)′=−(fp)′φ−fpφ′+φ(fp)′=−fpφ′。再展开扩散部分:(pφ)″=p″φ+2p′φ′+pφ″;减去φp″后,常数密度二阶导数项消失,剩2p′φ′+pφ″。乘上原来的g²/2,交叉项的系数二与Taylor的一半抵消,所以出现g²p′φ′。
因此反向SDE漂移是−f+g²s,并保留扩散g;反向概率流ODE直接反向原ODE时间,漂移为−f+g²s/2且没有布朗项。两者都能给反向密度,但补偿扩散的工作不同。如果g依赖空间,前面把g²移到微分外的步骤失效,会增加导数项,不能把这组式子原样套用。
为写从噪声回数据的过程,令新时间 随生成向前增加。反向扩散保留扩散强度,漂移变为 。可以用贝叶斯短步转移核证明:反向测试函数生成元等于正向伴随生成元作用于 ,减去 乘它对 的作用,再除 。展开乘积导数后,漂移项给出负 ,拉普拉斯的交叉导数给出一整份 ,剩下扩散生成元不变。这也解释为何不是半份score。
这个推理要求正密度、可用的条件转移、足够光滑及无问题的边界。若只把正向随机增量乘负号,并不能得到反向布朗路径的正确条件分布;新随机噪声不是训练时原噪声的逐项倒放。把反向ODE漂移与反向SDE噪声混搭,也一般不会保持目标密度,因为其扩散贡献没有得到对应补偿。实现时必须成套固定漂移、扩散和时间方向。
算例二:一个系数错误就改变概率流
取方差保持型正向过程的当前参数为 、;设当前边缘是均值零、方差零点二五的一维高斯,所以在 处score为负四。正向概率流速度是负一减一乘负四,得到三;生成方向的反向ODE速度是负三。反向SDE漂移却为一加二乘负四,得到负七,还要同时加入扩散系数根号二的新噪声。负三与负七不是矛盾,它们描述不同过程。
独立检查方差导数:正向SDE给出方差变化率负二乘零点二五加二,得到一点五。概率流在这个瞬间为每个位置三倍自身,方差变化率为六乘零点二五,也是一点五。因此半份score在ODE中恰好补偿了被移除的随机扩散项。若把整份score用于正向ODE,方差导数将不匹配,这个矩检查比仅观察一条轨迹方向更有辨别力。
另一个极简阳性对照是标准正态的平稳过程:漂移为负的当前位置、扩散平方为二,当前score也是负的当前位置。正向概率流速度因此为零,密度确实保持不变;反向SDE漂移仍为负的当前位置,依靠扩散和收缩平衡维持同一正态。若把半份score误用于反向SDE,漂移变成零而扩散仍存在,结果退化为布朗运动,方差持续增加。这个反例不需要复杂数据,就能检测ODE与SDE系数混搭。
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)# 确定性计算一阶短步矩;不靠有限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
密度为均值三、方差四的一维高斯,在 的score是多少?为什么未知归一化常数不影响结果?
提示 1
提示 2
对照参考解答
TRY IT YOURSELF
练习二|混合责任度
某位置属于两类的后验权重为0.9和0.1,两类条件score分别为2和−6,求边缘score。直接等权平均有何错误?
提示 1
提示 2
对照参考解答
TRY IT YOURSELF
练习三|发现随机离散化的尺度错误
程序用步长h=0.01,将布朗增量写成h乘标准正态。正确随机系数是什么?错误实现的方差少了多少倍?