Diffusion 扩散模型(DDPM)

警告
本文最后更新于 2023-08-08,文中内容可能已过时。

/posts/ddpm/images/DDPM_0.png

近年 AIGC 的爆火离不开人工智能在图像生成、文本生成以及多模态等领域的不断累积,其中生成模型的发展占据了很大功劳,如:生成对抗网络 GAN 及其一系列变体、变分自编码器 VAE 及其一系列变体、自回归模型 AR流模型 flow ,以及近年大火的扩散模型 Diffusion Model 等。

扩散模型的大火并非横空出世,早在 2015 年就有人提出了类似的想法,直到 2020 年才提出了经典的 Denoising Diffusion Probabilistic Models(DDPM),像 OpenAI、NovelAI、NVIDIA 和 Google 成功的训练了大规模模型之后,它们吸引了很多人注意,后续有了很多基于扩散模型的变体,比如有:GLIDE、DALLE-2、Imagen 和年底爆火的完全开源的稳定扩散模型(Stable Diffusion)。

扩散模型与之前所有的生成方法有着本质的区别:

/posts/ddpm/images/DDPM_1.png

直观的说它是将图像生成过程(采样)分解为许多小的去噪步骤,其实 Diffusion 的含义本质上就是一个迭代过程,实线箭头用于扩散步骤中添加随机噪声,虚线箭头代表的是通过学习逆向扩散过程从噪声中重构所需的数据样本引入噪声导致了信息的衰减,再通过噪声尝试还原原始数据,多次迭代最小化损失后,能够使模型在给定噪声输入的情况下学习生成新图像。

所以 Diffusion 模型和其它生成模型的区别是,它不是直接的图像 -> 潜变量、潜变量 -> 图像的一步到位,它是一步一步的逐渐分解、逐渐去噪的过程。

当然有关 Diffusion 的理解和变体有很多,但是扩散模型从本质上讲就是 DDPM,所以本文主要对 DDPM 的原理进行讲解,并给出 DDPM 的扩散过程、去噪过程、训练损失的详细推导,对于掌握 Diffusion 算法原理只需要抓住以下四点即可:

  • 前向过程(扩散);
  • 反向过程(去噪、采样);
  • 如何训练;
  • 如何推断。

扩散模型包括 前向扩散过程反向去噪过程 (采样),前向阶段对图像逐步施加噪声,直至图像被破坏变成完全的高斯噪声,然后在反向阶段学习从高斯噪声还原为原始图像的过程。

  • 扩散模型的目的是什么?
    • 学习从纯噪声生成图片的方法。
  • 扩散模型是怎么做的?
    • 训练一个 UNet,接受一系列加了噪声的图片,学习预测所加的噪声。
  • 前向过程在干什么?
    • 逐步向真实图片添加噪声最终得到一个纯噪声;
    • 对于训练集中的每张图片,都能生成一系列的噪声程度不同的加噪图片;
    • 在训练时,这些 【不同程度的噪声图片 + 生成它们所用的噪声】 是实际的训练样本。
  • 反向过程在干什么?
    • 训练好模型后,采样、生成图片。

/posts/ddpm/images/DDPM_2.png

前向过程在原始输入图像 x0x_0上逐步添加随机噪声,这个噪声服从高斯分布 N(0,1)N(0, 1),每一步得到的图像 xtx_t只和上一步的加噪结果 xt1x_{t-1}相关,逐步添加噪声至 TT 步,可以得到趋向于纯粹噪声的图像,如下图所示: /posts/ddpm/images/DDPM_3.png

后面有详细的推导,公式比较多,这里先提前把主要的列一下方便阐述。

对于将一张图片,从 xt1xtx_{t-1}\rightarrow x_{t}的逐步加噪破坏的公式为:

xt=αtxt1+1αtεt(1)x_t=\sqrt{\alpha_t}\left.x_{t-1}+\sqrt{1-\alpha_t}\right.\varepsilon_t\quad\quad\quad\quad\quad\quad(1)

