整体架构

DDPM可分为以下两个部分

image-20231106150512666

其中Denoise内部:输入图片+step,预测其噪声

  • 为什么step也是一个重要的输入:从噪声到原图,所要预测的噪声强度是不同的
image-20231028211558935

训练和推理部分如下所示

image-20231106150218795

训练过程

训练过程如下所示,Unet里有一个位置编码,是关于时间步的,每个时间步是有一个线性调度器的,每个时间添加的噪声的方差是不一样的,所以将时间步作为编码嵌入的话,可以将模型预测的噪声更加的准确

img

其中,损失函数如下:

$$ \text { Loss }=\left\|\varepsilon-\varepsilon_{\theta}\left(x_t, t\right)\right\|^2=\left\|\varepsilon-\varepsilon_{\theta}\left(\sqrt{\bar{\alpha}_t}x_0+\sqrt{1-\bar{\alpha}_t}\varepsilon_t, t\right)\right\|^2 $$

image-20231028213812364

t为step,t越大,$a_T$越小,加的噪声越多

  • 先进行forward process,生成每个step对应的图片和噪声数据集,即target noise
  • 实际训练时,t是随机取值,不用按顺序从大到小
  • 目标是noise predictor预测的噪声值接近真实噪声
    • noisy image 如下: image-20231106162229197

数学推导

  • $\alpha_t=1-\beta_t, \beta_t$要越大越好,论文中从0.0001到0.02;
    • 方差参数$\beta_t$可以固定为一个常数,也可以选择作为时间段的一个时间表。可以定义一个方差表,它可以是线性的、二次的、余弦的等等
    • 最初的DDPM作者利用了一个从到增加的线性时间表,$\beta_t$从$10^{-4}$到$0.02$线性增加
  • $\bar{\alpha}=\prod_{s=1}^t \alpha_s$,为累乘
  • $x_t=\sqrt{\alpha_t} x_{t-1}+\sqrt{1-\alpha_t} \varepsilon_t, \varepsilon_t \sim N(0,1)$,每一时刻的噪声均独立

推导过程如下,从第一步到第二步用到了重参数技巧

$\begin{aligned} q\left(x_t \mid x_{t-1}\right) & =N\left(x_t ; \sqrt{\alpha_t} x_{t-1},\left(1-\alpha_t\right) I\right) \\\ & =\underbrace{\sqrt{\alpha_t} x_{t-1}}_{x_{t-2} \text { 来表示 } x_{t-1}}+\sqrt{1-\alpha_t} \varepsilon_t \\\ & =\sqrt{\alpha_t}\left(\sqrt{\alpha_{t-1}} x_{t-2}+\sqrt{1-\alpha_{t-1}} \varepsilon_{t-1}\right)+\sqrt{1-\alpha_t} \varepsilon_t \\\ & =\sqrt{\alpha_t \alpha_{t-1}} x_{t-2}+\underbrace{\sqrt{\alpha_t-\alpha_t \alpha_{t-1}} \varepsilon_{t-1}+\sqrt{1-\alpha_t} \varepsilon_t}_{\text {两个独立正态分布相加 }} \\\ & =\sqrt{\alpha_t \alpha_{t-1}} x_{t-2}+\sqrt{1-\alpha_t \alpha_{t-1}} \varepsilon \\\ & \ldots \\\ & =\sqrt{\bar{\alpha}_t} x_0+\sqrt{1-\bar{\alpha}_t} \varepsilon \\\ & \therefore q\left(x_t \mid x_0\right)=N\left(x_t ; \sqrt{\bar{\alpha}_t} x_0, \sqrt{1-\bar{\alpha}_t} I\right) \end{aligned}$

推理过程(采样)

采样过程中,根据给定的噪声和condition(step, text…),输出对应的采样图

image-20231107094442143 image-20231028215441186
  • 根据噪声$x_t$预测$x_{t-1}$
  • 加上采样的噪声$z$,如果是最后一次采样($t==1$),就不添加噪声

数学推导

首先我们来看常见生成模型的目标函数,其中$z$为图像的隐空间表示,Network一般为一个Decoder

image-20231106163444153

给定网络参数$\theta$,我们要让输出$x$的分布$P_{\theta}(x)$尽可能接近$P_{data}(x)$: $$ \text { Sample }\left\{x^1, x^2, \ldots, x^m\right\} \text { from } P_{\text {data }}(x)\\\ \theta^{*}=\arg \max _{\theta} \prod_{i=1}^m P_{\theta}\left(x^i\right)=\arg \max _{\theta} \log \prod_{i=1}^m P_{\theta}\left(x^i\right) \\=\arg \max _{\theta} \sum_{i=1}^m \log P_{\theta}\left(x^i\right)$$ 我们从输入随机采样得到图片$x^i$,目标是$P_{\theta}(x^i)$有最大值,即最大似然估计


*补充知识点:

期望是对随机变量的数值进行加权平均的概念。当随机变量是连续型变量时,期望可以通过积分来计算。设$X$是一个连续型随机变量,其概率密度函数为$f(x)$。对于一个函数$g(X)$,它关于X的期望可以表示为 $$ E[g(X)] = ∫g(x) f(x) dx $$

