(2024,DDPM,DDIM,流匹配,SDE,ODE)扩散:基础教程

Step-by-Step Diffusion: An Elementary Tutorial

公和众与号:EDPJ(进 Q 交流群:922230617 或加 VX:CV_EDPJ 进 V 交流群)

目录

0 前言

1 扩散的基础知识

1.1 高斯扩散

1.2 抽象中的扩散

1.3 离散化

2 随机采样:DDPM

2.1 DDPM 的正确性

2.2 算法

2.3 方差减少:预测 x0

2.4 扩散作为 SDE [Optional]

3 确定性采样:DDIM

3.1 情况 1:单点

3.2 速度场和气体

3.3 情况 2:两个点

3.4 情况 3:任意分布

3.5 概率流 ODE [Optional]

3.6 讨论:DDPM vs DDIM

3.7 关于泛化的备注

4 Flow Matching

4.1 Flow

4.2 点级流

4.3 边缘流

4.4 点对点流的简单选择

4.5 Flow Matching

4.6 DDIM 作为流匹配 [Optional]

4.7 额外说明和参考资料 [Optional]

5. 实践中的扩散

6 结论


0 前言

有许多现有资源可供学习扩散模型。为什么我们还要再写一个呢?我们的目标是尽可能简单地教授扩散,尽量减少数学和机器学习的前置要求,但又足够详细,以便推理其正确性。与大多数关于此主题的教程不同,我们既不采用变分自编码器(VAE)方法,也不采用随机微分方程(SDE)方法。事实上,对于核心思想,我们不需要任何 SDE、基于证据的下界(ELBO)、朗之万动力学(Langevin dynamics),甚至不需要分数的概念。读者只需熟悉基本的概率、微积分、线性代数和多元高斯分布即可。本教程的目标读者是至少具有高级本科或研究生水平的技术读者,他们第一次学习扩散并希望对该主题有数学上的理解。

本教程分为五个部分,每部分相对独立,但涵盖紧密相关的主题。第一部分介绍了扩散的基本原理:我们试图解决的问题和基本方法概述。第二部分和第三部分分别展示了如何构建随机和确定性扩散采样器,并给出了这些采样器正确逆向扩散过程的直观推导。第四部分介绍了密切相关的流匹配(Flow Matching)主题,这可以看作是扩散的推广,提供了额外的灵活性(包括所谓的整流流或线性流)。最后,在第五部分,我们回到扩散,并将本教程与更广泛的文献联系起来,同时强调实践中最重要的一些设计选择,包括采样器、噪声时间表和参数化方法。

论文地址:https://arxiv.org/abs/2406.08929

【标记为 “[Optional]” 的部分是高级材料,第一次阅读时可以跳过。主章节不依赖于 Optional】

1 扩散的基础知识

生成式建模的目标是:给定来自某些未知分布 p*(x) 的独立同分布样本,构建一个(大致)相同分布的采样器。例如,给定来自某个基础分布 p_dog 的狗图像训练集,我们希望找到一种方法,从该分布中生成新的狗图像。

从高层次上解决这个问题的一种方法是学习从某个易于采样的分布(例如高斯噪声)到目标分布 p* 的变换 (相似的思想:Normalizing Flow)。扩散模型提供了一个学习这种变换的通用框架。扩散的巧妙之处在于将从分布 p*(x) 中采样的问题简化为一系列更容易的采样问题。

这一思想通过以下高斯扩散示例得以最佳解释。我们现在将勾勒出主要思路,并在后面的章节中使用这一设置推导出通常称为 DDPM 和 DDIM 采样器,并论证它们的正确性。

1.1 高斯扩散

对于高斯扩散,设 x_0 是在 R^d 中按目标分布 p*(例如狗的图像)分布的随机变量。然后通过连续添加具有某些小尺度 σ 的独立高斯噪声构造一系列随机变量 x1,x2,…,xT​:

这被称为前向过程(使用这种特定前向过程的一个好处是计算方面的:我们可以在恒定时间内直接给定 x0 来采样 xt。),它将数据分布转换为噪声分布。方程 (1) 定义了一个关于所有 (x0, x1, . . . , xT) 的联合分布,并且我们令{p_t}_(t∈[T]) 表示每个 xt 的边缘分布。注意,在较大的步骤数 T 时,分布 p_T 几乎是高斯分布(形式上,假设 p0 具有有界矩,那么 pT 在 KL 散度上接近 N(0, Tσ^2)。),因此我们可以通过采样一个高斯分布来近似采样 p_T。

现在,假设我们可以解决以下子问题: “给定一个边际分布为 pt 的样本,生成一个边际分布为 p_(t−1) 的样本”。

我们将执行此操作的方法称为反向采样器,因为它告诉我们如何从 p_(t−1) 中采样,假设我们已经可以从 pt 中采样。如果我们有一个反向采样器,我们可以通过从 pT 中简单地开始进行高斯采样,并迭代地应用反向采样过程来获取从 p_(T−1)、p_(T−2)、...直到最终的 p0 = p* 的样本。

扩散的关键见解是,学习每个中间步骤的反向过程可能比一步学习从目标分布中采样更容易(直觉上这是因为分布 (p_(t−1), pt) 已经非常接近,所以反向采样器不需要做太多的工作)。有许多构建反向采样器的方法,但为了具体说明,让我们先看看我们称为 DDPM 采样器的标准扩散采样器。

理想的 DDPM 采样器使用了一个明显的策略:在时间 t,给定输入 z(承诺是从 pt 中采样的样本),我们输出从如下条件分布中采样的样本。

这显然是一个正确的反向采样器。问题在于,它需要为每个 xt 学习条件分布 p(x_(t−1) | xt) 的生成模型,这可能会很复杂。但是,如果每步的噪声 σ 足够小,那么这个条件分布会变得简单:

事实 1(扩散反向过程)。对于小的 σ 和在(1)中定义的高斯扩散过程,条件分布 p(x_(t−1) | xt) 本身接近高斯分布。也就是说,对于所有时间 t 和条件 z ∈ R^d,存在一些均值参数 μ ∈ R^d,使得

这不是一个显而易见的事实;我们将在第 2.1 节推导它。这个事实带来了一个重大的简化:我们不再需要从头开始学习任意分布 p(x_(t−1) | xt),因为现在我们对这个分布的一切都已了然,除了其均值,我们用 μ_(t−1) (xt) 表示(我们将均值表示为一个函数 μ_(t−1) : R^d → R^d,因为 p(x_(t−1) | xt) 的均值取决于时间 t 和条件 xt,如事实 1 所述。)。当 σ 足够小时,我们可以将后验分布近似为高斯分布,如图 2 所示。这是一个重要的观点,所以再次强调:对于给定的时间 t 和条件值 xt,学习 p(x_(t−1) | xt) 的均值足以学习完整的条件分布 p(x_(t−1) | xt)

学习 p(x_(t−1) | xt) 的均值要比学习完整的条件分布简单得多,因为可以通过回归来解决这个问题。具体而言,我们有一个联合分布 (x_(t−1), xt),我们可以轻松地从中采样,并且我们希望估计 E[x_(t−1) | xt]。这可以通过优化标准的回归损失来实现:

其中,期望是针对从我们的目标分布 p* 中抽样得到的样本 x0 而言的。这个特定的回归问题在某些情况下已经被广泛研究。例如,当目标 p* 是图像分布时,对应的回归问题(方程 6)实际上是图像去噪的目标,可以用熟悉的方法来解决(例如卷积神经网络)。

回到主题,我们已经看到了一些显著的东西:我们将从任意分布中抽样学习的问题简化为标准的回归问题。

1.2 抽象中的扩散

现在让我们抽象地讨论高斯设定之外的情况,定义类似扩散的模型,以便捕捉它们的多种实例(包括确定性采样器、离散域和流匹配)。 抽象地说,构建类似扩散的生成模型的方法如下:我们从目标分布 p* 开始,并选择一些易于从中抽样的基础分布 q(x),例如标准高斯分布或独立同分布的比特。然后,我们试图构建一系列在目标 p* 和基础分布 q 之间插值的分布。换句话说,我们构建分布

使得 p0=p* 作为我们的目标分布,pT=q 作为基分布,并且相邻的分布 (p_(t−1), pt) 在某种适当的意义下在边际上是 “接近” 的。然后,我们学习一个反向采样器,它将分布 pt 转换为 p_(t−1​)。这是关键的学习步骤,假设相邻的分布 “接近”,这一步骤应该会更容易些。

具体地,反向采样器如下定义。

定义 1(反向采样器)。给定一系列边际分布 pt,第 t 步的反向采样器是一个潜在的随机函数 Ft​,满足如果 xt∼pt,那么 Ft(xt) 的边际分布恰好是 p_(t−1):

