DDIM、DDPM的sample结果与对比

代码来源:GitHub - LittleNyima/code-snippets

1.ddpm与ddim采样时间和效果的对比

使用cifar-10数据集,训练轮数皆为50轮。采样过程均生成32张图。
ddpm:

Sampling took 58.68 seconds.

ddim:

Sampling completed in 1.44 seconds
对比可以看出,ddim的速度明显比ddpm快多了。不过效果嘛。。。可能是训练的次数不够吧,确实也看不出什么东西。不过ddpm训练出来的东西确实比ddim要少掉san些(?)

然后又用原作者提供的权重模型跑了一下两个的sampling:

DDPM:

Sampling took 60.04 seconds.

DDIM:

Sampling completed in 1.44 seconds

又用CelebA数据集跑了一次,选取了前10000张照片,100epoch

ddpm:

图片 ddpm_20250304-154744.png 用时 59.24 秒

ddim:

ddim_20250304_154848用时1.44 秒

2、ddpm采样过程中噪声项\sigma_t \mathbf{z}的作用?

        测试了一下删除\sigma_t \mathbf{z}的效果(使用celebA数据集的训练结果)。发现无法生成图片。大部分的采样结果是一片黑,少部分的采样结果能隐约看见人的轮廓,背景为深蓝色,其余黑色。

调节\sigma_t \mathbf{z}的系数大小,并比较

epsilon_scale = 0.5  #  0.1 ~ 1.0 之间的值
epsilon = epsilon_scale * torch.randn_like(images)

      ①epsilon_scale = 0.25 

      ②epsilon_scale = 0.5 

      ③epsilon_scale = 0.75 

  ③epsilon_scale = 1.0

  ③epsilon_scale = 1.1

  

③epsilon_scale = 1.5

③epsilon_scale = 2

可以发现,随着系数的降低,sample出来的图像亮度降低,逐渐趋于同质化,且没有背景(背景为纯色)

以下为出现这个原因的一些猜想。

  • ①噪声没有正确弥补,导致采样过程中图像亮度降低

在每个时间步 t,\hat{\epsilon}由 UNet 预测,但预测结果不可能完全准确,它会有 误差\delta,即: \hat{\epsilon} = \epsilon + \delta

如果 epsilon 过小,意味着 σ_t * ε 几乎被移除,每一步的计算变成:

x_{t-1} \approx \frac{1}{\sqrt{\alpha_t}} (x_t - \frac{1 - \alpha_t}{\sqrt{1 - \bar{\alpha}_t}} \cdot \hat{\epsilon})

由于 UNet 的噪声预测有 累积误差,这些误差没有被 σ_t * ε 平衡掉,而是 一步步减少图像信号的整体强度,导致亮度降低。

  • ②生成的样本多样性降低,很多样本会塌缩

    σ_t * ε 代表了 采样过程中增加的随机性,本质上它会给图像提供一些 额外的方差信息,防止采样塌缩。当 epsilon 过小,去噪的方差越来越小,使得生成图像的 像素值逐渐收敛到一个固定的均值,导致:生成的 不同样本变得越来越相似,缺乏多样性(趋于同质化),同时亮度逐渐衰减,因为整个图像像素值在不断向某个固定值塌缩。

3.ddim步数与生成时间、图像质量之间的关系

    修改跳步采样时的步数

        num_train_timesteps: int = 1000,  # 训练时的时间步数
        beta_start: float = 0.0001,  # beta 的起始值
        beta_end: float = 0.02,  # beta 的结束值
        sample_steps: int = 20,  # 采样过程中使用的时间步数

逐渐增加时间步数,查看采样结果与运行时间 

sample_steps=2    ddim_20250304_165359用时0.40 秒

sample_steps=5    sample_steps=2ddim_20250304_165641用时0.58 秒

sample_steps=10    ddim_20250304_165818用时0.87 秒

sample_steps=20    ddim_20250304_170000用时1.43 秒

sample_steps=100    ddim_20250304_170139用时5.94 秒

sample_steps=500    ddim_20250304_170322用时28.86 秒

sample_steps=500    ddim_20250304_170634用时58.80 秒

采样的步数和生成时间大概成线性关系(或者是幂指数关系?)

4.ddim增加随机值eta

以上所展示的图都是eta=0时的情况。下在不同的sample_steps情况下增加eta,查看训练效果。

首先是在sample_steps=20的情况下

eta=0.5

sample_steps=20,eta=1.0

         好像也没什么变化? 

以下是猜想:

        初始噪声 (x_T) 是随机的:DDIM 采样仍然是 从随机噪声 x_T 开始的,即便 eta=0,初始输入 x_T 仍然是高斯噪声。由于 DDIM 只是一个 确定性的映射,不同的 x_T 仍然会导致不同的 x_0,所以 生成的样本还是多样的。

尝试在sample_steps=20比较小的情况下试一下

sample_steps=2,eta=1.0

 可见ddim采样中,随机噪声项eta对于采样结果的影响并不大。原因猜想可能有以下几个:

固定初始噪声噪声,修改eta:

 eta=0

eta=1

eta=3

eta=5

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值