跳过正文
  1. Notes/

简单理解扩散模型(Diffusion Model)

· loading · loading · ·
AI CV
目录

简单理解扩散模型(Diffusion Model)

0. 前言
#

现在用 AI 生成图像十分常用,最流行的一种就是 Stable Diffusion,而其中的 Diffusion 就是扩散模型(DM)。在 2020 年《Denoising Diffusion Probabilistic Models(DDPM)》中提出。

扩散模型其实是一种特殊的变分自编码器(VAE),利用热力学的扩散思想,一个分布可以通过不断地添加噪声变成另一个分布。放到图像生成任务里,就是来自训练集的图像可以通过不断添加噪声变成符合标准正态分布的图像。

如果你不清楚什么是 VAE,可以阅读这篇文章:

与 VAE 的编码、解码过程类似的是,DM 也是分为两个过程,一个是正向过程,一个是逆向过程。正向过程是指,通过不断的添加噪声,将训练集的图像变为符合标准正态分布的图像;而逆向过程是,给出一个符合标准正态分布的图像,通过去噪还原回原图像。

与 VAE 不同的是,DM 不再训练一个可学习的编码器,而是把编码过程固定成不断添加噪声的过程;而且 DM 不再把图像压缩成更短的向量,而是自始至终都对一个等大的图像做操作。解码器依然是一个可学习的神经网络,它的目的同样是实现编码的逆操作。

1. 总体结构
#

如图,下方的过程即是 DM 的正向(Forward Process)和逆向(Reverse Process)的过程。

正向过程:也称扩散过程,该过程将数据逐步转为纯噪声。由于每个状态只与前一个状态有关,因此可视为马尔可夫过程,正向过程也可以看作一条马尔可夫链。定义为:

$$ q(x_t|x_{t-1})=\mathcal{N}(x_t;\sqrt{1-\beta_t}x_{t-1},\beta_tI) $$

其中,\(\beta_t\) 是预定义的噪声比。

逆向过程:也称去噪过程,该过程将噪声逐步转为原数据。逆过程的目的是用神经网络 \(p\) 拟合 \(q\) 分布:

$$ p_{\theta}\left( x_{t-1}|x_t \right) =\mathcal{N}\left( x_{t-1};\mu _{\theta}\left( x_t,t \right) ,\Sigma _{\theta}\left( x_t,t \right) \right) $$

其中,\(\mu_\theta\) 和 \(\Sigma_\theta\) 为 \(p\) 的均值和协方差。

2. 正向过程
#

设来自训练集的原始图像为 \(\mathbf{x}_0\) ,经过加了 \(T\) 次噪声后, \(\mathbf{x}_T\) 符合标准正态分布。这里的加噪不是直接在上一时刻的图像上添加噪声,而是从一个均值与上一时刻图像相关的正态分布中采样一个新图像:

$$ \mathbf{x}_ t\sim\mathcal{N}(\mu_t(\mathbf{x}_{t-1}),\sigma^2_tI) $$

可以看到,\(t\) 时刻的状态只与 \(t-1\) 时刻有关,因此属于马尔可夫过程。

通过正态分布的性质以及公式推导(详情请看参考文献1),设定一系列常数 \(\beta_t\) ,可以将上式简化为:

$$ \mathbf{x}_ t\sim\mathcal{N}(\sqrt{1-\beta_t}\mathbf{x}_ {t-1},\beta_tI) $$

然而这个公式只能求 \(\mathbf{x}_ {t-1}\) 到 \(\mathbf{x}_ t\) ,如果想求 \(\mathbf{x}_{0}\) 到 \(\mathbf{x}_t\) ,需要引入 \(\alpha_t\) 。

设 \(\alpha_t=1-\beta_t\) ,\(\bar\alpha_t=\prod_ {i=1}^t\alpha_i\) ,则:

$$ \mathbf{x}_t=\sqrt{\bar{\alpha}_t}\mathbf{x}_0+\sqrt{1-\bar{\alpha}_t}\epsilon $$