存在许多可能的反向采样器【请注意,这些抽象并不特定于高斯噪声的情况——事实上,它甚至不需要 “添加噪声” 的概念。我们甚至可以在离散设置中实例化它,其中我们考虑在有限集合上的分布 p*,并定义相应的 “插值分布” 和反向采样器】,甚至可以构造确定性的反向采样器。在本教程的其余部分中,我们将更正式地看到三种流行的反向采样器:上面讨论的 DDPM 采样器(第 2.1 节),DDIM 采样器(第 3 节),它是确定性的,以及流匹配模型(第 4 节),可以看作是 DDIM 的一般化【对于给定的一组边际分布 {pt},存在许多可能的联合分布与这些边际分布一致(这些联合分布称为耦合)。因此,对于给定的一组边际分布 {pt},没有一个标准的反向采样器——我们可以自由选择最方便的耦合方式】。

1.3 离散化

在我们进一步进行之前,我们需要更精确地说明相邻分布 pt, p_(t−1) “接近”是什么意思。我们希望将序列 p0,p1,...,pT 视为某种(良好行为的)时间演化函数 p(x,t) 的离散化,该函数从时间 t=0 开始从目标分布 p0 开始,到时间 t=1 结束于有噪分布 pT:

步数 T 控制离散化的精细度(相邻分布的接近程度)【这自然地建议考虑连续时间极限,我们将在第 2.4 节中讨论这一点,尽管在我们大部分论证中并不需要这样做】。

为了确保最终分布 pT 的方差与离散化步数无关,我们还需要更具体地确定每个增量的方差。注意,如果 xk = x_(k−1) + N(0,σ^2),那么 xT∼N(x0, Tσ^2)。因此,我们需要通过 Δt=1/T 缩放每个增量的方差,即选择

其中 σ^2_q 是所需的终端方差(terminal variance)。这个选择确保了无论 T 如何, pT 的方差始终为 σ^2_q。(这种 √Δt 缩放在我们下一章中对反向求解器正确性的论证中将被证明是重要的,并且与第 2.4 节中的 SDE 表述相关联。)

在这一点上,调整我们的符号表示将更为方便。从现在开始,t 将表示在区间 [0, 1] 内的连续值(具体地说,取值为 0, Δt, 2Δt, ..., TΔt = 1)。下标将表示时间而不是索引,例如 xt 现在表示在离散时间 t 的 x。也就是说,方程 1 变为:

这也意味着

因为到时间 t 时添加的总噪声

也是均值为零、方差为

的高斯分布。

2 随机采样:DDPM

在这一节中,我们回顾了在第 1 节中讨论的类似 DDPM 的反向采样器,并启发性地证明了其正确性。这个采样器在概念上与 Ho 等人(2020年)在去噪扩散概率模型(DDPM)中推广的采样器相同,最初由 Sohl-Dickstein 等人(2015年)引入。然而,对于熟悉 Ho 等人(2020年)工作的读者,需要注意:虽然我们的采样器的总体策略与 Ho 等人(2020年)相同,但某些技术细节(如常数等)略有不同【对于专家来说,主要的区别在于我们使用了 “方差爆炸(Variance Exploding)” 的扩散前向过程。我们还使用了一个恒定的噪声计划,并且我们没有讨论如何参数化预测器(“预测 x0 vs. x_(t−1) vs. 噪声 η”)。我们将在第 2.3 节详细阐述后者】。

我们考虑第 1.3 节的设置,其中有一个目标分布 p*,以及由方程(11)定义的噪声样本的联合分布(x0, x_(Δt),...,x1​)。DDPM采样器将需要估计以下条件期望:

这是一组函数 {μ_t},对于每个时间步 t∈{0,Δt,...,1−Δt}都有一个。在训练阶段,我们通过优化如下去噪回归目标来从 x0 的独立同分布样本估计这些函数:

通常使用参数化 f 的神经网络【在实践中,通常会共享参数来学习不同的回归函数 {μ_t},而不是独立地为每个时间步学习一个单独的函数。这通常通过训练一个模型 fθ,该模型接受时间 t 作为额外的参数,并满足 fθ(xt, t) ≈ μt(xt) 来实现】。然后,在推断阶段,我们使用估计的函数来实现以下反向采样器。

要实际生成样本,我们首先从各向同性高斯分布中采样 x1 ∼ N(0, σ^2_q),然后运行算法 1 的迭代直到 t = 0,以生成一个生成样本 ^x0。(回想一下,在我们的离散化符号(12)中,x1 是完全加噪的终端分布,并且迭代采取大小为 Δt 的步骤。)这些算法的显式伪代码在第 2.2 节中给出。

我们想要推理整个过程的正确性:为什么迭代算法 1 可以(近似)生成一个来自我们目标分布 p* 的样本?关键缺失的部分是,我们需要证明某种形式的事实 1:即真实条件分布 p(x_(t−Δt) | xt) 可以很好地近似为高斯分布,并且随着 Δt → 0,这种近似变得更加准确。

2.1 DDPM 的正确性

这里是 Fact 1的更精确版本,以及一个启发式推导。这将完成对算法 1 正确性的论证——即它在 定义 1 的意义下近似于一个有效的反向抽样器。

声明 1(Informal)。设 p_(t−Δt) (x) 是任意充分平滑的 R^d 上的密度。考虑 (x_(t−Δt), xt) 的联合分布,其中

那么,对于足够小的 Δt,以下成立。对于所有的条件 z ∈ R^d,存在 μz 使得:

其中 μz 是仅依赖于 z 的某个常数。此外,仅需 

其中,pt 是 xt 的边际分布。

【专家会认识到这个均值与分数有关。实际上,Tweedie 的公式暗示,即使对于较大的 Δt,这个均值也是完全正确的,无需近似。也就是说,

然而,对于较大的 σ,分布 p(x_(t-Δt) | x_t)可能会偏离高斯分布。】

在看推导之前,有几点备注:声明 1 意味着,要从 x_(t−Δt) 抽样,只需首先从xt 抽样,然后从以E[x_(t−Δt)∣xt] 为中心的高斯分布抽样。这正是 DDPM 在方程 (15) 中所做的。最后,在这些注释中,我们实际上不需要方程 (18) 中的 μz 的表达式;我们只需知道这样的 μz 存在,因此我们可以从样本中学习它。

声明 1 的证明(Informal)。这里是为什么分数出现在反向过程中的启发性论证。我们基本上只需应用贝叶斯规则,然后适当地进行泰勒展开。我们从贝叶斯规则开始:

然后对两边取对数。在整个过程中,我们会忽略对数中的任何加法常数(这些对应于归一化因子),并且放弃所有 O(Δt) 阶的项。注意,在这个推导中,我们应将 xt 视为常数,因为我们希望理解条件概率作为 x_(t−Δt) 的函数。 

这与具有均值 μ 和方差 σ^2q·Δt 的正态分布的对数密度相同,差别仅在于加法因子。因此,

思考这个推导,其主要思想是对于足够小的 Δt,反向过程 p(x_(t-Δt) | x_t) 的贝叶斯规则展开由正向过程中的项 p(x_t | x_(t-Δt)) 主导。这就是为什么反向过程和正向过程具有相同的函数形式(这里都是高斯分布)的直觉原因。【这种正向和反向过程之间的一般关系,比仅限于高斯扩散更为普遍,可以参考例如 Sohl-Dickstein 等人在 2015 年的讨论。】

技术细节 [Optional]。细致的读者可能会注意到,声明 1 显然不足以暗示整个 DDPM 算法的正确性。问题在于:随着 Δt 的缩小,我们每步近似的误差(方程16)减少,但需要的总步数增加。因此,如果每步的误差不足够快地减少(作为 Δt 的函数),那么这些误差可能会在最后一步积累到一个非可忽略的程度。因此,我们需要量化每步误差的衰减速度。下面的引理 1 是一种量化方法:它表明,如果步长(即每步噪声的方差)为 σ^2,则每步高斯近似的 KL 误差为 O(σ^4)。这种衰减速度足够快,因为步数仅随着 Ω(1/σ^2) 增长。【KL散度的链式规则意味着我们可以将这些每步的误差相加:最终样本的近似误差由所有每步误差的总和界定。】

引理 1。设 p(x) 是 R 上的任意密度,具有有界的 1 到 4 阶导数。考虑联合分布 (x0, x1),其中 x0 ∼ p,x1 ∼ x0 + N(0, σ^2)。那么,对于任意的条件 z ∈ R,我们有 

可以通过精心的泰勒展开来证明引理 1;我们在附录 B.1 中包含了完整的证明。

2.2 算法

伪代码列表 1 和 2 给出了显式的 DDPM 训练损失和采样代码。为了训练网络 fθ【请注意,训练过程通过在第 2 行均匀地从区间 [0, 1] 中抽样 t 来同时优化所有时间步 t 的 fθ】,通常通过反向传播来最小化伪代码 1 输出的期望损失 Lθ。伪代码 3 描述了密切相关的 DDIM 采样器,稍后将在第 3 节讨论。