其中:

  • xtx_t表示第 tt 步的图像;
  • ε\varepsilon 是一个满足正态分布的随机噪声,εN(0,1)\varepsilon \sim N(0, 1)
  • αt\sqrt{\alpha_{t}} 是图片的权重,1αt\sqrt{1 - \alpha_{t}} 是噪声的权重;

定义:

  • αt=1βt\alpha_t=1-\beta_t
  • α=s=1tαs\overline{\alpha}=\prod_{s=1}^t\alpha_s

随着 tt 的增加,噪声的占比会越来越大,所以添加的噪声强度也会越来越大,也就是说图片的权重要越来越小,噪声的权重要越来越大。因为随着扩散过程的增加,图像中噪声的占比也会越来越大,我们想要进一步破坏它的结构,就需要添加更多的噪声。

换句话说,一开始图像比较清晰,这个时候添加的噪声小一些,随着图像的噪声越来越多,这个时候再加一点噪声的话,对原来的图像就没什么影响了,因为它本身就有好多噪声了,所以随着图像的噪声越来越多,后面的步骤就要加更多的噪声。

实际训练过程中会比较大(DDPM 原文中为 1000),所以会有从 x0x_0递推到 xtx_t的公式:

xt=αtx0+1αtε(2)x_t=\sqrt{\overline{\alpha}_t}\left.x_0+\sqrt{1-\overline{\alpha}_t}\right.\varepsilon\quad\quad\quad\quad(2)

其中:

  • αt\alpha_tβt\beta_t 有一个固定的已知函数,是可以直接进行计算的;
  • ε\varepsilon 为随机产生的噪声;

所以整个式子是已知的,式 (1)(1)(2)(2) 就可以描述前向过程了,(1)(1) 用于将一张图片的逐步破坏,(2)(2) 用于一步到位的破坏。

反向过程则是不断去除噪声的过程,给定一个噪声图片 xTx_T,对它一步步的去噪还原,直至最终将原始图像 x0x_0 给恢复出来,如下图所示:

去噪的过程,xtx_tαt\alpha_tβt\beta_t 都是已知的,只有公式 (2)(2) 中的真实噪声是未知的,因为它是随机采样的。所以需要一个神经网络把 ε\varepsilon 给学出来,也就是说训练一个由 xtx_ttt 估测噪声的模型:

$$x_{t-1}=\frac{1}{\sqrt{\alpha_t}}(x_t-\frac{\beta_t}{\sqrt{1-\overline{\alpha}t}}\varepsilon\theta(x_t,t))$$

其中 θ\theta 就是模型的参数,通常使用 UNet 作为预估噪声的模型。

所以说反向过程其实就是训练网络去学习分解过程每一步的噪声,当网络训练好之后,输入一张噪声图片,通过网络就能把加的噪声给求出来,噪声有了代入公式,就能把 xt1x_{t-1} 步的比较清晰的图给求出来了,一步步往前迭代就行了。

采用 L2 距离刻画相近程度就可以,DDPM 的关键是训练 εθ(xt,t)\varepsilon_{\theta}(x_t, t),目的就是使预测的噪声与真实用于破坏的噪声相近:

$$Loss=\mid\mid\varepsilon-\varepsilon_\theta(x_t,t)\mid\mid^2=\mid\mid\varepsilon-\varepsilon_\theta(\sqrt{\overline{\alpha}_t}x_0+\sqrt{1-\overline{\alpha}_t}\varepsilon_t,t)\mid\mid^2$$

模型训练完后,只要给定随机高斯噪声,就可以生成一张从未见过的图像。

UNet 本文不做介绍,结构图为:

额外强调的是:Unet 里有一个位置编码,是关于时间步的,每个时间步是有一个线性调度器的,每个时间添加的噪声的方差是不一样的,所以将时间步作为编码嵌入的话,可以将模型预测的噪声更加的准确。

