【⚠️⚠️⚠️本文为稀土技能社区首发签约文章,30天内制止转载,30天后未获授权制止转载,侵权必究!】

咱们好,在【CV大模型系列之】中,咱们将从原理到源码,全方面解读文生图CV大模型背后的技能。

本篇将和咱们一同解读分散模型的柱石:DDPM(Denoising Diffusion Probalistic Models) 。分散模型的研讨并不始于DDPM,但DDPM的成功对分散模型的开展起到至关重要的效果。在这个系列里咱们也会看到,后续一连串效果惊艳的模型,都是在DDPM的结构上迭代改进而来。所以,我把DDPM放在这个系列的第一篇进行解说。

初读DDPM论文的朋友,或许有以下两个痛点:

  • 论文花极大篇幅讲数学推导,可是我看不懂。

  • 论文没有给出模型架构图和详细的练习解说,而这是我最关心的部分。

针对这些痛点,DDPM系列将会出如下三篇文章:

  • DDPM(模型架构篇):在阅览源码的基础上,本篇制作了详细的DDPM模型架构图(DDPM UNet),一同附上关于模型运作流程的详细解说。本篇不触及数学知识,直观协助咱们了解DDPM怎样用,为什么好用。

  • DDPM(人人都能看懂的数学推理篇):也便是本篇文章,DDPM的数学推理或许是许多读者头疼的部分。我测验跳出原始论文的推导顺序和思路,从更契合咱们思想模式的视点下手,把整个推理流程串成一条完整的逻辑线。相同,我也会配上许多的图例,便利咱们了解数学公式。假如你不擅长数学推导,这篇文章能够协助你从直觉上了解DDPM的数学有效性;假如你更重视推导细节,这篇文章中也有详细的推导中心进程。

  • DDPM(源码解读篇):在前两篇的基础上,咱们将配合模型架构图,一同阅览DDPM源码,并实操跑一次,观测练习进程里的中心成果。

【⚠️⚠️⚠️假如你粗扫一眼本文,看见大段的公式推导,请不要抛弃。出于谨慎的意图,本文有必要列出公式推导的细节;可是,假如你只想把握整体逻辑,完全能够跳过推导,只看结论和图解,这并不会影响本文的阅览。】

【本系列文章导航(持续更新中)】

CV大模型系列之:分散模型柱石DDPM(模型架构篇)
CV大模型系列之:分散模型柱石DDPM(人人都能看懂的数学原理篇)

一、DDPM在做一件什么事

在DDPM模型架构篇中,咱们现已讨论过DDPM的效果,以及它为何能成为分散模型/文生图模型柱石的原因。这儿为了便利读者更好了解上下文,咱们将相关解说再放一次。

假定你想做一个以文生图的模型,你的意图是给一段文字,再随便给一张图(比方一张噪声),这个模型能帮你产出契合文字描述传神图片,例如:

CV大模型系列之:扩散模型基石DDPM(人人都能看懂的数学原理篇)

文字描述就像是一个指引(guidance),协助模型去发生更契合语义信息的图片。可是,毕竟语义学习是复杂的。咱们能不能先退一步,先让模型拥有发生传神图片的才能

比方说,你给模型喂一堆cyperpunk风格的图片,让模型学会cyperpunk风格的散布信息,然后喂给模型一个随机噪音,就能让模型发生一张传神的cyperpunk照片。或者给模型喂一堆人脸图片,让模型发生一张传神的人脸。相同,咱们也能选择给练习好的模型喂带点信息的图片,比方一张搀杂噪音的人脸,让模型帮咱们去噪。

CV大模型系列之:扩散模型基石DDPM(人人都能看懂的数学原理篇)

具有了产出传神图片的才能,模型才或许在下一步中去学习语义信息(guidance),进一步发生契合人类意图的图片。而DDPM的实质效果,便是学习练习数据的散布,产出尽或许契合练习数据散布的实在图片。所以,它也成为后续文生图类分散模型结构的柱石。

二、优化方针