**重参数化:**使计算过程可导 $$z \sim N\left(z, \mu, \sigma^2 I\right) \longrightarrow z=\mu+\sigma \cdot \epsilon, \epsilon \sim N(0, I)$$


求$P_{\theta}(x)$的下界,使其最大:

image-20231106204700016

同样的,推导可得,DDPM的下界:

image-20231106204817216

以下公式参考[2],详细过程见原文,这边只写简化后的结果 $$-\log \left(p_{\theta}\left(x_0\right)\right) \leq \underbrace{\log \left(\frac{q\left(x_{1: T} \mid x_0\right)}{p_{\theta}\left(x_{0: T}\right)}\right)}_{\text {变分下界, 可以优化它 }} \\ \log \left(\frac{q\left(x_{1: T} \mid x_0\right)}{p_{\theta}\left(x_{0: T}\right)}\right) =\underbrace{{D_{K L}\left(q\left(x_t \mid x_0\right) \| p\left(x_T\right)\right)}}_{q \text { 只是个正向过程没有可学习参数 }}+\sum_{t=2}^T D_{K L}\left(q\left(x_{t-1} \mid x_t, x_0\right) \| p_{\theta}\left(x_{t-1} \mid x_t\right)\right)-\log \left(p_{\theta}\left(x_0 \mid x_1\right)\right)$$

  • 第一项KL散度可以忽略,因为q只是个正向过程,没有可学习参数,换句话说就是它是固定的。

  • 第二项KL散度,左边和右边都是正态分布,左边的$q\left(x_{t-1} \mid x_t, x_0\right)$是真实值,我们想求的;右边的${p_{\theta}\left(x_{t-1} \mid x_t\right)}$是神经网络估计的

    $$\sum_{t=2}^T D_{K L}(\underbrace{q\left(x_{t-1} \mid x_t, x_0\right)}_{N\left(x_{t-1} ; \tilde{\mu_t}\left(x_t, x_0\right), \tilde{\beta_t} I\right)} \| \overbrace{p_{\theta}\left(x_{t-1} \mid x_t\right)}^{N\left(x_{t-1} ; \mu_{\theta}\left(x_t, t\right), \beta I\right.})$$

    • 首先,通过变化,可以获得$\tilde{\mu_t}$的值,这里的$\varepsilon$为真实噪声值 $$\\ \begin{aligned} \underbrace{\tilde{\mu_t}\left(x_t, x_0\right)}_{\text {不再依赖 } x_0} & & =\frac1{\sqrt{\alpha_t}}\left(x_t-\frac{\beta_t}{\sqrt{1-\bar{\alpha}_t}} \varepsilon\right) \end{aligned}$$

    • 我们需要减小KL散度,由于方差是固定的,我们无法优化,所以需要将它们的均值之差减小,原论文中使用的是简单的均方误差: $$\begin{aligned} L_t & =\frac1{2 \sigma_t^2}\left\|\tilde{\mu}_t\left(x_t, x_0\right)-\mu_{\theta}\left(x_t, t\right)\right\|^2 \\ & =\frac1{2 \sigma_t^2}\left\|\frac1{\sqrt{\alpha_t}}\left(x_t-\frac{\beta_t}{\sqrt{1-\bar{\alpha}_t}} \varepsilon\right)-\frac1{\sqrt{\alpha_t}}\left(x_t-\frac{\beta_t}{\sqrt{1-\bar{\alpha}_t}} \varepsilon_{\theta}\left(x_t, t\right)\right)\right\|^2 \\ & =\frac{\beta_t^2}{2 \sigma_t^2 \alpha_t\left(1-\bar{\alpha}_t\right)} \underbrace{\left\|\varepsilon-\varepsilon_{\theta}\left(x_t, t\right)\right\|^2}_{m s e} \\ & ->\left\|\varepsilon-\varepsilon_{\theta}\left(x_t, t\right)\right\|^2=\left\|\varepsilon-\varepsilon_{\theta}\left(\sqrt{\bar{\alpha}_t} x_0+\sqrt{1-\bar{\alpha}_t} \varepsilon_t, t\right)\right\|^2 \end{aligned}$$

最终,DDPM的过程可概括为如下: $$ x_{t-1}=N\left(x_{t-1} ; \frac1{\sqrt{\alpha_t}}\left(x_t-\frac{\beta_t}{\sqrt{1-\bar{\alpha}_t}} \varepsilon_{\theta}\left(x_t, t\right)\right), \Sigma_{\theta}\left(x_t, t\right)\right) $$

  • 每个时间步通过$x_t$和$t$来预测高斯噪声$\varepsilon_{\theta}$,根据上面公式计算得到均值$\mu$
  • 得到方差$\Sigma_{\theta}\left(x_t, t\right)$;
  • 代入公式得到$q\left(x_{t-1} \mid x_t, x_0\right)$,利用重参数化得到$x_{t-1}$
    • 因为我们计算了$D_{K L}\left(q\left(x_{t-1} \mid x_t, x_0\right) \| p_{\theta}\left(x_{t-1} \mid x_t\right)\right)$,故可以利用$q\left(x_{t-1} \mid x_t\right)$来近似$p\left(x_{t-1} \mid x_t\right)$

参考资料:

ML 2023 Spring (ntu.edu.tw)

保姆级讲解 Diffusion 扩散模型(DDPM)