生成模型 / 扩散与 Flow Matching 原理笔记进阶 9 分钟阅读 查看源文件 ↗

Score-based SDE#

本页内容4 个部分
查看概览图
FOUNDATIONS · 03b

ε、score 与 SDE
是同一件事的三种写法

把 DDPM 的离散步长推到 0,加噪变成一条 SDE;反向 SDE 与它的 Probability Flow ODE 共享同一族边际分布。

DDPM 视角 ε-pred 预测加进去的噪声
SCORE 视角 ∇ₓ log p_t(x) 指向密度更高处
连续视角 SDE 离散步长 → 0
三者是同一件事的三种写法:score = −ε / √(1−ᾱ_t)
∇Score function 的直觉

永远指向密度更高的方向

x →p(x)
位置 xscore = −x含义
x = 3−3(向左)离中心太远,强烈拉回
x = 1−1(向左)稍微往中心走
x = 00(停止)已经在密度最高处,不动
x = −2+2(向右)向中心拉回
取极限 Δt → 0
d离散与连续的对应

DDPM 的每一步就是 SDE 的一瞬间

  • x_t = √(1−β_t)·x_{t−1} + √β_t·εDDPM 离散(每步)
  • dx = f(x,t)dt + g(t)dwSDE 连续(每一瞬间)
    统一
  • f(x,t)dt = −(β(t)/2)·x·dt漂移项:让 x 慢慢缩小
  • g(t)dw = √β(t)·dw扩散项:加随机噪声
ODESDE
公式dx = f(x,t)dtdx = f(x,t)dt + g(t)dw
轨迹确定——同起点同路径随机——同起点不同路径
对应DDIM(确定性采样)DDPM(随机采样)
关键结论
Probability Flow ODE 与反向 SDE 边际分布相同

反向 SDE 有随机项,每条轨迹都不同、路径抖动;PF-ODE 无随机项,同 seed 路径完全一样、光滑。但一百万条轨迹的分布都是同一个 p_t(x)——这就是确定性采样器能替代随机采样器的理论依据。

score = −ε / √(1−ᾱ_t)轨迹不同,分布相同DDIM = PF-ODE 的一阶离散

组件阅读路线 · Score Function · SDE / ODE 对偶 · 统一框架

1. Score Function 与 ε 预测#

1.1 DDPM 和 Score Matching 本来是两条独立的线#

DDPM 那条线(Ho et al., 2020):从概率建模出发——定义前向马尔可夫链,推导反向马尔可夫链,优化变分下界。

Score Matching 那条线(宋飏 et al., 更早):从另一个角度——直接学习数据分布的 score function ∇xlog⁡p(x)\nabla_x \log p(x)(对数概率密度的梯度),然后用朗之万动力学(Langevin dynamics)从噪声走到数据。

2021 年宋飏(Song Yang)证明:它们本质上是同一件事,只是从不同角度描述了同一个过程。

1.2 Score Function 是什么#

Score function ∇xlog⁡p(x)\nabla_x \log p(x) 是 log⁡p(x)\log p(x) 对 xx 的梯度。梯度的定义就是"指向函数值增大最快的方向",而 log⁡\log 单调递增,所以 log⁡p\log p 增大 = pp 增大 = 概率密度更高。直觉上:想象数据分布 p(x)p(x) 是一座山峰(高密度区域在山顶),score function 就是每个点上"指向山顶的方向"。从噪声出发,沿着 score function 走,就会一步步爬向山顶——数据最集中的区域。

用具体例子理解 Score Function#

假设数据分布是一维高斯 p(x)=N(0,1)p(x) = \mathcal{N}(0, 1),一步一步算:

p(x)=12π e−x2/2p(x) = \frac{1}{\sqrt{2\pi}}\, e^{-x^2/2}

log⁡p(x)=−x22+const\log p(x) = -\frac{x^2}{2} + \text{const}

∇xlog⁡p(x)=ddx ⁣(−x22)=−x\nabla_x \log p(x) = \frac{d}{dx}\!\left(-\frac{x^2}{2}\right) = -x

score function 就是 −x-x——位置越偏,往回拉的力越大

3b_SDE 图1

三个函数的关系:p(x) → 取 log → log p(x) → 对 x 求导 → score function

代入几个具体的点:

位置 xx score = −x-x 含义
x=3x = 3(右侧偏远) −3-3(向左) 离中心太远,强烈拉回
x=1x = 1(右侧较近) −1-1(向左) 稍微往中心走
x=0x = 0(中心最密) 00(停止) 已经在密度最高处,不动
x=−2x = -2(左侧偏远) +2+2(向右) 向中心拉回

