扩散模型的基本原理
Denoising Diffusion Probabilistic Models (DDPM) 是一种利用扩散过程来生成样本的深度学习模型。其主要的灵感来源于扩散过程,通过逐渐增加噪音来模糊一个初始的图像,并通过学习一个去噪模型来逆向回到原始图像。这种方法为高质量的样本生成和变换提供了一种新颖的视角。
扩散模型主要概念和步骤如下:
1.添加噪声:模型从一张真实的图像开始,然后逐步增加噪声。在这个过程中,图像的细节和结构逐渐被噪声所覆盖,最终转变成随机噪声。
2.逆向过程:在生成过程中,模型执行与添加噪声相反的操作。它从噪声图像开始,逐步去除噪声并恢复图像的结构和细节。这个过程是通过训练模型来学习如何从噪声图像中逐步恢复出原始图像来实现的。
3.训练过程:模型通过大量的真实图像及其噪声版本进行训练。它学习如何预测在添加噪声的过程中丢失的图像信息,从而能够在生成过程中逐步重建图像。
4.控制生成:在模型训练完成后,可以利用它来生成新的图像。这通常是通过提供一个含有噪声的起始图像和一些指导条件(如文本描述)来实现的。模型然后根据这些条件去除噪声,生成与条件匹配的图像。
这种方法的关键在于,模型学习如何从噪声中重建图像,并且可以通过指导条件来控制重建过程,从而创造出多样的、符合特定要求的图像。这使得扩散模型在图像生成和艺术创作等领域非常有用。
整体的流程如下图1所示:
![图片[1]-扩散模型(Diffusion Model)-点头深度学习网站](https://venusai-1311496010.cos.ap-beijing.myqcloud.com/wp-content/upload-images/2024/03/20240305144113771.png)
在扩散模型中,逆扩散过程通常并不能直接计算,因为它需要对噪声注入过程进行逆操作,这是一个从简单分布到复杂数据分布的映射。为了解决这个问题,扩散模型通常使用一个神经网络来参数化逆扩散过程,并通过最大化似然来学习网络的参数。一旦模型训练完成,我们便可以从一个简单随机变量中抽样,让它进行反向计算得到新的图片。
扩散模型的一个关键优点是其理论上的强大表达能力。在理论上,给定足够的扩散步骤和足够大的网络,扩散模型可以精确地学习和生成任何数据分布。在实践中,扩散模型在图像、文本和音频生成等任务上表现出了强大的性能。
值得注意的是,尽管扩散模型与变分自编码器(VAEs)和生成对抗网络(GANs)在形式上有所不同,但是它们都是试图学习数据分布的生成模型,并且都可以使用神经网络来参数化生成过程。不过,扩散模型的训练过程通常更加稳定,因为它直接最大化数据的似然,而不需要像VAEs和GANs那样涉及到重参数化技巧或者对抗训练,具体解释将在下面的章节进行展开讲解。
DDPM扩散模型与变分自编码器的比较
扩散模型是一种特别的生成模型,与典型的变分自编码器(VAEs)相比,它主要侧重于解码器的训练。其核心思想是通过一系列固定的噪声注入步骤将数据转化为简单的随机变量,然后通过一个训练有素的解码器将这些简单的随机变量转化回原始的复杂数据。某种程度上可以理解为,扩散模型采用一个固定的数学过程来模拟VAE中的编码器的功能,只需要训练解码器即可。
在扩散模型中,我们逐步添加噪声,使数据在多个步骤中逐渐“扩散”到一个简单的随机变量,这个过程可以视为一种向潜在空间的映射。常见的做法是将这个潜在空间的分布设定为简单的高斯分布。
然而,与VAEs等其他潜在变量模型不同,扩散模型的潜在空间并不会降低数据的维度。噪声注入过程不会改变数据的维度,比如在处理图像数据时,添加噪声不会改变图像的尺寸(像素数量)。因此,可以将扩散模型的潜在空间视为与原始数据维度相同的空间,只是数据在这个空间中遵循了一个简单的分布(如高斯分布)。
在生成数据时,我们会逐步移除添加的噪声,从潜在空间将数据恢复到原始数据空间。这个过程是通过训练一个神经网络来实现的,该网络的目标是最大化在去噪过程中数据的似然。在去噪过程中,数据的维度保持不变,但数据的分布会从简单的高斯分布逐渐转变为复杂的实际数据分布。
DDPM前向扩散简明指导
在扩散模型中,噪声注入的基本思想是通过加入随机噪声,使得数据的分布进行变化,使得模型在训练时需要适应这些变化,从而可以提高模型的泛化能力。
扩散模型中噪声注入的具体过程通常如下:
假设我们有一个图片数据集的概率分布 \(P(x)\), 我们想要模型学习这个分布。在扩散模型中, 我们不直接对 \(P(x)\) 建模, 而是对一个由 \(P(x)\) 通过扩散过程得到的分布 \(q\left(x^{\prime}\right)\) 建模。这个扩散过程可以看作是向 \(P(x)\) 中注入噪声。
对于每一个数据点 \(x\), 我们可以通过以下方式进行噪声注入:
选取一个噪声分布, 例如高斯噪声分布 \(N\left(0, \sigma^2\right)\) 。
从这个噪声分布中采样出噪声 \(\varepsilon\), 并将其加入到数据点 \(x\) 中, 得到新的数据点 \(x^{\prime}\) 。这个过程可以用以下公式表示:
$$
x^{\prime}=x+\varepsilon \text {, 其中 } \varepsilon \sim N\left(0, \sigma^2\right)
$$
这就是扩散模型中噪声注入的基本过程。在这个过程中, \(\sigma\) 控制了噪声的强度。 \(\sigma\) 越大, 噪声越强, 数据点 \(x\) 与原始数据点 \(x\) 的差距越大。
在实际应用中, 这个过程通常会被重复多次, 每次注入的噪声可以相同, 也可以不同。
例如, 我们可以在每一步中逐渐增大 \(\sigma\), 使得噪声逐渐增强。
当加上时间概念对加噪过程进行数学描述时, 公式如下:
$$
q\left(x_{1: T} \mid x_0\right)=\prod_{t \geq 0} q\left(x_t \mid x_{t-1}\right), \quad q\left(x_t \mid x_{t-1}\right)=N\left(x_t ; \sqrt{1-\beta_t} x_{t-1}, \beta_t I\right)
$$
解释一下上述公式, 我们考虑一个随时间变化的数据序列 \(x_0, x_1, \ldots, x_T\), 其中 \(x_0\) 是原始数据, \(x_T\) 是在一系列噪声扩散过程后得到的数据。对于任意的 \(t, q\left(x_t \mid x_{t-1}\right)\) 表示在给定 \(x_{t-1}\) 的情况下 \(x_t\) 的条件概率分布。这里, 这个分布被定义为一个高斯分布, 其均值是 \(1-\beta_t x_{t-1}\), 方差是 \(\beta_t I\) 。这里的 \(I\) 是单位矩阵, 表示的是每个维度上的噪声是独立的。这个高斯分布就代表了在时间 \(t\) 所注入的噪声。其中, \(\beta_t\) 是一个介于 0 和 1 之间的参数,控制了噪声注入的强度。具体来说, \(1-\beta_t\) 是噪声注入前的数据所占比重, 而 \(\beta_t\) 是噪声的方差。因此, 当 \(\beta_t\) 接近 0 时, 噪声的影响较小, \(x_t\) 主要由 \(x_{t-1}\) 决定; 当 \(\beta_t\) 接近 1 时,噪声的影响较大, \(x_t\) 更多地由噪声决定。总的来说, \(N\left(x_t ; \sqrt{1-\beta_t} x_{t-1}, \beta_t I\right)\) 表示当前步骤的图像状态 \(x_t\) 是从一个以 \(\sqrt{1-\beta_t} x_{t-1}\) 为均值、 \(\beta_t I\) 为方差的正态分布中采样得到的。这里, \(\beta_t\)是一个预先定义的噪声级别参数, 用于控制每一步添加的噪声量。
最后, \(q\left(x_{1: T} \mid x_0\right)=\prod_{t \geq 0} q\left(x_t \mid x_{t-1}\right)\) 描述的是整个噪声扩散过程的概率分布。由于每一步的噪声注入都是独立的, 所以整个过程的概率分布就是每一步噪声注入的概率分布的乘积。
实际上, 这个加噪的过程就是一个马尔可夫链算法, 在马尔可夫链中, 一个状态的下一状态只依赖于当前状态, 而与过去的状态无关, 这就是所谓的“无记忆性”。
对于给定的公式:
$$
q\left(x_{1: T} \mid x_0\right)=\prod_{t \geq 0} q\left(x_t \mid x_{t-1}\right)
$$
这里, \(x_{t-1}\) 是前一个状态, \(x_t\) 是下一个状态, 公式表明下一个状态 \(x_t\) 只依赖于前一个状态 \(x_{t-1}\) 。所以, 整个序列 \(x_0, x_1, \ldots, x_T\) 实际上构成了一个马尔可夫链。
此外,
$$
q\left(x_t \mid x_{t-1}\right)=N\left(x_i ; \sqrt{1-\beta_t} x_{t-1}, \beta_t I\right)
$$
这个公式表示了在给定前一个状态 \(x_{t-1}\) 的情况下, 下一个状态 \(x_t\) 的概率分布。这实际上是马尔可夫链中的状态转移概率。 所以,从这个角度看,这个公式实际上描述了一个马尔可夫链,并且这个马尔可夫链的状态转移概率是高斯分布。这样的马尔可夫链也被称为高斯马尔可夫链。值得注意的是,我们每次进行噪声加入的时候都是很有规矩的加入一定的高斯噪声,那我们是否可以打破这种循规蹈矩,不用多次的加入而是一步到位呢?
实际上, 在原论文已经给出了相关的推导, 论文中给到的公式是 \(x_t=\sqrt{\bar{\alpha}_t} x_0+\sqrt{1-\bar{\alpha}_t} \epsilon\),这个公式与上文推导的公式 \(q\left(x_t \mid x_{t-1}\right)=N\left(x_t ; \sqrt{1-\beta_t} x_{t-1}, \beta_t I\right)\) 最大的不一样在于 \({ }_t\) 的生成不依赖于 \(x_{t-1}\), 而是根据初始图片 \(x_0\) 和扩散次数 \(\mathrm{t}\) 即可生成, 换句话说, 原论文中给出的公式允许一步到位生成噪声图片,而不需要多次的迭代叠加噪声,这大大的简化的生成噪声图片的流程。这个公式的推导要依赖于重参数化技巧,下面进行详细的数学推导。
重参数化是一种用于训练深度概率模型的策略,在变分自编码器(VAE)和扩散模型中经常使用。考虑一个基本的噪声注入过程: 我们有一个数据点 \(x\), 我们想要向其注入服从正态分布 \(N\left(0, \sigma^2\right)\) 的噪声。如果我们直接从这个分布中采样噪声 \(\varepsilon\), 并将其加到 \(x\) 上, 那么这个过程就涉及到随机性, 无法直接进行反向传播。
为了解决这个问题, 我们可以使用重参数化技巧。具体来说, 我们不是直接从 \(N\left(0, \sigma^2\right)\)中采样噪声, 而是先从标准正态分布 \(N(0, I)\) 中采样, 然后再通过适当的变换得到我们想要的噪声。这样, 这个噪声注入过程就可以分解为两步:
- 从标准正态分布 \(N(0, I)\) 中采样噪声 \(\varepsilon^{\prime}\) 。
- 将噪声 \(\varepsilon^{\prime}\) 进行变换, 得到我们想要的噪声 \(\varepsilon=\sigma \varepsilon^2\) 。
然后, 我们就可以将这个噪声 \(\varepsilon\) 加到数据点 \(x\) 上, 得到新的数据点 \(x^{\prime}=x+\varepsilon\) 。
通过这种方式, 我们就将噪声注入过程中的随机性移到了第一步, 这一步是可以进行反向传播的。因为标准正态分布 \(N(0, I)\) 是固定的, 不涉及到模型的参数, 所以从中采样的过程是可以进行反向传播的。然后,第二步中的变换也是可以进行反向传播的,因为这个变换只涉及到乘法和加法,这两种操作都是可导的。这样,整个噪声注入过程就可以进行反向传播,可以被优化。这就是重参数化技巧。
在扩散模型中,这种技巧也被广泛使用。例如,上面提到的公式
$$
q\left(x_t \mid x_{t-1}\right)=N\left(x_t ; \sqrt{1-\beta_t} x_{t-1}, \beta_t I\right)
$$
描述的噪声注入过程就可以用重参数化技巧来实现。具体来说, 我们可以先从标准正态分布 \(N(0, I)\) 中采样噪声 \(\varepsilon^{\prime}\), 然后将这个噪声通过变换 \(\varepsilon=\beta_t \varepsilon^{\prime}\), 得到我们想要的噪声。然后再将这个噪声加到 \(x_{t-1}\) 上, 得到新的数据点 \(x_t=\sqrt{1-\beta_t} x_{t-1}+\varepsilon\) 。这样, 整个噪声注入过程就可以进行反向传播, 可以被优化。借助重参数化技巧计算 \(x_t\) 的公式如下:
$$
x_t=\sqrt{1-\beta_t} x_{t-1}+\sqrt{\beta_t} \varepsilon_{t-1}
$$
在上述公式中:
\(x_t\) 是在时间步 \(t\) 的状态。\(\beta_t\) 是一个介于 0 和 1 之间的参数, 控制着前一个状态 \(x_{t-1}\) 和新引入的噪声 \(\varepsilon_{t-1}\) 对当前状态 \(x_t\) 的贡献。 \(\varepsilon_t\) 是噪声项, 通常假定服从标准正态分布, 表示在时间 \(t\) 引入的随机噪声。在实践中, \(\beta_t\) 通常是预先定义的, 可以根据特定的扩散过程进行设定。
这个公式可以继续推导下去, 令, \(\alpha_t=1-\beta_t, \bar{\alpha}_i=\prod_{s=0}^t \alpha_s, \epsilon_0, \epsilon_0, \ldots, \epsilon_{t-2}, \epsilon_{t-1} \sim \mathcal{N}(0, I)\),对于 \(x_t\), 我们可以将其写为: \(\mathbf{x}_{\mathbf{t}}=\sqrt{\alpha_i} \mathbf{x}_{\mathrm{t}-1}+\sqrt{1-\alpha_t} \epsilon_{\mathrm{t}-1}\)
然后, 我们将 \(x_{t-1}\) 进一步展开:
$$
\mathbf{x}_{\mathbf{t}-1}=\sqrt{\alpha_{t-1}} \mathbf{x}_{\mathbf{t}-2}+\sqrt{1-\alpha_{t-1}} \epsilon_{\mathbf{t}-2}
$$
现在, 我们将这个表达式代入到 \({ }_t\) 的公式中:
$$
\mathbf{x}_{\mathbf{t}}=\sqrt{\alpha_t}\left(\sqrt{\alpha_{t-1}} \mathbf{x}_{\mathbf{t}-2}+\sqrt{1-\alpha_{t-1}} \epsilon_{\mathrm{t}-2}\right)+\sqrt{1-\alpha_t} \epsilon_{t-1}
$$
可以整理为:
$$
\mathbf{x}_t=\sqrt{\alpha_t \alpha_{t-1}} x_{t-2}+\sqrt{\alpha_t\left(1-\alpha_{t-1}\right)} \epsilon_{t-2}+\sqrt{1-\alpha_t} \epsilon_{t-1}
$$
由于 \(\epsilon_{t-2}\) 和 \(\epsilon_{t-1}\) 都是独立的高斯随机变量, 我们可以将这两项合并, 得到:
$$
\begin{aligned}
& \sqrt{\alpha_t \alpha_{t-1}} x_{t-2}+\sqrt{\alpha_t\left(1-\alpha_{t-1}\right)} \epsilon+\sqrt{1-\alpha_t} \epsilon \\
& =\sqrt{\alpha_t \alpha_{t-1}} x_{t-2}+\mathcal{N}\left(0, \alpha_t\left(1-\alpha_{t-1}\right)\right)+\mathcal{N}\left(0,1-\alpha_t\right) \\
& =\sqrt{\alpha_t \alpha_{t-1}} x_{t-2}+\mathcal{N}\left(0,1-\alpha_t \alpha_{t-1}\right) \\
& =\sqrt{\alpha_t \alpha_{t-1}} x_{t-2}+\sqrt{1-\alpha_t \alpha_{t-1}} \epsilon
\end{aligned}
$$
其中 \(\epsilon^{\prime}\) 是新的随机噪声, 其分布为 \(\mathcal{N}(0, I)\) 。然后, 我们可以继续这个过程, 将 \(x_{t-2}\) 继续展开, 直到 \(x_0\) 。最后我们会得到:
$$
x_t=\sqrt{\bar{\alpha}_t} x_0+\sqrt{1-\bar{\alpha}_t} \epsilon^{\prime \prime}
$$
其中 \(\epsilon^{\prime \prime}\) 也是随机噪声, 分布为 \(\mathcal{N}(0, I)\) 。
最后, 由于 \(\mathrm{x}_t\) 是 \(\mathrm{x}_0\) 和随机噪声 \(\epsilon^{\prime \prime}\) 的线性组合, 因此 \(\mathrm{x}_t\) 的分布为正态分布 \(N\left(\sqrt{\bar{\alpha}_t} x_0,\left(1-\bar{\alpha}_t\right) I\right)\)
重参数化不仅是简单的数学推导,而是一种在保持概率分布特性的同时改变其形式的方法。在当前的例子中,重参数化的主要目的是为了简化从原始图像(x_0)到任意噪声级别(x_t)的转换过程。通过这种方法,可以直接计算出任意时间点的噪声图像,而无需逐步通过每个噪声级别。这在理论上简化了加噪过程,并使得在生成和处理数据时更加高效。尽管重参数化提供了一种高效计算噪声图像的方法,但在实际训练过程中,为了训练模型学习逐步去噪,通常仍然需要生成一系列噪声图像。这些噪声图像及其对应的更低噪声级别的图像(或原始图像)被用作训练数据,以帮助模型学习如何在每一步去除噪声。值得注意的是,这一系列的噪声图像可以通过我们重参数化之后的公式根据(x_0)直接生成,没有必要按照t的序列顺序依次串行生成。更重要的是这个重参数化后的公式也会参与损失函数的计算,这将在下面小节展开推导。
DDPM反向去噪过程
扩散模型是一种生成模型,它通过逐步向数据添加噪声来模拟数据生成过程。反向去噪的过程则是其逆过程,也就是从被噪声污染的数据中恢复出原始数据。
扩散模型的反向去噪过程是一种独特而精细的技术,其目的是将一个高噪声水平的图像逐步转换回其原始形态。这个过程始于一个噪声图像,该图像通常是在扩散过程的最后阶段生成的。在这个阶段,图像含有大量的噪声,与原始图像相比,信息损失极为严重。
在去噪过程中,神经网络致力于在每个步骤中去除部分噪声。这主要通过预测给定噪声图像在下一步的去噪版本来实现。为了训练网络达到这一目标,使用特定的训练标签是至关重要的。这些训练标签通常是从原始图像通过一定的前向扩散过程生成的,它们代表了在各个噪声级别下理想的去噪结果。在训练过程中,网络学习如何从一个噪声级别\(x_t\)恢复到一个更低噪声级别的状态 \(x_{t-1}\) 。这意味着, 对于每个噪声图像\(x_t\), 其相应的训练目标是一个在噪声级别稍低一些的图像 \(x_{t-1}\), 或者最终的原始图像 \(x_0\) 。
这个过程是迭代的,意味着在每一步中生成的去噪图像会被用作下一步的输入。因此,随着每一次迭代,图像的噪声水平逐渐降低,图像逐渐接近其原始形态。这里注意两点,首先上句话提到的“这个过程是迭代的”只是理论上的方法,在实际的使用中,我们也是一次到位进行噪声的去除的,这将在下面小节中展开推导。其次,整个迭代过程中使用的是同一个神经网络,而非每次迭代都训练一个新的网络。这种方法的目的是为了提高效率和一致性。
使用单一神经网络进行多次迭代的做法有几个关键优势。首先,它允许网络学习如何在各个噪声级别下处理图像,而不是仅限于单一的噪声水平。其次,这种方法减少了计算资源的需求,因为不需要为每个噪声级别单独训练和维护一个网络。此外,参数共享(即相同的网络权重用于处理不同噪声级别的图像)有助于网络更好地泛化到新的、未见过的数据。
神经网络的训练是基于一系列具有不同噪声水平的图像及其相应的噪声版本。如下图2(a)所示,是一个前向扩散的示例,在这个例子中,t=3时刻对应的训练信息如图2(b)所示,输入信息是t=3,以及t=3时刻的噪声图片,输出结果是对t=3时刻噪声的预测,而真实标签就是前向扩散过程中t=3时刻的噪声。预测完成之后,通过将t=3时刻的噪声图片与预测的噪声相减得到去噪版本的输出结果,如图2(c)所示。通过这种方式,网络学习如何在不同的噪声水平下有效地去除噪声。这样的训练策略使得网络能够适应各种级别的噪声,并在迭代过程中逐步恢复图像的清晰度。
![图片[2]-扩散模型(Diffusion Model)-点头深度学习网站](https://venusai-1311496010.cos.ap-beijing.myqcloud.com/wp-content/upload-images/2024/03/20240305155004953.png)
经过多个迭代步骤后,最终的输出是一个去除了所有噪声的图像,这个图像应非常接近于原始的无噪声图像。在有条件的扩散模型中,这个过程也可以受到额外条件的影响,如文本描述。这些条件可以用来引导图像生成过程,使得最终生成的图像满足特定的要求或特征。
实际上,上述也仅仅是一个理论上的简明介绍,在实际的去噪中,扩散模型的逆向过程并不是迭代的,而是一次完成的,这是因为扩散模型的前向扩散过程就是一次生成的,在上一小节有关详细解释。需要注意的是,无论是前向过程的一次性噪声生成,还是去噪过程的一步完成,都基于多次迭代的理念。所谓的“一次完成”实际上是多次迭代的抽象表达,这一处理方式与扩散模型的基本原理是一致的。这种方法与自编码器的一次性生成输出的方式不同,后者不涉及迭代过程。
DDPM扩散模型的损失函数
DDPM扩散模型的损失函数要从图片生成模型共同的目标讲起——最大似然估计。最大似然估计是一种统计方法,用于在给定一些观测数据时,估计模型参数使得观测数据出现的概率(似然性)最大。在图片生成模型的上下文中,这意味着我们希望找到模型参数,使得模型生成观测到的真实图片数据的概率最大化。
图片生成模型,如生成对抗网络(GANs)、变分自编码器(VAEs)、和扩散模型等,旨在学习真实世界图片数据的概率分布。一旦模型学会了这个分布,它就可以生成新的、以前未见过的图片,这些图片与真实数据在统计上是不可区分的。
最大似然估计之所以在图像生成模型中得到广泛应用,是因为它在提高模型泛化能力和确保学习过程的稳定性方面的独特优势。它鼓励模型学习一个能够覆盖数据集多样性的分布,而不是仅仅记住特定的数据样本。
虽然最大似然估计在理论上非常优雅,但在实际应用中,尤其是在处理高维数据(如图像)时,可能会遇到显著的计算挑战。对于复杂的深度学习模型,直接计算或最大化似然函数可能不可行,因此通常需要借助变分推断的思想,这个在自编码器章节有过介绍。变分推断(Variational Inference)的核心部分是使用了变分下界(也称为证据下界或ELBO)来近似概率模型中难以直接计算的对数似然。以下是逐步的公式解释:
1. 目标的设定:
$$
\log P_\theta(x)
$$
这里的目标是计算数据点 \(x\) 在参数 \(\theta\) 下的对数似然, 这个参数 \(\theta\) 实际上是神经网络模型中的待训练参数。
2. 引入隐变量 \(z\) :
$$
\log P_\theta(x)=\int_z q(z \mid x) \log P_\theta(x) d z
$$
在这里, 我们使用隐变量 \(z\) 的分布 \(q(z \mid x)\) 来重写对数似然。注意, 这个 \(q(z \mid x)\) 可以是任何分布, 因为它与我们最初试图评估的量 \(\log P(x)\) 是无关的。这是因为 \(\log P(x)\) 是关于数据点 \(x\) 的对数似然, 而 \(x\) 是给定的, 与 \(z\) 无关。从积分性质角度讲, 我们使用的是 \(q(z \mid x)\) 对 \(z\) 的完整积分, 这意味着积分会遍历所有可能的 \(z\) 值。由于积分是在整个空间上进行的, 它会覆盖所有 \(z\) 的可能性, 因此积分的结果是不变的。此外, 由于 \(P(x)\) 是常数, 它可以被提出积分外。
3. 将对数似然分解:
$$
\log P_\theta(x)=\int_z q(z \mid x) \log \left(\frac{P_\theta(z, x)}{P_\theta(z \mid x)}\right) d z
$$
这一步骤是将对数似然 \(\log P_\theta(x)\) 重写为联合分布 \(P_\theta(z, x)\) 与条件分布 \(P_\theta(z \mid x)\) 的比率。这是基于概率论中的乘法规则 \(P_\theta(x)=\frac{P_\theta(z, x)}{P_\theta(z \mid x)}\) 。
4. 引入变分分布:
$$
\log P_\theta(x)=\int_z q(z \mid x) \log \left(\frac{P_\theta(z, x)}{q(z \mid x)} \frac{q(z \mid x)}{P_\theta(z \mid x)}\right) d z
$$
这里, 我们在分子式的分子分母上同时引入了变分分布 \(q(z \mid x)\) 并将其与条件分布 \(P_\theta(z \mid x)\) 相比较。该步骤是为了创建一个项, 该项后续可以转化为 KL 散度, 这是一个衡量两个概率分布相似度的度量。
5. 分解对数:
$$
\log P_\theta(x)=\int_z q(z \mid x) \log \left(\frac{P_\theta(z, x)}{q(z \mid x)}\right) d z+\int_z q(z \mid x) \log \left(\frac{q(z \mid x)}{P_\theta(z \mid x)}\right) d z
$$
对数的性质允许我们将比率的对数分解为差的对数。
6. 应用 Jensen 不等式:
$$
\log P_\theta(x) \geq \int_z q(z \mid x) \log \left(\frac{P_\theta(z, x)}{q(z \mid x)}\right) d z
$$
在这里, 通过应用 Jensen 不等式, 我们删除了等式右侧的第二项, 这是 KL 散度, 它总是非负的, 即大于等于 0 , 这样就可以删除 \(\mathrm{KL}\) 散度的同时得到一个大于等于的不等式, 即对数似然的一个下界。
7. 变分下界:
$$
\log P_\theta(x) \geq \mathrm{E}_{q(z \mid x)}\left[\log \left(\frac{P_\theta(x, z)}{q(z \mid x)}\right)\right]
$$
最终, 我们将积分重写为期望值的形式, 这表明对数似然的下界是隐变量 \(z\) 下变分分布 \(q(z \mid x)\) 的期望。
总结来说, 这段推导展示了如何将复杂的对数似然问题转化为一个可以通过优化变分分布 \(q(z \mid x)\) 来解决的下界问题。这种方法在复杂的概率模型中, 如图像生成模型, 是非常有用的, 因为它使我们能够近似学习难以直接处理的分布。
上式子中的 \(\mathrm{E}_{q(z \mid x)}\) 在 VAE 中是编码器, 在扩散模型中是前向扩散过程, 即下式:
$$
\log p(\mathbf{x}) \geq \mathbb{E}_{q\left(\mathbf{x}_{1: T} \mid \mathbf{x}_0\right)}\left[\log \frac{p\left(\mathbf{x}_{0: T}\right)}{q\left(\mathbf{x}_{1: T} \mid \mathbf{x}_0\right)}\right]
$$
\(-\mathbf{x}\) 是观测到的数据点 (例如一张图片)。
\(-\log p(\mathbf{x})\) 是数据点 \(\mathbf{x}\) 的对数似然, 即我们想要最大化的目标, 以便模型能够学习生成真实数据的概率分布。 \(p\) 可以理解成神经网络模型。
– \(\mathbf{x}_{1: T}\) 表示数据 \(\mathbf{x}\) 经过一系列噪声增加步骤后的扩散序列, 直到时间 \(T\) 的状态。这是一个扩散过程, 其中每一步我们向数据添加噪声。
\(-q\left(\mathbf{x}_{1: T} \mid \mathbf{x}_0\right)\) 是在给定原始数据 \(\mathbf{x}_0\) 的情况下, 数据经过扩散过程达到 \(\mathbf{x}_{1: T}\) 的条件概率分布。 \(-p\left(\mathbf{x}_{0: T}\right)\) 表示从噪声状态 \(\mathbf{x}_T\) 逆向恢复到原始数据 \(\mathbf{x}_0\) 的整个扩散过程的联合概率分布。在扩散模型中, 这个逆向过程是通过逐步去除噪声实现的。
\(-\mathbb{E}_{q\left(\mathbf{x}_{1: T} \mid \mathbf{x}_0\right)}\) 是期望操作,表示在 \(q\) 分布下对所有可能的扩散路径 \(\mathbf{x}_{1: T}\) 进行平均。
这个不等式的意义在于, 它提供了对数似然 \(\log p(\mathbf{x})\) 的一个可计算的下界。由于直接计算 \(\log p(\mathbf{x})\) 在技术上通常是不可行的,这个下界成为了一个实用的替代目标。通过优化模型参数以最大化这个下界, 扩散模型可以被训练来逆向模拟扩散过程, 最终生成与观测数据 \(\mathbf{x}_0\)类似的样本。
这个公式可以得到下述的整理:
![图片[3]-扩散模型(Diffusion Model)-点头深度学习网站](https://venusai-1311496010.cos.ap-beijing.myqcloud.com/wp-content/upload-images/2024/03/20240305162018969.png)
此时,我们得到了扩散模型中最大似然函数的推导结果,即:
$$
\begin{aligned}
\log p(\mathbf{x})=\mathrm{E}_{q\left(x_1 \mid x_0\right)}\left[\log P\left(x_0 \mid x_1\right)\right] & -K L\left(q\left(x_T \mid x_0\right) \| P\left(x_T\right)\right) \\
& -\sum_{t=2}^T \mathrm{E}_{q\left(x_t \mid x_0\right)}\left[K L\left(q\left(x_{t-1} \mid x_t, x_0\right) \| P\left(x_{t-1} \mid x_t\right)\right)\right]
\end{aligned}
$$
这个公式是对扩散模型中对数似然的分解, 其中 \(\mathbf{x}\) 表示我们的数据点(如一张图片),而 \(x_0\) 是原始数据, \(x_1\) 到 \(x_T\) 表示数据在不同时间步的扩散状态。这个分解涉及到以下几个关键部分:
\(1 . \log p(\mathbf{x})\) : 这是我们想要最大化的目标, 即数据点 \(\mathbf{x}\) 的对数似然。它衡量的是模型生成数据点的概率。
2. \(\mathrm{E}_{q\left(x_1 \mid x_0\right)}\left[\log P\left(x_0 \mid x_1\right)\right]\) : 这是在给定 \(x_1\) 的情况下, \(x_0\) 的对数条件概率的期望值。它表示模型从扩散状态 \(x_1\) 逆向恢复到原始状态 \(x_0\) 的能力。
3. \(K L\left(q\left(x_T \mid x_0\right) \| P\left(x_T\right)\right)\) : 这是在给定原始数据 \(x_0\) 的情况下, 数据点在最终扩散状态 \(x_T\) 的变分分布 \(q\) 与模型假设的最终扩散状态的概率分布 \(P\) 之间的 KL 散度。它衡量了模型假设的扩散过程如何匹配实际的扩散过程。
4. \(\sum_{t=2}^T \mathrm{E}_{q\left(x_t \mid x_0\right)}\left[K L\left(q\left(x_{t-1} \mid x_t, x_0\right) \| P\left(x_{t-1} \mid x_t\right)\right)\right]\) : 这是对所有时间步的累加, 它计算了在每一步扩散过程中, 给定 \(x_t\) 和 \(x_0\) 时的变分分布 \(q\) 与模型的条件概率分布 \(P\) 之间的 KL 散度的期望值。这个累加项量化了逐步恢复过程中的误差。
整体来看, 这个公式通过期望值和 KL 散度的项, 将对数似然分解成了模型在整个扩散过程中的性能度量。每一项都与模型在不同阶段如何准确地模拟数据的扩散和恢复过程有关。在训练扩散模型时, 我们希望最大化对数似然 \(\log p(\mathbf{x})\), 这通常是通过最小化各个 KL 散度项来实现的, 因为 \(\log p(\mathbf{x})\) 的最大化等同于整个右侧表达式的最大化, 这包括了最大化第一项 (逆向恢复的期望对数似然) 以及最小化所有的 KL 散度项。
接下来, 我们进一步解释 \(q\left(x_{t-1} \mid x_t, x_0\right)\) 的求解。实际上, 我们已知的是 \(q\left(x_t \mid x_{t-1}\right)\), \(q\left(x_{t-1} \mid x_0\right)\) 和 \(q\left(x_t \mid x_0\right)\), 这些都可以通过 8.2.1 小节推导的公式得出。因此, 这里的关键是使用这三个公式去表示 \(q\left(x_{t-1} \mid x_t, x_0\right)\) 。推导过程也很简单, 利用条件概率的定义和联合概率的分解即可实现, 具体如下:
$$
\begin{aligned}
& q\left(x_{t-1} \mid x_t, x_0\right) \\
& =\frac{q\left(x_{t-1}, x_t, x_0\right)}{q\left(x_t, x_0\right)} \\
& =\frac{q\left(x_t \mid x_{t-1}\right) q\left(x_{t-1} \mid x_0\right) q\left(x_0\right)}{q\left(x_t \mid x_0\right) q\left(x_0\right)} \\
& =\frac{q\left(x_t \mid x_{t-1}\right) q\left(x_{t-1} \mid x_0\right)}{q\left(x_t \mid x_0\right)}
\end{aligned}
$$
接下来,可以对上述公式进行进一步的推导。
![图片[4]-扩散模型(Diffusion Model)-点头深度学习网站](https://venusai-1311496010.cos.ap-beijing.myqcloud.com/wp-content/upload-images/2024/03/20240305162326223.png)
上述公式推导的结果显示, \(q\left(x_{t-1} \mid x_t, x_0\right)\) 服从一个高斯分布, 它的均值和方差分别是
$$
\text { mean }=\frac{\sqrt{\bar{\alpha}_{t-1}} \beta_t x_0+\sqrt{\alpha_t}\left(1-\bar{\alpha}_{t-1}\right) x_t}{1-\bar{\alpha}_t}, \text { variance }=\frac{1-\bar{\alpha}_{t-1}}{1-\bar{\alpha}_t} \beta_t I
$$
由于均值和方程中的组成因子都是已知的, 因此 \(q\left(x_{t-1} \mid x_t, x_0\right)\) 实际上是一个已知的高斯分布。此时, \(K L\left(q\left(x_{t-1} \mid x_t, x_0\right) \| P\left(x_{t-1} \mid x_t\right)\right)\) 表示的含义就是计算了在每一步扩散过程中, 给定 \(x_t\) 和 \(x_0\) 时 \(x_{t-1}\) 的变分分布 \(q\) (根据上述推导, 这是一个已知的高斯分布)与模型的条件概率分布 \(P\) (知道某时刻 \(\mathrm{t}\) 的噪声图片预测去噪结果的分布)之间的 \(\mathrm{KL}\) 散度的期望值。在训练过程中, 我们是求损失函数的极小值, 也就是说, 我们希望这个 KL 散度的期望值越小越好, 这就要求 \(q\left(x_{t-1} \mid x_t, x_0\right)\) 和 \(P\left(x_{t-1} \mid x_t\right)\) 的均值越接近越好。在刚刚的推到中, \(q\left(x_{t-1} \mid x_t, x_0\right)\)的均值是已知的,即:
$$
\text { mean }=\frac{\sqrt{\bar{\alpha}_{t-1}} \beta_t x_0+\sqrt{\alpha_t}\left(1-\bar{\alpha}_{t-1}\right) x_t}{1-\bar{\alpha}_t}
$$
而 \(P\left(x_{t-1} \mid x_t\right)\) 的均值实际上来自于训练的神经网络的输出结果。也就是说上述 \(q\left(x_{t-1} \mid x_t, x_0\right)\) 的已知均值实际上是神经网络训练的标签。针对上述 \(q\left(x_{t-1} \mid x_t, x_0\right)\) 的均值可以进行进一步的推导。根据之前小节已知推导结果 \(x_t=\sqrt{\bar{\alpha}_t} x_0+\sqrt{1-\bar{\alpha}_t} \varepsilon\), 可以整理得到 \(x_0=\frac{x_t-\sqrt{1-\bar{\alpha}_t} \varepsilon}{\sqrt{\bar{\alpha}_t}}\), 再代入上述均值整理一下得到:
$$
\begin{aligned}
& \frac{\sqrt{\bar{\alpha}_{t-1}} \beta_t \frac{x_t-\sqrt{1-\bar{\alpha}_t} \varepsilon}{\sqrt{\bar{\alpha}_t}}+\sqrt{\alpha_t}\left(1-\bar{\alpha}_{t-1}\right) x_t}{1-\bar{\alpha}_t} \\
= & \frac{1}{\sqrt{\alpha_t}}\left(x_t-\frac{1-\alpha_t}{\sqrt{1-\bar{\alpha}_t}} \varepsilon\right)
\end{aligned}
$$
在这个整理结果中, 唯一的变量实际上是 \(\mathcal{E}\), 其他的因子要么是已知的, 要么是手动设置的。也就是说, 这个 \(\mathcal{E}\) 才是神经网络模型需要预测的值。
最后, 回顾一下 DDPM 的损失函数:
$$
\begin{aligned}
\log p(\mathbf{x})=\mathrm{E}_{q\left(x_1 \mid x_0\right)}\left[\log P\left(x_0 \mid x_1\right)\right] & -K L\left(q\left(x_T \mid x_0\right) \| P\left(x_T\right)\right) \\
& -\sum_{t=2}^T \mathrm{E}_{q\left(x_t \mid x_0\right)}\left[K L\left(q\left(x_{t-1} \mid x_t, x_0\right) \| P\left(x_{t-1} \mid x_t\right)\right)\right]
\end{aligned}
$$
其中, \(\sum_{t=2}^T \mathrm{E}_{q\left(x_t \mid x_0\right)}\left[K L\left(q\left(x_{t-1} \mid x_t, x_0\right) \| P\left(x_{t-1} \mid x_t\right)\right)\right]\) 在上述已经进行了详细的推导。 \(K L\left(q\left(x_T \mid x_0\right) \| P\left(x_T\right)\right)\) 不需要管它, 因为其中的因子都是已知的, 换句话说, 当采样得到 \(x_t\)和 \(x_0\) 这个值是可计算的。最后 \(\mathrm{E}_{q\left(x_1 \mid x_0\right)}\left[\log P\left(x_0 \mid x_1\right)\right]\) 的计算与 \(\sum_{t=2}^T \mathrm{E}_{q\left(x_t \mid x_0\right)}\left[K L\left(q\left(x_{t-1} \mid x_t, x_0\right) \| P\left(x_{t-1} \mid x_t\right)\right)\right]\) 十分类似,这里就不再进行详细的推导解释了。
大家可能会好奇为什么损失函数的定义和推导如此的复杂?不可以使用一些距离度量损失直接约束模型每次迭代的预测值和真实值之间的距离吗?主要原因在于扩散模型的特殊性质和目标。以下是几个关键原因:
1.扩散过程的本质:
扩散模型的核心在于模拟数据逐步被噪声覆盖的过程,并在逆过程中去除这些噪声。这个过程不仅涉及在特定时刻的数据状态,而且涉及整个数据分布的演变。因此,损失函数需要捕捉这个分布的变化,而不仅仅是在特定时刻的数据点。
2.数据分布的重要性:
在扩散模型中,重要的是学习数据如何随时间变化而逐步转变为噪声,以及如何从噪声状态恢复到原始状态。这种变化更多地体现在数据分布的变化上,而不只是单个数据点的预测准确性。
3.高噪声水平下的挑战:
在扩散过程的后期,数据点会被高水平的噪声覆盖,使得它们几乎或完全是随机的。在这种情况下,使用MSE衡量预测值和高度随机的真实值之间的差异变得不那么有意义。其值将会非常大。
4.特定的统计特性:
扩散模型中的数据点在加入噪声后会遵循特定的统计分布(通常是正态分布)。因此,损失函数需要专门设计以适应这些统计特性,而不是简单地对预测值和真实值进行点对点的比较。
5.优化目标的不同:
扩散模型的最终目标是能够从高度噪声的数据中恢复出清晰的原始数据。为此,需要优化模型对整个数据分布的理解,而不仅仅是单个数据点的预测。
DDPM扩散模型的应用
使用训练好的扩散模型来生成或重构图像是一个详尽而精细的过程,涉及多次计算以逐步达到最终结果。具体来说,使用过程从一个高噪声水平的图像开始。与训练过程类似,这个噪声图像通常是随机生成的,类似于白噪声,而不是从特定清晰图像通过加噪得到的。训练好的模型随后用于逐步减少噪声并逐渐恢复图像细节。在每次迭代中,模型接收当前的噪声图像,基于其进行去噪处理,生成一个噪声水平降低的新图像。迭代的次数取决于模型在训练时的设置。例如,如果模型在训练过程中是通过50个不同的噪声级别逐步生成图像,那么在使用时也会进行相似数量的迭代。
如果是有条件的扩散模型,这个过程可以受到额外条件的影响,比如文本描述。这些条件信息被用来引导图像的生成过程,确保最终生成的图像符合这些指定的条件。经过足够次数的迭代后,最终的输出是一个去除了大部分或所有噪声的图像,这个图像应非常接近于原始图像或满足特定的生成要求。在每次迭代中,可能会引入一定的随机性,这有助于在生成图像时引入多样性,特别是在生成新的、未见过的图像时。
扩散模型不采用像自编码器那样一步到位的方法生成图像的原因主要是由于它们的工作原理和设计哲学的不同。扩散模型和自编码器在处理图像生成问题时采取了不同的方法。
首先是工作原理的差异,对于自编码器而言,通常包括一个编码器和一个解码器。编码器将输入数据(如图像)转换为一个较低维度的表示(潜在空间),然后解码器从这个潜在空间重构出原始数据。这种一步到位的过程适用于许多情况,但可能在处理高度复杂或细节丰富的图像时遇到限制。而通过逐步引入和逐步去除噪声来生成图像。在这个过程中,模型学习如何逐渐恢复图像的细节,这可以捕捉更细微的数据分布特征。这种逐步的方法允许模型生成极为复杂和高质量的图像,这在一步生成方法中可能难以实现。
其次考虑图像质量和复杂性,扩散模型特别适合生成高质量和视觉上复杂的图像。逐步去除噪声的过程可以更精细地控制图像的细节,从而生成质量更高、细节更丰富的图像。
另外从灵活性和控制角度理解, 扩散模型在图像生成过程中提供了更多的控制点,因为它可以在多个步骤中调整生成的过程。这种逐步生成方法可以更好地应对复杂的生成任务,如条件图像生成或风格迁移。
最后,对复杂数据分布的建模,扩散模型通过逐步的方法能够更好地建模复杂的数据分布。在逐步去噪的每一步,模型都在学习数据的不同方面,这有助于捕获数据的复杂性和多样性。总之,扩散模型之所以不采用像自编码器那样一步到位的方法,是因为其逐步去噪的方法在处理高度复杂的图像生成任务时提供了更高的质量、更细致的控制以及对复杂数据分布更好的建模能力。
暂无评论内容