2.3 方差减少:预测 x0

到目前为止,我们的扩散模型已经被训练来预测 E[x_(t−Δt) | xt]:这是算法 1 所要求的,也是伪代码 1 训练过程产生的内容。然而,许多实际的扩散实现实际上是训练来预测 E[x0 | xt],即预测初始点 x0 的期望,而不是前一个点 x_(t−Δt)。这种差异实际上只是一种方差减少的技巧,它在期望上估计相同的量。形式上,这两个量可以如下相关联:

声明 2. 对于第 1.3 节中的高斯扩散设置,我们有:

或者等价地:

这个声明暗示,如果我们想要估计 E[x_(t−Δt) | xt],我们可以改为估计 E[x0 | xt],然后乘以 (t/Δt) 的倒数,即迄今为止所采取的步数。DDPM 训练和抽样算法的方差减少版本正是这样做的;我们在附录 B.9 中包含了它们。

声明 2 背后的直觉可以在图 3 中说明:首先,注意到给定 xt,预测 x_(t−Δt) 相当于预测最后的噪声步,即在方程 (11) 中的正向过程中的 η_(t−Δt) = (xt − x_(t−Δt))。但是,如果我们只有最终的 xt,那么之前所有的噪声步骤 {ηi}_(i<t) 在直觉上 “看起来是相同的”——我们无法区分最后一步添加的噪声和例如第 5 步添加的噪声。通过这种对称性,我们可以推断所有单独的噪声步骤在给定 xt 的条件下是相同分布的(尽管不是独立的)。因此,我们可以不是估计单个噪声步骤,而是等效地估计所有之前噪声步骤的平均值,这具有更低的方差。到达时间 t 时有 (t/Δt) 个已过去的噪声步骤,因此在方程 23 中,我们将总噪声除以这个数量来计算平均值。有关正式证明,请参阅附录 B.8。

警告:扩散模型应始终被训练来估计期望。特别是当我们训练模型预测 E[x0 | xt] 时,我们不应将其视为尝试学习 “如何从分布 p(x0 | xt) 中采样”。例如,如果我们正在训练一个图像扩散模型,那么最优模型将输出类似于图像的模糊混合物的 E[x0 | xt](例如 Karras 等人 [2022] 中的图 1b)——它不会看起来像实际的图像样本。记住,当扩散论文口头上讨论模型 “预测 x0” 时,他们并不意味着生成类似于 x0 实际样本的东西。

2.4 扩散作为 SDE [Optional]

在本节中,我们将迄今讨论的离散时间过程与随机微分方程(SDE)联系起来。在连续极限下,当 Δt → 0 时,我们的离散扩散过程变成一个随机微分方程。SDE 还可以表示许多其他扩散变体(对应于不同的漂移(drift)和扩散项),在设计选择上提供了灵活性,比如缩放和噪声调度。SDE 视角非常强大,因为现有理论为时间反转 SDE 提供了一般的闭式解。我们特定扩散的反向时间 SDE 的离散化立即得出了我们在本节中推导的抽样器,但其他扩散变体的反向时间 SDE 也可以自动获得(然后可以用任何现成的或定制的 SDE 求解器来解决),从而实现更好的训练和抽样策略,我们将在第 5 节进一步讨论。虽然我们这里只简要提及这些联系,但 SDE 视角已经对该领域产生了重大影响。有关更详细的讨论,我们推荐 Yang Song 的博客文章 [Song, 2021]。

极限 SDE。回顾我们的离散更新规则:

在 Δt → 0 的极限下,这对应于一个零漂移的 SDE:

其中 w 是布朗运动(Brownian motion)【参见 Eldan [2024] 以获取布朗运动和 Itô 公式的高级概述。另请参阅 Evans [2012] 以获取温和的入门教材,以及 Kloeden 和 Platen [2011] 的数值方法】。布朗运动是一个方差随 Δt 缩放的具有独立同分布高斯增量的随机过程。非常启发性地,我们可以认为

并由下式 “推导” 出 (25):

更普遍地,不同的扩散变体等价于具有不同漂移和扩散项选择的 SDE:

SDE (25) 只是 f = 0 和 g = σ_q 的一种简单形式。然而,这种形式涵盖了许多其他可能性,分别对应于 SDE 中不同的 f 和 g 的选择。正如我们将在第 5 节中重新讨论的那样,这种灵活性对于开发有效的算法至关重要。实际中做出的两个重要选择是调整噪声调度和缩放 xt;它们一起有助于控制 xt 的方差,并控制我们对不同噪声水平的关注程度。采用灵活的噪声调度 {σt} 代替固定的调度 σt ≡ σ_q·√t 对应于SDE [Song et al., 2020]

如果我们还希望通过因子 s(t) 缩放每个 x_t,Karras 等人 [2022] 表明这对应于以下 SDE: 

【关于 f 的产生方式的概述,让我们忽略噪声并注意到:

注:这里有个小错误,分子应该是 s(t+Δt) - s(t)

这些只是灵活的 SDE (26) 所启用的丰富且有用的设计空间中的几个示例。

反向时间 SDE。SDE 的时间反转使过程在时间上逆向运行。反向时间 SDE 是对像 DDPM 这样的采样器的连续时间类比。Anderson [1982] 提出的一个深刻结果(在 Winkler [2021] 中重新推导得很好)表明,SDE (26) 的时间反转由以下公式给出:

也就是说,SDE (27) 告诉我们如何将任何形式为 (26) 的 SDE 在时间上反向运行!这意味着我们不必在每种情况下重新推导反向公式,可以选择任何 SDE 求解器来获得实际的采样器。但没有什么是免费的:我们仍然不能直接使用 (27) 进行反向采样,因为项 ∇_x log ⁡p_t (x) ——事实上是之前出现在方程 18 中的分数——通常是未知的,因为它取决于 pt。然而,如果我们能够学习到这个分数,那么我们就可以求解反向 SDE。这类似于离散扩散,其中正向过程易于建模(它只是添加噪声),而反向过程必须被学习。

让我们花点时间讨论分数 ∇_x log ⁡p_t (x),它起着核心作用。直观地,由于分数 “指向较高概率”,它有助于反转扩散过程,而扩散过程 “平滑” 了概率。分数还与给定 xt 条件下 x0 的期望有关。回想一下,在离散情况下,根据方程 18 和 23: 

相似地,在连续情况下,我们有:

【我们可以通过直接应用 Tweedie 公式来看到这一点,该公式表明:

由于 xt∼N(x0, t·σ^2_q),应用 Tweedie 公式,设 z ≡ xt,μ_z ≡ x0​,得到:

】 

回到反向 SDE,我们可以证明其离散化获得了声明 1 中的 DDPM 采样器作为一个特例。简单 SDE (25) 的反转为:

其离散化为:

这正是声明 1 中推导的随机(DDPM)采样器。

3 确定性采样:DDIM

现在我们将展示一个高斯扩散的确定性反向采样器——它看起来类似于前一节的随机采样器,但在概念上有很大的不同。这个采样器等价于 Song 等人 [2021] 的 DDIM 更新,适应于我们的简化设置。【DDIM 代表去噪扩散隐式模型,这是 Song 等人 [2021] 原始推导中使用的一个视角。我们的推导遵循不同的视角,“隐式” 方面对我们来说并不重要】

我们考虑与前一节相同的高斯扩散设置,具有联合分布 (x0, x_(Δt),…,x1) 和条件期望函数 μ_t(z):=E[xt ∣x_(t+Δt) = z]。反向采样器定义如下,并在伪代码 3 中明确列出。

我们如何证明,这定义了一个有效的逆采样器?由于算法 2 是确定性的,声明它从 p(x_(t−Δt) | xt) 进行采样是没有意义的,因为我们对类似 DDPM 的随机采样器进行了这样的论证。相反,我们将直接展示方程(33)实现了边际分布 pt 和 p_(t−Δt) 之间的有效转移映射(transport map)。也就是说,如果我们让 Ft 是方程(33)的更新: 

那么我们想要显示

【符号 F♯p 表示 {F(x)}_(x∼p) 的分布。这被称为 p 经过函数 F 的推前分布(pushforward)】 

证明概述: 我们通常证明这一点的方法是使用随机微积分的工具,但我们将呈现一个基础的推导。我们的策略是首先在最简单的情况下,即点质量分布的情况下展示算法 2 是正确的,然后通过适当地进行边缘化将这一结果推广到完整的分布情况。对于专家来说,这类似于 “流匹配” 证明。

3.1 情况 1:单点

让我们首先理解目标分布 p0 是 R^d 中的单点质量分布的简单情况。不失一般性【因为我们可以通过简单地“平移”我们的坐标来达到这个目的。从形式上讲,我们的整个设置,包括方程 35,都是平移对称的】,我们可以假设该点位于 x0 = 0。在这种情况下,算法 2 是否正确?