💡 直觉:score 就是"有方向的斜率"

log⁡p(x)\log p(x) 是一条开口向下的抛物线,最高点在 x=0x=0(概率密度最大处)。Score function −x-x 就是这条曲线在每个点上的斜率(切线的斜率)——不只是"斜不斜",还告诉你往哪个方向走能让 log⁡p\log p 增大,也就是走向概率密度更高的地方。

从 x=3x=3 沿 score 方向走向 0,是 log-density 的梯度上升示意。Langevin dynamics 还必须包含随机噪声项;只走梯度会趋向密度模态,并不能从目标分布正确采样。

1.3 ϵ\epsilon 预测和 Score Function 的关系#

∇xtlog⁡q(xt∣x0)=−ϵ1−αˉt\nabla_{x_t} \log q(x_t\mid x_0) = -\frac{\epsilon}{\sqrt{1-\bar{\alpha}_t}}

score function = 噪声的负方向,缩放了一下

噪声回归的总体 MSE 最优解是条件均值,其负值再除以噪声标准差对应边际 score。噪声预测本身与 score 方向相反;后文区分条件 score 与边际 score。

这个公式是怎么推导出来的?#

只需要三步,全程只用高斯分布的定义和求导。

第一步:写出 q(xt∣x0)q(x_t \mid x_0) 的概率密度

前向过程告诉我们,给定 x0x_0,xtx_t 服从高斯分布:

q(xt∣x0)=N ⁣(αˉt x0,  (1−αˉt) I)q(x_t \mid x_0) = \mathcal{N}\!\left(\sqrt{\bar{\alpha}_t}\, x_0,\; (1-\bar{\alpha}_t)\, I\right)

代入高斯密度公式 p(x)∝exp⁡ ⁣(−∥x−μ∥22σ2)p(x) \propto \exp\!\left(-\frac{\|x-\mu\|^2}{2\sigma^2}\right),写出对数密度:

log⁡q(xt∣x0)=−∥xt−αˉt x0∥22(1−αˉt)+const\log q(x_t \mid x_0) = -\frac{\|x_t - \sqrt{\bar{\alpha}_t}\, x_0\|^2}{2(1-\bar{\alpha}_t)} + \text{const}

常数项与 xtx_t 无关,对梯度没贡献

第二步:对 xtx_t 求梯度

分子 ∥xt−αˉt x0∥2\|x_t - \sqrt{\bar{\alpha}_t}\, x_0\|^2 对 xtx_t 求导,结果就是 2(xt−αˉt x0)2(x_t - \sqrt{\bar{\alpha}_t}\, x_0):

∇xtlog⁡q(xt∣x0)=−xt−αˉt x01−αˉt\nabla_{x_t} \log q(x_t \mid x_0) = -\frac{x_t - \sqrt{\bar{\alpha}_t}\, x_0}{1 - \bar{\alpha}_t}

第三步:代入前向公式消掉 x0x_0

从一步到位的加噪公式 xt=αˉt x0+1−αˉt ϵx_t = \sqrt{\bar{\alpha}_t}\, x_0 + \sqrt{1-\bar{\alpha}_t}\, \epsilon 直接得到:

xt−αˉt x0=1−αˉt  ϵx_t - \sqrt{\bar{\alpha}_t}\, x_0 = \sqrt{1-\bar{\alpha}_t}\; \epsilon

代入第二步的结果:

∇xtlog⁡q(xt∣x0)=−1−αˉt  ϵ1−αˉt=−ϵ1−αˉt\nabla_{x_t} \log q(x_t \mid x_0) = -\frac{\sqrt{1-\bar{\alpha}_t}\;\epsilon}{1-\bar{\alpha}_t} = \boxed{-\frac{\epsilon}{\sqrt{1-\bar{\alpha}_t}}}

1−αˉt\sqrt{1-\bar{\alpha}_t} 上下约分,只剩一个根号在分母

💡 三步的核心逻辑

整个推导只做了一件事:高斯分布的 log 求导。高斯的对数是一个关于 xtx_t 的二次函数,导数就是一次函数(线性的)。

  • 分母 (1−αˉt)(1-\bar{\alpha}_t) 是高斯的方差——方差越大,score 越小,拉力越弱
  • 分子 (xt−αˉt x0)(x_t - \sqrt{\bar{\alpha}_t}\, x_0) 就是"当前位置偏离均值多远"——偏得越远,拉力越大
  • 用前向公式替换后,"偏离均值" = 1−αˉt ϵ\sqrt{1-\bar{\alpha}_t}\,\epsilon,化简得到 −ϵ/1−αˉt-\epsilon/\sqrt{1-\bar{\alpha}_t}

