采样算法一:去噪扩散概率模型(DDPM)采样算法详解
参考
https://arxiv.org/pdf/2006.11239
一、背景知识
扩散模型(Diffusion Models) 是一种基于概率论的生成模型,通过模拟数据的扩散和逆扩散过程生成样本。核心思想分为两个阶段:
- 前向扩散过程:逐步向数据中添加噪声,直到数据变为纯高斯噪声。
- 反向去噪过程:学习如何逐步去除噪声,从噪声中恢复原始数据。
DDPM(Denoising Diffusion Probabilistic Models) 是一种经典的扩散模型,其采样算法是反向去噪过程的核心。
二、前向扩散过程
前向过程通过固定方差调度(Variance Schedule)逐步破坏数据,定义为马尔可夫链:
-
公式定义
每一步的噪声添加公式为:
q ( x t ∣ x t − 1 ) = N ( x t ; 1 − β t x t − 1 , β t I ) q(x_t | x_{t-1}) = \mathcal{N}(x_t; \sqrt{1-\beta_t} x_{t-1}, \beta_t \mathbf{I}) q(xt∣xt−1)=N(xt;1−βtxt−1,βtI)
其中:- β t ∈ ( 0 , 1 ) \beta_t \in (0,1) βt∈(0,1) 是预先定义的噪声调度参数。
- α t = 1 − β t \alpha_t = 1 - \beta_t αt=1−βt, α ˉ t = ∏ i = 1 t α i \bar{\alpha}_t = \prod_{i=1}^t \alpha_i αˉt=∏i=1tαi.
-
任意时刻 ( x_t ) 的闭式解
通过重参数化技巧,可直接从 x 0 x_0 x0 计算 x t x_t xt:
x t = α ˉ t x 0 + 1 − α ˉ t ϵ , ϵ ∼ N ( 0 , I ) x_t = \sqrt{\bar{\alpha}_t} x_0 + \sqrt{1 - \bar{\alpha}_t} \epsilon, \quad \epsilon \sim \mathcal{N}(0, \mathbf{I}) xt=αˉtx0+1−αˉtϵ,ϵ∼N(0,I)
三、反向去噪过程
反向过程通过神经网络学习逐步去噪,定义为另一个马尔可夫链:
-
反向条件分布
假设每一步服从高斯分布:
p θ ( x t − 1 ∣ x t ) = N ( x t − 1 ; μ θ ( x t , t ) , Σ θ ( x t , t ) ) p_\theta(x_{t-1} | x_t) = \mathcal{N}(x_{t-1}; \mu_\theta(x_t, t), \Sigma_\theta(x_t, t)) pθ(xt−1∣xt)=N(xt−1;μθ(xt,t),Σθ(xt,t))- μ θ \mu_\theta μθ 和 Σ θ \Sigma_\theta Σθ 由神经网络预测。
-
关键简化
DDPM 固定方差为 σ t 2 = β t \sigma_t^2 = \beta_t σt2=βt,仅需预测均值 μ θ \mu_\theta μθ。通过推导可得:
μ θ ( x t , t ) = 1 α t ( x t − β t 1 − α ˉ t ϵ θ ( x t , t ) ) \mu_\theta(x_t, t) = \frac{1}{\sqrt{\alpha_t}} \left( x_t - \frac{\beta_t}{\sqrt{1 - \bar{\alpha}_t}} \epsilon_\theta(x_t, t) \right) μθ(xt,t)=αt1(xt−1−αˉtβtϵθ(xt,t))- 核心任务:训练神经网络 ( \epsilon_\theta ) 预测噪声 ( \epsilon )。
四、采样算法步骤
从噪声 x T ∼ N ( 0 , I ) x_T \sim \mathcal{N}(0, \mathbf{I}) xT∼N(0,I) 出发,逐步生成数据:
- 输入:训练好的噪声预测模型 ϵ θ \epsilon_\theta ϵθ,时间步总数 T T T,方差调度 { β t } \{\beta_t\} {βt}。
- 初始化:采样 x T ∼ N ( 0 , I ) x_T \sim \mathcal{N}(0, \mathbf{I}) xT∼N(0,I)。
- 迭代去噪(
t
=
T
,
T
−
1
,
…
,
1
t = T, T-1, \dots, 1
t=T,T−1,…,1):
- 预测噪声: ϵ t = ϵ θ ( x t , t ) \epsilon_t = \epsilon_\theta(x_t, t) ϵt=ϵθ(xt,t)
- 计算均值:
μ t = 1 α t ( x t − β t 1 − α ˉ t ϵ t ) \mu_t = \frac{1}{\sqrt{\alpha_t}} \left( x_t - \frac{\beta_t}{\sqrt{1 - \bar{\alpha}_t}} \epsilon_t \right) μt=αt1(xt−1−αˉtβtϵt) - 采样前一时刻:
x t − 1 = μ t + σ t z , z ∼ N ( 0 , I ) x_{t-1} = \mu_t + \sigma_t z, \quad z \sim \mathcal{N}(0, \mathbf{I}) xt−1=μt+σtz,z∼N(0,I)- 当 t = 1 t=1 t=1时, z = 0 z=0 z=0(不添加噪声)。
- 输出: x 0 x_0 x0 为生成的数据。
五、数学推导关键点
-
反向过程均值的推导
通过最小化变分下界(ELBO)中的 KL 散度项,可得:
μ θ = α t ( 1 − α ˉ t − 1 ) 1 − α ˉ t x t + α ˉ t − 1 β t 1 − α ˉ t x ^ 0 \mu_\theta = \frac{\sqrt{\alpha_t}(1 - \bar{\alpha}_{t-1})}{1 - \bar{\alpha}_t} x_t + \frac{\sqrt{\bar{\alpha}_{t-1}} \beta_t}{1 - \bar{\alpha}_t} \hat{x}_0 μθ=1−αˉtαt(1−αˉt−1)xt+1−αˉtαˉt−1βtx^0
代入 x ^ 0 = x t − 1 − α ˉ t ϵ θ α ˉ t \hat{x}_0 = \frac{x_t - \sqrt{1 - \bar{\alpha}_t} \epsilon_\theta}{\sqrt{\bar{\alpha}_t}} x^0=αˉtxt−1−αˉtϵθ,化简后得到均值公式。 -
噪声预测的直观解释
模型 ϵ θ \epsilon_\theta ϵθ 预测的是前向过程中添加到 x 0 x_0 x0 的噪声,通过移除该噪声可逐步恢复数据。
六、伪代码示例
def ddpm_sample(model, T, betas):
alpha = 1 - betas
alpha_bar = np.cumprod(alpha)
x = torch.randn_like(data) # x_T ~ N(0, I)
for t in range(T, 0, -1):
# 预测噪声
epsilon = model(x, t)
# 计算均值和方差
mu = (x - (betas[t]/np.sqrt(1-alpha_bar[t])) * epsilon) / np.sqrt(alpha[t])
if t > 1:
z = torch.randn_like(x)
else:
z = 0
# 更新x
x = mu + np.sqrt(betas[t]) * z
return x