DPM-Solver

DPM-Solver & DPM-Solver++

核心地位

DPM-Solver (Lu et al., NeurIPS 2022) 是扩散模型采样加速的集大成者。 它没有使用通用的 ODE 求解器(如 Runge-Kutta),而是针对 Diffusion ODE 的特殊结构(半线性 Semi-linear)设计了专用的求解器。

  • 结果: 将高频生成需要的步数从 50-100 步压缩到了 10-20 步

1. 核心数学原理

1.1 扩散 ODE 的特殊结构

一般的 ODE 是 $dx = f(x, t) dt$。 但 Diffusion ODE(Probability Flow ODE)长这样:

$$ d\mathbf{x}_t = \underbrace{[f(t) \mathbf{x}_t]}_{\text{Linear part}} dt + \underbrace{\frac{g^2(t)}{2\sigma_t} \epsilon_\theta(\mathbf{x}_t, t)}_{\text{Non-linear (Noise) part}} dt $$
  • 线性部分: $f(t)x_t$,这一项只和 $x_t$ 有线性关系,非常单纯。
  • 非线性部分: 包含神经网络预测的噪声 $\epsilon_\theta$。

1.2 解析解与近似 (Semi-Linear ODE)

DPM-Solver 的天才之处在于:既然线性部分如此简单,为什么我们要用数值方法去估算它?直接求解析解不好吗?

通过变量代换(将时间 $t$ 换为对数信噪比 $\lambda_t = \log(\alpha_t/\sigma_t)$),DPM-Solver 推导出了一个精确解公式:

$$ x_{t-1} = \underbrace{e^{-\lambda \Delta t} x_t}_{\text{Exact Linear Evolution}} + \sigma_{t-1} \int_{t}^{t-1} e^{-\lambda s} \epsilon_\theta(x_s, s) ds $$
  • 第一项(数据项):直接用指数函数算出精确值,完全没有误差
  • 第二项(噪声积分项):只有这一项需要近似。

1.3 泰勒展开 (Taylor Expansion)

为了计算第二项的积分,DPM-Solver 将神经网络输出 $\epsilon_\theta(x_s, s)$ 看作是关于 $\lambda$ 的函数,并进行泰勒展开

  • DPM-Solver-1 (1阶): 假设 $\epsilon_\theta$ 是由 $t$ 到 $t-1$ 是常数。 -> 等价于 DDIM
  • DPM-Solver-2 (2阶): 假设 $\epsilon_\theta$ 随 $\lambda$ 线性变化。利用 $x_t$ 和 $x_{t+1}$ 两个点来拟合斜率。
  • DPM-Solver-3 (3阶): 假设是抛物线变化。利用三个点。

2. DPM-Solver++ (改进版)

2.1 为什么要改?

原版 DPM-Solver 针对的是 Unconditional SamplingNoise Prediction 模型。 但在 Stable Diffusion 等大规模模型中,我们通常使用 Classifier-Free Guidance (CFG),并且有时预测的是 $x_0$ (Data Prediction) 而不是噪声 $\epsilon$。 原版 DPM-Solver 在大 CFG Scale 或 Data Prediction 下不稳定。

2.2 改进点

DPM-Solver++ 专门针对 Data Prediction ($x_0$-prediction) 进行了优化。

  • 它对 $x_0$ 进行插值积分,而不是对 $\epsilon$。
  • 2M (Multistep): 这是最常用的版本。它利用过去的时间步(History)来构建高阶近似,而不像 Singlestep 那样需要在一个 Step 里跑多次模型(费时)。

3. 常见变体速查

变体名称解释特点推荐指数
DPM++ 2M2阶 ODE,多步利用历史信息极快,收敛好,SDXL/SD1.5 标配⭐⭐⭐⭐⭐
DPM++ 2M SDE2阶 SDE,多步,加了额外噪声画质最细腻,能补全细节⭐⭐⭐⭐⭐
DPM++ 2S a2阶 SDE,Ancestral (Singlestep)类似 Euler a 的高阶版,更慢但更精准⭐⭐⭐
DPM++ 3M3阶 ODE理论上更准,但实际容易“过拟合”导致伪影⭐⭐

4. 总结

DPM-Solver 的胜利是数学对暴力计算的胜利。 它没有像 Runge-Kutta 那样盲目地把整个 ODE 当黑盒去解,而是剥离了简单的线性部分(直接算精确解),只对困难的非线性部分做近似。这使得它在极少的步数下(10-20步)就能还原出极其精准的分布。