现在,咱们知道DDPM的方针便是:使得生成的图片尽或许契合练习数据散布。依据这个方针,咱们记:

  • P(x)P_{\theta}(x):模型所发生的图片的(概率)散布。其间\theta表明模型参数,以\theta作为下标的意图是表明这个散布是由模型决定的,
  • Pdata(x)P_{data}(x):练习数据(也可了解为实在国际)图片的(概率)散布。下标data表明这是一个自然国际客观存在的散布,与模型无关。

则咱们的优化方针能够用图例表明为:

CV大模型系列之:扩散模型基石DDPM(人人都能看懂的数学原理篇)

而求两个散布之间的类似性,咱们自然而然想到了KL散度。 温习一下KL散度的界说:散布p与散布q之间的KL散度为:

DKL(p∣∣q)=∑i=1mp(xi)logp(xi)q(xi)(原始界说)=−∑i=1mp(xi)logq(xi)p(xi)(稍作变式)=−∫xp(x)logq(x)p(x)dx(m→∞)\begin{align} D_{KL}(p||q) &=\sum_{i=1}^{m}p(x_i)log\frac{p(x_i)}{q(x_i)} (原始界说) \notag\\ &= -\sum_{i=1}^{m}p(x_i)log\frac{q(x_i)}{p(x_i)} (稍作变式) \notag\\ &= -\int\limits_{x}p(x)log\frac{q(x)}{p(x)}dx (m\to \infty ) \tag{1.1}\\ \end{align}

则现在咱们的方针函数就变为:

argminKL(Pdata∣∣P){argmin}_\theta KL(P_{data}||P_{\theta})

咱们运用运用式(1.1),对该方针函数做一些变换(可向右拖动公式,阅览公式注解)

CV大模型系列之:扩散模型基石DDPM(人人都能看懂的数学原理篇)

通过这一番转化,咱们的优化方针从直觉上的“令模型输出的散布迫临实在图片散布”转变为“ argmax∏i=1mP(xi)argmax_{\theta}\prod_{i=1}^{m} P_{\theta}(x_i) “,咱们也能够把这个新的方针函数通俗了解成“使得模型发生实在图片的概率最大” 。假如一上来就直接把式(1.2)作为优化方针,或许会令许多朋友感到困惑。因而在这一步中,咱们解释了为什么要用式(1.2)作为优化方针。

接下来,咱们近一步来看,对式(1.2)还能做什么样的转化和拆解。

三、最大化ELBO(Evidence Lower Bound)

argmax∏i=1mP(xi)argmax_{\theta}\prod_{i=1}^{m} P_{\theta}(x_i) 的实质便是要使得连乘中的每一项最大,也等同于使得logP(x)logP_{\theta}(x) 最大。所以咱们进一步来拆解logP(x)logP_{\theta}(x) 。在开始拆解之前,让咱们先回忆一下分散模型的加噪与去噪进程,协助咱们更好地做数学推理。

CV大模型系列之:扩散模型基石DDPM(人人都能看懂的数学原理篇)

CV大模型系列之:扩散模型基石DDPM(人人都能看懂的数学原理篇)

Diffusion Process中,咱们不过模型,而是依照设置好的加噪规矩,跟着time_step的变化,给图片添加噪声(xt−1→xtx_{t-1}\tox_{t})。在Denoise Process中,咱们则需要通过模型,对图片进行去噪,逐步将图片复原成原始的样子(xt→xt−1x_{t}\tox_{t-1})。Diffusion进程中遵照的散布,咱们记为qq ,Denoise进程中遵照的散布,咱们记为pp_{\theta}。严格来说,Diffusion进程遵照的散布应该记为qq_{\phi},下标\phi也表明模型参数,也便是说, “规矩”也算一种“模型” 。理论上,你想对Diffusion独自练习一套模型,也是没有问题的。为了表述谨慎,咱们接下来都将用qq_{\phi}进行表明。

现在咱们能够回到拆解logP(x)logP_{\theta}(x) 了,即然x和z与Diffusion和Denoise的进程密切相关,那么咱们的方针便是要把logP(x)logP_{\theta}(x) 拆解成用q,Pq_{\phi},P_{\theta}一同表达的办法:

CV大模型系列之:扩散模型基石DDPM(人人都能看懂的数学原理篇)