为了推理正确性,我们希望考虑任意步骤 t 时 xt 和 x_(t−Δt) 的分布。根据扩散前向过程(方程11),在时间 t 时,相关的随机变量是 

【我们在这些协方差中省略单位矩阵,以简化符号。读者可以假设维度 d = 1,不失一般性】 

x_(t−Δt) 的边缘分布是 p_(t−Δt) = N(0, σ^2_(t−1)),而 xt 的边缘分布是pt = N(0, σ^2_t)。让我们首先找到一些确定性函数 G_t: R^d → R^d,使得 G_t ♯ p_t = p_(t−Δt)。有许多可能的函数可以起作用【例如,我们总是可以将原点周围的旋转添加到任何有效的映射中】,但有一个明显的选择: 

函数 Gt 简单地重新调整了 pt 的高斯分布,以匹配 p_(t−Δt) 的高斯分布的方差。事实证明,这个 Gt 正好等同于算法 2 中采取的步骤 Ft,我们现在将展示这一点。

声明 3. 当目标分布是一个点质量 p0 = δ0 时,更新步骤 Ft(如方程式 35 中定义的)等价于缩放函数 Gt(如方程式 37 中定义的): 

因此,算法 2 定义了目标分布 p0 = δ0 的逆采样器。

证明:为了应用 Ft,我们需要计算我们简单分布的 E[x_(t−Δt) | xt]。由于 (x_(t−Δt), xt) 是联合高斯分布,即

剩下的是代数运算: 

因此,我们得出结论,算法 2 是一个正确的逆采样器,因为它等价于 Gt,并且 Gt 是有效的。

如果 x0 是任意点而不是 x0 = 0,算法 2 的正确性仍然成立,因为整个设置是平移对称的。【请参阅附录 B.3 中的声明 5,其中有明确的陈述】 

3.2 速度场和气体

在我们继续之前,将 DDIM 更新视为等价于速度场可能会有所帮助,该速度场将时间 t 的点移动到时间 (t - Δt) 的位置。具体来说,定义向量场

然后,根据方程式 (33),DDIM 更新算法可以写为:

对于速度场 v_t 的物理直觉是:想象一个非相互作用的粒子气体,其密度场由 pt 给出。然后,假设位置为 z 的粒子沿着速度场 v_t(z) 移动。结果气体的密度场将是 p_(t−Δt)。我们将这一过程表示为

在步长 Δt 很小的极限情况下,非正式地说,我们可以将 vt 视为速度场 —— 它指定了按照 DDIM 算法移动的粒子的即时速度。

作为一个具体的例子,如果目标分布 p0=δ_(x0​​),如第 3.1 节所述,则 DDIM 的速度场是

vt(xt) = ((σt − σ_(t−Δt)) / σt)·(x0 − xt) / Δt,这是一个指向初始点 x0 的向量场(参见图 4)。

3.3 情况 2:两个点

现在让我们展示当目标分布是两个点的混合时,算法 2 是正确的:

其中 a,b∈R^d。根据扩散前向过程,在时间 t 的分布将是高斯混合体【在这里,前向过程的线性性(关于 p0 的)是很重要的。粗略地说,扩散一个分布相当于独立地扩散该分布中的每个个体点;这些点之间没有相互作用】:

我们希望展示在这些分布 pt 下,DDIM 的速度场 vt(方程式 40)可以转移

让我们首先尝试构造某些速度场 v*_t,使得 pt 经 v*_t 转移到 p_(t−Δt)。根据我们在第 3.1 节的结果——即 DDIM 更新对单个点有效——我们已经知道可以转移每个混合成分 {a, b} 的速度场。也就是说,我们知道速度场 v^[a]_t 定义为

转移【请特别注意我们对哪些分布取期望!方程式(45)中的期望是针对单点分布 δa 的,但是我们对 DDIM 算法的定义及其方程式(40)中的向量场总是针对目标分布而言的。在我们的情况下,目标分布是方程式(43)中的 p0】

与 v^[b]_t 相似。

现在我们希望找到一种方法将这两个速度场组合成一个单一的速度场 v*_t,以转移这个混合分布: 

我们可能会尝试简单地取平均速度场 v*_t = 0.5v^[a]_t + 0.5v^[b]_t​,但这是不正确的。正确的组合速度 v*_t 是各个单独速度场的加权平均,其权重由它们对应的密度场确定。 

明确地说,在点 xt 处,速度场 v^[a]_t 的权重是 xt 是由初始点 x0 = a 生成的概率,而不是 x0 = b 的概率。

为了直观地理解这一点,考虑图中所示的关于气体的对应问题(如图 5 所示)。假设我们有两种重叠的气体:红色气体密度为 N(a, σ^2),速度为 v^[a]_t;蓝色气体密度为 N(b, σ^2),速度为 v^[b]_t。我们想知道,合并气体的有效速度是多少(就像我们只看到灰度一样)?显然,我们应该通过它们各自的密度加权平均个别气体的速度,就像在方程(49)中一样。

现在我们已经解决了本节的主要子问题:我们找到了一个特定的向量场 v*_t,它将 pt 转移到 p_(t−Δt),适用于我们的两点分布 p0。现在剩下的是展示这个 v*_t 是否等价于算法 2 的速度场(方程式 40 中的 vt)。

为了展示这一点,首先注意到单个向量场 v^[a]_t 可以写成一个条件期望。利用方程式(45)中的定义【我们添加条件 x0=a,因为我们希望根据两点混合分布,而不是单点分布来取期望】,

现在整个向量场 v*_t 可以写成一个条件期望: 

其中,所有的期望都是相对于分布 x0∼1/2δa+1/2δb。因此,组合的速度场 v*_t 正是由算法 2 更新给出的速度场 vt — 因此算法 2 对我们的两点混合分布是一个正确的逆采样器。

3.4 情况 3:任意分布

现在我们知道如何处理两个点,我们可以将这个思想推广到 x0 的任意分布。我们在这里不会详细讨论,因为一般的证明将在随后的部分中进行总结。

事实证明,我们对算法 2 的整体证明策略可以显著推广到其他类型的扩散过程,而不需要太多工作。这引出了流匹配的概念,我们将在以下部分看到。一旦我们发展了流的机制,直接从方程(37)中简单的单点缩放算法推导 DDIM 实际上是直截了当的:详见附录 B.5。

3.5 概率流 ODE [Optional]

最后,我们将我们的离散时间确定性采样器推广到称为概率流 ODE 的常微分方程(ODE)[Song et al., 2020]。以下部分建立在我们在第 2.4 节中讨论的将 SDE 作为扩散的连续极限的基础上。正如第 2.4 节中逆时间 SDE 提供了离散随机采样器的灵活连续时间推广一样,我们将看到离散确定性采样器如何推广到 ODE。

ODE 形式提供了一个有用的理论视角,用于理解扩散,同时具有实际优势,如选择各种现成和定制 ODE 求解器来改善采样(例如流行的 DPM++ 方法,如第 5 章讨论的)。

回顾第 2.4 节中的一般 SDE(26): 

Song 等人 [2020] 展示了可以将这个 SDE 转换为一个称为概率流 ODE(PF-ODE)的确定性等效形式:

【一个证明概述在附录 B.2 中。 它涉及将 SDE 的噪声项重写为确定性的评分(回顾方程(18)中噪声和评分之间的联系)。尽管是确定性的,但评分是未知的,因为它依赖于 pt】 

SDE(26)和 ODE(56)在以下意义上是等价的:通过求解 PF-ODE 得到的轨迹,在每个时间点上具有与 SDE 轨迹相同的边缘分布【使用气体类比来说:SDE 描述了气体中个别粒子(布朗运动)的运动,而 PF-ODE 描述了气体速度场的流线。换句话说,PF-ODE 描述了被气体转移的 “测试粒子” 的运动,就像风中的羽毛一样】。然而,请注意,评分再次出现,就像在逆向 SDE(27)中一样;就像对于逆向 SDE 一样,我们必须学习评分来使 ODE(56)在实践中有用。

就像 DDPM 是逆向时间 SDE(27)的(离散化的)特例一样,DDIM 可被看作是 PF-ODE(56)的(离散化的)特例。回顾第 2.4 节中我们正在研究的对应于 SDE(25)的简单扩散过程,其中 f = 0 且 g = σ_q。相应的 ODE 是

反向和离散化的结果如下:

注意到

我们恢复了确定性(DDIM)采样器(33)。

3.6 讨论:DDPM vs DDIM