⚠️ 注意:这里是条件 score,不是边际 score

严格说,推导出来的是 ∇xtlog⁡q(xt∣x0)\nabla_{x_t} \log q(x_t \mid x_0)(给定 x0x_0 时的 score),不是边际分布 ∇xtlog⁡q(xt)\nabla_{x_t} \log q(x_t)。

边际 score 的精确表达式是:

∇xtlog⁡q(xt)=Ex0∼q(x0∣xt) ⁣[−ϵ1−αˉt]\nabla_{x_t} \log q(x_t) = \mathbb{E}_{x_0 \sim q(x_0 \mid x_t)}\!\left[-\dfrac{\epsilon}{\sqrt{1-\bar{\alpha}_t}}\right]

也就是对所有可能的 x0x_0 取期望。网络 ϵθ(xt,t)\epsilon_\theta(x_t, t) 学的正是这个期望——这是网络在训练中隐式学到的,不需要显式计算积分。所以"ϵ\epsilon 预测 = 学 score function"在期望意义下成立。

2. SDE 怎么统一#

2.1 为什么需要把它们统一?#

你可能会想:DDPM 能用,DDIM 也能用,为什么还要费劲搞一个"统一框架"?三个原因:

  • 解释力:DDPM 和 DDIM 各自推导,看起来是两种独立方法。统一框架告诉你它们是同一个连续过程的两种离散化方式——理解了框架,两者的异同一目了然
  • 设计新方法:后续的 DPM-Solver、EDM、Rectified Flow 等更好的采样器,都是在这个框架下设计出来的。没有框架,每个新方法都要从头推导;有了框架,你只需要在"怎么离散化"这一步做文章
  • 面试价值:这是区分"用过扩散模型"和"真正理解扩散模型"的分水岭。能把 DDPM → DDIM → SDE 的关系讲清楚,面试官会认为你有扎实的理论功底

SDE 是什么#

先从 ODE 说起——你大概在物理课上见过微分方程,最简单的形式:

dxdt=f(x,t)⟺dx=f(x,t) dt\frac{dx}{dt} = f(x, t) \quad\Longleftrightarrow\quad dx = f(x,t)\,dt

在向量场满足适当存在唯一性条件时,初值确定 ODE 轨迹;一般 ODE 不能无条件保证唯一性

比如一个球从山坡滚下来:给定起点,牛顿力学告诉你它每一刻的位置。没有任何随机性,跑一百次结果一模一样。这就是 ODE(常微分方程)。

现在加上随机性——如果球在滚的时候有随机阵风呢?每一瞬间都有一个不可预测的小推力。同一个起点,滚两次,轨迹不一样了。这就是 SDE(随机微分方程):

dx=f(x,t) dt⏟漂移(drift)——确定性的力+g(t) dw⏟扩散(diffusion)——随机的风dx = \underbrace{f(x,t)\,dt}_{\text{漂移(drift)——确定性的力}} + \underbrace{g(t)\,dw}_{\text{扩散(diffusion)——随机的风}}

**dwdw(布朗运动的增量)到底是什么?**不需要严格数学定义,只需记住三件事:

  • 随机的:每一瞬间的 dwdw 是一个均值为 0 的高斯随机变量——往左推和往右推的概率一样
  • 独立的:这一瞬间的推力和上一瞬间无关——"风没有记忆"
  • 很小的:dwdw 的大小和 dt\sqrt{dt} 成正比——直觉上就是"每步加一点小噪声"

💡 用 for 循环理解 SDE

如果你对代码比公式更亲切,SDE 就是这个循环取步长无穷小的极限:

for t in range(T):
    x = x + f(x, t) * dt      # 漂移:确定性的一步
    x = x + g(t) * sqrt(dt) * randn()  # 扩散:加一个随机扰动

DDPM 的前向过程就是这样一个循环:每步让 xx 缩小一点(漂移),再加一点高斯噪声(扩散)。SDE 只是把步长 dtdt 从 1/T1/T 取到无穷小。

⚠️ ODE vs SDE 的核心区别

ODE SDE
公式 dx=f(x,t) dtdx = f(x,t)\,dt dx=f(x,t) dt+g(t) dwdx = f(x,t)\,dt + g(t)\,dw
轨迹 确定——同起点同路径 随机——同起点不同路径
对应 DDIM(确定性采样) DDPM(随机采样)