Eq(z∣x)[logP(x,z)q(z∣x)]E_{q_{\phi}(z|x)}[log\frac{P_{\theta}(x, z)}{q_{\phi}(z|x)}]就被称为Evidence Lower Bound (ELBO)。到这一步停止,咱们将最大化logP(x)logP_{\theta}(x) 拆解成最大化ELBO,其间qq_{\theta}与diffusion进程密切相关,PP_{\theta}与denoise进程密切相关。

(2.1)这个公式一出,咱们是不是很眼熟?没错,它其实也刻画了VAE的优化方针,所以这儿咱们才选用z而不是x来表明latent space中的变量。有些读者或许现已发现了,(2.1)描述的是一个time_step下的优化方针,可是咱们的分散模型,是有T个time_step的,因而,咱们还需要把(2.1)再进一步扩展成链式表达的办法。在这一步扩展里,咱们将不再运用z变量,取而代之的是用x0,…xTx_{0},…x_{T}来表明,更契合咱们对分散模型的整体了解,则咱们有:

到这一步位置,咱们只是拆解了一个time_step,即xt→xt−1x_{t}\tox_{t-1},咱们知道分散模型的进程是包含多个time_step的,因而咱们能够依据式(2.1)进一步拆解成链式表达的办法:

logP(x)≥Eq(x1:xT∣x0)logP(x0:xT)q(x1:xT∣x0)\begin{align} logP_{\theta}(x) &\ge E_{q_{\phi}(x_{1}:x_{T}|x_{0})}log\frac{P_{\theta}(x_{0}:x_{T})}{q_{\phi}(x_{1}:x_{T}|x_{0})} \tag{2.2} \end{align}

其间,x0x_{0}表明从实在国际中筛选出来的干净的图片,xTx_{T}表明最后一个time_step加噪后的图片,通常是一个近似纯噪声。细心的读者或许发现,在(2.2)公式中,左边的logP(x)logP_{\theta}(x)是不是写成logP(x0)logP_{\theta}(x_{0})更合理呀?没错,因为分散模型的方针便是去复原来自实在国际的x0x_{0}。但这儿为了前后表达统一,就不做修改了。读者们只需了解(2.2)的含义即可。

四、进一步拆解ELBO

温习一下,到这一步停止,咱们经历了如下进程:

  • 首先,整体优化方针是让模型发生的图片散布和实在图片散布尽量类似,也便是argminKL(Pdata∣∣P){argmin}_\theta KL(P_{data}||P_{\theta})

  • 对KL散度做拆解,将优化方针argminKL(Pdata∣∣P){argmin}_\theta KL(P_{data}||P_{\theta})转变为argmax∏i=1mP(xi)argmax_{\theta}\prod_{i=1}^{m} P_{\theta}(x_i) 一同也等价于让连乘项中的每一项logP(x)logP_{\theta}(x) 最大

  • logP(x)logP_{\theta}(x) 做拆解,以优化DDPM其间一个time_step为例,将优化方针转向最大化下界(ELBO)Eq(z∣x)[logP(x,z)q(z∣x)]E_{q_{\phi}(z|x)}[log\frac{P_{\theta}(x, z)}{q_{\phi}(z|x)}]

  • 以全部time_step为例,将优化方针转变为Eq(x1:xT∣x0)logP(x0:xT)q(x1:xT∣x0)E_{q_{\phi}(x_{1}:x_{T}|x_{0})}log\frac{P_{\theta}(x_{0}:x_{T})}{q_{\phi}(x_{1}:x_{T}|x_{0})},也便是式(2.2)

祝贺你充溢耐心地看到这一步了!接下来,咱们还需要再耐心对式(2.2)进行拆解,毕竟现在它只是一个偏笼统的办法,因而咱们还需对p与q再做具象化处理。之前咱们提过,qq_{\phi}下标的意思是着重从理论上来说,diffusion进程能够通过练习一个模型来加噪,而并非只能通过规矩加噪。这两种办法在数学上都是成立的。因为DDPM采用了后者,因而在接下来的进程中,咱们将会去掉下标\phi

式(2.2)的进一步拆解如下:

CV大模型系列之:扩散模型基石DDPM(人人都能看懂的数学原理篇)