上面定义的两种逆采样器(DDPM 和 DDIM)在概念上有显著区别:一种是确定性的,另一种是随机的。回顾一下,这些采样器使用以下策略:

  • DDPM 理想情况下实现了一个随机映射 F_t,使得输出 F_t(xt) 在每个点上都是从条件分布 p(x_(t−Δt)∣xt) 中抽样得到的。
  • DDIM 理想情况下实现了一个确定性映射 F_t,使得输出 F_t(xt) 的边际分布为 p_(t−Δt)。换句话说,Ft ♯ pt = p_(t−Δt)。

尽管它们在给定相同输入 xt 的情况下朝着相同方向迈出步伐,但这两种算法最终的演变方式却非常不同。为了看清楚这一点,让我们考虑每种采样器理想情况下的行为,从相同的初始点 x1 开始并迭代完成。

DDPM 理想情况下将产生从 p(x0∣x1) 抽样得到的样本。如果正向过程充分混合(即在我们的设置中 σ_q 很大),那么最终点 x1 将几乎独立于初始点。因此,p(x0∣x1) ≈ p(x0),因此理想的 DDPM 输出的分布完全不依赖于起始点 x1​。相反,DDIM 是确定性的,因此对于给定的 x1 它将始终产生固定值,因此非常依赖于 x1​。

在心中留下的图像是,DDIM 定义了一个确定性映射 R^d → R^d,从一个高斯分布取样到我们的目标分布。在这个层面上,DDIM 映射听起来可能类似于其他生成模型 — 毕竟,GANs 和标准化流(Normalizing Flows)也定义了从高斯噪声到真实分布的映射。DDIM 映射的特殊之处在于,它不允许是任意的:目标分布 p* 完全确定了理想的 DDIM 映射(我们训练模型来模拟这个映射)。这个映射是 “好的”;例如,如果我们的目标分布是光滑的,我们期望它是平滑的。相比之下,GANs 可以自由地学习噪声和图像之间的任意映射。扩散模型的这个特性在某些情况下可能会使学习问题更容易(因为它是监督的),或者在其他情况下可能会使学习问题更困难(因为可能有更容易学习的映射,其他方法可以找到)。

3.7 关于泛化的备注

在本教程中,我们没有讨论扩散模型的学习理论方面:在只有有限样本和有限计算资源的情况下,我们如何学习底层分布的属性?这些是学习的基本方面,但对于扩散模型来说还没有完全理解,这是一个活跃的研究领域。【我们推荐查阅陈等人(2022年)和陈等人(2024b年)的介绍,以获取最近学习理论结果的概述。这一研究领域包括例如德博尔托利等人(2021年)、德博尔托利(2022年)、李等人(2023年)、陈等人(2023年,2024a年)的工作】

为了欣赏这里的微妙之处,假设我们使用经验风险最小化(Empirical Risk Minimization,ERM)的经典策略来学习扩散模型:我们从底层分布中采样一个有限的训练集,并针对这个经验分布优化所有的回归函数。问题在于,我们不应该完全最小化经验风险,因为这会导致一个只能复现训练样本的扩散模型。【这不仅仅适用于扩散模型:任何对经验分布完美生成的模型都将始终输出一个在真实底层分布下远非最优的均匀随机训练点】

通常情况下,学习扩散模型必须进行正则化,无论是隐式地还是显式地,以防止过拟合和训练数据的记忆。当我们训练用于扩散模型的深度神经网络时,这种正则化通常是隐式的:有限的模型大小和优化随机性等因素阻止了训练模型完全记忆其训练集。我们将在第 5 节重新讨论这些因素(作为错误的来源)。

这个记忆训练数据的问题已经在小图像数据集上的扩散模型中被观察到,并且已经观察到,随着训练集大小的增加,记忆效应减少了 [Somepalli et al., 2023, Gu et al., 2023]。此外,像 Carlini 等人 [2023] 中指出的那样,记忆还被视为神经网络潜在的安全和版权问题,作者发现他们可以从稳定的扩散中恢复训练数据。图 6 展示了训练集大小的影响,并展示了使用 3 层 ReLU 网络训练的扩散模型的 DDIM 轨迹。我们可以看到,N = 10 样本的扩散模型 “记忆” 了其训练集:其轨迹都收敛到训练点中的一个,而不是产生底层的螺旋分布。随着样本的增加,模型开始泛化:轨迹收敛到底层的螺旋流形。这些轨迹还开始更垂直于底层流形,表明正在学习低维结构。我们还注意到,在 N = 10 的情况下,扩散模型失败了,人类可能无法从这些样本中识别出 “正确” 的图样(pattern),因此可能期望的泛化过程太过分了。

4 Flow Matching

现在我们介绍流匹配(flow matching)的框架 [Peluchetti, 2022, Liu et al., 2022b,a, Lipman et al., 2023, Albergo et al., 2023]。流匹配可以被看作是 DDIM 的一种推广,它在设计生成模型时提供了更大的灵活性,包括例如稳定扩散 3 [Liu et al., 2022a, Esser et al., 2024] 中使用的修正流(有时称为线性流)。

实际上,在我们对 DDIM 进行的分析中,我们已经看到了流匹配的主要思想。在高层次上,这里是我们在第 3 节构建生成模型的方式:

  • 首先,我们定义了如何生成单个点。具体来说,我们构建了矢量场 {v^[a]_t}_t,当应用于所有时间步长时,将标准高斯分布转换为任意的 δ 分布 δ_a。
  • 其次,我们确定了如何将两个矢量场组合成单个有效的矢量场。这使我们能够构建从标准高斯到两个点(或者更一般地,到点的分布 — 我们的目标分布)的转移。

这两个步骤都不特别需要高斯基分布,或者高斯前向过程(方程 1)。例如,将两个矢量场组合的第二步对于任意两个矢量场来说仍然是相同的。

因此,让我们放弃所有的高斯假设。相反,我们将从基本层面开始思考如何在任意两点 x0 和 x1 之间进行映射。然后,我们看看当这两个点分别从任意分布 p(数据)和 q(基本)中采样时会发生什么。我们将看到这种观点涵盖了 DDIM 作为一个特例,但它显然更加通用。

4.1 Flow

让我们首先定义流(flow)的核心概念。流简单地是一组时间索引的矢量场 v = {vt},t∈[0,1]。我们应该将这看作是在每个时间 t 上的气体的速度场 vt,就像我们在第 3.2 节中所做的那样。任何流通过沿着速度场 {vt} 将初始点 x1 转移到最终点 x0,定义了一个轨迹。

形式化地,对于流 v 和初始点 x1,考虑 ODE

【相应的离散时间模拟是迭代过程: 在 t = 1 时从初始点 x1 开始,通过 x_(t-Δt) ← xt + vt(xt)·Δt 进行迭代】 

在时间 t = 1 时,初始条件为 x1。我们写作

来表示在时间 t 结束时(到达最终点 x0),流 ODE(方程 59)的解。换句话说,RunFlow 是沿着流 v 将点 x1 转移到时间 t 的结果。

正如流定义了初始点和最终点之间的映射,它们也通过沿着它们的轨迹“推进”源分布中的点,定义了整个分布之间的传输。如果 p1 是初始点的分布【注意:大多数流匹配文献使用反向时间约定,因此 t = 1 是目标分布。为了与 DDPM 约定保持一致,我们将 t = 0 视为目标分布】,则应用流 v 将得到最终点的分布

【我们可以等价地写成 pushforward 的形式 RunFlow(v, ·, 0) ♯ p1】 

我们用

表示流 v 将初始分布 p1 转移到最终分布 p0 的过程。在我们的气体类比中,这意味着如果我们从按照 p1 分布的粒子气体开始,并且每个粒子按照流 v 定义的轨迹运动,那么最终粒子的分布将是 p0。

流匹配的最终目标是以某种方式学习一个流 v*,它将易于采样的基础分布 q(例如高斯分布)转移到目标分布 p,即

如果我们有了这个 v*,我们可以通过首先从 q 中采样 x1,然后运行我们的流,以 x1 作为初始点,并输出结果的最终点 x0,从而生成目标分布 p 的样本。第 3 节的 DDIM 算法实际上是这种情况的一个特例【与扩散模型的联系:DDIM(58)的连续时间极限是一个流,其中 vt(xt) = 1/(2t)·E[x0 − xt |xt]。基础分布 p1 是高斯分布。DDIM 抽样(算法 3)是评估 RunFlow 的离散化方法。DDPM 训练(算法2)是学习 v* 的方法,但它依赖于高斯结构,并且在某些方面与我们将在本章中呈现的流匹配算法有所不同】,针对流 v* 的一个非常特定的选择。那么,我们如何一般构造这样的流呢?

4.2 点级流

