[基础] DDPM原理

名称

DDPM: Denoising Diffusion Probabilistic Models
时间:2020.12

TL;DR

这篇文章介绍了一种名为去噪扩散概率模型(Denoising Diffusion Probabilistic Models, DDPM)的新型生成模型。DDPM通过在图像逐步添加噪声来构造训练样本,推理过程可以从噪声中逐步采样出清晰的图像。这种方法在图像合成方面取得了高质量的结果,特别是在CIFAR-10和LSUN数据集上,其生成的图像在Inception分数和FID分数上达到了最先进的水平。

Method

直观理解

训练过程(Forward Process):将原始图像X0不断叠加噪声经过T步变成高斯噪声图像XT,而中间每一步产生的噪声都可以作为GT来训练一个生成噪声的模型。
推理过程(Reverse Process):以高斯噪声图像XT作为初值,每一步使用训好的模型生成噪声e,并在噪声图像上去噪,经过T步左右生成清晰图像。

训练过程

按照上面理解让我们自己设计一个Diffusion Model,我们可能会这么设计: 训练一个已知\(x_t\)预测\(x_{t-1}\)的网络,实际上\(x_{t-1}\)中包含一定的随机成分,而采样操作是不可微分传递梯度的。解决这个问题可以使用reparameterization trick,将\(x_{t-1}\)的随机成分拆出来,使用重参数化技巧另外一个好处是递推公式可以被展开,利用多个正态分布线性叠加为一个新的正态分布,极大简化了模型训练的可实操性。

所以,实际训练过程输入:采样出的步数t、以某个系数对X0加噪声a之后的噪声图像。监督模型预测叠加的噪声a。

Q: 模型已经输入了ε,但是Loss的减号左边需要预测的也是ε,对于一个神经网络训练而言不是相当于泄露Ground truth信息了吗(模型更倾向于完全相信ε这个输入,直接拟合一个Identity的网络,而忽略X0和t这两支输入)?
A from苏神:ϵθ的输入不只是ϵ,而是ϵ与其它信号的加权求和,从求和中析出原本的成本并不是一件简单的事情,不存在泄漏的问题(或者说,这个任务本身就是靠一丁点的泄漏去推测出完整的噪声)。直观理解,就好比说已知两个质数的成绩,来求这两个数本身不是一件容易的事情(大数分解,现代密码学的基石)。

推理过程

原文中的伪代码

Q:为什么t~1过程去噪之后还要再加高斯噪声z呢?
A:
a) 类似于VAE,去噪模型预测仅是当前这一步噪声的Mean,而增加多样性还需要加上variance。
b) 训练过程的噪声输入本身在每一步都加入了随机性,但推理过程的每一步如果不加上噪声随机性,就会导致推理与训练过程行为不一致。

CodeReading

参考DenoisingDiffusionProbabilityModel-ddpm

Train

def forward(self, x_0):
    # 生成batch_size个采样时间戳
    t = torch.randint(self.T, size=(x_0.shape[0], ), device=x_0.device)
    # 采样与输入图片同shape的标准高斯噪声 
    noise = torch.randn_like(x_0)
    # extract用来按t取应对的alpha超参(参考公式)
    x_t = (
        extract(self.sqrt_alphas_bar, t, x_0.shape) * x_0 +
        extract(self.sqrt_one_minus_alphas_bar, t, x_0.shape) * noise)
    # 这里看出用来作GT的noise与对图像加噪的noise是同一次采样
    loss = F.mse_loss(self.model(x_t, t), noise, reduction='none')
    return loss

Sampling

基本与原文中伪代码一致,更具体参考:GaussianDiffusionSampler

总结与发散思考

与VAE中latent space上的高斯噪声建模原理基本一致,只不过将该过程利用马尔可夫链分散成为多步。
从AR(AutoRegressive)角度来看,像是利用一个Decoder模型,按照设定的scheduler将图像内容逐渐填充。

基础