CV大模型系列之:扩散模型基石DDPM(人人都能看懂的数学原理篇)

  • (48):分子上,因为xTx_{T}已是个近似高斯散布的纯噪声,因而它的散布p是已知的,和模型\theta无关,所以将p(xT)p(x_{T})独自提炼出。分子与分母的其余项则是因为分散模型遵照马尔可夫链性质,因而能够通过链式连乘规矩进行改写
  • (50):x0x_{0} 表明来自实在国际的干净图片,它是diffusion进程的来源,恣意xtx_{t}都可由x0x_{0} 推导而来,因而可将q(xt∣xt−1)q(x_{t}|x_{t-1}) 改写成q(xt∣xt−1,x0)q(x_{t}|x_{t-1}, x_{0})
  • (52):依据多变量条件概率的贝叶斯链式法则进行改写,即:
q(xt−1∣xt,x0)=q(xt∣xt−1,x0)q(xt−1∣x0)q(xt∣x0)\begin{align} q(x_{t-1}|x_{t}, x_{0}) & = \frac{q(x_{t}|x_{t-1},x_{0})q(x_{t-1}|x_{0})}{q(x_{t}|x_{0})} \notag \end{align}

当然多变量条件概率的改写办法有许多种,依据需要咱们选择了上面的这一种

  • (54):因为q是既定的,能够看作是一个常量,因而可添加logq(x1∣x0)q(xT∣x0)log\frac{q(x_{1} | x_{0})}{q(x_{T}|x_{0})}一项

  • (56)~(57):依据希望项中触及到的详细元素,调整希望E的下标

  • (58):依据KL散度的界说重写最后两项。其间prior matching term可看作是常量,reconstruction term和denoising matching term则是和模型密切相关的两项。因为两者间十分类似,因而接下来咱们只需要特别重视denoising matching term如何拆解即可。

五、重参数与噪声猜测

