Skip to content

扩散模型的工作原理:从零开始的数学

扩散模型(Diffusion Models)是一类强大的生成模型,能够生成高分辨率、高质量的图像。近年来,随着 OpenAI、NVIDIA 和 Google 等机构训练出大规模扩散模型,这类方法受到了广泛关注。GLIDE、DALL·E 2、Imagen 以及完全开源的 Stable Diffusion 都是基于扩散模型的代表性架构。

本文从基本原理出发,重点介绍由 Sohl-Dickstein 等人 提出、并经 Ho 等人(2020) 改进的去噪扩散概率模型(DDPM, Denoising Diffusion Probabilistic Model)。Stable Diffusion、基于分数的模型等变体不在本文详细讨论范围内。

扩散模型与以往的生成方法有本质不同:它将图像生成过程拆解为许多小的“去噪”步骤,通过逐步去噪从随机噪声中合成样本。

扩散模型属于生成模型,其目标是学习训练数据的分布并生成相似的新样本。具体而言,扩散模型首先通过前向过程逐步向数据中添加高斯噪声以破坏数据结构,然后学习逆转这一过程,从噪声中恢复原始数据。训练完成后,只需从随机噪声出发,经过学习的去噪过程即可生成新样本。

扩散模型的前向与反向过程示意

扩散模型通过多步迭代去噪生成样本。这种逐步求精的思想与 AlphaFold 等模型有相似之处,但迭代过程也使得采样速度相对较慢。

1. 扩散过程

扩散模型的核心思想可以概括为:通过前向过程逐步向数据添加高斯噪声,再通过反向过程学习逐步去噪。前向过程是固定的、无需学习的马尔可夫链;反向过程则由神经网络参数化,是实际的生成采样过程。

1.1 前向扩散

扩散模型可视为隐变量模型,其中隐变量是与原始数据同维的连续特征。与 VAE 不同,扩散模型的隐变量维度不会降低。

具体地,给定从真实数据分布中采样的样本 x0q(x),前向过程通过 T 步马尔可夫链逐步加噪。马尔可夫性意味着每步仅依赖前一步,其转移分布为:

q(xtxt1)=N(xt;1βtxt1,βtI).

前向扩散过程

前向扩散过程示意图,修改自 Ho et al. 2020

这里 I 为单位矩阵,表示每个维度独立地加入方差为 βt 的高斯噪声。整个前向轨迹的联合分布为:

q(x1:Tx0)=t=1Tq(xtxt1).

若要在任意时刻 t 得到 xt,按上述乘积形式需要递归应用 t 次。借助重参数化技巧,可以直接从 x0 封闭地采样 xt

1.1.1 重参数化技巧

定义 αt=1βtα¯t=s=1tαs,其中 ϵ0,,ϵt1N(0,I),则由重参数化技巧可得:

xt=1βtxt1+βtϵt1=αtxt1+1αtϵt1==α¯tx0+1α¯tϵ0

由于所有时间段都有相同的高斯噪声,我们从现在开始只使用符号 ϵ

因此,为了产生一个样本xt,我们可以使用如下公式:

xtq(xt|x0)=N(xt;α¯tx0,(1α¯t)I)

由于 βt是一个超参数,我们可以预先计算所有时间步的αtα¯t。这意味着我们在任何一个时间点t对噪声进行采样,并一次性得到xt。因此,我们可以在任何一个任意的时间段对我们的潜变量xt进行采样。这将是我们以后计算可操作的目标损失Lt的目标。

1.1.2 方差表

方差参数 βt可以固定为一个常数,也可以选择作为T时间段的一个时间表。事实上,我们可以定义一个方差表,它可以是线性的、二次的、余弦的等等。最初的 DDPM 作者利用了一个从β1=104βT=0.02增加的线性时间表。 Nichol et al. 2021 的研究表明,采用余弦时间表效果更好。

variance-schedule

Latent samples from linear (top) and cosine (bottom) schedules respectively. Source: Nichol & Dhariwal 2021

1.2 反向扩散

T时,隐变量的xT几乎是一个各向同性 (isotropic) 的高斯分布。因此,如果我们知道反向条件分布q(xt1|xt),然后我们可以反向运行该过程, 通过从随机高斯噪声分布N(0,I)中采样一些xt,然后逐渐对其进行“去噪”, 从而生成原始数据分布中的一个新数据点x0

1.2.1 用神经网络近似反向过程

在实际情况中,我们不知道 q(xt1|xt),由于估计q(xt1|xt)需要知道所有可能图像的分布才能计算这个条件概率,因此它是不可行的。