KL散度 FromChatGPT(提示词:KL散度为什么是非对称的?为什么不满足交换律?从几何角度考虑如果是两个分布的差异程度的话,那A与B的差异不应该和B与A的差异是相同的吗?) KL散度(Kullback-Leibler divergence)是一种用于度量两个概率分布之间差异的指标。它的非对称性和不满足交换律是由其定义方式所决定的。

KL散度的定义如下:

KL(P || Q) = Σ P(x) * log(P(x) / Q(x))

其中,P和Q是两个概率分布,x是样本空间中的元素。

从几何角度来看,KL散度可以被理解为衡量从Q到P的信息损失或信息增益。它并不是一个度量两个分布之间的距离,而是一个度量它们之间的差异或分歧程度的指标。

为什么KL散度是非对称的呢?这是因为KL散度中包含了求和符号,每个元素的贡献是由P(x) * log(P(x) / Q(x))确定的。由于log函数中的除法是非对称的,即log(a/b)不等于log(b/a),因此KL散度也是非对称的。

换句话说,KL(P || Q)不等于KL(Q || P)。

另外,KL散度也不满足交换律。也就是说,KL(P || Q)不等于KL(Q || P)。

从几何角度考虑,KL散度衡量的是从Q到P的信息损失或信息增益。这种信息损失或增益是与两个分布的相对位置和形状有关的。因此,A与B的差异和B与A的差异并不一定相同,因为它们可能具有不同的相对位置和形状。KL散度度量的是两个分布之间的差异,而不是它们之间的对称性或互换性。

马尔可夫链 FromChatGPT(提示词:什么是马尔可夫链?与Denoising Diffusion Probabilistic Models与什么关系?) 马尔可夫链是一种数学模型,用于描述具有“无记忆性”特点的随机过程。在这种过程中,系统的下一个状态只依赖于当前状态,而与之前的历史状态无关。马尔可夫链的核心概念包括状态空间、转移概率矩阵和平稳分布。状态空间是所有可能状态的集合,转移概率矩阵描述了从一个状态转移到另一个状态的概率,而平稳分布是系统长期运行后达到的稳定状态的概率分布。

马尔可夫链可以是离散时间的(如随机游走)或连续时间的(如泊松过程)。它们在许多领域都有应用,包括物理学、工程学、经济学、金融学、生物学和计算机科学等。

Denoising Diffusion Probabilistic Models(去噪扩散概率模型,简称DDPM)是一种生成模型,它基于扩散过程来模拟数据的生成。在DDPM中,数据的生成过程被视为一个逐步添加噪声的过程,这个过程可以用马尔可夫链来描述。具体来说,DDPM通过定义一个逆向的马尔可夫链来学习如何从噪声中恢复出清晰的数据样本。这个过程包括两个阶段:

  1. 正向扩散过程:在这个阶段,数据逐渐被噪声“污染”,直到达到一个完全随机的状态。这个过程可以看作是一个马尔可夫链,其中每一步都添加一些噪声,直到数据完全失真。

  2. 逆向生成过程:在这个阶段,模型学习如何从噪声状态逐步恢复出原始数据。这个过程是正向扩散过程的逆过程,也是一个马尔可夫链,但每一步都是去噪操作,目的是逆转噪声的影响,最终恢复出清晰的数据样本。

DDPM与马尔可夫链的关系在于,DDPM的逆向生成过程可以被视为一个马尔可夫链,其中每一步都是基于当前状态和噪声水平来预测下一个状态。这种模型在生成高质量图像和其他类型的数据方面显示出了很好的性能,尤其是在处理高维数据时。通过训练这个逆向马尔可夫链,DDPM能够学习如何有效地从噪声中恢复出有意义的信息。

参考材料

https://lilianweng.github.io/posts/2021-07-11-diffusion-models/#:~:text=Diffusion models are inspired by,data samples from the noise
https://speech.ee.ntu.edu.tw/~hylee/ml/ml2023-course-data/DDPM (v7).pdf
https://spaces.ac.cn/archives/9119
https://github.com/zoubohao/DenoisingDiffusionProbabilityModel-ddpm-

posted @ 2024-03-11 00:11  fariver  阅读(103)  评论(0编辑  收藏  举报