一文理清 Diffusion Model 扩散模型

注:

2024 年 12 月 26 日终于完工啦,如有错误,欢迎指正~

参考:

【大白话01】一文理清 Diffusion Model 扩散模型 | 原理图解+公式推导_哔哩哔哩_bilibili

多模态大模型:算法、应用与微调 刘兆峰 (豆瓣) (douban.com)

狗都能看懂的DDPM论文详解-CSDN博客

Diffusion model(一): 公式推导详解_diffusion模型公式推导-CSDN博客

扩散模型理论与公式推导——详细过程速览与理解加深_扩散模型加噪公式中加噪推导-CSDN博客

1. 什么是 Diffusion Model ?

扩散的设计灵感主要来自于非平衡热力学,在非平衡热力学中,系统和环境之间经常发生物质与能量的交换。如果在一个装有水的容器中滴入一滴墨水,那么会看到墨水在水中逐渐扩散,直至最后均匀的分布在整个容器。如果把这个扩散过程的每一步都控制的足够小,那么理论上这个过程就是可逆的。

Denoising Diffusion Probabilistic Models[1],DDPM 是一种生成模型,所谓生成模型,就是从学习给定数据的分布,然后再通过该分布生成新的数据样本。那么理所当然的,DDPM 可以用于缓解数据集稀缺数据集类别分布不平衡数据增强

DDPM 包含两个关键过程:

  1. 正向扩散过程(Forward Diffusion Process)

    对数据逐步加入噪声,直到变为纯随机噪声

    Forward Diffusion Process
  2. 逆向生成过程(Reverse Diffusion Process)

    从纯噪声中逐步移除噪声,生成目标数据

    Reverse Diffusion Process

2. Diffusion Model 的数学推导

2.1 Forward Diffusion Process

这个阶段是一个逐渐往图片中加入噪声的过程,通过 T 步加入噪声之后,得到一个完全为噪声的图像。每个加噪的步骤都是类似的,对于 $ t $ 步的样本 \(x_t\),可以理解成一个递推过程:\(x_t = f(x_{t-1})\),而 $ f(x) $ 的定义如下: \[ x_t = \sqrt{1-\beta_t}\; × \; x_{t-1} + \sqrt{\beta_t} \; × \; \varepsilon_{t} \quad \quad \quad \quad \varepsilon_t \sim \mathcal{N}(0, I) \]

其中 $ t $ 表示第 \(t\) 个时间步,\(x_t\) 表示在第 \(t\) 个时间步的数据,\(\varepsilon_t\) 表示第 \(t\) 个时间步的多维标准高斯正态噪声,它的每个维度是独立同分布的,即: $(0, I) $ ——均值为 0,协方差矩阵为单位矩阵 \(I\)

协方差矩阵

协方差矩阵:随机变量的各个维度之间是独立的,且每个维度的方差都为 1

\(\beta_t\) 表示时间步 $ t $ 的噪声调度参数(Noise Schedule Parameter),用于控制噪声的强度( \(\beta_t\) 通常很小,如 0.0001 ∼ 0.02 ),通常来说, $ t $ 越大,\(\beta_t\) 越大(因为越到后面,轻微扰动很难看出变化,所以 \(\beta_t\) 的值会越来越大)。

在训练的时候,如果直接使用这种逐步计算的过程,自然是效率很低的,那么通过这个公式能否直接从初始时刻推导到最后时刻呢?这里我们直到答案是肯定的,具体的步骤如下~

首先令 $ _t = 1 - _t $,那么 \(x_t\) 就转换成: \[ x_t = \sqrt{\alpha_t}\; × \; x_{t-1} + \sqrt{1-\alpha_t} \; × \; \varepsilon_{t} \] 对于上式中的 \(x_{t-1}\) ,我们再利用该公式进行替换: \[ x_t = \sqrt{\alpha_t}(\sqrt{\alpha_{t-1}} \; × \; x_{t-2} \; + \; \sqrt{1-\alpha_{t-1}} \; × \; \varepsilon_{t-1}) + \sqrt{1-\alpha_t} \; × \; \varepsilon_{t} \] 稍微化简一下: \[ x_t = \sqrt{\alpha_t\alpha_{t-1}} \; × \; x_{t-2} + (\; \sqrt{\alpha_t-\alpha_{t}\alpha_{t-1}} \; × \; \varepsilon_{t-1} \; + \; \sqrt{1-\alpha_t} \; × \; \varepsilon_{t}) \] 我们知道: \[ \sqrt{\alpha_t-\alpha_{t}\alpha_{t-1}} \; × \; \varepsilon_{t-1} \quad \sim \mathcal{N}(0, \; (\alpha_t-\alpha_{t}\alpha_{t-1}) \; × \; I) \]