相反,我们用一个参数化的模型 pθ(例如一个神经网络)来近似条件分布q(xt1|xt)。由于q(xt1|xt)也将是高斯分布,对于足够小的βt,我们可以选择pθ为高斯分布,只需对平均值和方差进行参数化:

pθ(xt1|xt)=N(xt1;μθ(xt,t),Σθ(xt,t))

reverse-diffusion

Reverse diffusion process. Image modified by Ho et al. 2020, 其中均值和方差也取决于噪声水平

如果我们对所有的时间步数应用反向公式 pθ(x0:T),我们可以由xT得到数据分布:

pθ(x0:T)=pθ(xT)t=1Tpθ(xt1|xt)

通过在模型上添加时间 t的条件,该模型将学会预测每个时间段的高斯分布参数(指平均值μθ(xt,t))和协方差矩阵Σθ(xt,t)

但我们如何训练这样一个模型呢?

2. 扩散模型训练

2.1 定义目标函数

为了推导出逆向扩散过程的目标函数,作者观察到, qp的组合与变分自编码器 (VAE) (Kingma et al., 2013) 非常相似。因此,我们可以通过优化训练数据的负对数似然来训练它。经过一系列的计算(我们在此不做分析),我们可以把证据下界 (ELBO) 写成如下:

logp(x) Eq(x1|x0)[logpθ(x0|x1)]DKL(q(xT|x0)||p(xT))t=2TEq(xt|x0)[DKL(q(xt1|xt,x0)||pθ(xt1|xt))]=L0LTt=2TLt1

我们来分析一下这些内容:

  1. Eq(x1|x0)[logpθ(x0|x1)]可以当作是一个重建项 (reconstruction term) ,类似于变分自编码器 ELBO 中的项。在 Ho et al 2020 的研究中,这一项是用一个单独的解码器学习的。
  2. DKL(q(xT|x0)||p(xT)) 显示了xT与标准高斯有多接近。注意到,整个项都没有可训练的参数,因此,在训练过程这个项会被忽略。
  3. 最后的第三项 t=2TLt1也表示为Lt,描述了期望的去噪步骤pθ(xt1|xt)与近似项q(xt1|xt,x0)之间的差异。

很明显,通过 ELBO ,最大化似然可以归结为学习去噪步骤 Lt

尽管 q(xt1|xt)是难以解决的,但 Sohl-Dickstein et al 说明,通过对x0的附加条件,可以使它变得容易解决

直观地说,画家(我们的生成模型)需要一个参考图像 (x0) 来慢慢绘制(反向扩散步骤q(xt1|xt,x0))一个图像。因此,当且仅当我们有x0作为参考时,我们可以向后退一小步,即从噪声中生成一个图像。换句话说,我们可以在噪声水平t的条件下对xt进行采样。由于αt=1βtα¯t=s=0tαs,我们可以证明:

q(xt1|xt,x0)=N(xt1;μ~(xt,x0),β~tI)β~t=1α¯t11α¯tβtμ~t(xt,x0)=α¯t1βt1α¯tx0+αt(1α¯t1)1α¯txt

αtα¯t只取决于​βt,所以它可以被预先计算出来

这个小技巧为我们提供了一个完全可操作的 ELBO 。上述属性还有一个重要的副作用,正如我们在重参数化技巧中已经看到的,我们可以将 x0表示为:

x0=1α¯t(xt1α¯tϵ),

其中 ϵN(0,I)

通过合并最后两个方程,现在每个时间步长将有一个仅依赖于xt均值μ~t(我们的目标) :

μ~t(xt)=1αt(xtβt1α¯tϵ)

因此,我们可以使用一个神经网路 ϵθ(xt,t)来近似ϵ并得到如下均值结果:

μθ~(xt,t)=1αt(xtβt1α¯tϵθ(xt,t))

因此,损失函数(ELBO 中的去噪项)可以表示为:

Lt=Ex0,t,ϵ[12||Σθ(xt,t)||22||μ~tμθ(xt,t)||22]=Ex0,t,ϵ[βt22αt(1α¯t)||Σθ||22ϵtϵθ(α¯tx0+1α¯tϵ,t)||2]

这实际上告诉我们,该模型不是预测分布的平均值,而是预测每个时间点 t的噪声ϵ

Ho et.al 2020 对实际损失项做了一些简化,他们忽略了一个加权项。简化后的版本优于完整的目标:

Ltsimple=Ex0,t,ϵ[ϵϵθ(α¯tx0+1α¯tϵ,t)||2]

其中,$ x_0t\epsilont\epsilon_\theta(x_t, t)$是我们的神经网络。神经网络是使用真实和预测的高斯噪声之间的简单均方误差(MSE)进行优化的。

作者发现,优化上述目标比优化原始 ELBO 效果更好。这两个方程的证明可以在 Lillian Weng 的这篇优秀文章或 Luo et al. 2022 中找到。

此外,Ho et. al 2020 决定保持方差固定,让网络只学习均值。后来 Nichol et al. 2021 对此进行了改进,他们让网络学习协方差矩阵 (Σ)(通过修改Ltsimple),取得了更好的结果。

training-sampling-ddpm

DDPMs 的训练和采样算法 , 图片来自 Ho et al. 2020

训练算法现在看起来如下:

  • 首先从真实的未知且可能是复杂的概率分布 q(x0)中随机采样$ x_0$;
  • 在 1 到 T 之间均匀地采样一个噪声水平 t(即,一个随机的时间步);
  • 从高斯分布中采样一些噪声,并通过这个噪声破坏输入;
  • 在水平 t(使用重参数技巧)上,神经网络被训练来基于被破坏的图像xt预测这个噪声(即,基于已知的时间表βt应用于x0上的噪声);

3. 扩散模型架构

到目前为止,我们还没有提到的一件事是模型的架构是什么样子的。请注意,模型的输入和输出应该是相同尺寸的。

为此, Ho et al. 采用了一个 U-Net 。如果你对 U-Net 不熟悉,请随时查看我们过去关于 U-Net 架构 的文章。简而言之, U-Net 是一种对称的架构,其输入和输出的空间大小相同,在相应特征维度的编码器和解码器块之间使用 跳层连接 。通常,输入图像首先经过下采样,然后上采样,直到达到其初始尺寸。

在 DDPMs 的原始实现中, U-Net 由 Wide ResNet 块分组归一化 以及 自注意力 块组成。

