SDE
在连续的时间域中, 扩散模型的 前向过程 可以通过 随机微分方程(stochastic differential equation) 来描述:
dx(t)=f(t)x(t)dt+g(t)dw
- f(t) 被称为漂移系数,表明系统确定性演化趋势
- g(t) 被称为扩散系数, 表明随机噪声的强度
- w 被称为维纳过程(Wiener Process,即布朗运动),是随机噪声的来源。 dw∼N(0,dt)
其 反转过程(去噪过程) 也可以用另一种形式的随机微分方程来描述:
dx(t)=[f(t)x(t)−g2(t)∇x(t)logpt(x(t))]dt+g(t)dw=[f(t)x(t)+1−αˉtg2(t)ε^θ(x(t),t)]dt+g(t)dw
- 其中 x(T)∼N(0,I)
Wiener Process
Wiener Process (Brownian Motion) 是一个具有以下4个关键性质的一维连续时间随机过程:
- 初始条件 w(0)=0, 几乎必然,即概率为1
- 正态增量:对于任意时间 0≤s<t ,增量 w(t)−w(s)∼N(0,t−s)
- 独立增量:对于任意时间 0≤s<t ,增量 w(t)−w(s) 对于过去的时间独立
- 连续性:w(t)是几乎必然连续的, 即概率为1
Variational Diffusion Models
展示diffusion models一种通用的形式:
q(xt∣x0)=N(xt;α(t)x0,σ2(t)I)
- 其中 α(t) 和 σ2(t) 的选取需要满足信噪比(Signal-to-Noise Ratio) SNR=σ2(t)α2(t) 随着t增大持续降低
SDE 与 Diffusion model的转化
SDE:
dx(t)=f(t)x(t)dt+g(t)dw
前向传播的概率分布:
q(xt∣x0)=N(xt;α(t)x0,σ2(t)I)
根据SDE可以推导出二者之间的关系:
从SDE到Diffuson model:
从Diffusion model到SDE:
- f(t)=dtdlogα(t)=dtdlogαt
- g2(t)=dtdσ2(t)−2dtdlogα(t)σ2(t)=dtdσt2−2dtdlogαtσt2
g2(t)=dtdσt2−2dtdlogαtσt2=2σt(σtdtdlogσt)−2dtdlogαtσt2=2σt2(dtdlogσt−dtdlogαt)=2σt2(−dtdλt)
- 其中 λt=logσtαt 随t增大而逐渐减小
Probability Flow ODE
给定一个反向传播的SDE,
dx(t)=[f(t)x(t)+1−αˉtg2(t)ε^θ(x(t),t)]dt+g(t)dw
可以确定一个反向去噪的ODE:
dtdx(t)=f(t)x(t)+2σ(t)g2(t)ϵ^θ(x(t),t)
- 概率流ODE保证在时间演化过程中,每个时刻 t 的样本分布 p(xt),与原始扩散过程SDE在相同时刻的分布 q(xt) 完全一致
- 概率流ODE通过确定性的动力学方程描述样本演化过程,避免了SDE中的随机噪声项(SDE因为维纳过程,转化为离散形式计算时,一旦步长变大会出现很大误差),更适合采用大步长以加速采样
DPM-Solver
Step1: 一阶半线性微分方程
针对以下ODE:
dtdx(t)=f(t)x(t)+2σ(t)g2(t)ϵ^θ(x(t),t)
- f(t)x(t) 是关于 x 的线性
- 2σ(t)g2(t)ϵ^θ(x(t),t) 是用神经网络的非线性
该结构就是的一阶半线性微分方程(First-Order Semlinear Differential Equation)
回忆一阶半线性微分方程的解法:
x′(t)=p(t)x(t)+q(xt,t)
- 线性是指 p(t)x(t) 对于 x 是线性函数
- 非线性是指 q(xt,t) 可能针对 x 不是线性的
- 方程是相对于t求导,x 是关于 t 的一个函数
考虑特殊情况 q(xt,t)
x′(t)=p(t)x(t)
对方程进行转化:
x(t)x′(t)=dtlnx(t)=p(t)
将 d(t) 移动到等式左边,再积分(注意积分变元要和 t 区分)得:
lnx(t)−lnx(s)=∫stp(z)dz
得出:
x(t)=elnx(s)⋅e∫stp(z)dz=C⋅e∫stp(z)dz
再回过头来审视 一般情况:
x′(t)=p(t)x(t)+q(t)
方程两边同时乘上 e−∫t0tp(z)dz :
e−∫t0tp(z)dz[x′(t)−p(t)x(t)]=e−∫t0tp(z)dzq(t)
- 注意到: dtd(f(t)g(t))=f′(t)g(t)+f(t)g′(t) 且 dtde−∫t0tp(z)dz=e−∫t0tp(z)dz⋅(−p(t))
所以:
d[e−∫t0tp(z)dz⋅x(t)]=e−∫t0tp(z)dzq(t)
由:
dtd(p(t))=q(s)⇒p(t)=p(s)+∫stq(τ)dτ
得到:
e−∫t0tp(z)dz⋅x(t)=e−∫t0sp(z)dz⋅x(s)+∫ste−∫t0tp(z)dzq(τ)dτ
化简得到:
x(t)=e∫stp(z)dzx(s)+∫ste−∫τtp(z)dzq(τ)dτ
将 p(t)=f(t)=dtdlogαt, q(t)=2σ(t)g2(t)=σt(−dtdλt)ϵ^θ(x(t),t) 带入
x(t)=αsαtx(s)−αt∫st(dτdλτe−λτϵ^θ(x(τ),τ))dτ
- λτ=logστατ
Step2: 积分变量换元
由于 λτ=λ(τ) 单调递减,存在逆函数 tλ(λt)=t, λt 和 t 之间可以一一对应
对上式进行积分变量替换:
x(t)=αsαtx(s)−αt∫λsλt(dτdλτe−λτϵ^θ(x(λτ),λτ))dλτdτdλτ=αsαtx(s)−αt∫λsλt(e−λτϵ^θ(x(λτ),λτ))dλτ
离散形式,s=t+1
x(t)=αt+1αtx(t+1)−αt∫λt+1λt(e−λτϵ^θ(x(λτ),λτ))dλτ
Step3: 解析计算
作者进一步对 ϵ^θ(x(λτ),λτ)) 进行泰勒展开
ϵ^θ(x^λ,λ)=n=0∑k−1n!(λ−λt+1)nϵ^θ(n)(x^λt+1,λt+1)+O((λ−λt+1)k)
带入得:
xt=αt+1αtxt+1−αtn=0∑k−1derivativesϵ^θ(n)(x^λt+1,λt+1)coefficients∫λt+1λte−λn!(λ−λt+1)ndλ+O(hik+1)
- 其中ht=λt−λt+1
系数 Cn 的解析计算过程如下:
Cn=∫λt+1λte−λn!(λ−λt+1)ndλ=−∫λt+1λtn!(λ−λt+1)nde−λ=(−n!(λ−λt+1)ne−λ)λt+1λt+∫λt+1λte−λ(n−1)!(λ−λt+1)n−1dλ=−n!hine−λt+Cn−1
基础项 C0 的计算为:
C0=∫λt+1λte−λdλ=e−λt+1−e−λt=αtσt(eht−1)
高阶系数的递推结果:
C1C2=e−λt+1−(1+ht)e−λt=αtσt(eht−1−ht)=e−λt+1−(1+ht+2ht2)e−λt=αtσt(eht−1−ht−2ht2)
DPM-Solver-1
令k = 1
xt=αt+1αtxt+1−αtϵ^θ(x^λ,λ)C0+O(hi2)=αt+1αtxt+1−σt(eht−1)ϵ^θ(x^λ,λ)=αt+1αtxt+1−σt(eht−1)ϵθ(xt,t)=αt+1αtxt+1−(αtαt+1σt+1−σt+1)ϵθ(xt,t)=DDIM
Step4:数值估计导数项
对于更高阶的, 我们需要求解 ϵ^θ(n)(x^λt+1,λt+1) , 这一项作者进一步采用数值方式估计,具体略有复杂,感兴趣的可以参照原论文