后面你会看到:反向生成时,走 SDE 就是 DDPM,走 ODE 就是 DDIM。

DDPM 的前向加噪就是 SDE 的离散版#

把 DDPM 每步加噪公式和 SDE 对比:

DDPM 离散(每步) SDE 连续(每一瞬间)
xt=1−βt xt−1+βt ϵx_t = \sqrt{1-\beta_t}\, x_{t-1} + \sqrt{\beta_t}\, \epsilon dx=f(x,t) dt+g(t) dwdx = f(x,t)\,dt + g(t)\,dw
1−βt xt−1≈xt−1−βt2xt−1\sqrt{1-\beta_t}\, x_{t-1} \approx x_{t-1} - \frac{\beta_t}{2} x_{t-1}(漂移:让 xx 慢慢缩小) 漂移项 f(x,t)dt=−β(t)2x dtf(x,t)dt = -\frac{\beta(t)}{2} x\, dt
βt ϵ\sqrt{\beta_t}\,\epsilon(加随机噪声) 扩散项 g(t) dw=β(t) dwg(t)\,dw = \sqrt{\beta(t)}\, dw

时间步无限细分(T→∞T \to \infty),离散的 βt\beta_t 变成连续函数 β(t)\beta(t),DDPM 的离散加噪就"升级"成了这个 SDE。

💡 "取极限"到底意味什么?

这和微积分里"求和 → 积分"是同一个思路。DDPM 用 1000 步加噪,每步 Δt=1/1000\Delta t = 1/1000。如果把步数增加到 10000 步、100000 步……最终每步 Δt→0\Delta t \to 0,离散的递推公式就变成了连续的微分方程。

所以 SDE 不是一个新的模型,它就是 DDPM 前向过程步数取到无穷大时的数学表达。

宋飏的核心贡献:反向过程也有对应的 SDE#

数学上可以证明,任何前向 SDE 都有一个精确的反向 SDE,只需要知道 score function:

dx=[f(x,t)−g(t)2 ∇xlog⁡pt(x)] dt+g(t) dwˉdx = \big[f(x,t) - g(t)^2\, \nabla_x \log p_t(x)\big]\, dt + g(t)\, d\bar{w}

反向 SDE = 正向漂移 − score function 的校正项 + 反向布朗运动

类比理解:正向过程是"加噪声、往混乱方向走",反向就是"往数据密度高的地方走(靠 score function 指引)+ 随机抖动"。

💡 为什么知道 score function 就能反转整个过程?

这是最不直觉的一步,值得多说几句。

**正向过程(加噪)**你完全控制:你设计了噪声调度 βt\beta_t,你知道每一步加了多少噪声、信号缩小了多少。

**反向过程(去噪)**的难点在于:给你一张充满噪声的图 xtx_t,你不知道噪声具体长什么样(每次采样的噪声都不同),也不知道原始图像 x0x_0 是什么。

但 score function ∇xlog⁡pt(x)\nabla_x \log p_t(x) 提供了关键信息:在当前的噪声水平下,数据更可能在哪个方向。它不需要知道具体的 x0x_0 是什么,而是综合了所有可能的 x0x_0 给你一个"平均指引方向"。

类比:你在浓雾(噪声)中迷路了。Score function 就像一个指南针——它不知道你家具体在哪,但它知道"城市(数据密集区)在你的东南方向"。沿着指南针一步步走,你就能从荒野(纯噪声)走回城市(数据分布)。雾每走一步就淡一点(噪声水平降低),指南针的指引也越来越精确。

Probability Flow ODE:去掉随机性#

宋飏还发现:每个 SDE 都对应一个完全确定性的 ODE,和反向 SDE 有完全相同的边际分布 pt(x)p_t(x)。

"边际分布相同":单条 SDE 轨迹每次都不同(随机抖动),但大量轨迹在每个时刻 tt 的位置分布 pt(x)p_t(x) 是确定的。Probability Flow ODE 的单条轨迹是光滑确定的,但产生的 pt(x)p_t(x) 和 SDE 完全一样。

描述方式 单条轨迹 一百万条轨迹的分布
反向 SDE 有随机项 每次都不同,路径抖动 pt(x)p_t(x)
Probability Flow ODE 无随机项 每次完全一样,路径光滑 也是 pt(x)p_t(x)

注意:不是简单地把随机项删掉

对比两个公式,区别有两处:

