DDPM与DDIM中的采样

在深度生成模型中,采样(Sampling)指的是根据模型生成新样本的过程。在扩散模型(Diffusion Models)中,采样的关键是从高斯噪声逐步还原出原始数据。让我们分别探讨 DDPMDDIM 的采样过程,以及两者之间的差异。


DDPM(Denoising Diffusion Probabilistic Models)中的采样

基本概念

  1. 前向扩散过程(Forward Diffusion Process)

    • 从真实数据 x_0​ 开始,逐步添加高斯噪声生成一系列中间状态 x_1,x_2\dots,x_T​,直到最终变为近似纯噪声 x_T​。
    • 这一过程可以用公式描述为:q(x_t|x_{t-1})=\mathcal{N}(x_t; \sqrt{1-\beta_t} x_{t-1}, \beta_t \mathbf{I}) , 其中 \beta_t 是控制每步添加噪声量的参数。

其中,只有参数 \beta_t​ 是可调的。 \bar{\alpha}_t​ 是根据 \beta_t计算出的变量,其计算方法为:\alpha _t = 1 -\beta _t​, \quad \bar{\alpha}_t = \prod_{i=1}^t \alpha_i.  

为了能直接使用预训练的DDPM,我们希望在改进DDPM时不更改DDPM的训练过程。而经过简化后,DDPM的训练目标只有拟合x₀,训练时只会用到前向过程公式q(\mathbf{x}_t|\mathbf{x}_0) = \mathcal{N}(\mathbf{x}_t; \sqrt{\bar{\alpha}_t}\mathbf{x}_0, (1-\bar{\alpha}_t)\mathbf{I}), 所以,我们的改进应该建立在公式q(\mathbf{x}_t|\mathbf{x}_0)完全不变的前提下。 换中写法:x_t = \sqrt{\bar{\alpha}_t} x_0 + \sqrt{1 - \bar{\alpha}_t} \epsilon

参考:DDIM 简明讲解与 PyTorch 实现:加速扩散模型采样的通用方法 - 知乎

  1. 逆向去噪过程(Reverse Denoising Process)

    • 从纯噪声 x_T​ 开始,逐步去除噪声还原出原始数据 x_0
    • 理论上需要学习真实逆过程的条件分布 q(x_{t-1} | x_t),但实际中近似为高斯分布: p_\theta(x_{t-1} | x_t) = \mathcal{N}(x_{t-1}; \mu_\theta(x_t, t), \Sigma_\theta(x_t, t)),, 其中 \mu_\theta​ 和\Sigma_\theta​ 是由神经网络预测的参数。
  2. 采样过程

    • 逐步去噪:从纯噪声 x_T开始,通过神经网络预测每一步的均值\mu_\theta和方差\Sigma_\theta,逐步采样 x_{T-1}, x_{T-2}, \dots, x_0​。
    • 全步骤采样:完整还原 x_0​ 通常需要数百到上千步,因此计算开销很大。

DDIM(Denoising Diffusion Implicit Models)中的采样

DDIM 是对 DDPM 采样过程的改进,目标是在不重新训练模型的前提下,加速采样并控制生成的灵活性

主要创新

  1. 确定性采样(Deterministic Sampling)

    • 在 DDIM 中,假设逆向过程是一个确定性映射,而不是像 DDPM 那样的随机采样。
    • 给定x_t​,直接计算 x_{t-1} = \sqrt{\alpha_{t-1}} \hat{x}_0(x_t) + \sqrt{1 - \alpha_{t-1}} \cdot \epsilon,, 其中 \hat{x}_0(x_t) 是从当前状态推断的原始数据,\epsilon是噪声估计。
  2. 跳步采样(Non-Markovian Sampling)

    • 在 DDPM 中,采样是逐步进行的(每步对应一个时间步t)。而在 DDIM 中,允许直接跳过中间时间步,从而减少采样步骤。
    • 通过选择一个子集 \{t_1, t_2, \dots, t_N\} (通常 N\ll T),只对这些时间步进行采样,显著提升采样速度。

采样的效果

  • DDIM 的采样是确定性的,这意味着在每一步中,模型会根据当前的噪声图像和预测的噪声,直接计算出前一步的图像,而不是像DDPM(Denoising Diffusion Probabilistic Models)那样依赖于随机噪声。
  • 通过减少采样步数(比如从 1000 步减少到 20 步),采样速度可以提升约 50 倍,同时尽可能保留生成质量。

DDPM 和 DDIM 的采样对比

特性DDPMDDIM
采样类型随机(Stochastic)确定性(Deterministic)
采样步数多步(通常 1000+ 步)少步(比如 20-50 步)
采样速度
生成质量高(取决于步数)质量保持较好
灵活性不支持跳步支持跳步和方差调整

总结

  • 采样的意义
    在扩散模型中,采样是指从纯噪声逐步生成新的样本数据。这个过程模拟了数据从无序到有序的生成过程。
  • DDPM 的采样:随机逐步还原,计算开销大但生成质量高。
  • DDIM 的采样:通过确定性映射和跳步策略,大幅提升采样速度,同时在不重新训练模型的前提下保持生成质量。

