采样算法二:去噪扩散隐式模型(DDIM)采样算法详解教程

参考

https://arxiv.org/pdf/2010.02502
在这里插入图片描述


一、背景与动机

去噪扩散隐式模型(DDIM) 是对DDPM的改进,旨在加速采样过程同时保持生成质量。DDPM虽然生成效果优异,但其采样需迭代数百至数千次,效率较低。DDIM通过以下关键创新解决该问题:

  • 非马尔可夫反向过程:打破严格的马尔可夫链假设,允许跳步采样。
  • 确定性生成路径:通过设定参数σ=0,实现确定性采样,减少随机性带来的不确定性。
  • 兼容性:使用与DDPM相同的训练模型,无需重新训练。

二、DDIM与DDPM的核心区别
特性DDPMDDIM
反向过程严格马尔可夫链非马尔可夫,允许跳跃式采样
采样速度慢(需完整迭代所有时间步)快(可跳过中间步,如50步代替1000步)
随机性控制固定方差调度(βₜ)可调参数σₜ(σ=0时为确定性采样)
训练目标需完整训练噪声预测模型直接复用DDPM的预训练模型

三、数学推导与关键公式
1. 前向过程的一致性

DDIM沿用DDPM的前向扩散过程定义,任意时刻( x_t )可表示为:
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=αˉt x0+1αˉt ϵ,ϵN(0,I)
其中 α ˉ t = ∏ i = 1 t α i \bar{\alpha}_t = \prod_{i=1}^t \alpha_i αˉt=i=1tαi, α t = 1 − β t \alpha_t = 1 - \beta_t αt=1βt

2. 反向过程的重新参数化

DDIM将反向过程定义为非马尔可夫链,允许从任意时间步( t )直接推断( x_{t-Δ} )(Δ为跳跃步长)。其核心公式为:
x t − Δ = α ˉ t − Δ ( x t − 1 − α ˉ t ϵ θ ( x t , t ) α ˉ t ) ⏟ 预测的  x 0 + 1 − α ˉ t − Δ − σ t 2 ⋅ ϵ θ ( x t , t ) + σ t z x_{t-Δ} = \sqrt{\bar{\alpha}_{t-Δ}} \underbrace{\left( \frac{x_t - \sqrt{1 - \bar{\alpha}_t} \epsilon_\theta(x_t, t)}{\sqrt{\bar{\alpha}_t}} \right)}_{\text{预测的 } x_0} + \sqrt{1 - \bar{\alpha}_{t-Δ} - \sigma_t^2} \cdot \epsilon_\theta(x_t, t) + \sigma_t z xtΔ=αˉtΔ 预测的 x0 (αˉt xt1αˉt ϵθ(xt,t))+1αˉtΔσt2 ϵθ(xt,t)+σtz

  • 第一项:基于当前 x t x_t xt和预测噪声 ϵ θ \epsilon_\theta ϵθ估计的原始数据 x 0 x_0 x0
  • 第二项:沿预测噪声方向的确定性更新。
  • 第三项:可控的随机噪声项, z ∼ N ( 0 , I ) z \sim \mathcal{N}(0, \mathbf{I}) zN(0,I)
3. 参数σₜ的作用
  • σₜ=0:完全确定性采样(DDIM的标准设定),生成结果唯一。
  • σₜ=√[(1−αₜ₋₁)/(1−αₜ)] · √(1−αₜ/αₜ₋₁):恢复DDPM的采样过程。