再次总结,扩散模型两个步骤如下:

  • 一个固定的(预先定义好的)前向扩散过程 q(xtxt1)q(x_t | x_{t-1}):逐步向图片增加噪声直到最终得到一张纯粹的噪声图;
  • 一个学习得到的去噪过程 pθ(xt1xt)p_{\theta}(x_{t-1} | x_t):训练一个神经网络去逐渐的从一张纯噪声中消除噪声,直到得到一张真正的图片。

算法 1 为训练流程:

  • line2:从数据中采样 x0x_0q(x0)q(x_0) 的意思是给 x0x_0 加上噪声;
  • line3:随机选取 time step tt
    • 真实训练过程中我们不可能一步步的从 ttTT,因为会很大,这就意味着每输入一张图片 xx,就会产生张噪声图像,也就是一张图像的网络要训练 TT 个噪声样本,非常耗时。
    • 所以对 TT 进行了采样,tt 就是从 TT 里采集若干个的意思。
    • 举个例子:假设采集 tt 的分别为 100、20、3,对应的 xxx100x_{100}x20x_{20}x3x_{3},对应噪声为 ε100\varepsilon_{100}ε20\varepsilon_{20}ε3\varepsilon_{3},对于的预测噪声为 $\hat{\varepsilon}{100}\hat{\varepsilon}{20}\hat{\varepsilon}_{3}, 只需要将 , 只需要将 \varepsilon \hat{\varepsilon}$ 代入 MSE 公式即可(相减、平方、最小化)。
  • line 4:生成随机高斯噪声;
  • line 5:调用模型估计 $\varepsilon_{\theta}(\sqrt{\overline{\alpha}_t}x_0+\sqrt{1-\overline{\alpha}_t}\varepsilon_t,t)$ ,计算真实噪声与估计噪声之间的 MSE Loss,反向传播更新模型。
    • 网络的作用是预测噪声,随着的增加,噪声强度会越来越大,因此预测的噪声是和迭代是直接相关的,所以要把作为参数送入到网络当中。
  • 直到收敛。

算法 2 为采样流程:

  • line 1:从高斯分布采样 xTx_T
  • line 2:按照 T,,1T, …, 1 的顺序进行迭代;
  • line 3:如果 t=1t = 1z=0z = 0;如果 t>1t > 1 ,从高斯分布中采样;
  • line 4:利用公式求出均值和方差,进而求得 xt1x_{t-1}
  • 经过上述迭代,恢复 x0x_0

我们来推导如何从原始图像直接到第 t 时刻的图像 (X0Xt)(X_0 - X_t)

首先回顾 2.1 小节 的两个定义:

  • αt=1βt\alpha_t = 1 - \beta_{t}, βt\beta_t 要越大越好,论文中从 0.0001 到 0.02;
  • α=s=1tαs\overline{\alpha}=\prod_{s=1}^t\alpha_s累乘,下面会用到;
  • xt=αtxt1+1αtεt,εtN(0,1)x_t=\sqrt{\alpha_t}x_{t-1}+\sqrt{1-\alpha_t}\varepsilon_t\text{,}\varepsilon_t\sim N(0,1) 每一时刻添加的噪声均独立;

我们要求 xtx_t时刻的图像,它需要一步步的加噪迭代,这样太慢了。因为每一步添加的噪声独立且服从正太分布,我们可以做如下推导:

为了不混淆,只需要记住:下标越小,噪声越小,即 xt1x_{t-1} 的噪声是小于 xtx_t 的。

$$ \begin{aligned} q(x_{t}\mid x_{t-1})& =N(x_t;\sqrt{\alpha_t}x_{t-1},(1-\alpha_t)I) \cr &=\underbrace{\sqrt{\alpha_t}x_{t-1}}{x{t-2}\text {来表示} x_{t-1}}+\sqrt {1-\alpha_t}\varepsilon_t \cr &=\sqrt {\alpha_t}\left (\sqrt {\alpha_{t-1}}\right.x_{t-2}+\sqrt {1-\alpha_{t-1}}\left.\varepsilon_{t-1}\right)+\sqrt {1-\alpha_t}\left.\varepsilon_t\right. \cr &=\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 {两个独立正太分布相加}} \cr &=\sqrt {\alpha_t\alpha{t-1}}\left.x_{t-2}+\sqrt{1-\alpha_t\alpha_{t-1}}\right.\varepsilon \cr &\text{…} \ &=\sqrt{\overline{\alpha}_t}\left.x_0+\sqrt{1-\overline{\alpha}_t}\right.\varepsilon \cr &\therefore q(x_t\mid x_0)=N(x_t;\sqrt{\overline{\alpha}_t}x_0,\sqrt{1-\overline{\alpha}_t}I) \end{aligned} $$