反向 SDE:  dx=[f−g2 ∇xlog⁡pt]dt+g dwˉ\text{反向 SDE:}\; dx = \left[f - g^2\, \nabla_x \log p_t\right] dt + g\, d\bar{w}

Probability Flow ODE:  dx=[f−12 g2 ∇xlog⁡pt]dt\text{Probability Flow ODE:}\; dx = \left[f - \tfrac{1}{2}\, g^2\, \nabla_x \log p_t\right] dt

① 删掉了随机项 g dwˉg\,d\bar{w};② score 项系数从 g2g^2 变成了 12g2\frac{1}{2}g^2

直觉:随机项本身对分布有"扩散"作用,去掉它之后 score 项需要多承担一半的引导工作,所以系数调整为一半。如果只删随机项而不改系数,分布就会对不上。

(背后的证明工具叫 Fokker-Planck 方程,描述概率密度随时间如何演化;工程上只需要记结论即可。)

💡 为什么这个 ODE 和 DDIM 是同一件事?

DDIM 的核心操作是"先预测 x0x_0,再按确定性公式走到目标时间步"——没有任何随机项。把这个操作的时间步无限细分,极限正好就是这个 Probability Flow ODE。DDIM 是它的离散化。

**统一的关键:两者都需要 score function,而 DDPM 训练的 ϵθ\epsilon_\theta 就是在学 score function。**所以一个训练好的 DDPM 网络,既能用来做随机采样(反向 SDE = DDPM),也能用来做确定性快速采样(Probability Flow ODE = DDIM)——不需要重新训练,只是采样方式不同。

三者统一:

  • DDPM = 反向 SDE 的离散化(随机采样,需要 1000 步)
  • DDIM = Probability Flow ODE 的离散化(确定性采样,可以跳步)
  • Score-based SDE = 连续时间的统一框架,DDPM 和 DDIM 都是它的特例

3. 三者关系图#

  Score-based SDE(2021,统一框架)
  连续时间:dx = f(x,t)·dt + g(t)·dw
  │
  ├─── 随机分支 ──────────────────────────────────────────────────
  │    反向 SDE:dx = [f − g²·∇logp]dt + g·dw̄
  │    │
  │    └─ 离散化 ──→  DDPM(2020)
  │                   · 随机采样(每步加噪声 z)
  │                   · 必须 1000 步,不能跳步
  │                   · 马尔可夫链
  │
  └─── 确定性分支 ─────────────────────────────────────────────────
       Probability Flow ODE:dx = [f − ½g²·∇logp]dt
       │
       └─ 离散化 ──→  DDIM(2020)
                      · 确定性采样(无随机项)
                      · 可跳步,50 步接近 DDPM 质量
                      · 非马尔可夫

  ─────────────────────────────────────────────────────────────────
  共同点(三者完全一致):
    · 前向加噪过程相同
    · 使用同一个训练好的网络 ε_θ(预测噪声)
    · 训练目标完全相同(MSE loss)
    · 区别只在采样方式

💡 面试时一句话说清三者关系

DDPM 是离散时间的随机采样,DDIM 是离散时间的确定性采样,Score-based SDE 是把它们统一到连续时间框架下——DDPM 对应反向 SDE,DDIM 对应 Probability Flow ODE。三者训练完全一样,区别只在采样。

4. 理解检查#

面试题 01 DDPM、DDIM、Score-based SDE 的关系?

一句话:DDPM = 反向 SDE 离散化(随机)。DDIM = Probability Flow ODE 离散化(确定性)。Score-based SDE = 连续统一框架。三者训练相同,区别只在采样。

关系:训练一个 DDPM 模型后,既可以 DDPM 采样(1000 步,随机)也可以 DDIM 采样(50 步,确定性)。不需要重新训练。

面试题 02 Score Matching 和扩散模型的关系?

数学等价:∇xtlog⁡q(xt)=−ϵ/1−αˉt\nabla_{x_t}\log q(x_t) = -\epsilon/\sqrt{1-\bar{\alpha}_t}。预测噪声 = 预测 score 的负方向。

历史:Score matching 更早(2019),DDPM 独立发展(2020)。2021 年宋飏用 SDE 统一。

Score-based SDE:统一框架

多模态算法面试准备系列

原始资料:Score-Based Generative Modeling through SDEs。反向 SDE 与 probability-flow ODE 的边际一致性需要精确 score 和精确积分等条件;近似网络与有限步求解会产生偏差。

相关阅读路线

理解生成模型 ↗