LOSS:

the objective of diffusion model is simplified to predicting the true noise ε from Eq. 1 when xt is fed as input with additional inputs like the timestep t and conditioning c.

DDPM, DDIM, stable diffusion 和 LDM 发展历程的概述:

  1. DDPM (Denoising Diffusion Probabilistic Models)

    • DDPM是扩散模型的早期形式,它通过逐步去噪的方式生成高质量数据,但其效率较低,特别是在处理高分辨率图像时需要耗费大量的计算资源。(没有任何的引导生成技术的出现,这一阶段的论文都属于利用输入图像引导生成的范式。)
  2. DDIM (Denoising Diffusion Implicit Models)

    • DDIM是DDPM的改进版本,通过设计非马尔科夫链的扩散过程,提出了一种加速采样的技巧(Respacing),从而加快了模型的推理速度。
  3. LDM (Latent Diffusion Models)

    • LDM进一步发展了扩散模型,通过在低维潜在空间进行扩散过程,极大地减少了计算资源的需求。相比DDPM,LDM在推理速度上有了显著提升,特别是在处理高分辨率图像时,这种优势更加明显。
  4. Stable Diffusion

    • Stable Diffusion是基于LDM发展而成的强大的文生图大模型,它采用了更加稳定、可控和高效的方法来生成高质量图像。Stable Diffusion在生成图像的质量、速度和成本上都有显著的进步,因此该模型可以直接在消费级显卡上实现图像生成。

综上所述,从DDPM到DDIM,再到LDM,最后到Stable Diffusion,这些模型的发展体现了扩散模型在图像生成领域的不断进步和优化。每一步的发展都在提高生成效率、降低计算成本以及提升图像质量方面做出了贡献。

参考:https://zhuanlan.zhihu.com/p/666552214

### 转换方法区别 #### DDPMDDIM 的核心概念对比 DDPM (去噪扩散概率模型) 是一种生成模型,其工作原理在于逐步向数据添加噪声并随后再移除这些噪声以恢复原始数据[^3]。此过程涉及多个离散的时间步,在每一个时间步上都应用一定的噪声水平。 相比之下,DDIM (去噪扩散隐式模型) 可视为一种优化后的版本,允许更高效地遍历相同的扩散过程。具体而言,DDIM能够在较少的推理步骤内完成高质量图像生成的任务,这是因为该模型可以在不显著增加误差的情况下采用较大的跳跃步长[^2]。 #### 过渡方式 要实现从DDPMDDIM的转变,关键是理解两者的采样策略不同: - **DDPM** 使用的是马尔可夫链式的祖先抽样(ancestral sampling),即每次只减少一点点噪音,并依赖于先前的状态来决定下一步的动作[^4]。 - **DDIM**, 则不是严格遵循马尔可夫性质;相反,它可以跳过中间状态直接连接起始点和终点,从而减少了所需的总迭代次数。这种特性使得DDIM能够提供更加平滑的结果以及更好的可控性。 为了将一个已有的DDPM框架调整为支持DDIM模式,开发者需要修改原有的前向传播算法以便适应新的非马尔科夫决策路径。这涉及到重新定义每一步骤间的转移关系,确保即使是在较大跨度之间也能保持合理的重建质量。 ```python import torch def ddim_sampling(model, x_T, steps=100, eta=0.0): """ 实现DDIM采样的函数 参数: model -- 已经训练好的DDPM/Score-based Model x_T -- 输入带有最大量级噪声的数据张量 steps -- 总共使用的降噪步骤数,默认值设为原版DDPM的一半 eta -- 控制随机性的参数,范围介于[0, 1], 当eta接近零时行为趋向确定性 (完全由预测指导) 返回: 清晰化后的输出图片序列 """ betas = get_beta_schedule(timesteps=len(x_T))[:steps] alphas_cumprod_prev = torch.cumprod(1-betas[:-1], dim=-1) img_list = [] current_img = x_T.clone() for i in reversed(range(steps)): t = torch.full((current_img.shape[0],), i, device=current_img.device).long() alpha_t = alphas_cumprod[i].item() if isinstance(alphas_cumprod, list)\ else alphas_cumprod[t] sigma_squared = ((1-alpha_t)/alpha_t)*(beta[i]*eta**2)/(1-alphas_cumprod_prev[i]) noise_level = math.sqrt(sigma_squared * min(i+1, len(betas)-1)) predicted_noise = model(current_img, t) mean_pred = extract_coefficients(alpha_t, sqrt_recip_alphas_cumprod, sqrt_one_minus_alphas_cumprod)[t] * \ current_img -\ extract_coefficients(beta[i], sqrt_recipm1_alphas_cumprod)[t] *\ predicted_noise if i>0: next_img = mean_pred + noise_level*torch.randn_like(mean_pred) else: next_img = mean_pred img_list.append(next_img.detach().cpu()) current_img = next_img return img_list # 辅助功能用于获取预计算系数表 def get_beta_schedule(*args,**kwargs): ... def extract_coefficients(coeff_name,*args,**kwargs): ... ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值