【扩散模型】 DDPM和DDIM讲解

扩散模型DDPM和DDIM

扩散模型之DDPM介绍了经典扩散模型DDPM的原理和实现,那么生成一个样本的次数和训练次数需要一致,导致采样过程很缓慢。这篇文章我们将介绍另外一种扩散模型DDIM(Denoising Diffusion Implicit Models),它两有相同的训练目标,但是它不再限制扩散过程必须是一个马尔卡夫链,这使得DDIM可以采用更小的采样步数来加速生成过程,DDIM的另外是一个特点是从一个随机噪音生成样本的过程是一个确定的过程(中间没有加入随机噪音)。
参考链接:
B站视频: https://www.bilibili.com/video/BV1JY4y1N7dn/
https://zhuanlan.zhihu.com/p/565698027 扩散模型之DDIM

https://zhuanlan.zhihu.com/p/627616358 【生成模型(三)】一文读懂DDIM凭什么可以加速DDPM的采样效率

https://blog.youkuaiyun.com/weixin_43850253/article/details/128413786 DDIM原理及代码(Denoising diffusion implicit models

https://blog.youkuaiyun.com/weixin_43850253/article/details/128275723 IDDPM原理和代码剖析
https://blog.youkuaiyun.com/D_Trump/article/details/126611014 008_SSSS_ Improved Denoising Diffusion Probabilistic Models
https://zhuanlan.zhihu.com/p/626062570 Improved Diffusion代码和理解
https://blog.youkuaiyun.com/zzfive/article/details/127169343 IDDPM论文解读

代码:
https://zhuanlan.zhihu.com/p/635144824
Diffusion之DDPM代码简述、MNIST与Fashion-MNIST生成实战及DDIM加速生成应用
https://blog.youkuaiyun.com/qq_41234663/article/details/128780745
扩散模型(Diffusion model)代码详细解读

回顾DDPM:

在这里插入图片描述
前向过程为一个马尔科夫链,上面公式和DDPM原文里面的alpha代表的不一样了,可能是为了方便起见了。通过推导可以得到:
在这里插入图片描述
反向过程也定义为马尔科夫链:
在这里插入图片描述
在这里插入图片描述
之后使用后验概率:
在这里插入图片描述
在这里插入图片描述
解得方差为定值,均值为:
在这里插入图片描述
通过变分推断和KL散度以及简化得到:
在这里插入图片描述
可以发现DDPM仅依赖于边缘分布,因此可以做其他修改。

DDIM:

为了构造非马尔科夫链的扩散过程,并且复用DDPM的训练过程,现在上面的公式变为:
在这里插入图片描述
并且我们自己构造一个分布,只要满足公式
即可。即前向过程具体怎样我们不需要管了。因此通过待定系数法可以得到:
在这里插入图片描述
这就是我们新的反向生成分布,也就是我们新的要去拟合的“终极目标”。
DDIM中定义以下公式:
在这里插入图片描述
在这里插入图片描述
上面这个公式是基于T的。
对于t>=1的时候要满足:
在这里插入图片描述
通过数学归纳法(在论文中有证明过程)可以得到以下边缘分布公式,因此可以使用DDPM去进行训练:
在这里插入图片描述
在这里插入图片描述
通过xt和x0之间的关系(因为不是马尔科夫了,可以进行变换)推导得到以下公式:
在这里插入图片描述
并且通过证明得到DDPM中的Lsimple和DDIM中的损失是一致的。
论文中将方差定义为超参数
在这里插入图片描述
当标准差为0时,生成过程就是确定性的。
DDIM是一种模型,不能加速,但是我们可以使用技巧在DDIM上加速采样。
我们的采样过程是在一个更短的子序列上面进行的。

ddim_sample.py

@torch.no_grad()
def ddim_sample(self, shape, return_all_timesteps = False):
    batch, device, total_timesteps, sampling_timesteps, eta, objective = shape[0], self.betas.device, self.num_timesteps, self.sampling_timesteps, self.ddim_sampling_eta, self.objective
    times = torch.linspace(-1, total_timesteps - 1, steps = sampling_timesteps + 1)   # [-1, 0, 1, 2, ..., T-1] when sampling_timesteps == total_timesteps
    times = list(reversed(times.int().tolist()))
    time_pairs = list(zip(times[:-1], times[1:])) # [(T-1, T-2), (T-2, T-3), ..., (1, 0), (0, -1)]
    img = torch.randn(shape, device = device)
    imgs = [img]
    x_start = None
    for time, time_next in tqdm(time_pairs, desc = 'sampling loop time step'):
        time_cond = torch.full((batch,), time, device = device, dtype = torch.long)
        self_cond = x_start if self.self_condition else None
        pred_noise, x_start, *_ = self.model_predictions(img, time_cond, self_cond, clip_x_start = True)
        imgs.append(img)
        if time_next < 0:
            img = x_start
            continue

        alpha = self.alphas_cumprod[time]
        alpha_next = self.alphas_cumprod[time_next]
        sigma = eta * ((1 - alpha / alpha_next) * (1 - alpha_next) / (1 - alpha)).sqrt()
        c = (1 - alpha_next - sigma ** 2).sqrt()
        noise = torch.randn_like(img)
        img = x_start * alpha_next.sqrt() + \
              c * pred_noise + \
              sigma * noise
    ret = img if not return_all_timesteps else torch.stack(imgs, dim = 1)
    ret = self.unnormalize(ret)
    return ret