\[ \sqrt{1-\alpha_t} \; × \; \varepsilon_{t} \quad \sim \mathcal{N}(0, \; (1-\alpha_t) \; × \; I) \]

二者相加,因为: \[ \begin{align*} IF \quad & x \sim \mathcal{N}(\mu_x,\; \sigma_x^2), \quad Y \sim \mathcal{N}(\mu_y,\; \sigma_y^2)\\ & Z = x + Y\\ Then \quad & Z \sim \mathcal{N}(\mu_x + \mu_y,\; \sigma_x^2 + \sigma_y^2) \end{align*} \] 根据均值方差相加,那么可以得到: \[ \; \sqrt{\alpha_t-\alpha_{t}\alpha_{t-1}} \; × \; \varepsilon_{t-1} \; + \; \sqrt{1-\alpha_t} \; × \; \varepsilon_{t} \sim \mathcal{N}(0, (1-\alpha_t\alpha_{t-1} \; × \; I)) \] 所以 \(x_{t}\) 公式可以写为: \[ x_t = \sqrt{\alpha_t\alpha_{t-1}} \; × \; x_{t-2} + \sqrt{1-\alpha_t\alpha_{t-1}} × \varepsilon \quad \quad \quad \quad \varepsilon \sim \mathcal{N}(0, \; I) \] 那么我们可以推导出: \[ x_t = \sqrt{\alpha_t\alpha_{t-1}...\alpha_1} \; × \; x_0 + \sqrt{1-\alpha_t\alpha_{t-1}...\alpha_1} × \varepsilon \] 方便起见,令 \(\overline{\alpha}_t= \alpha_t\alpha_{t-1}...\alpha_1\) ,最终我们可以得到: \[ x_t = \sqrt{\overline{\alpha}_t} \; × \; x_0 + \sqrt{1-\overline{\alpha}_t} × \varepsilon \] 当 $ t $ 很大的时候,\(x_t ≈ \varepsilon\) (全噪声),\(\overline{\alpha}_t\) 为 0 ,\(\beta_t\) 此时比较大,符合一开始的结论。

这就是 Diffusion 模型的 Forward Diffusion Process 过程,还是比较容易的~

2.2 Reverse Diffusion Process

对于 Reverse 阶段,模型的目标是通过一个完全噪声的图片,逐步的进行去噪操作,最终得到我们所需要的图片。

这里可能有的同学会去想,那么我们把 Forward 过程直接逆过来可以吗?在这里是不可以的。因为初始状态是一个纯噪声的图片,想要一步步的去噪,生成所需的图片。那其实相当于我们直接知道了我们所需的图片了,这显然是自相矛盾了,我们怎么可能提前知道了所要生成的图片呢?

既然已经明确了这个阶段是一个逐步去噪的过程,那么是怎么做的呢?这里 DDPM 采用的方法是神经网络里的 UNet 去预测当前时间步 \(x_t\) 里的噪声 \(\varepsilon_{t}\),这里需要联系上方 Forward 过程,和之前的公式是同样的参数。

根据前面的 Forward 过程,我们知道,从 \(x_{t-1}\) 生成 \(x_t\) 的过程是一个高斯分布: \[ q(x_{t}|x_{t-1})=\mathcal{N}(x_{t};\ \sqrt{\alpha_t}x_{t-1}, \; (1-\alpha_t)I) \]

给出该公式的计算过程:

因为 \(x_t = \sqrt{\alpha_t}x_{t-1} + \sqrt{1-\alpha_t}\varepsilon_{t}\) ,其中 \(\varepsilon_t \sim \mathcal{N}(0,\ I)\) 是标准高斯分布。可以看出 \(x_t\) 是由 \(x_{t-1}\) 和一个独立的高斯噪声项线性组合而成,所以 \(x_t\) 也是一个高斯分布。

如果随机变量 \(x\)\(y\) 服从高斯分布,并且有以下线性关系: \[ y = Ax + b + \epsilon \] 其中:

  • \(\epsilon \sim \mathcal{N}(0, \Sigma)\) 是独立的高斯噪声;

  • \(A\) 是线性变换矩阵,\(b\) 是偏置项。

\(y\) 的分布也是高斯分布,均值和协方差分别为:

  • 均值:\(\mu_y = A\mu_x + b\)
  • 协方差:\(\Sigma_y = A\Sigma_xA^T + \Sigma_\epsilon\)

在扩散模型中:

  • \(A = \sqrt{\alpha_t}\),即 \(x_{t-1}\) 被缩放;
  • \(b = 0\),无偏移项;
  • \(\epsilon \sim \mathcal{N}(0, (1 - \alpha_t)I)\) ,协方差是 \((1 - \alpha_t)I\)

因此,\(x_t\) 的分布是: \[ q(x_{t} | x_{t-1}) = \mathcal{N}(x_t;\; \sqrt{\alpha_t}x_{t-1},\; (1 - \alpha_t)I) \]

对于后向分布 \(q(x_{t-1}|x_t)\),通过贝叶斯公式 \(q(x_{t-1}|x_t)=\frac{q(x_t,\ x_{t-1})}{q(x_t)}=\frac{q(x_t|x_{t-1})q(x_{t-1})}{q(x_t)}\) 可以得到 \(q(x_{t-1}|x_t)\) 自然也属于高斯分布。但是我们不能够简单推断 \(q(x_{t-1}|x_t)\) ,那么需要做的就是,使用一个神经网络,去拟合这个噪声的分布,也就是让以下公式去拟合真实的 \(q(x_{t-1}|x_t)\)\[ \begin{align}\label{eqn-2} p_{\theta}(x_{t-1}|x_t)=\mathcal{N}(x_{t-1};\ \, \mu_{\theta}(x_t,\ t),\ \Sigma_{\theta}(t)) \end{align} \]

其中:

  • 均值 \(\mu_{\theta}(x_t,\ t)\) 是一个由神经网络预测的,输入时带噪的图片 \(x_t\) 和时间步 \(t\)
  • 协方差 \(\Sigma_{\theta}(t)\) 是一个固定值,可由神经网络预测。通常,为简化计算,协方差 \(\Sigma_\theta(t)\) 被设为一个固定值或直接从前向过程的参数继承。
  • \(p_{\theta}(x_{t-1}\ | \ x_t)\) 是一个可调分布,依赖于神经网络的参数 \(\theta\) 。通过训练,网络会逐步优化这个部分,使它尽可能接近真实的后向分布 \(q(x_{t-1}\ |\ x_t)\)

后向分布(Backward Distribution)是指在扩散模型的生成阶段中,从当前时刻 \(x_t\) 推测上一时刻 \(x_{t-1}\) 的条件分布。

训练过程的核心目标最小化两者之间的差距\[ D_{KL}(q(x_{t-1}\ |\ x_t)\ || \ p_{\theta}(x_{t-1}\ | \ x_t)) \] 这里 \(D_{KL}\) 是 Kullback-Leibler 散度,用来衡量两个概率分布之间的差异。通过最小化 \(D_{KL}\) ,神经网络会调整 \(\mu_{\theta}(x_t,\ t)\)\(\Sigma_{\theta}(t)\) ,使得 \(p_{\theta}(x_{t-1}\ |\ x_t)\) 更加接近真实分布 \(q(x_{t-1}\ |\ x_t)\)

KL 散度:

具体见:Kullback-Leibler 散度 - Excelius's World

简单理解,KL 散度是用来衡量两个概率分布之间“相似度”的一个数学工具。如果 KL 散度小,表示 \(Q(x)\) 能很好地近似 \(P(x)\);KL 散度大,表示 \(Q(x)\)\(P(x)\) 有较大的差异。