扩散时间段 t是通过在每个残差块中加入一个正弦的 位置嵌入 来指定的。欲了解更多细节,请随时访问 官方 GitHub 仓库 。关于扩散模型的详细实现,请查看 [Hugging Face 的这篇精彩文章](https://Hugging Face.co/blog/annotated-diffusion) 。

unet

U-Net 的架构 ,图片来自 Ronneberger et al.

4. 条件图像生成:引导扩散

图像生成的一个关键方面是调节采样过程,以操纵生成的样本。在这里,这也被称为引导性扩散。

甚至有一些方法将图像嵌入到扩散中,以便“引导”生成。从数学上讲,引导指的是用一个条件 y,即类别标签或图像/文本嵌入来调节先验数据分布p(x),导致p(x|y)。 为了把扩散模型pθ变成一个条件扩散模型,我们可以在每个扩散步骤中加入条件信息y:

pθ(x0:T|y)=pθ(xT)t=1Tpθ(xt1|xt,y)

条件在每个时间步都可见,这可能是文字提示的优秀样本的一个良好证明。

一般来说,引导扩散模型的目的是学习 logpθ(xt|y),所以使用贝叶斯规则,我们可以写出:

xtlogpθ(xt|y)=xtlog(pθ(y|xt)pθ(xt)pθ(y))=xtlogpθ(xt)+xtlog(pθ(y|xt))

因为 pθ(y)被移除,梯度算子xt仅涉及xt, 所以没有y的梯度。此外请记住log(ab)=log(a)+log(b)

再加上一个引导标量项 s,我们就有:

logpθ(xt|y)=logpθ(xt)+slog(pθ(y|xt))

利用这一表述,让我们对分类器和无分类器的引导进行区分。

4.1 分类引导

Sohl-Dickstein et al. 以及后来的 Dhariwal 和 Nichol 表明,我们可以使用第二个模型,即分类器 fϕ(y|xt,t),在训练过程中引导扩散朝着目标类别y。为了达到这个目的,我们可以在噪声图像xt上训练一个分类器fϕ(y|xt,t)以预测其类别y。然后我们可以使用梯度log(fϕ(y|xt))来引导扩散。具体怎么做呢?

我们可以建立一个具有均值 μθ(xt|y)和方差Σθ(xt|y)的类条件扩散模型。

由于 pθN(μθ,Σθ),我们可以用上一节的引导公式表明,均值受到了y类的logfϕ(y|xt)的梯度扰动,结果是:

μ^(xt|y)=μθ(xt|y)+sΣθ(xt|y)xtlogfϕ(y|xt,t)

Nichol et al. 著名的 GLIDE 论文 中,作者扩展了这个想法,并使用 CLIP 嵌入 来指导扩散。 Saharia et al. 提出的 CLIP 由一个图像编码器 g和一个文本编码器h组成。它分别产生一个图像和文本嵌入g(xt)h(c),其中c是文本标题。

因此,我们可以用它们的点积来扰动梯度:

μ^(xt|c)=μ(xt|c)+sΣθ(xt|c)xtg(xt)h(c)

结果,他们能够“引导”生成过程朝着用户定义的文本标题发展。

classifier-guidance

分类器引导的扩散采样算法,图片来自 Dhariwal & Nichol 2021

4.2 无分类器引导

使用与之前相同的表述,我们可以将无分类器的引导扩散模型定义为:

logp(xt|y)=slog(p(xt|y))+(1s)logp(xt)

正如 Ho & Salimans 所提议的那样,不需要第二个分类器模型就可以实现指导作用。事实上,他们使用的是完全相同的神经网络,而不是训练一个单独的分类器,作者将条件性扩散模型 ϵθ(xt|y)与无条件性模型ϵθ(xt|0)一起训练。在训练过程中,他们随机地将类y设置为0,这样模型就同时接触到了有条件和无条件的设置:

ϵ^θ(xt|y)=sϵθ(xt|y)+(1s)ϵθ(xt|0)=ϵθ(xt|0)+s(ϵθ(xt|y)ϵθ(xt|0))

请注意,这也可以用来“注入”文本嵌入,正如我们在分类器指导中显示的那样

这个无疑“奇怪”的过程有两个主要优点:

  1. 它只使用一个单一的模型来指导扩散。
  2. 它简化了在难以用分类器预测的信息(如文本嵌入)的条件下的引导。

Saharia et al. 提出的 Imagen 在很大程度上依赖于无分类器的引导,因为他们发现这是生成具有强图像-文本对齐的样本的关键贡献者。关于 Imagen 方法的更多信息,请看 AI Coffee Break 与 Letitia 的这段 YouTube 视频:

4.3 扩展扩散模型

你可能会问这些模型有什么问题。嗯,将这些 U-Nets 扩展到高分辨率图像在计算上非常昂贵。这给我们带来了两种方法,将扩散模型扩展到更高分辨率:级联扩散模型和潜在扩散模型。

4.4 级联扩散模型

Ho et al. 2021 引入了级联扩散模型,以产生高保真的图像。级联扩散模型包括一个由许多连续扩散模型组成的Pipeline,这些模型生成分辨率逐渐增加的图像。每个模型通过连续上采样图像并添加更高分辨率的细节,生成比前一个更高质量的样本。要生成图像,我们从每个扩散模型顺序采样。

cascade-diffusion

级联扩散模型Pipeline,图片来自 Ho & Saharia et al.

为了在使用级联架构时获得良好的结果,对每个超分辨率模型的输入进行强数据增强至关重要。为什么?因为它减轻了前面级联模型的复合误差,以及由于训练-测试不匹配造成的误差。

研究发现,发现高斯模糊是实现高保真度的一个关键转换。他们将这种技术称为条件增强。

4.5 Stable Diffusion: 隐变量扩散模型

隐变量扩散模型是基于一个相当简单的想法:我们不是直接在高维输入上应用扩散过程,而是将输入投射到一个较小的隐变量空间,并在隐变量空间应用扩散。

更详细地说, Rombach et al. 建议使用编码器网络将输入编码为隐变量表示,即 zt=g(xt)。这一决定背后的直觉是通过在低维空间处理输入来降低训练扩散模型的计算需求。之后,一个标准的扩散模型 (U-Net) 应用于生成新的数据,这些数据被一个解码器网络放大。

如果一个典型的扩散模型 (DM) 的损失被表述为:

LDM=Ex,t,ϵ[ϵϵθ(xt,t)||2]

然后,给定编码器 E和一个隐变量表示z,那么一个隐变量扩散模型 (LDM) 的损失函数可以表示为:

LLDM=EE(x),t,ϵ[ϵϵθ(zt,t)||2]
stable-diffusion

隐变量的扩散模型,图片来自 Rombach et al

欲了解更多信息,请看这个 YouTube 视频:

5. 基于分数的生成模型

在 DDPM 论文发表的同时, Song and Ermon 提出了一种不同类型的生成模型,似乎与扩散模型有许多相似之处。基于分数的模型利用分数匹配和 Langevin 动力学来解决生成式学习。

xt=xt1+δ2xlogp(xt1)+δϵ, whereϵN(0,I)

其中 δ是步长大小。

假设我们有一个概率密度 p(x),并且我们定义分数函数为xlogp(x)。然后我们可以训练一个神经网络sθ来估计xlogp(x),而不用先估计p(x)。训练目标可以表述如下:

Ep(x)[xlogp(x)sθ(x)22]=p(x)xlogp(x)sθ(x)22dx

然后通过使用 Langevin 动力学,我们可以使用近似的分数函数直接从 p(x)中采样。

引导式扩散模型使用这种基于分数的模型的表述,因为它直接学习 xlogp(x)。当然,它并不依赖 Langevin 动力学

5.1 为基于分数的模型添加噪音:噪声条件得分网络 (NCSN)

到目前为止的问题是:在低密度地区,估计的分数函数通常是不准确的,因为那里的数据点很少。因此,使用 Langevin 动力学采样的数据质量并不好.

他们的解决方案是对数据点进行噪声扰动,然后在噪声数据点上训练基于分数的模型。事实上,他们使用了多种规模的高斯噪声扰动。

因此,添加噪声是使 DDPM 和基于分数的模型都起作用的关键。

score-based

基于分数的生成模型与分数匹配以及 Langevin 动力学,图片来自 Generative Modeling by Estimating Gradients of the Data Distribution

在数学上,给定数据分布 p(x),我们用高斯噪声进行扰动N(0,σi2I)其中i=1,2,,L得到一个噪声扰动的分布:

pσi(x)=p(y)N(x;y,σi2I)dy

然后我们训练一个网络 sθ(x,i),称为基于噪声条件的分数网络 (NCSN) 来估计分数函数xlogdσi(x)。训练目标是所有噪声尺度的 Fisher 散度 的加权和:

i=1Lλ(i)Epσi(x)[xlogpσi(x)sθ(x,i)22]

5.2 通过随机微分方程 (SDE) 进行基于分数的生成性建模

Song et al. 2021 探讨了基于分数的模型与扩散模型的联系。为了将 NSCNs 和 DDPMs 都囊括在同一伞下,他们提出了以下建议。

我们不使用有限数量的噪声分布来扰动数据,而是使用连续的分布,这些分布根据扩散过程随时间演变。这个过程由一个规定的随机微分方程 (SDE) 来模拟,它不依赖于数据,也没有可训练的参数。通过逆转这个过程,我们可以生成新的样本。

score-sde

通过随机微分方程 (SDE) 进行基于分数的生成性建模, 图片来自 Song et al. 2021

我们可以把扩散过程 {x(t)}t[0,T]定义为以下形式的 SDE:

dx=f(x,t)dt+g(t)dw

其中,w是维纳过程(又称布朗运动)。f(,t)是一个矢量值函数,称为x(t)的漂移系数,g()是一个标度函数,称为x(t)的扩散系数。请注意, SDE 通常有一个唯一的强解。

为了理解我们为什么使用 SDE ,这里有一个提示: SDE 的灵感来自于布朗运动,在布朗运动中,一些粒子在介质内随机移动。粒子运动的这种随机性模拟了数据上的连续噪声扰动

在对原始数据分布进行足够长时间的扰动后,被扰动的分布会变得接近于一个可操作的噪声分布。

为了产生新的样本,我们需要逆转扩散过程。该 SDE 被选择为有一个相应的封闭形式的反向 SDE:

dx=[f(x,t)g2(t)xlogpt(x)]dt+g(t)dw

为了计算反向 SDE ,我们需要估计分数函数 xlogpt(x)。这是用基于分数的模型sθ(x,i)和 Langevin 动力学完成的。训练目标是 Fisher 分歧的连续组合:

EtU(0,T)Ept(x)[λ(t)xlogpt(x)sθ(x,t)22]

其中 U(0,T)表示时间间隔上的均匀分布,λ是一个正的加权函数。一旦我们有了分数函数,我们就可以把它放入反向 SDE 并求解,以便从原始数据分布p0(x)中采样x(0)

有许多解决反向 SDE 的方案,我们在此不作分析。请务必查看原始论文或作者的 这篇优秀博文

score-based-sde-overview

通过 SDEs 进行基于分数的生成性建模的概述, 图片来自 Song et al. 2021

总结

让我们对这篇博文中所学到的主要内容做一个简单的总结。

  • 扩散模型的工作原理是通过一系列的 T 步骤将高斯噪声逐渐添加到原始图像中,这个过程被称为扩散。
  • 为了对新数据进行采样,我们使用神经网络对反向扩散过程进行近似。
  • 模型的训练是基于证据下界 (ELBO) 的最大化。
  • 我们可以将扩散模型置于图像标签或文本嵌入的条件下,以便“指导”扩散过程。
  • 级联扩散和隐变量扩散是两种将模型扩展到高分辨率的方法。
  • 级联扩散模型是连续的扩散模型,可以生成分辨率越来越高的图像。
  • 隐变量扩散模型(像 Stable Diffusion )在较小的隐变量空间上应用扩散过程,以提高计算效率,使用变分自编码器进行向上和向下取样。
  • 基于分数的模型也将一连串的噪声扰动应用到原始图像上。但它是用分数匹配和 Langevin 动力学来训练的。尽管如此,它最终的目标是相似的。
  • 扩散过程可以被表述为一个 SDE 。解决反向 SDE 使我们能够生成新的样本。

最后,有关扩散模型和 VAE 或 AE 之间联系的更多信息,请查看 这些很棒的文章

本文翻译自 AI Summer 的工作人员 Sergios Karagiannakos, Nikolas Adaloglou 等几人发布的一篇文章,原文是 How diffusion models work: the math from scratch | AI Summer (theaisummer.com)

6. References

[1] Sohl-Dickstein, Jascha, et al. Deep Unsupervised Learning Using Nonequilibrium Thermodynamics. arXiv:1503.03585, arXiv, 18 Nov. 2015

[2] Ho, Jonathan, et al. Denoising Diffusion Probabilistic Models. arXiv:2006.11239, arXiv, 16 Dec. 2020

[3] Nichol, Alex, and Prafulla Dhariwal. Improved Denoising Diffusion Probabilistic Models. arXiv:2102.09672, arXiv, 18 Feb. 2021

[4] Dhariwal, Prafulla, and Alex Nichol. Diffusion Models Beat GANs on Image Synthesis. arXiv:2105.05233, arXiv, 1 June 2021

[5] Nichol, Alex, et al. GLIDE: Towards Photorealistic Image Generation and Editing with Text-Guided Diffusion Models. arXiv:2112.10741, arXiv, 8 Mar. 2022

[6] Ho, Jonathan, and Tim Salimans. Classifier-Free Diffusion Guidance. 2021. openreview.net

[7] Ramesh, Aditya, et al. Hierarchical Text-Conditional Image Generation with CLIP Latents. arXiv:2204.06125, arXiv, 12 Apr. 2022

[8] Saharia, Chitwan, et al. Photorealistic Text-to-Image Diffusion Models with Deep Language Understanding. arXiv:2205.11487, arXiv, 23 May 2022

[9] Rombach, Robin, et al. High-Resolution Image Synthesis with Latent Diffusion Models. arXiv:2112.10752, arXiv, 13 Apr. 2022

[10] Ho, Jonathan, et al. Cascaded Diffusion Models for High Fidelity Image Generation. arXiv:2106.15282, arXiv, 17 Dec. 2021

[11] Weng, Lilian. What Are Diffusion Models? 11 July 2021

[12] O'Connor, Ryan. Introduction to Diffusion Models for Machine Learning AssemblyAI Blog, 12 May 2022

[13] Rogge, Niels and Rasul, Kashif. [The Annotated Diffusion Model](https://Hugging Face.co/blog/annotated-diffusion) . Hugging Face Blog, 7 June 2022

[14] Das, Ayan. “An Introduction to Diffusion Probabilistic Models.” Ayan Das, 4 Dec. 2021

[15] Song, Yang, and Stefano Ermon. Generative Modeling by Estimating Gradients of the Data Distribution. arXiv:1907.05600, arXiv, 10 Oct. 2020

[16] Song, Yang, and Stefano Ermon. Improved Techniques for Training Score-Based Generative Models. arXiv:2006.09011, arXiv, 23 Oct. 2020

[17] Song, Yang, et al. Score-Based Generative Modeling through Stochastic Differential Equations. arXiv:2011.13456, arXiv, 10 Feb. 2021

[18] Song, Yang. Generative Modeling by Estimating Gradients of the Data Distribution, 5 May 2021

[19] Luo, Calvin. Understanding Diffusion Models: A Unified Perspective. 25 Aug. 2022

Maintained by Robin