四、DDIM采样算法步骤
  1. 输入

    • 预训练噪声预测模型 ϵ θ \epsilon_\theta ϵθ
    • 总时间步 T T T,子序列步数 S S S(如 S = 50 S=50 S=50
    • 方差调度参数 { α t } \{\alpha_t\} {αt}
    • 随机性控制参数 σ t \sigma_t σt
  2. 生成时间步子序列
    选择递减的子序列 { τ 1 , τ 2 , . . . , τ S } \{\tau_1, \tau_2, ..., \tau_S\} {τ1,τ2,...,τS},例如均匀间隔或余弦调度。

  3. 初始化:采样初始噪声 x T ∼ N ( 0 , I ) x_T \sim \mathcal{N}(0, \mathbf{I}) xTN(0,I)

  4. 迭代去噪(从 τ S \tau_S τS τ 1 \tau_1 τ1):

    • 预测噪声 ϵ = ϵ θ ( x τ s , τ s ) \epsilon = \epsilon_\theta(x_{\tau_s}, \tau_s) ϵ=ϵθ(xτs,τs)
    • 估计原始数据
      x ^ 0 = x τ s − 1 − α ˉ τ s ϵ α ˉ τ s \hat{x}_0 = \frac{x_{\tau_s} - \sqrt{1 - \bar{\alpha}_{\tau_s}} \epsilon}{\sqrt{\bar{\alpha}_{\tau_s}}} x^0=αˉτs xτs1αˉτs ϵ
    • 计算下一步状态
      x τ s − 1 = α ˉ τ s − 1 x ^ 0 + 1 − α ˉ τ s − 1 − σ τ s 2 ⋅ ϵ + σ τ s z x_{\tau_{s-1}} = \sqrt{\bar{\alpha}_{\tau_{s-1}}} \hat{x}_0 + \sqrt{1 - \bar{\alpha}_{\tau_{s-1}} - \sigma_{\tau_s}^2} \cdot \epsilon + \sigma_{\tau_s} z xτs1=αˉτs1 x^0+1αˉτs1στs2 ϵ+στsz
      • σ τ s = 0 \sigma_{\tau_s}=0 στs=0时,最后一项消失,变为确定性更新。
  5. 输出 x 0 x_0 x0为生成的数据。


五、伪代码示例
def ddim_sample(model, T, S, alphas_bar, sigmas):
    # 生成时间步子序列(如从T到0每隔k步取一次)
    tau = np.linspace(T, 0, S+1, dtype=int)  # 示例:线性间隔
    
    x = torch.randn_like(data)  # x_T ~ N(0, I)
    for s in range(S, 0, -1):
        t_current = tau[s]
        t_prev = tau[s-1]
        
        # 预测噪声
        epsilon = model(x, t_current)
        
        # 估计x0
        x0_hat = (x - np.sqrt(1 - alphas_bar[t_current]) * epsilon) / np.sqrt(alphas_bar[t_current])
        
        # 计算系数
        coeff1 = np.sqrt(alphas_bar[t_prev])
        coeff2 = np.sqrt(1 - alphas_bar[t_prev] - sigmas[t_current]**2)
        
        # 更新x
        x = coeff1 * x0_hat + coeff2 * epsilon + sigmas[t_current] * torch.randn_like(x)
        
    return x

### DDIM采样器介绍及应用 #### 工作原理 DDIM(Denoising Diffusion Implicit Models)是一种改进版的扩散模型,相较于传统的DDPM(Denoising Diffusion Probabilistic Models),具备更优的样本生成质量和一致性特性[^1]。在DDIM中,通过调整声逐步除的过程,可以控制生成过程中的不确定性程度。这种灵活性使得DDIM能够在保持高质量的同时显著减少所需的迭代次数。 对于具体的实现细节而言,DDIM采用了一种非马尔科夫步骤序列化策略,即允许相邻时间步之间的依赖关系存在,从而实现了更加平滑且可控的结果转换路径[^4]。这不仅提高了最终输出的质量,还赋予了模型更强的表现力,尤其是在处理复杂结构的数据集上表现尤为突出。 #### 实现方 为了便于理解和实际部署,下面给出一段基于Python语言编写的简化版本DDIM采样逻辑: ```python import torch from diffusers import DDIMScheduler, UNet2DModel def ddim_sampling(model: UNet2DModel, scheduler: DDIMScheduler, latent_variable, num_inference_steps=50): """ 使用给定的UNet模型和调度程序执行一次DDIM抽样 参数: model (UNet2DModel): 训练好的U-Net网络实例. scheduler (DDIMScheduler): 调度算法对象. latent_variable : 初始潜在向量. num_inference_steps (int): 推理过程中使用的总步数,默认为50. 返回值: List[Tensor]: 各阶段产生的中间状态列表. """ images = [] with torch.no_grad(): for t in reversed(range(num_inference_steps)): # 获取当前时刻t对应的beta_t和其他必要参数 timestep = torch.tensor([t]*latent_variable.shape[0]).to(latent_variable.device) # 预测音并计算预测后的x_0̂ noise_pred = model(latent_variable, timestep).sample # 更新潜变量 prev_latents = scheduler.step(noise_pred, t, latent_variable).prev_sample # 存储每一步骤得到的新图象 images.append(prev_latents.clone()) latent_variable = prev_latents return images[-1] ``` 上述代码片段展示了如何利用预训练过的`UNet2DModel`配合特定配置下的`DDIMScheduler`来完成一轮完整的图像合成任务。值得注意的是,这里仅提供了一个高度抽象化的接口定义;真实环境中还需要考虑更多因素如设备兼容性、数据预处理等。 #### 应用场景 DDIM因其独特的优势被广泛应用于各类视觉创作领域,特别是在需要高效稳定地生成高分辨率图片的任务里表现出色。例如,在艺术风格迁移项目中,开发者们往往倾向于选用DDIM作为默认选项之一,因为其能够有效降低计算成本同时维持良好的画质水平[^2]。此外,借助于内置的一致性质,用户还可以轻松实施诸如跨域翻译或是条件引导等功能扩展,进一步拓宽了技术的应用边界。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

idealmu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值