上述用的就是重参数化技巧。

方差参数 βt\beta_{t} 可以固定为一个常数,也可以选择作为 TT 时间段的一个时间表。事实上,人们可以定义一个方差表,它可以是线性的、二次的、余弦的等等。最初的 DDPM 作者利用了一个从 β1=104\beta_1 = 10^{-4} βT=0.02\beta_T = 0.02 增加的线性时间表。Nichol 等人 2021 年的研究表明,采用余弦时间表效果更好。

接下来是反向过程的推导: $$p(x_{t-1}\mid x_t)=N(x_{t-1};\underbrace{\mu_\theta(x_t,t)}\text {要反预测这个},\overbrace {\Sigma\theta(x_t,t)}^{fixed})$$

给定 xtx_t要预测 xt1x_{t-1},它是一个高斯分布,xtx_t tt 的方差是固定的,论文作者使用原始的噪声调度器作为方差,也就是说噪声调度器一旦确立,方差的大小也就固定了。所以我们只需要预测这个均值就好了,下面给出具体的推导过程:

我们先看整个损失函数,是个负对数似然

logpθ(x0)-\log{p_{\theta}(x_0)}

希望神经网络的参数 θ\theta,可以使得生成 x0x_0的概率越大越好。

但问题在于 x0x_0 的概率不好计算,因为它依赖于 x0x_0 之前的所有步长,从 xTx_T 开始。作为一种解决方案,我们可以计算这个目标的变分下界,并得到一个更易于计算的公式:

log(pθ(x0))log(pθ(x0))+DKL(q(x1:Tx0)pθ(x1:Tx0))-log(p_\theta(x_0))\leq-log(p_\theta(x_0))+D_{KL}(q(x_{1:T}\mid x_0)\parallel p_\theta(x_{1:T}\mid x_0))

其中:

  • x1:Tx_{1:T} 指的是 x1,,xTx_1, …, x_T 整个序列。

现在依然无法计算,我们继续推导:

log(pθ(x0))log(pθ(x0))+DKL(q(x1:Tx0)pθ(x1:Tx0))log(pθ(x0))+log(q(x1:Tx0)pθ(x1:Tx0)) \begin{gathered} -log(p_\theta(x_0)) \leq-log(p_\theta(x_0))+D_{KL}(q(x_{1:T}\mid x_0)\mid\mid p_\theta(x_{1:T}\mid x_0)) \cr \leq-log(p_\theta(x_0))+log(\frac{q(x_{1:T}\mid x_0)}{p_\theta(x_{1:T}\mid x_0)}) \end{gathered}

我们将 KL divergence 改写后,再利用贝叶斯公式进行变形,即分母可以改写为:

pθ(x1:Tx0)=pθ(x0x1:T) pθ(x1:T)pθ(x0)=pθ(x0,x1:T)pθ(x0)=pθ(x0:T)pθ(x0) \begin{aligned} p_\theta(x_{1:T}\mid x_0) &=\frac{p_\theta(x_0\mid x_{1:T})\mathrm{~}p_\theta(x_{1:T})}{p_\theta(x_0)} \cr &=\frac{p_\theta(x_0,x_{1:T})}{p_\theta(x_0)} \cr &=\frac{p_\theta(x_{0:T})}{p_\theta(x_0)} \end{aligned}

将其代回原式:

log(q(x1:Tx0)pθ(x1:Tx0))=log(q(x1:Tx0)pθ(x0:T)pθ(x0))=log(q(x1:Tx0)pθ(x0:T))+log(pθ(x0)) \begin{aligned} log(\frac{q(x_{1:T}\mid x_0)}{p_\theta(x_{1:T}\mid x_0)})& =log(\frac{q(x_{1:T}\mid x_0)}{\frac{p_\theta(x_{0:T})}{p_\theta(x_0)}}) \cr &=log(\frac{q(x_{1:T}\mid x_0)}{p_\theta(x_{0:T})})+log(p_\theta(x_0)) \end{aligned}

所以原式可简化为:

log(pθ(x0))log(q(x1:Tx0)pθ(x0:T))变分下界 , 可以优化它 -log (p_\theta (x_0))\leq\underbrace {log (\frac {q (x_{1:T}\mid x_0)}{p_\theta (x_{0:T})})}_{\text {变分下界,可以优化它}}

  • 分子,就是前向过程,它是固定的,从 x0x_0x1:Tx_{1:T} 的采样,换句话说就是从我们数据中的一些图像开始;

  • 分母,pθ(x0:T)=p(xT)t=1Tpθ(xt1xt)p_\theta(x_{0:T})=p(x_T)\prod_{t=1}^Tp_\theta(x_{t-1}\mid x_t)

    • p(xT)p(x_T) 提出来,是因为 p(xT)p(x_T) 是指当前图像,它是不依赖于网络参数 θ\theta 的.

    log(q(x1:Tx0)pθ(x0:T))=log(t=1Tq(xtxt1)p(xT)t=1Tpθ(xt1xt))=log(p(xT))+log(t=1Tq(xtxt1)t=1Tpθ(xt1xt))=log(p(xT))+t=1Tlog(q(xtxt1)pθ(xt1xt))=log(p(xT))+t=2Tlog(q(xtxt1)pθ(xt1xt))+log(q(x1x0)pθ(x0x1))t=1 \begin{aligned} log(\frac{q(x_{1:T}\mid x_0)}{p_{\theta}(x_{0:T})})& =log(\frac{\prod_{t=1}^Tq(x_t\mid x_{t-1})}{p(x_T)\prod_{t=1}^Tp_\theta(x_{t-1}\mid x_t)}) \cr &=-log(p(x_T))+log(\frac{\prod_{t=1}^Tq(x_t\mid x_{t-1})}{\prod_{t=1}^Tp_\theta(x_{t-1}\mid x_t)}) \cr &=-log(p(x_T))+\sum_{t=1}^Tlog(\frac{q(x_t\mid x_{t-1})}{p_\theta(x_{t-1}\mid x_t)}) \cr &=-log(p(x_T))+\sum_{t=2}^Tlog(\frac{q(x_t\mid x_{t-1})}{p_\theta(x_{t-1}\mid x_t)})+\underbrace{log(\frac{q(x_1\mid x_0)}{p_\theta(x_0\mid x_1)})}_{t=1} \end{aligned}

q(xtxt1)q(x_t|x_{t-1}) 根据贝叶斯公式可以变换如下:

q(xtxt1)=q(xt1xt)q(xt)q(xt1)q(x_t\mid x_{t-1})=\frac{q(x_{t-1}\mid x_t)q(x_t)}{q(x_{t-1})}

q(xt1xt)q(x_{t-1}|x_{t}) 具有比较高的方差,因为根据这张照片,我们无法确定它来自哪里,但是引入 x0x_0,我们就可以容易的预测出 xt1x_{t-1}

因此我们使用:

q(xt1xt,x0) q(xtx0)q(xt1x0)\frac{q(x_{t-1}\mid x_t,x_0)\mathrm{~}q(x_t\mid x_0)}{q(x_{t-1}\mid x_0)}

替换贝叶斯重写后的式子,我们得到:

log(q(x1:Tx0)pθ(x0:T))=log(p(xT))+t=2Tlog(q(xt1xt,x0)q(xtx0)pθ(xt1xt)q(xt1x0))+log(q(x1x0)pθ(x0x1))=log(p(xT))+t=2Tlog(q(xt1xt,x0)pθ(xt1xt))+t=2Tlog(q(xtx0)q(xt1x0))+log(q(x1x0)pθ(x0x1)) \begin{aligned} log(\frac{q(x_{1:T}\mid x_0)}{p_{\theta}(x_{0:T})})& =-log(p(x_T))+\sum_{t=2}^Tlog(\frac{q(x_{t-1}\mid x_t,x_0)q(x_t\mid x_0)}{p_\theta(x_{t-1}\mid x_t)q(x_{t-1}\mid x_0)})+log(\frac{q(x_1\mid x_0)}{p_\theta(x_0\mid x_1)}) \cr &=-log(p(x_T))+\sum_{t=2}^Tlog(\frac{q(x_{t-1}\mid x_t,x_0)}{p_\theta(x_{t-1}\mid x_t)})+\underbrace{\sum_{t=2}^Tlog(\frac{q(x_t\mid x_0)}{q(x_{t-1}\mid x_0)})}+log(\frac{q(x_1\mid x_0)}{p_\theta(x_0\mid x_1)}) \end{aligned}

上述标记的式子,也可以简化,我们假设 t=4t=4

t=2T=4log(q(xtx0)q(xt1x0))=log(q(x2x0)q(x1x0)q(x3x0)q(x2x0)q(x4x0)q(x3x0)) =log(q(x4x0)q(x1x0)) \begin{gathered} \begin{aligned}\sum_{t=2}^{T=4}log(\frac{q(x_t\mid x_0)}{q(x_{t-1}\mid x_0)})\end{aligned} =log(\frac{q(x_2\mid x_0)}{q(x_1\mid x_0)}\cdot\frac{q(x_3\mid x_0)}{q(x_2\mid x_0)}\cdot\frac{q(x_4\mid x_0)}{q(x_3\mid x_0)}) \ =log(\frac{q(x_4\mid x_0)}{q(x_1\mid x_0)}) \end{gathered}

因此我们可以简化为:

$$ \begin{aligned} &=-log(p(x_T))+\sum_{t=2}^Tlog(\frac{q(x_{t-1}\mid x_t,x_0)}{p_\theta(x_{t-1}\mid x_t)})+log(\frac{q(x_t\mid x_0)}{q(x_1\mid x_0)})+log(\frac{q(x_1\mid x_0)}{p_\theta(x_0\mid x_1)}) \cr &=-log(p(x_T))+\sum_{t=2}^Tlog(\frac{q(x_{t-1}\mid x_t,x_0)}{p_\theta(x_{t-1}\mid x_t)})+log(q(x_t\mid x_0))-log(p_\theta(x_0\mid x_1)) \cr &=log(\frac{q(x_t\mid x_0)}{p(x_T)})+\sum_{t=2}^Tlog(\frac{q(x_{t-1}\mid x_t,x_0)}{p_\theta(x_{t-1}\mid x_t)})-log(p_\theta(x_0\mid x_1))\cr &=\overbrace{\underbrace{D_{KL}(q(x_t\mid x_0)\mid\mid p(x_T))}{q\text {只是个正向过程没有可学习参数}}}^{\text {可以忽略}} + \sum{t=2}^TD_{KL}(q(x_{t-1}\mid x_t,x_0)\mid\mid p_\theta(x_{t-1}\mid x_t))-log(p_\theta(x_0\mid x_1)) \end{aligned} $$

  • 第一项 KL 散度可以忽略,因为 qq 只是个正向过程,没有可学习参数,换句话说就是它是固定的。
  • 第二项 KL 散度,左边和右边都是正太分布,分别服从 $N(x_{t-1};\tilde{\mu_t}(x_t,x_0),\tilde{\mathsf{\beta}t}I)N(x{t-1};\mu_\theta(x_t,t),\text{β}I)$:

$$ \sum_{t=2}^TD_{KL}(\underbrace{q(x_{t-1}\mid x_t,x_0)}{N(x{t-1};\tilde{\mu}t(x_t,x_0),\tilde{\mathsf{\beta}}tI)}\mid\mid\overbrace{p\theta(x{t-1}\mid x_t)}^{N(x_{t-1};\mu_\theta(x_t,t),\mathsf{\beta}I}) $$

第一项的 μt~(xt,x0)\tilde{\mu_{t}}(x_{t},x_{0})βt~\tilde{\beta_{t}} 就是我们要求的值,这里省略了这部分的推导,不影响算法的理解,

$$ \begin{gathered}\tilde{\mu}t(x_t,x_0)=\frac{\sqrt{\alpha_t}(1-\overline{\alpha}{t-1})}{1-\overline{\alpha}t}x_t+\frac{\sqrt{\alpha}{t-1}\beta_t}{1-\overline{\alpha}_t}x_0\\tilde{\mathsf{\beta}}t=\frac{1-\overline{\alpha}{t-1}}{1-\overline{\alpha}_t}\beta_t\end{gathered} $$

凡是涉及到 αt\alpha_t 的,就是学习调度器的,我们不需要关注它

我们可以化简 μ~t\tilde{\mu}_{t},我们知道 xt=αtx0+1αtεx_t=\sqrt{\overline{\alpha}_t}x_0+\sqrt{1-\overline{\alpha}_t}\varepsilon , 即:

x0=1αt(xt1αtε) x_0=\frac1{\sqrt{\overline{\alpha}_t}}(x_t-\sqrt{1-\overline{\alpha}_t}\left.\varepsilon\right)

还知道: α=s=1tαs\overline{\alpha}=\prod_{s=1}^t\alpha_sαt=1βt\alpha_t=1-\beta_t:

代入 μ~t\tilde{\mu}_{t} 得到:

$$ \begin{aligned} \underbrace{\tilde{\mu}t(x_t,x_0)}{\text {不再依赖} x_0}& =\frac {\sqrt {\alpha_{t}}(1-\overline {\alpha}{t-1})}{1-\overline{\alpha}{t}}x_{t}+\frac{\sqrt{\overline{\alpha}{t-1}}\beta{t}}{1-\overline{\alpha}{t}}\frac{1}{\sqrt{\overline{\alpha}{t}}}(x_{t}-\sqrt{1-\overline{\alpha}{t}}\varepsilon) \cr &=\frac{\alpha_t(1-\overline{\alpha}{t-1})x_t}{\sqrt{\alpha_t}(1-\overline{\alpha}_t)}+\frac{\beta_t}{\sqrt{\alpha_t}(1-\overline{\alpha}_t)}(x_t-\sqrt{1-\overline{\alpha}_t}\left.\varepsilon\right) \cr &=\frac{\alpha_tx_t-\overline{\alpha}_tx_t+(1-\alpha_t)x_t-(1-\alpha_t)\sqrt{1-\overline{\alpha}_t}\varepsilon}{\sqrt{\alpha_t}(1-\overline{\alpha}_t)} \cr &=\frac{x_t(1-\overline{\alpha}_t)-(1-\alpha_t)\sqrt{1-\overline{\alpha}_t}\varepsilon}{\sqrt{\alpha_t}(1-\overline{\alpha}_t)} \cr &=\frac{x_t}{\sqrt{\alpha_t}}-\frac{(1-\alpha_t)\varepsilon}{\sqrt{\alpha_t}\sqrt{(1-\overline{\alpha}_t)}} \cr &=\frac1{\sqrt{\alpha_t}}(x_t-\frac{\beta_t}{\sqrt{1-\overline{\alpha}_t}}\left.\varepsilon\right) \end{aligned} $$

代入之后我们发现它就不再依赖于 x0x_0 了,它就是和 xtx_t 的一个关系式,式中的 αt\alpha_tβt\beta_tε\varepsilon 都是已知的,最后的本质就是我们只是从中减去缩放的随机噪声。

$$\therefore x_{t-1}=N(x_{t-1};\frac1{\sqrt{\alpha_t}}(x_t-\frac{\beta_t}{\sqrt{1-\overline{\alpha}t}}\left.\varepsilon\theta(x_t,t)\right),\Sigma_\theta(x_t,t))$$

这样一来,DDPM 的每一步推断可以总结为:

  • 每个时间步通过 xtx_ttt 来预测高斯噪声,图中用 zz 表示,根据上述公式计算得到均值 μ\mu
  • 得到方差 Σθ(xt,t)\Sigma_\theta(x_t,t)
  • 入公式得到 q(xt1xt)q(x_{t-1}\mid x_t) ,利用重参数化得到 xt1x_{t-1}

下面我们来看损失的推导,我们来回顾第二项:

我们需要减小 KL 散度,由于方差是固定的,我们无法优化,所以需要将它们的均值之差减小,原论文中使用的是简单的均方误差:

μ\mu 表达式代入:

$$ \begin{aligned} L_{t}& =\frac1{2\sigma_t^2}\mid|\tilde{\mu}t(x_t,x_0)-\mu\theta(x_t,t)||^2 \cr &=\frac1{2\sigma_t^2}\mid\mid\frac1{\sqrt{\alpha_t}}(x_t-\frac{\beta_t}{\sqrt{1-\overline{\alpha}t}}\left.\varepsilon\right)-\frac1{\sqrt{\alpha_t}}(x_t-\frac{\beta_t}{\sqrt{1-\overline{\alpha}t}}\left.\varepsilon\theta(x_t,t)\right)\mid\mid^2 \cr &=\frac{\beta_t^2}{2\sigma_t^2\alpha_t(1-\overline{\alpha}t)}\underbrace{\mid\mid\varepsilon-\varepsilon\theta(x_t,t)\mid\mid^2}{mse} \cr &->\mid\mid\varepsilon-\varepsilon_\theta(x_t,t)\mid\mid^2=\mid\mid\varepsilon-\varepsilon_\theta(\sqrt{\overline{\alpha}_t}\left.x_0+\sqrt{1-\overline{\alpha}_t}\left.\varepsilon_t,t\right)\mid\mid^2\right. \end{aligned} $$

研究人员发现,忽略前面的系数项会变得更简单,采样质量也会得到提高,所以前面这个系数项我们直接忽略,它是和噪声调度器有关的,我们加噪的话也会使计算复杂。

我们最小化 εεθ(xt,t)2\mid\mid\varepsilon-\varepsilon_\theta(x_t, t)\mid\mid^2 也就是最小化了 KL 散度,KL 散度变小了也就是变分上限优化到最小,所以那个负对数似然也会变小。

上面还剩了最后一项 log(pθ(x0x1))-log(p_\theta(x_0\mid x_1)) ,这个作者决定去掉它,即在 t=1t=1 时,我们不添加噪声。也就是下面横线的地方,只有 t>1t>1 的时候才服从高斯分布,如果 t1t\leq {1},直接让 z=0z=0,即噪声设置为 0。

回顾上面整个推导过程:我们从负对数似然 -> 优化下界 -> 简化下界 -> 预测噪声

https://wangguisen.blog.csdn.net/article/details/128821008

ref: [1]. https://arxiv.org/abs/2006.11239
[2]. https://kexue.fm/archives/9119
[3]. https://zhuanlan.zhihu.com/p/576475987
[4]. https://zhuanlan.zhihu.com/p/525106459
[5]. https://www.bilibili.com/video/BV1b541197HX
[6]. https://www.bilibili.com/video/BV1WD4y1E7X5
[7]. https://huggingface.co/blog/annotated-diffusion
[8]. https://www.datalearner.com/blog/1051664857725795
[9]. https://lilianweng.github.io/posts/2021-07-11-diffusion-models
[10]. https://mp.weixin.qq.com/s?__biz=Mzk0MzIzODM5MA==&mid=2247486128&idx=1&sn=7ffef5d8c1bbf24565d0597eb5eaeb16&chksm=c337b729f4403e3f4ca4fcc1bc04704f72c1dc02876a2bf83c330e7857eba567864da6a64e18&scene=21#wechat_redirect [11]. paper link

Buy me a coffee~
支付宝
微信
0%