2.2.1 Reverse 过程的具体步骤

  1. 初始化

    从纯噪声开始采样\[ x_T \sim \mathcal{N}(0, \ I) \]

  2. 逐步去噪

    通过神经网络从 \(x_t\) 逐步生成 \(x_{t-1}\)\[ x_{t-1} \sim \mathcal{p_{\theta}}(x_{t-1}\ |\ x_t) \]

    • 对于每一步 \(t\),我们从近似分布 \(p_{\theta}(x_{t-1}\ |\ x_t)\)采样
    • 逐步重复该过程,直到 \(t=0\),最终得到生成的样本 \(x_0\)
  3. 单步去噪公式

    采样过程通常按照如下公式进行: \[ x_{t-1}=\mu_{\theta}(x_t,\ t)+\sqrt{\Sigma_{\theta}(t)} \cdot z \] 其中:

    • \(z \sim \mathcal{N}(0,\ I)\) 是随机噪声,用来为每一步增加随机性(如果 \(t=1\),可以直接去掉随机性)。
    • \(\mu_{\theta}(x_t,\ t)\)\(\Sigma_{\theta}(t)\) 由神经网络预测。

    高斯分布采样公式:

    对于一个随机变量 \(x \sim \mathcal{N}(\mu, \Sigma)\),高斯分布的采样公式为: \[ x = \mu + \sqrt{\Sigma} \cdot z, \quad z \sim \mathcal{N}(0, I) \]

    • \(\mu\):高斯分布的均值。
    • \(\Sigma\):协方差矩阵(如果是对角矩阵,则每个元素是方差)。
    • \(z\):标准正态分布噪声。

    扩散模型中的 \(p_\theta(x_{t-1}\ |\ x_t)\) 是高斯分布,因此可以直接套用这一公式: \[ x_{t-1} = \mu_\theta(x_t,\ t) + \sqrt{\Sigma_\theta(t)} \cdot z \] 这里的 \(z \sim \mathcal{N}(0, I)\) 表示在采样过程中添加的随机性。

2.2.2 Reverse 过程中的噪声预测

