DL——DDIM

文本介绍DDIM(Denoising Diffusion Implicit Models)的理论介绍

DDPM为什么慢?

  • 采样步数不能太小,否则单次破坏力度过大,不容易恢复?
  • 不能跳步,否则不遵循马尔科夫过程

推导过程

  • 核心是在DDPM的基础上,增加解决马尔科夫问题
  • 直观理解
  • 推导结果,推导流程有时间再补充
    • 当采样方差\(\sigma\)满足一定条件时,上面的式子会满足马尔科夫过程,即等价于DDPM
  • 图示跳步采样(生成)的原理:

训练和推理

DDPM的训练和推理

DDIM的训练和推理

  • 训练过程与DDPM基本一致,但DDIM只需要采样固定间隔的步数即可

    • 如果已经有训练好的DDPM,可以直接用,因为DDPM的训练时间步包含了DDIM的训练时间步
  • 推理过程

  • 推理时,一般会设置\(\sigma=0\),即DDIM是确定性的,也就是DDIM中I(Implicit)区别于DDPM中(Probabilistic)的原因

实验结果

  • 实验设置
  • 结果展示
  • 结果分析
  • 从图中可以得出结论
    • \(\sigma\)越小(\(\eta\)越小,方差越小),即方差越小,效果越好,DDIM最好(DDIM对应\(\eta=0\)且\(\sigma=0\))
    • 当\(T=1000\)时(或者\(T\)非常大时),DDPM效果最好(DDPM对应\(\eta=1\)且\(\sigma = \hat{\sigma}\))
    • 小节:当采样步数少时(即间隔大时),使用DDIM效果更好,DDPM效果非常差;当采样步数很大时,DDPM效果微微好于DDIM

代码亲测

  • 各种\(\alpha,\beta\)的定义技巧:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    num_steps = 100
    betas = torch.linspace(-6,6,num_steps)
    betas = torch.sigmoid(betas)*(0.5e-2 - 1e-5)+1e-5 # beta逐步递增
    alphas = 1-betas
    print("alphas: %s" % alphas)
    alphas_prod = torch.cumprod(alphas,0) # 连乘
    alphas_bar = alphas_prod
    alphas_prod_p = torch.cat([torch.tensor([1]).float(),alphas_prod[:-1]],0) # previous连乘
    alphas_bar_sqrt = torch.sqrt(alphas_bar)
    one_minus_alphas_bar_log = torch.log(1 - alphas_bar)
    one_minus_alphas_bar_sqrt = torch.sqrt(1 - alphas_bar)

    # 模型定义:model(x, t)
    # 采样方式:torch.randn_like(x)
  • 实现细节(为了清晰表达,对原始采样公式有所修改):
    $$
    x_s = \sqrt{\bar{\alpha}_s}\left(\frac{x_k-\sqrt{1-\bar{\alpha}_k}\epsilon_{\theta}(x_k,k)}{\bar{\alpha}_k}\right) + \sqrt{1-\bar{\alpha}_s-a_1\sigma_k^2}\epsilon_{\theta}(x_k,k) + a_2\sigma_k \epsilon
    $$

    • 其中:\(\sigma_k^2 = \beta_t\)
    • 注意:\(a_1,a_2\)是新加的,拆开\(a_1,a_2\)的原因是实验发现两者可以设置不同值,且有以下现象:
      • \(a_2=0,a_1=1.0\)时,此时表示不采样,整个生成过程中没有添加随机值(除了初始样本为随机值外),不影响样本的生成质量,相对有随机值生成效果甚至更好
      • \(a_1=0\)时,无论\(a_2\)值为多少,生成的样本均是类似乱码的图
      • \(a_1>0.5\)时,无论\(a_2\)值是否为0,生成的样本均不错(\(a_1\)的值不能太小,否则效果会不好)
  • 亲测实验结果与论文有偏差的原因分析:

    • 如果采样步数较少,效果也不好,但当采样间隔为2时,即跳一步采样,效果还可以(不如间隔为1)
      • 采样步数越多,效果越好(与原始论文结果一样)
    • 为什么本人实现的DDIM采样步数不能太少?(跳步10步时效果较差,与原始论文结果不一致)
      • DDIM可能对模型要求很高,本人尝试环境中模型过于简单?训练样本过少?
    • 为什么\(a_1=0\)时,效果非常差?
      • 待解答

DDIM对比DDPM

  • DDIM训练流程与DDPM完全相同,只是推理(采样)过程不同
  • DDIM主要解决DDPM采样慢的问题
    • DDPM有符合马尔科夫假设,需要一步步采样,效率慢
    • DDIM没有马尔科夫假设,可以跳步生成图片,且可以不采样(标准的DDIM就是不采样的,论文中,噪音的方差越小,得到的效果越好)

一些问题和解答

  • DDPM采样时不能去掉噪音,为什么DDIM可以?
    • 回答:因为DDIM采样中,噪音的方差\(\sigma\)是通过实验发现效果比较好的
    • 具体原因?
  • 为什么DDPM和DDIM训练逻辑基本一致,但DDPM推断必须遵循马尔科夫性,而DDIM不需要?
    • 回答:
      • 训练时:DDIM和DDPM训练过程都遵循马尔科夫过程。DDIM可以按照一定间隔采样时间步,但实际上也是经过在满足马尔科夫过程的情况下推导出来的,DDPM和DDIM的训练采样公式都是因为方差可以累加实现跳跃采样的
      • 推断时:因为DDPM的采样公式是在满足马尔科夫过程情况下推导出来的, 而DDIM的采样公式是在非马尔科夫过程情况下推导出来的,所以使用DDPM采样公式时,不能跳步;使用DDIM采样公式时(注意:实际上DDIM不采样,直接确定性生成),可以跳步