我们的基本构建模块将是点级流(pointwise flow),它仅将单个点 x1 转移到点 x0。直观地说,给定连接 x1 和 x0 的任意路径 {xt},t∈[0,1],点级流通过在每个点 xt 处给出其速度 vt(xt) 来描述这条轨迹(参见图 8)。形式上,x1 和 x0 之间的点级流是任何满足方程 59,并在 t = 1 和 t = 0 时具有边界条件 x1 和 x0 的流 {vt}_t。我们将这样的流表示为 v^[x1,x0]。点级流并不唯一:在 x0 和 x1 之间存在许多不同的路径选择。

4.3 边缘流

假设对于所有点对 (x1, x0),我们都可以构建一个显式的点级流 v^[x1,x0],将源点 x1 转移到目标点 x0。例如,我们可以让 xt 沿着从 x1 到 x0 的直线或任何其他显式路径移动。回想在我们的气体类比中,这相当于一个单独的粒子在 x1 和 x0 之间移动。现在,让我们试图建立一组个体粒子,使得在 t = 1 时,粒子按照 q 分布,而在 t = 0 时,它们按照 p 分布。这实际上很容易做到:我们可以选择任意一个 q 和 p 之间的耦合 Π_(q,p),并考虑与点级流 {v^[x1,x0]},(x1,x0)∼Π_(q,p) 对应的粒子。 这给了我们一个点级流的分布(即一组粒子轨迹),在总体上表现出所需的行为。【q 和 p 之间的一个耦合 Π_(q,p),指定了如何联合采样源点和目标点对 (x1, x0),使得 x0 边际分布为 p,x1 边际分布为 q。最基本的耦合是独立耦合,对应于独立采样 x1 和 x0】

我们希望以某种方式结合所有这些点级流,得到一个单一的流 v*,实现相同的分布之间的转移【我们希望这样做的原因是,正如后面将看到的那样,这简化了我们的学习问题:我们不必学习所有个体轨迹的分布,而只需学习代表它们整体演变的一个速度场】。我们先前在第 3 节中的讨论【与第 3 节中的方程(49)相比,在附录 B.4 中给出了如何组合流的正式说明】告诉我们如何做到这一点:为了确定有效速度 v*_t (xt),我们应该通过所有个体粒子速度 v^[x1,x0]_t 的加权平均值来确定,其中权重是在 xt 处的粒子由点级流 v^[x1,x0] 生成的概率。最终结果

其中,期望对应于由采样 (x1,x0)∼Π_(q,p) 引起的 (x1,x0,xt) 的联合分布,其中

【在高层次上查看这个结果的另一种方式是:我们从它们转移 δ 分布的点对点流 v^[x1,x0] 开始:

然后方程(64)以一种高级方式 “对 x1 和 x0 上的这些流进行平均”,得到转移流 v*

】 

从原则上讲,我们对生成建模问题有了一个 “解决方案”,但在实践中仍有一些重要的问题需要解决:

  • 我们应该选择哪个点对点流 v^[x1,x0] 和耦合 Π_(q,p)
  • 我们如何计算边际流 v* ?我们不能直接从方程(64)计算它,因为这将需要对给定点 xt 从 p(x0∣xt) 进行采样,这在一般情况下可能很复杂。

我们将在接下来的章节中回答这些问题。

4.4 点对点流的简单选择

我们需要明确选择:点对点流、基础分布 q 和耦合 Π_(q,p)。有许多简单的可行选择【扩散提供了一种可能的构造,正如我们将在第 4.6 节中看到的那样】。

基础分布 q 可以是任何易于采样的分布。例如,高斯分布是一个常见的选择,但绝非唯一的选择——例如,图 7 使用了一个环形的基础分布。至于基础分布和目标分布之间的耦合 Πq,p​,最简单的选择是独立耦合,即从 p 和 q 中独立采样。

对于点对点流而言,可以说最简单的构造是线性点对点流:

这简单地在线性上对 x1 和 x0 进行插值(并对应于 Liu 等人 [2022a] 中的选择)。在图 9 中,我们可视化了由线性点对点流组成的边际流,与图 7 中的环形基础分布 q 相同,目标分布为点质量 p=δ_(x0​)【一个边际分布,其目标分布是一个点质量分布,或者等效地说,只是基础分布上点对点流的平均,有时被称为(单边的,one-sided)条件流 [Lipman et al., 2023]】。 

4.5 Flow Matching

现在,唯一剩下的问题是,直接用方程(64)评估 v* 需要针对给定的 xt 从 p(x0∣xt) 进行采样。如果我们知道如何在 t=1 时执行此操作,我们就已经解决了生成建模问题!

幸运的是,我们可以利用与 DDPM 相同的技巧:我们只需能够从联合分布 (x0,xt) 进行采样,然后解决一个回归问题。类似于 DDPM,利用通用事实:

方程(64)中的条件期望函数可以写成一个回归器:

 

【这个结果类似于 Lipman 等人 [2023] 的定理 2,但我们的针对双向流(two-sided flow)】 

简而言之,方程(68)表明,为了计算模型 fθ 在固定时间 t 的损失,我们应该:

  • 从它们的联合分布中采样源点和目标点 (x1,x0)。
  • 通过运行点对点流 v^[x1,x0],从点 x1 到时间 t 确定性地计算点 xt。【例如,如果我们选择线性点对点流,这意味着,xt ← t·x1 + (1−t)·x0,通过方程(66)】
  • 在 xt 评估模型的预测 f_θ(xt),评估确定性的向量 v^[x1,x0]_t (xt),然后计算这两个量之间的 L2 损失。

为了从训练好的模型(我们对 v*_t 的估计)中采样,我们首先从源点 x1∼q 中采样,然后沿着学到的流将其传输到目标样本 x0。伪代码列表 4 和 5 给出了基于流的模型训练和采样的明确过程(包括具体情况下的线性流;匹配 Liu 等人 [2022a] 的算法 1)。

总结。总结一下,以下是如何为目标分布 p 学习流匹配生成模型的方法。

成分。我们首先选择:

  • 一个源分布 q,我们可以有效地从中采样(例如标准高斯分布)。
  • 源分布 q 和目标分布 p 之间的耦合 Πq,p​,它指定了如何联合采样一对源点和目标点 (x1,x0),分别具有边际分布 q 和 p。标准选择是独立耦合,即独立地从 q 中采样 x1 和从 p 中采样 x0。
  • 对于所有点对 (x1,x0),显式点对点流 v^[x1,x0] 将 x1 转移到 x0。我们必须能够在所有点上有效地计算向量场 v^[x1,x0]_t。

这些成分理论上决定了边际向量场 v*,它将 q 转移到 p:

其中期望对应于联合分布:

训练。通过反向传播伪代码 4 计算的随机损失函数来训练神经网络 fθ。对于这个期望损失的最优函数是:f_θ (xt,t) = v*_t (xt)。

采样。运行伪代码 5,从(近似)目标分布 p 中生成一个样本 x0。

4.6 DDIM 作为流匹配 [Optional]

第 3 节的 DDIM 算法可以看作是流匹配的一个特例,适用于特定选择的点对点流和耦合。我们在这里描述确切的对应关系,这将使我们注意到 DDIM 和线性流之间的有趣关系。我们声称 DDIM 等价于使用以下参数的流匹配:

1)点对点流:以下两种等价的点对点流之一:

两者都生成轨迹: 

【关于为什么方程(70)和(71)在它们的轨迹上是等价的,详情请参见附录 B.6】 

2)耦合:使用 “扩散耦合”——即由以下生成的 (x0,x1) 联合分布: 

这个声明很容易证明(参见附录 B.5),但其含义有些令人惊讶:我们可以将 DDIM 轨迹(通常不是直线)恢复为方程(72)中直线点对点轨迹的组合。事实上,DDIM 轨迹恰好等同于使用上述线性流和扩散耦合产生的流匹配轨迹,只是时间尺度不同(√t​ vs. t)。【在时间 t 处的 DDIM 对应于时间 √t 处的线性流;因此,当 t 较小时,线性流比 DDIM “慢”。这在实践中可能对线性流有益(推测)】

声明​​​​​​​ 4(DDIM 作为线性流;非正式):DDIM 采样器(算法 2)等效于,通过时间重新参数化,由线性点对点流(方程 65)和扩散耦合(方程 73)产生的边际流。

详细的声明请参见附录 B.7。【在实践中,线性流最常使用独立耦合,而不是上述的 “扩散耦合”。然而,对于足够大的终端方差 σ^2_q,扩散耦合接近于独立耦合。因此,声明 4 告诉我们,在流匹配中的常见做法(线性流与高斯终端分布和独立耦合)几乎等同于标准的 DDIM,只是时间安排不同。最后,对于专家来说:这是关于 “方差爆炸” 版本的 DDIM 的主张,这是我们在整个过程中使用的版本。声明 4 在方差保持的 DDIM 情况下是错误的】