这里面的alpha_next应该是数值更小的。

<think>嗯,用户想找关于手写数据集扩散模型的教程或资料。首先,我需要确认用户的需求具体是什么。他们可能刚接触扩散模型,想用MNIST这样的手写数字数据集来训练生成模型,比如生成手写数字。用户提到的关键词包括“手写数据集”、“扩散模型”、“生成”、“教程”“资料”,所以我需要围绕这些点来整理信息。 首先,手写数据集最常见的是MNIST,可能还有Fashion-MNIST或者其他,但用户明确提到手写数字,所以重点在MNIST。然后扩散模型方面,DDPM(去噪扩散概率模型)是基础,用户可能需要从零开始的代码教程,比如如何构建模型、训练流程、采样过程等。 接下来,我需要检查已有的引用内容。引用12提到了扩散模型实战构建DDPM模型,使用MNIST数据集,这些可以直接推荐给用户。引用3虽然主要讲故事生成,但提到了FID等评估指标,可能对用户了解生成质量评估有帮助。 用户可能需要分步教程,包括数据准备、模型结构、训练代码、采样可视化等。此外,可能还需要理论基础的资料,比如扩散模型的工作原理,如何逐步去噪生成图像。同时,优化方法评估指标也是用户可能关心的,比如如何提升生成质量,使用FID、FSD等指标进行评估。 用户可能没有提到的深层需求包括代码实现的细节,比如使用PyTorch框架,如何处理数据集,调整超参数,以及常见的训练问题。此外,他们可能想了解扩散模型相比其他生成模型(如GAN)的优势,或者在实际应用中的案例。 需要确保推荐的资料教程适合初学者,代码示例清晰,有详细的注释。可能还需要提及一些扩展资源,如相关论文、博客文章或视频教程,帮助用户进一步学习。同时,结合现有的引用内容,引用12提供了实际的代码训练步骤,应该优先推荐。 最后,生成的相关问题需要覆盖教程推荐、模型优化、数据集选择、评估方法、应用场景对比分析,这样用户可以根据自己的需求进一步探索。</think>### 手写数据集与扩散模型生成教程资料整理 #### 一、核心资料推荐 1. **扩散模型实战教程** - 推荐[引用1]的博客《扩散模型实战:从零开始训练手写数字生成模型》,包含完整代码实现,以MNIST数据集为例,详细讲解扩散模型的训练流程、损失函数设计采样过程,适合初学者入门[^1]。 - 代码示例(简化版): ```python # 定义扩散模型的核心步骤:逐步去噪 class DDPM(nn.Module): def forward(self, x, t): noise = torch.randn_like(x) noisy_x = self.sqrt_alphas_cumprod[t] * x + self.sqrt_one_minus_alphas_cumprod[t] * noise return noisy_x, noise ``` 2. **DDPM模型构建指南** - 参考[引用2],MNIST数据集需预处理为标准化灰度图(像素值归一化到$[-1,1]$),模型需设计U-Net结构处理时间步嵌入,损失函数为均方误差(MSE)[^2]。 - 关键公式: $$L(\theta) = \mathbb{E}_{t,x_0,\epsilon}\left[\|\epsilon - \epsilon_\theta(x_t,t)\|^2\right]$$ #### 二、扩展学习方向 1. **数据集选择** - **MNIST**:标准手写数字数据集,含6万训练样本。 - **EMNIST**:扩展版MNIST,包含字母数字。 - **自定义数据集**:通过扫描或绘图工具生成个性化手写体。 2. **模型优化方法** - **加速采样**:使用DDIM(Denoising Diffusion Implicit Models)减少采样步数。 - **条件生成**:添加标签信息实现可控生成(如指定数字类别)。 3. **评估指标** - **Fréchet Inception Distance (FID)**:衡量生成图像与真实数据的分布相似性[^3]。 - **定性分析**:可视化生成样本对比真实数据。 #### 三、实践建议 1. **硬件配置** - 入门级:GPU显存≥8GB(如NVIDIA RTX 3060)。 - 云端方案:使用Colab或AWS EC2实例。 2. **调试技巧** - 初始阶段可缩小图像分辨率(如16×16)快速验证模型可行性。 - 监控训练损失曲线,若损失不下降需检查学习率或噪声调度策略。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值