DDPM:Denoising Diffusion Probabilistic Models

2006.11239

https://github.com/hojonathanho/diffusion

摘要

我们使用扩散概率模型呈现了高质量的图像合成结果,这是一类潜在变量模型的想法来自非平衡热力学。

导言

各种深度生成模型最近在各种数据模式中显示出高质量的样本。生成对抗网络(GANs)、自回归模型、流和变分自编码器(VAEs)已经合成了引人注目的图像和音频样。

扩散概率模型(为了简洁起见,我们称之为“扩散模型”)是一个参数化的马尔可夫链,使用变分推理进行训练,在有限时间后产生与数据相匹配的样本。这条链的转换被学习为逆转扩散过程,扩散过程是一个马尔可夫链,它逐渐向相反采样方向的数据增加噪声,直到信号被破坏。当扩散包含少量的高斯噪声时,将采样链转换设置为条件高斯噪声就足够了,允许一个特别简单的神经网络参数化。

image.png

扩散模型定义起来很简单,训练效率也很高,但据我们所知,还没有证据表明它们能够生成高质量的样本。我们这篇论文证明,扩散模型实际上能够生成高质量的样本,有时比在其他类型的生成模型上发表的更好的结果更好。

背景

扩散模型是$p_θ(x_0) := \int p_θ(x_{0:T} ) dx_{1:T}$的潜在变量模型

其中,$x_1,...,x_T$是与数据$x_0∼q(x_0)$具有相同维度的隐变量

Diffusion models and denoising autoencoders

扩散模型可能是一类有限的潜在变量模型,但它们在实现过程中允许大量的自由度。我们必须选择正向过程的方差$β_t$和反向过程的模型体系结构和高斯分布参数化。为了指导我们的选择,我们在扩散模型和去噪分数匹配之间建立了一个新的明确的联系(第3.2节),这导致了扩散模型的一个简化的、加权的变分界目标(第3.4节)。最终,我们的模型设计是由简单性和实证结果证明的(第4节)。我们的讨论按公式式分类

![image.png](Denoising+Diffusion+Probabilistic+Models/image 1.png)

![image.png](Denoising+Diffusion+Probabilistic+Models/image 2.png)

简化后的目标函数(模型使用的):

![image.png](Denoising+Diffusion+Probabilistic+Models/image 3.png)

其中$\overline{\alpha}_t$是给定好的一组序列,${\overline{\alpha}_0 ... \overline{\alpha}_T}$,生成方式如下代码:

betas = torch.Tensor(
    make_beta_schedule(schedule="linear", n_timestep=n_timestep)
)
# [0.9999, 0.9994, 0.9985, 0.9971, 0.9953, 0.9931, 0.9905, 0.9874, 0.9839,0.9800]
alphas = 1.0 - betas

def make_beta_schedule(
    schedule, n_timestep, linear_start=1e-4, linear_end=2e-2, cosine_s=8e-3
):
    if schedule == "linear":
        betas = (
            torch.linspace(
                linear_start ** 0.5, linear_end ** 0.5, n_timestep, dtype=torch.float64
            )
            ** 2
        )

    elif schedule == "cosine":
        timesteps = (
            torch.arange(n_timestep + 1, dtype=torch.float64) / n_timestep + cosine_s
        )
        alphas = timesteps / (1 + cosine_s) * np.pi / 2
        alphas = torch.cos(alphas).pow(2)
        alphas = alphas / alphas[0]
        betas = 1 - alphas[1:] / alphas[:-1]
        betas = np.clip(betas, a_min=0, a_max=0.999)

    elif schedule == "sqrt_linear":
        betas = torch.linspace(
            linear_start, linear_end, n_timestep, dtype=torch.float64
        )
    elif schedule == "sqrt":
        betas = (
            torch.linspace(linear_start, linear_end, n_timestep, dtype=torch.float64)
            ** 0.5
        )
    else:
        raise ValueError(f"schedule '{schedule}' unknown.")
    return betas.numpy()
   

因为我们的简化目标(14)放弃了等式中的权重(12),它是一个加权变分界,与标准变分界[18,22]相比,它强调了重建的不同方面。特别是,我们在第4节中的扩散过程设置使简化目标简化为对应于小t的降低重量损失项。这些项训练网络用非常小的噪声去噪数据,因此降低其权重是有益的,这样网络就可以在更大的t项下专注于更困难的去噪任务。我们将在我们的实验中看到,这种重新加权会导致更好的样本质量。

注:

T必须>1000,希望$x_t$要服从正态分布。

Last updated