4.7 额外说明和参考资料 [Optional]

  • 参见图 11,了解本教程中描述的不同方法及其关系的图示。
  • 我们强烈推荐 Fjelde 等人 [2024] 的流匹配教程,其中包含有助于可视化流的有用信息,并使用与当前文献更一致的符号。
  • 有趣的是,注意到我们从未需要为流匹配定义显式的 “前向过程”,就像我们为高斯扩散所做的那样。相反,定义适当的 “反向过程”(通过流)就足够了。
  • 我们称之为点对点流的东西在文献中也被称为双边条件流,已经在 Albergo 和 Vanden-Eijnden [2022],Pooladian 等人[2023],Liu 等人[2022a],Tong 等人[2023] 的研究中发展起来。
  • Albergo 等人 [2023] 定义了随机插值的框架,可以看作是考虑随机点对点流而不仅仅是确定性流。他们的框架严格推广了 DDPM 和 DDIM。
  • 参见 Stark 等人 [2024] 的有趣例子,介绍了非标准的流。他们通过将离散空间嵌入连续空间(概率单纯形,probability simplex),然后在这些单纯形上构建特殊流来推导离散空间的生成模型。

5. 实践中的扩散

总结一下,我们提到了一些在实践中很重要但在本教程中未涉及的扩散方面的内容。

实践中的采样器。我们的 DDPM 和 DDIM 采样器(算法 2 和算法 3)分别对应于 Ho 等人 [2020]和 Song 等人 [2021] 中提出的采样器,但在时间安排和参数化上有所不同。DDPM 和 DDIM 是最早被用于实践中的采样器之一,但自那时以来,在少步生成的采样器方面取得了显著进展(这是至关重要的,因为每一步都需要通常昂贵的模型前向传递)。【即使最好的采样器仍然需要大约 10 个采样步骤,这可能是不切实际的。各种时间精炼方法旨在训练一步生成器学生模型,以匹配扩散教师模型的输出,从而实现在一步(或少数步)中进行高质量采样。一些例子包括一致性模型[Song et al., 2023b] 和对抗精炼方法 [Lin et al., 2024, Xu et al., 2023, Sauer et al., 2024]。然而,请注意,精炼模型不再是扩散模型,它们的采样器(即使是多步的)也不是扩散采样器

在 2.4 节和 3.5 节中,我们展示了 DDPM 和 DDIM 可以看作是反向 SDE 和概率流 ODE 的离散化版本。SDE 和 ODE 的视角自动收获了许多采样器,对应于不同的黑箱 SDE 和 ODE 数值求解器(例如欧拉法、Heun 方法和 Runge-Kutta 方法)。还可以利用扩散 ODE 的特定结构,以改进黑箱求解器 [Lu等人,2022a,b;Zhang和Chen,2023]。

噪声调度。噪声调度通常指 σt,它决定了扩散过程在时间 t 时添加的噪声量。简单的扩散过程(1)具有 p(xt)∼N(x0,σ^2_t),其中 σ_t ∝ t。注意, xt 的方差在每个时间步增加。【Song et al. [2020] 在比较 SMLD [Song and Ermon, 2019] 和 DDPM [Ho et al., 2020] 时,区分了 “方差爆炸”(VE)和 “保持方差”(VP)调度。VE 和 VP 这些术语通常特指 SMLD 和 DDPM。我们的扩散(1)也可以称为方差爆炸调度,尽管我们的噪声调度与 Song 和 Ermon [2019] 最初提出的不同】

在实践中,通常偏好具有可控方差的调度。其中一种最流行的调度,由 Ho 等人 [2020] 提出,使用时间依赖的方差和缩放,以确保 xt 的方差保持有界。他们的离散更新如下:

其中 0<β(t)<1 被选择为在 t=1 时 xt 几乎是干净数据,在 t=T 时是纯噪声。

引入在 2.4 节中介绍的一般 SDE(26)提供了额外的灵活性。在我们简单的扩散(1)中,f = 0, g = σ_q​,而在 Ho 等人 [2020] 的扩散(74)中,f = −1/2β(t), g = √β(t)。Karras 等人 [2022] 重新参数化了 SDE,用整体缩放 s(t) 和 xt 的方差 σ(t) 来更直观地思考扩散设计,并建议使用 s(t)=1, σ(t)=t 的调度(对应于 f = 0, g = √2t)。通常来说,选择 f,g 或等效地选择 s,σ 提供了探索可能的调度设计空间的便利方式。

似然解释和 VAE。一种流行且有用的扩散模型解释是变分自编码器(VAE)的视角【这实际上是推导扩散目标函数的最初方法,详见 Sohl-Dickstein 等人 [2015] 和 Ho 等人 [2020] 的工作】。简而言之,扩散模型可以视为深层次变分自编码器的特例,其中每个扩散时间步骤对应于 VAE 解码器的一层。相应的 VAE 编码器由正向扩散过程给出,它产生作为输入 x 的 “潜变量” 序列 {xt}。值得注意的是,这里的 VAE 编码器是不学习的,不同于通常的 VAE。由于潜变量的马尔可夫结构,VAE 解码器的每一层可以单独训练,而无需通过所有先前层进行正向/反向传递,这有助于解决深层次 VAE 的训练不稳定性问题。我们建议查阅 Turner [2021] 和Luo [2022] 的教程,以了解更多关于 VAE 视角的细节。

VAE 解释的一个优点是,它通过使用 VAE 的标准证据下界(ELBO)给出了我们生成模型下的数据似然估计。这使得我们可以直接使用最大似然目标训练扩散模型。事实证明,扩散 VAE 的 ELBO 恰好简化为我们所呈现的 L2 回归损失,但具有特定的时间加权,该加权在不同时间步骤 t 上对回归损失进行了不同的加权。例如,在大时间步长 t 处(即高噪声水平处),回归误差可能需要不同的加权,以便整体损失能够正确反映似然性【请参阅 Kadkhodaie 等人 [2024] 中的方程(5),该方程提供了关于真实分布与生成分布之间 KL 散度的一个简单界限,以回归超额风险的形式】。在实践中,最佳的时间加权选择仍存在争议:受 VAE 解释启发的 “原则性” 选择并不总能产生最佳的生成样本【例如,Ho 等人 [2020] 在扩散模型中省略了时间加权项,而是均匀加权所有时间步】。有关不同加权及其影响的良好讨论,请参阅 Kingma 和 Gao [2023]。

参数化:x0 / ϵ / v -预测。另一个重要的实际选择是我们要求网络预测的几个相关量中的哪一个——部分去噪数据、完全去噪数据或噪声本身【更准确地说,网络始终预测这些量的条件期望】。回顾一下在 DDPM 训练(算法 1)中,我们要求网络 fθ 学习通过最小化

来预测 E[x_(t−Δt)∣xt]。然而,还有其他的参数化可能。例如,回顾

我们可以看到

是一个(几乎)等价的问题,通常被称为 x0 预测【这对应于减少方差的算法(6)】。这些目标只在时间加权因子 1/t 上有所不同。类似地,定义噪声 ε_t = 1/σ_t · E[x0 − xt | xt],我们可以选择让网络预测 E[ε_t | xt]:这通常称为 ε 预测。另一种参数化 v 预测,要求模型预测

[Salimans and Ho, 2022],在高噪声水平主要预测数据,在低噪声水平则主要预测噪声。所有这些参数化只是通过时间加权不同(详见附录 B.10)。

尽管不同的时间加权不会影响最优解,但它们会影响训练,如上所述。此外,即使时间加权被调整为在原则上产生等价问题,不同的参数化在实践中可能表现不同,因为学习并不完美,某些目标可能对错误更加鲁棒。例如,结合在低噪声水平上放置大量权重的 x0 预测,在实践中可能效果不佳,因为对于低噪声,恒等函数可以实现相对较低的目标值,但显然不是我们想要的。

误差来源。最后,在实际使用扩散和流模型时,存在多种误差源,阻止学习的生成模型完全生成目标分布。这些误差大致可分为训练时和采样时的错误。

  • 训练时误差:在学习人群最优(population-optimal)回归函数时的回归误差。回归目标是流匹配中的边际流 v*_t,或者在扩散模型中是得分 E[x0 | xt]。对于每个固定时间 t,这是一种标准的统计误差。它依赖于神经网络架构和大小,以及样本数量,并且可以进一步按照通常的方式分解为逼近误差和过拟合误差(例如,见 Advani et al. [2020, Sec. 4] 将二层网络分解为逼近误差和过拟合误差)。

  • 采样时误差:使用有限步长 Δt 时的离散化误差。这种误差恰好是在采样中使用的 ODE 或 SDE 求解器的离散化误差。这些误差以不同的方式表现出来:对于 DDPM,这反映了在使用高斯逼近的反向过程中的误差(即对于大 σ,事实 1 失效)。对于 DDIM 和流匹配,它反映了在离散时间中模拟连续时间流动的误差。