$$ \frac{\mathbf{x}_t-\sqrt{\bar{\alpha}_t}\mathbf{x}_0}{\sqrt{1-\bar{\alpha}_t}}\sim \mathcal{N}(0,I) $$

$$ q(x_t|x_{0})=\mathcal{N}(x_t;\sqrt{\bar{\alpha}_t}\mathbf{x}_0,(1-\bar{\alpha}_t)I) $$

3. 逆向过程
#

当 \(\beta_t\) 足够小时,每一步加噪的逆过程也满足正态分布:

$$ \mathbf{x}_{t-1}\sim \mathcal{N}(\tilde{\mu}_t,\tilde{\beta}_tI) $$

然而,我们无法求出 \(\tilde{\mu}_t\) 和 \(\tilde{\beta}_t\),因此通过神经网络学习这两个参数来拟合该分布。同时,我们也无法直接计算所有数据的逆分布,但若给定 \(\mathbf{x}_0\),就可以用贝叶斯公式计算该分布:

$$ q(\mathbf{x}_ {t-1}|\mathbf{x}_ t,\mathbf{x}_ 0)=q(\mathbf{x}_ t|\mathbf{x}_ {t-1},\mathbf{x}_ 0) \frac{q(\mathbf{x}_ {t-1}|\mathbf{x}_ {0})}{q(\mathbf{x}_ {t}|\mathbf{x}_ {0})} $$

其中,\(q(\mathbf{x}_ {t-1}|\mathbf{x}_ t,\mathbf{x}_ 0)\) 是待求的分布,而 \(q(\mathbf{x}_ {t}|\mathbf{x}_ {t-1},\mathbf{x}_ 0)\) 是正向过程的加噪操作,右侧分式的分子和分母也都可以通过正向过程求得,最终化简得到两个参数:

$$ \tilde{\mu}_t=\frac{1}{\sqrt{\alpha_t}}(\mathbf{x}_t-\frac{1-\alpha_t}{\sqrt{1-\bar{\alpha}_t}}\epsilon_t) $$

$$ \epsilon_t=\frac{\mathbf{x}_t-\sqrt{\bar{\alpha}_t}\mathbf{x}_0}{\sqrt{1-\bar{\alpha}_t}} $$

$$ \tilde{\beta_t}=\frac{1-\bar{\alpha}_{t-1}}{1-\bar{\alpha}_t}\beta_t $$

可以看到,\(\tilde{\beta_t}\) 是一个常量,因此神经网络在训练时仅需拟合 \(\tilde{\mu}_ t\) 即可。拟合时,\(\mathbf{x}_ t\) 是已知的,因此只预测噪声 \(\epsilon_ \theta(\mathbf{x}_ t,t)\) 即可,最终误差函数为:

$$ L=||\epsilon_t-\epsilon_\theta(\mathbf{x}_t,t)||^2 $$

4. 训练算法与采样算法
#

在实际训练中,论文采用训练算法和采样算法来训练 U-net 网络(其实可以是任意的神经网络),如图所示:

训练算法中,先取一个 \(\mathbf{x}_ 0\) ,在随机取一个时刻 \(t\) 训练,随机生成一个噪声 \(\epsilon\) ,用于生成 \(\mathbf{x}_ t\)。之后,将 \(\mathbf{x}_ t\) 和 \(t\) 传给神经网络,预测一个随机噪声 \(\epsilon_ \theta(\mathbf{x}_ t,t)\) ,通过设定的误差函数即可训练网络。

而采样算法中,即可输入 \(\mathbf{x}_ T\) ,逐步计算 \(\mathbf{x}_ {t-1}\) ,最终得到 \(\mathbf{x}_ 0\) 即为生成的图像。

5. 参考文献
#

1.扩散模型(Diffusion Model)详解:直观理解、数学原理、PyTorch 实现 - 周弈帆

2.详解Diffusion扩散模型:理论、架构与实现 - techlead_krischang - 博客园