现在,咱们的优化方针转为最大化∑t=2TEq(xt∣x0)[DKL(q(xt−1∣xt,x0)∣∣p(xt−1∣xt)]\sum_{t=2}^{T} E_{q(x_{t}|x_{0})}[D_{KL}(q(x_{t-1}|x_{t},x_{0}) || p_{\theta}(x_{t-1}|x_{t})],咱们持续对该项进行拆解。

首先咱们来看q(xt−1∣xt,x0)q(x_{t-1}|x_{t},x_{0})一项。

依据多变量条件概率的链式法则,咱们有:

q(xt−1∣xt,x0)=q(xt−1,xt,x0)q(xt,x0)=q(xt∣xt−1)q(xt−1∣x0)q(x0)q(xt∣x0)q(x0)=q(xt∣xt−1)q(xt−1∣x0)q(xt∣x0)\begin{align} q(x_{t-1}|x_{t},x_{0}) &= \frac{q(x_{t-1},x_{t},x_{0})}{q(x_{t}, x_{0})} \notag \\ &=\frac{q(x_{t}|x_{t-1})q(x_{t-1}|x_{0})q(x_{0})}{q(x_{t}|x_{0})q(x_{0})} \notag \\ &=\frac{q(x_{t}|x_{t-1})q(x_{t-1}|x_{0})}{q(x_{t}|x_{0})} \notag \end{align}

现在,咱们别离来看q(xt∣xt−1)q(x_{t}|x_{t-1}) q(xt−1∣x0)q(x_{t-1}|x_{0}) q(xt∣x0)q(x_{t}|x_{0})详细长什么样子。

5.1 重参数

5.1.1 为什么需要重参数

回忆模型架构篇,咱们曾经提过,最朴素的diffusion加噪规矩是,在每一个time_step中都sample一次随机噪声,使得:

xt=x0+1+2+…+T\begin{align} x_t = x_{0}+\epsilon_{1}+\epsilon_{2}+…+\epsilon_{T}\notag \end{align}

在架构篇中,咱们直接指出t∼N(0,I)\epsilon_{t} \sim \mathcal{N}(0, I) ,即筛选的噪声是来自一个标准高斯散布。可是为什么要这么规划呢

咱们假定实在国际的图片遵守N(,)\mathcal{N}(\mu, \sigma) 这样的高斯散布,而现在咱们的模型PP_{\theta}便是要去学习这个散布,更具象点,假定模型遵照的散布是N(,)\mathcal{N}(\mu_{\theta}, \sigma_{\theta}) ,咱们的意图便是让\mu_{\theta}迫临\mu \sigma_{\theta}迫临 \sigma

那么在diffusion进程中,更契合直觉的做法是,模型从N(,)\mathcal{N}(\mu_{\theta}, \sigma_{\theta}) 采样出一个噪声,然后在denoise的进程中去猜测这个噪声,这样就能把梯度传递到,\mu_{\theta}, \sigma_{\theta}上,使得模型在猜测噪声的进程中习得实在图片的散布。

但这样做发生的问题是,实际上梯度并不能传递到,\mu_{\theta}, \sigma_{\theta}上。举个简略的例子,假定你从N(,)\mathcal{N}(\mu_{\theta}, \sigma_{\theta}) 随机采样出了一个3,你怎样将这个随机的采样成果和,\mu_{\theta}, \sigma_{\theta}联系起来呢?也便是说,在diffusion进程中,假如咱们从一个带参数的散布中做数据采样,在denoise进程中,咱们无法将梯度传递到这个参数上

针对这个问题,有一个简略的处理办法:我从一个确认的散布(不带参数)中做数据采样,不就行了吗?比方,我从N(0,I)\mathcal{N}(0, I) 先采样出一个\epsilon,然后再令终究的采样成果z为:∗+\epsilon*\sigma_{\theta}+\mu_{\theta}。这样我不就能知道z和,\mu_{\theta}, \sigma_{\theta}间的联系了?一同依据高斯散布性质,z也遵守N(,)\mathcal{N}(\mu_{\theta}, \sigma_{\theta}) 散布。

以上“从一个带参数的散布中进行采样”转变到“从一个确认的散布中进行采样”,以处理梯度无法传递问题的办法,就被称为 “重参数”(reparamterization)。 关于重参数原理的更多细节,引荐咱们阅览这篇文章(spaces.ac.cn/archives/67…

5.1.2 重参数的详细办法

到这一步依据重参数的思想,咱们能够把t∼N(,)\epsilon_{t} \sim\mathcal{N}(\mu_{\theta}, \sigma_{\theta}) 转变为t∼N(0,I)\epsilon_{t} \sim\mathcal{N}(0, I) 了。可是现在的diffusion进程还是太繁琐:每一个time_step都要做一次采样,等我后续做denoise进程去猜测噪声,传达梯度的时候,参数\theta不仅在这个time_step有,在之前的一系列time_steps中都有,这不是给我计算梯度造成困扰了吗?注意到在diffusion进程中,跟着time_step的添加,图片中含有的噪声是越来越多的,那我能不能设定一个函数,使得每个time_step的图片都能由原始图片x0x_{0}加噪推导而来,然后使得噪声的份额跟着time_step添加而变大?这样我不就只需要一次采样了吗?

当然没有问题,DDPM采用的做法是:

(1)首先,设置超参数1,2,…T{\beta}_{1},{\beta}_{2},…{\beta}_{T},满足跟着t增大,t{\beta}_{t}逐步变大。

(2)令:

t=1−tt=12…t\begin{align} \alpha_t=1-\beta_{t}\notag\\ \bar \alpha_t=\alpha_1\alpha_2…\alpha_t\notag \end{align}

易推出t\bar\alpha_{t}跟着t增大而逐步变小

(3)则恣意时刻的xtx_{t}都能够由x0x_{0}表明出:

xt=tx0+1−t(∼N(0,I))\begin{align} x_t = \sqrt{\bar\alpha_t}x_0 + \sqrt{1-\bar\alpha_t}\epsilon\qquad(\epsilon \sim\mathcal{N}(0, I))\notag \end{align}

咱们通过图例来更好了解上面的三进程:

CV大模型系列之:扩散模型基石DDPM(人人都能看懂的数学原理篇)

详细的进程都在图例中表明出了,这儿不做赘述。

5.2 噪声猜测

讲完了重参数的部分,咱们持续回到刚才拆解的进程上来,温习一下,咱们现已将ELBO拆解成∑t=2TEq(xt∣x0)[DKL(q(xt−1∣xt,x0)∣∣p(xt−1∣xt)]\sum_{t=2}^{T} E_{q(x_{t}|x_{0})}[D_{KL}(q(x_{t-1}|x_{t},x_{0}) || p_{\theta}(x_{t-1}|x_{t})],现在咱们的重视点在q散布上,而q散布又由以下三项组成:

q(xt∣xt−1)q(x_{t}|x_{t-1}) q(xt−1∣x0)q(x_{t-1}|x_{0}) q(xt∣x0)q(x_{t}|x_{0}) ,咱们持续来看这三项要怎样详细表明出来。

由章节5.1.2,咱们知道:

xt=tx0+1−t(∼N(0,I))\begin{align} x_t = \sqrt{\bar\alpha_t}x_0 + \sqrt{1-\bar\alpha_t}\epsilon\qquad(\epsilon \sim\mathcal{N}(0, I))\notag \end{align}

则恣意x0,xt−1,xtx_{0},x_{t-1},x_{t}的联系都能够由此推出:

q(xt∣xt−1):xt=1−t∗xt−1+t∗=t∗xt−1+1−t∗q(xt−1∣x0):xt−1=t−1∗x0+1−t−1∗q(xt∣x0):xt=t∗x0+1−t∗\begin{align} q(x_{t}|x_{t-1}): \quad x_{t} &= \sqrt{1-\beta_{t}}*x_{t-1} + \sqrt{\beta_{t}}*\epsilon \notag \\ &= \sqrt{\alpha_{t}} * x_{t-1} + \sqrt{1-\alpha_{t}} * \epsilon \notag \\ q(x_{t-1}|x_{0}): x_{t-1} &= \sqrt{\bar\alpha_{t-1}}*x_{0} + \sqrt{1-\bar\alpha_{t-1}}*\epsilon \notag\\ q(x_{t}|x_{0}): \quad x_{t} &= \sqrt{\bar\alpha_{t}}*x_{0} + \sqrt{1-\bar\alpha_{t}}*\epsilon \notag\\ \end{align}

(友情提示:咱们记住看5.1.2中的图例区别t,t\alpha_{t},\bar\alpha_{t}哦,不是typo)。

一同,咱们现已知道(假定)x0,xt−1,xt,x_{0},x_{t-1},x_{t},\epsilon都遵守高斯散布,则依据高斯散布的性质,咱们有:

q(xt∣xt−1):xt∼N(txt−1,(1−t)I)q(xt−1∣x0):xt−1∼N(t−1×0,(1−t−1)I)q(xt∣x0):xt∼N(tx0,(1−t)I)\begin{align} q(x_{t}|x_{t-1}): \quad &x_{t}\sim N(\sqrt{\alpha_{t}}x_{t-1}, (1-\alpha_{t})I) \notag \\ q(x_{t-1}|x_{0}): \quad &x_{t-1} \sim N(\sqrt{\bar\alpha_{t-1}}x_{0}, (1-\bar\alpha_{t-1})I) \notag\\ q(x_{t}|x_{0}): \quad &x_{t} \sim N(\sqrt{\bar\alpha_{t}}x_{0}, (1-\bar\alpha_{t})I) \notag\\ \end{align}

对于高斯散布,知道了均值和方差,咱们就能够把它详细的概率密度函数写出来:

CV大模型系列之:扩散模型基石DDPM(人人都能看懂的数学原理篇)

通过这样的一顿爆肝推导,咱们终于将q(xt−1∣xt,x0)q(x_{t-1}|x_{t}, x_{0})的散布写出来了(84)。也便是咱们当前优化方针∑t=2TEq(xt∣x0)[DKL(q(xt−1∣xt,x0)∣∣p(xt−1∣xt)]\sum_{t=2}^{T} E_{q(x_{t}|x_{0})}[D_{KL}(q(x_{t-1}|x_{t},x_{0}) || p_{\theta}(x_{t-1}|x_{t})]中的q部分。

现在,咱们来看p(xt−1∣xt)p_{\theta}(x_{t-1}|x_{t})部分,依据优化方针,此刻咱们需要让p和q的散布尽量挨近:

CV大模型系列之:扩散模型基石DDPM(人人都能看懂的数学原理篇)

而让p和q的散布挨近,等价与让→q,→q\mu_{\theta}\to\mu_{q},\sigma_{\theta}\to\sigma_{q}注意到q\sigma_{q}其实是一个常量,它只和超参有关。在DDPM中,为了简化优化进程,而且使练习更稳定,就假定\sigma_{\theta}也按此种办法固定下来了。在后续的分散模型(例如GLIDE)中,则引进对方差的猜测。在DDPM中,只猜测均值。

好,那么猜测均值,到底是在猜测什么东西呢?咱们对q\mu_{q}再做改写,主要是依据咱们设置的diffusion规矩,将x0x_{0}

xtx_{t}进行表明:

q=t−1tx0+t(1−t−1)xt1−t=t−1txt−1−tt+t(1−t−1)xt1−t=1t(xt−1−t1−t)\begin{align} \mu_{q} &= \frac{\sqrt{\bar\alpha_{t-1}}\beta_{t}x_{0} + \sqrt{\alpha_{t}}(1-\bar\alpha_{t-1})x_{t}}{1 – \bar\alpha_{t}} \notag \\ &= \frac{\sqrt{\bar\alpha_{t-1}}\beta_{t}\frac{x_{t} – \sqrt{1-\bar\alpha_{t}}\epsilon}{\sqrt{\bar\alpha_{t}}} + \sqrt{\alpha_{t}}(1-\bar\alpha_{t-1})x_{t}}{1 – \bar\alpha_{t}} \notag \\ &= \frac{1}{\sqrt{\alpha_{t}}}(x_{t} – \frac{1-\alpha_{t}}{\sqrt{1-\bar\alpha_{t}}}\epsilon) \tag{5.1} \end{align}

观察到,式(5.1)的成果在diffusion进程中就已决定好。所以现在对于p(xt−1∣xt)p_{\theta}(x_{t-1} | x_{t}),我只需让它在denoise的进程里,猜测出\epsilon_{\theta},使得→\epsilon_{\theta}\to\epsilon,然后令:

xt−1=1t(xt−1−t1−t)+qz(z∼N(0,I))\begin{align} x_{t-1} &= \frac{1}{\sqrt{\alpha_{t}}}(x_{t} – \frac{1-\alpha_{t}}{\sqrt{1-\bar\alpha_{t}}}\epsilon_{\theta})+\sigma_{q}z\qquad(z\sim N(0, I))\notag \end{align}

这样,我不就能使得p(xt−1∣xt)p_{\theta}(x_{t-1} | x_{t})q(xt−1∣xt,x0)q(x_{t-1}|x_{t}, x_{0})的散布一致了吗!

此刻!是不是一道光在你的脑海里闪过! 一切都串起来了,也便是说,只需在denoise的进程中,让模型去猜测噪声,就能够达到让“模型发生图片的散布”和“实在国际的图片散布”迫临的意图!

5.3 再次了解training和sampling

CV大模型系列之:扩散模型基石DDPM(人人都能看懂的数学原理篇)

现在,咱们再来回忆training和sampling的进程,在training的进程中,咱们只需要去猜测噪声,就能在数学上使得模型学到的散布和实在的图片散布不断迫临。而当咱们运用模型做sampling,即去测验模型能生成什么质量的图片时,咱们即可由式(5.1)中的推导结论,从xtx_{t}推导xt−1x_{t-1},直至复原出x0x_{0}。注意到这儿xt−1∼N(q,q)x_{t-1}\simN(\mu_{q},\sigma_{q}),其间q\mu_{q}是咱们式(5.1)中要迫临的均值真值;t=q\sigma_{t}=\sigma_{q},则正是咱们现已固定住的方差。

关于training和sampling更详细的实操解说,能够拜见模型架构篇。

六、总结(必看)

祝贺你坚持看到了这儿!咱们来把整个推导串成完整的逻辑链:

(1)首先,DDPM整体优化方针是让模型发生的图片散布和实在图片散布尽量类似,也便是argminKL(Pdata∣∣P){argmin}_\theta KL(P_{data}||P_{\theta})。一同,咱们假定实在国际的图片契合高斯散布:Pdata∼N(data,data)P_{data}\simN(\mu_{data},\sigma_{data})。因而咱们的方针便是要让PP_{\theta}习得data,data\mu_{data},\sigma_{data}

(2)可是data,data\mu_{data},\sigma_{data}这两个客观存在的真值是不知道的,因而咱们有必要对KL散度进行不断拆解,直至能用确认的办法将它表明出来。

(3)对KL散度做初步拆解,将优化方针argminKL(Pdata∣∣P){argmin}_\theta KL(P_{data}||P_{\theta})转变为argmax∏i=1mP(xi)argmax_{\theta}\prod_{i=1}^{m} P_{\theta}(x_i) 一同也等价于让连乘项中的每一项logP(x)logP_{\theta}(x) 最大

(4)持续对logP(x)logP_{\theta}(x) 做拆解,以优化DDPM其间一个time_step为例,将优化方针转向最大化下界(ELBO)Eq(z∣x)[logP(x,z)q(z∣x)]E_{q_{\phi}(z|x)}[log\frac{P_{\theta}(x, z)}{q_{\phi}(z|x)}]

(5)依照马尔可夫性质,从1个time_step推至所有的time_steps,将(4)中的优化方针改写为Eq(x1:xT∣x0)logP(x0:xT)q(x1:xT∣x0)E_{q_{\phi}(x_{1}:x_{T}|x_{0})}log\frac{P_{\theta}(x_{0}:x_{T})}{q_{\phi}(x_{1}:x_{T}|x_{0})},也便是式(2.2)

(6)对式(2.2)持续做拆解,将优化方针变为∑t=2TEq(xt∣x0)[DKL(q(xt−1∣xt,x0)∣∣p(xt−1∣xt)]\sum_{t=2}^{T} E_{q(x_{t}|x_{0})}[D_{KL}(q(x_{t-1}|x_{t},x_{0}) || p_{\theta}(x_{t-1}|x_{t})]

(7)先来看(6)中的q(xt−1∣xt,x0)q(x_{t-1}|x_{t}, x_{0})一项,注意到这和diffusion的进程密切相关。在diffusion的进程中,通过重参数的办法进行加噪,再通过一顿爆肝推导,得出q(xt−1∣xt,x0)∼N(t−1tx0+t(1−t−1)xt1−t,(1−t)(1−t−1)1−t)q(x_{t-1}|x_{t}, x_{0})\simN(\frac{\sqrt{\bar\alpha_{t-1}}\beta_{t}x_{0} + \sqrt{\alpha_{t}}(1-\bar\alpha_{t-1})x_{t}}{1 – \bar\alpha_{t}}, \frac{(1-\alpha_{t})(1-\bar\alpha_{t-1})}{1-\bar\alpha_{t}}),易看出该散布中方差是只和咱们设置的超参数相关的常量。

(8)再来看(6)中的p(xt−1∣xt)p_{\theta}(x_{t-1} | x_{t})一项,下标说明了该项和模型相关。为了让p和q的散布挨近,咱们需要让p去学习q的均值和方差。因为方差是一个常量,在DDPM中,假定它是固定的,不再独自去学习它(后续的分散模型,例如GLIDE则一同对方差也做了猜测)。因而现在只需要学习q的均值。通过一顿变式,能够把q的均值改写成

1t(xt−1−t1−t) \frac{1}{\sqrt{\alpha_{t}}}(x_{t} – \frac{1-\alpha_{t}}{\sqrt{1-\bar\alpha_{t}}}\epsilon)。因而,这儿只需让模型去猜测噪声\epsilon_{\theta},使得→\epsilon_{\theta}\to\epsilon就能达到达到(1)中的意图!

七、参考

在学习DDPM的进程中,我也看了许多参考资料,但发现很难将整个推导进程串成一条契合思想惯性的逻辑链,因而对许多细节也是一知半解。直到我看到李宏毅教师对分散模型原理的解说(从散布类似性下手),以及阅览了google的一篇关于分散模型数学推理的综述,才茅塞顿开。自己着手推导后,从更契合我惯性思想的视点下手,写了这篇文章。因而,我也把我认为非常有协助的参考资料列在下面,咱们能够补充阅览。

1、李宏毅,分散模型解说:speech.ee.ntu.edu.tw/~hylee/ml/m…

2、Understanding Diffusion Models: A Unified Perspective:arxiv.org/pdf/2208.11…

3、DDPM:arxiv.org/pdf/2006.11…

4、重参数:spaces.ac.cn/archives/67…