这些误差以非平凡的方式相互作用和累积,目前尚不完全理解。例如,不清楚回归估计中的训练时误差确切如何转化为整个生成模型的分布误差。(而这个问题本身很复杂,因为在实践中并不总是清楚我们关心哪种类型的分布差异)。有趣的是,这些 “误差” 对于小训练集也可能有益,因为它们作为一种正则化作用,防止扩散模型仅仅记忆训练样本(如第 3.7 节所讨论的)。

6 结论

我们现在已经介绍了扩散模型和流匹配的基础知识。这是一个活跃的研究领域,还有许多有趣的方面和未解决的问题我们没有涉及(请参阅第 36 页推荐阅读)。我们希望这里的基础知识能够使读者理解扩散建模中的更高级主题,并可能为他们自己的研究做出贡献。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/759743.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【强化学习的数学原理】课程笔记--2(贝尔曼最优公式,值迭代与策略迭代)

目录 贝尔曼最优公式最优 Policy求解贝尔曼最优公式求解最大 State Value v ∗ v^* v∗根据 v ∗ v^* v∗ 求解贪婪形式的最佳 Policy π ∗ \pi^* π∗一些证明过程 一些影响 π ∗ \pi^* π∗ 的因素如何让 π ∗ \pi^* π∗ 不 “绕弯路” γ \gamma γ 的影响reward 的…

qt for android 使用打包sqlite数据库文件方法

1.在使用sqlite数据库时&#xff0c;先将数据库文件打包&#xff0c;放置在assets中如下图: 将文件放置下android中的assets下的所有文件都会打包在APK中&#xff0c;可以用7zip查看apk文件 2.在qt代码读取数据文件&#xff0c;注意在assets下的文件都是Read-Only&#xff0c;需…

[AIGC] Shell脚本在工作中的常用用法

Shell脚本是一种为 shell 编写的脚本程序。商业上的 Unix Shell 一般都配备图形界面&#xff0c;主要包括&#xff1a;Bourne Shell&#xff08;/usr/bin/sh或/bin/sh&#xff09;、Bourne Again Shell&#xff08;/bin/bash&#xff09;、C Shell&#xff08;/usr/bin/csh&…

抓紧收藏!7 款令人惊艳的 AI 开源项目

&#x1f43c; 关注我, 了解更多 AI 前沿资讯和玩法&#xff0c;AI 学习之旅上&#xff0c;我与您一同成长&#xff01; &#x1f388; 进入公众号&#xff0c;回复 AI, 可免费领取超多实用的 AI 资料 和内容丰富的 AI 知识库地址。 自从去年 AIGC 兴起以来&#xff0c;AI 开源…

【python爬虫实战】爬取豆瓣top250(网站有反爬虫机制肿么办)

关于请求头headers: 值得注意的是&#xff0c;与上一篇 &#xff1a;​​​​​​【python爬虫实战】爬取书店网站的 书名&价格&#xff08;注释详解&#xff09;-CSDN博客 爬取书名不同&#xff0c;这次爬取豆瓣网站必须使用“请求头headers”&#xff0c;不然将没有输…

Tomcat的安装和虚拟主机和context配置

一、 安装Tomcat 注意&#xff1a;安装 tomcat 前必须先部署JDK 1. 安装JDK 方法1&#xff1a;Oracle JDK 的二进制文件安装 [rootnode5 ~]# mkdir /data [rootnode5 ~]# cd /data/ [rootnode5 data]# rz[rootnode5 data]# ls jdk-8u291-linux-x64.tar.gz [rootnode5 data]…

通用管理页面的功能实现

在Windows Forms&#xff08;WinForms&#xff09;应用程序中&#xff0c;创建一个通用的管理页面通常涉及对数据的增删改查&#xff08;CRUD&#xff09;操作&#xff0c;以及一些额外的功能&#xff0c;如数据过滤、排序、导出和导入等。 先看一个仓库管理页面要素。 仓库管…

Tcmalloc工具定位内存泄漏问题

内存泄漏问题定位 gperftools工具安装 执行如下操作&#xff1a; git clone https://github.com/gperftools/gperftools.git 注&#xff1a;如果网速较慢&#xff0c;可直接去下载压缩包。 如我下载的地址&#xff1a;https://github.com/gperftools/gperftools/releases/ta…

ComfyUI局部重绘的四种方式 (附件工作流在最后)

前言 局部重绘需要在图片中选择重绘区域&#xff0c;点击图片右击选择Open in MaskEditor&#xff08;在蒙版编辑器中打开&#xff09;&#xff0c;用鼠标描绘出需要重绘的区域 方式一&#xff1a;重绘编码器 这种方式重绘比较生硬&#xff0c;需要额外搭配使用才行 方式二&…

Sql审核平台Archery的搭建和简单配置

Sql审核平台Archery的搭建和简单配置 Archery是一个开源的Web应用&#xff0c;基于Python开发&#xff0c;利用Flask作为后端框架&#xff0c;前端采用Vue.js&#xff0c;构建了一个现代化的数据操作界面。提供了SQL审核、数据查询、报表生成等功能&#xff0c;同时支持多种数据…

普元EOS学习笔记-创建精简应用

前言 本文依旧基于EOS8.3进行描述。 在上一篇文章《EOS8.3精简版安装》中&#xff0c;我们了解到普元预编译好的EOS的精简版压缩包&#xff0c;安装后&#xff0c;只能进行低开&#xff0c;而无法高开。 EOS精简版的高开方式是使用EOS开发工具提供的IDE&#xff0c;创建一个…

【C语言】指针剖析(完结)

©作者:末央&#xff06; ©系列:C语言初阶(适合小白入门) ©说明:以凡人之笔墨&#xff0c;书写未来之大梦 目录 回调函数概念回调函数的使用 - qsort函数 sizeof/strlen深度理解概念手脑并用1.sizeof-数组/指针专题2.strlen-数组/指针专题 指针面试题专题 回调函…

从0-1搭建一个web项目(package.json)详解

本章分析package.json文件详解 本文主要对packge.json配置子文件详解 ObJack-Admin一款基于 Vue3.3、TypeScript、Vite3、Pinia、Element-Plus 开源的后台管理框架。在一定程度上节省您的开发效率。另外本项目还封装了一些常用组件、hooks、指令、动态路由、按钮级别权限控制等…

每日一题——Python实现PAT乙级1073 多选题常见计分法(举一反三+思想解读+逐步优化)9千字好文

一个认为一切根源都是“自己不够强”的INTJ 个人主页&#xff1a;用哲学编程-CSDN博客专栏&#xff1a;每日一题——举一反三Python编程学习Python内置函数 Python-3.12.0文档解读 目录 初次尝试 再次尝试 有何不同 版本一&#xff08;原始版本&#xff09;&#xff1a;…

Python变量的命名规则与赋值方式

第二章&#xff1a;Python 基础语法 第一节&#xff1a;变量的命名规则与赋值方式 2.1.1 引言 在编程中&#xff0c;变量是存储数据的基本单元。变量的命名和赋值是编程语言中表达和操作数据的基础。了解和遵循变量命名规则对于编写清晰、可维护的代码至关重要。 2.1.2 变量…

修复vcruntime140.dll方法分享

修复vcruntime140.dll方法分享 最近在破解typora的时候出现了缺失vcruntime140.dll文件的报错导致软件启动失败。所以找了一番资料发现都不是很方便的处理&#xff0c;甚至有的dll处理工具还需要花钱&#xff1f;&#xff1f;&#xff1f;&#xff1f;&#xff0c;我本来就是为…

VMware17安装Ubuntu20版本-保姆级别

首先需要安装好VMware和Ubuntu20的镜像&#xff0c;在网上搜索Ubuntu镜像下载即可&#xff0c;最后选择国内镜像站下载&#xff0c;这样更快点&#xff0c;然后打开VMware。 1.创建虚拟机&#xff1a; 2.选择自定义&#xff1a; 3.默认&#xff0c;继续下一步&#xff1a; 4.选…

【Linux】IO多路复用——select,poll,epoll的概念和使用,三种模型的特点和优缺点,epoll的工作模式

文章目录 Linux多路复用1. select1.1 select的概念1.2 select的函数使用1.3 select的优缺点 2. poll2.1 poll的概念2.2 poll的函数使用2.3 poll的优缺点 3. epoll3.1 epoll的概念3.2 epoll的函数使用3.3 epoll的优点3.4 epoll工作模式 Linux多路复用 IO多路复用是一种操作系统的…

UE5(c++)开发日志(2):向日志和屏幕输出信息/将C++类变为蓝图类

通过UE_LOG()向日志输出&#xff0c;向其传入三个参数(①输出日志类型,一般LogTemp ②具体种类&#xff0c;普通/警告/错误&#xff0c;这里是Warning ③输出的文本内容&#xff0c;使用TEXT(" ")&#xff0c;这里是TEXT("Run AActor BeginPlay")) 代码写…