在 DDPM 中,通常不直接预测后向分布的均值 \(\mu_\theta(x_t,\ t)\),而是将任务转化为预测噪声 \(\epsilon\),原因如下:

  1. 真实的均值依赖于 \(x_0\)

    • 在 Forward 过程中,\(x_t\) 可以由 \(x_0\) 和噪声 \(\epsilon\) 表示为:\(x_t = \sqrt{\overline{\alpha}_t} x_0 + \sqrt{1-\overline{\alpha}_t} \epsilon\)

    • \(q(x_{t-1}\ |\ x_t)\) 的均值公式中涉及 \(x_0\),但 \(x_0\) 是未知的。

    • 神经网络可以间接通过预测 \(\epsilon\) 来推导 \(\mu_\theta\)

  2. 预测噪声更简单

    • 对于上述的 \(x_t\) 计算公式,神经网络学习预测噪声 \(\epsilon\),不直接预测均值 \(\mu_\theta(x_t,\ t)\),通过预测噪声,可以间接计算出均值: \[ \mu_\theta(x_t,\ t)=\frac{1}{\sqrt{\alpha_t}}(x_t-\frac{1-\alpha_t}{\sqrt{1-\overline{\alpha}_t}}\epsilon_{\theta}(x_t,\ t)) \]

    上述公式的推导公式:

    在扩散模型中,前向过程(Forward Process)的每一步是一个加噪的马尔科夫链,其条件分布定义为: \[ q(x_t | x_{t-1}) = \mathcal{N}(x_t; \sqrt{\alpha_t} x_{t-1}, (1 - \alpha_t) I) \] 我们想要计算后向分布 \(q(x_{t-1} | x_{t})\),实际上这个在理论上很难计算的——数据分布未知: 数据的真实分布 \(q(x_0)\) 通常是未知的,而后向分布依赖于这个分布。

    于是乎,对于这个马尔可夫过程,我们引入 \(q(x_{t-1}\ |\ x_{t},\ x_0)\)来代替原始的 \(q(x_{t-1}\ |\ x_t)\),此时 \[ q(x_{t-1}\ |\ x_{t},\ x_0)=\frac{q(x_t,\ x_{t-1}\ |\ x_0)}{q(x_t\ |\ x_0)}=\frac{q(x_t\ | \ x_{t-1},\ x_0)q(x_{t-1}\ |\ x_0)}{q(x_t\ |\ x_0)} \] 在扩散模型中,Forward 过程是马尔可夫过程,意味着 \(x_t\) 的分布只依赖于上一时刻 \(x_{t-1}\),与 \(x_0\) 无关: \[ q(x_t\ |\ x_{t-1},\ x_0) = q(x_t\ |\ x_{t-1}) \] 然后,我们再忽略归一化项,最终,后向分布可以化简为: \[ q(x_{t-1}\ |\ x_t,\ x_0) \varpropto q(x_t\ |\ x_{t-1})q(x_{t-1}\ |\ x_0) \]

    关于归一化项为什么要忽略:

    归一化项 \(q(x_t | x_0)\) 表示边际分布: \[ q(x_t\ |\ x_0) = \int q(x_t\ |\ x_{t-1}) q(x_{t-1}\ |\ x_0) dx_{t-1} \] 这个积分在实际中难以解析计算,但它对于 \(q(x_{t-1}\ |\ x_t, x_0)\)相对值或形式并不重要。

    实际采样中不需要归一化项

    在扩散模型的 Reverse 过程中,我们需要通过采样生成 \(x_{t-1}\)。采样过程中,只需要知道分布的相对权重(如 \(\tilde{P}(x)\) 的形状),而不需要知道它的具体归一化值 \(Z\)。因此,在推导和实现中,可以省略 \(Z\)

    那么好,此时我们也知道了 \(q(x_t\ |\ x_{t-1})=\mathcal{N}(x_t;\ \sqrt{\alpha_t}x_{t-1},\ (1-\alpha_t)I)\) (前方已经给出了)和 \(q(x_{t-1}\ |\ x_0)=\mathcal{N}(x_{t-1};\ \sqrt{\overline{\alpha}_{t-1}}x_0,\ (1-\overline{\alpha}_{t-1})I)\) (根据先前的公式可以计算出),其两者相乘的后向分布 \(q(x_{t-1}\ |\ x_t,\ x_0)\) 依然是高斯分布。其条件均值 \(\mu(x_t,\ x_0)\) 计算步骤如下:

    • 联合分布方差: \[ \Sigma = \left( \Sigma_1^{-1} + \Sigma_2^{-1} \right)^{-1}=(\frac{1}{1-\alpha_t}+\frac{1}{1-\overline{\alpha}_{t-1}})^{-1}I=\frac{(1-\alpha_t)(1-\overline{\alpha}_{t-1})}{(1-\alpha_t)+(1-\overline{\alpha}_{t-1})}I=\frac{(1-\alpha_t)(1-\overline{\alpha}_{t-1})}{1-\overline{\alpha}_t}I \] 其中,累积噪声衰减因子 \(\bar{\alpha}_t\) 的一个性质: \[ 1-\overline{\alpha}_t=1-\alpha_t\overline{\alpha}_{t-1} \overset{\text{乘法展开}}{=} (1-\alpha_t) + (1-\overline{\alpha}_{t-1}) - (1-\alpha_t)(1-\overline{\alpha}_{t-1}) \approx (1-\alpha_t)+(1-\overline{\alpha}_{t-1}) \] 注意:在扩散模型中,\((1 - \bar{\alpha}_{t-1})(1 - \alpha_t)\) 是高阶小量,可以被忽略(噪声强度通常很小)。

    • 联合分布均值: \[ \mu = \Sigma \left( \Sigma_1^{-1}\mu_1 + \Sigma_2^{-1}\mu_2 \right)=\frac{(1-\alpha_t)(1-\overline{\alpha}_{t-1})}{1-\overline{\alpha}_t}{(\frac{\sqrt{\alpha_t}x_t}{1-\alpha_t}+\frac{\sqrt{\overline{\alpha}_{t-1}}x_0}{1-\overline{\alpha}_{t-1}})}=\frac{(1-\overline{\alpha}_{t-1})\sqrt{\alpha_t}}{1-\overline{\alpha}_t}x_t+\frac{(1-\alpha_t)\sqrt{\overline{\alpha}_{t-1}}}{1-\overline{\alpha}_t}x_0 \]

    即: \[ \mu(x_t,x_0)=\frac{(1-\overline{\alpha}_{t-1})\sqrt{\alpha_t}}{1-\overline{\alpha}_t}x_t+\frac{(1-\alpha_t)\sqrt{\overline{\alpha}_{t-1}}}{1-\overline{\alpha}_t}x_0 \]

    高斯分布乘积的性质

    两个高斯分布: \[ p_1(x) = \mathcal{N}(x;\ \mu_1,\ \Sigma_1), \quad p_2(x) = \mathcal{N}(x;\ \mu_2,\ \Sigma_2) \] 相乘的结果是: \[ p(x) \propto \mathcal{N}(x; \mu, \Sigma) \] 其中:

    • 协方差: \(\Sigma = \left( \Sigma_1^{-1} + \Sigma_2^{-1} \right)^{-1}\)
    • 均值: \(\mu = \Sigma \left( \Sigma_1^{-1}\mu_1 + \Sigma_2^{-1}\mu_2 \right)\)

    之后呢,我们使用神经网络预测噪声,由 \(x_0 = \frac{x _t-\sqrt{1-\overline{\alpha}_t}\epsilon}{\sqrt{\overline{\alpha}_t}}\) (上方公式可推导),因为噪声 \(\epsilon\) 是未知的,我们使用神经网络 \(\epsilon_\theta(x_t,\ t)\) 来预测,可近似为: \[ \hat{x}_0 = \frac{x _t-\sqrt{1-\overline{\alpha}_t}\epsilon_\theta(x_t,\ t)}{\sqrt{\overline{\alpha}_t}} \]\(\hat{x}_0\) 带入到 \(\mu(x_t,x_0)\)得: \[ \mu(x_t,\hat{x}_0)=\frac{(1-\overline{\alpha}_{t-1})\sqrt{\alpha_t}}{1-\overline{\alpha}_t}x_t+\frac{(1-\alpha_t)\sqrt{\overline{\alpha}_{t-1}}}{1-\overline{\alpha}_t} \cdot \frac{x _t-\sqrt{1-\overline{\alpha}_t}\epsilon_\theta(x_t,\ t)}{\sqrt{\overline{\alpha}_t}} \] 整理便可得: \[ \mu_\theta(x_t,\ t)=\frac{1}{\sqrt{\alpha_t}}(x_t-\frac{1-\alpha_t}{\sqrt{1-\overline{\alpha}_t}}\epsilon_{\theta}(x_t,\ t)) \]

    • 这样,我们可以通过噪声预测模型间接计算 \(\mu_\theta(x_t,\ t)\) ,然后通过预测的 \(\mu_\theta(x_t,\ t)\) 和后向分布的协方差 \(\Sigma_\theta(x_t,\ t)\),生成 \(x_{t-1}\),然后我们逐步重复这个过程,就可以得到最终样本 \(x_0\)
  3. 训练目标转换为噪声预测

    • 目标是让神经网络预测噪声 \(\hat{\epsilon}_\theta(x_t,\ t)\),并与真实噪声 \(\epsilon\) 之间最小化均方误差(MSE): \[ L = \mathbb{E}_t \left[ \| \epsilon - \hat{\epsilon}_\theta(x_t, t) \|^2 \right] \]

好了,现在我们已经讲解完毕 Diffusion 模型的 Reverse 阶段了,这个阶段比较复杂,但是经过梳理之后,我们也顺利推导出来各项公式了~

接下来我会再写一篇 Diffusion 模型在 NLP 的一篇实战博文,敬请期待~


一文理清 Diffusion Model 扩散模型
https://excelius.xyz/一文理清-diffusion-model-扩散模型/
作者
Excelius
发布于
2024年12月17日
许可协议