扩散模型理论篇——发疯整理版

扩散模型理论篇——发疯整理版

闲谈叨叨叨:

哇塞,怎么要学的东西那么多!想学习扩散模型,结果看资料开头就讲到VAE,不懂…,好!学VAE!结果KL散度到底是什么!怎么这么多概率公式啊!(抓狂)。没办法,还是了解下吧…

这篇文章是整个扩散模型学习过程的笔记记录(还有发疯式的心路历程o((>ω< ))o)。尽量整理的知识点全面一点,和大家一起学习!强烈建议先复习复习概率论

目录附上:

1 补充一些知识点

这一部分如果都了解过,那就忽略掉。不想忽略的,可以在看正文部分涉及到时来翻一翻。(把这一部分放在前面,是因为怕你们坚持不到最后(/ω\))

概率的东西,大家还记否?如果想推公式的话,建议复习一下。我先列几个可能会用到的公式,按需查看。

1.1 一些公式

1.1.1 条件概率的一般形式

P ( A , B , C ) = P ( C ∣ B , A ) P ( B , A ) = P ( C ∣ B , A ) P ( B ∣ A ) P ( A ) P ( B , C ∣ A ) = P ( B ∣ A ) P ( C ∣ A , B ) \begin{aligned} &P(A,B,C) = P(C|B,A)P(B,A)=P(C|B,A)P(B|A)P(A)\\ &P(B,C|A)=P(B|A)P(C|A,B) \end{aligned} P(A,B,C)=P(CB,A)P(B,A)=P(CB,A)P(BA)P(A)P(B,CA)=P(BA)P(CA,B)

嗯~,能看懂哈<(^-^)>

1.1.2 基于马尔科夫假设的条件概率

如果满足马尔科夫链关系 A → B → C A\rightarrow{B}\rightarrow{C} ABC,那么有
P ( A , B , C ) = P ( C ∣ B , A ) P ( B , A ) = P ( C ∣ B ) P ( B ∣ A ) P ( A ) P ( B , C ∣ A ) = P ( B ∣ A ) P ( C ∣ B ) \begin{aligned} &P(A,B,C) = P(C|B,A)P(B,A) = P(C|B)P(B|A)P(A) \\ &P(B,C|A)=P(B|A)P(C|B) \end{aligned} P(A,B,C)=P(CB,A)P(B,A)=P(CB)P(BA)P(A)P(B,CA)=P(BA)P(CB)
就是A距离C太过遥远,C已经不记得A了,所以A对C的影响没那么大了的意思。

1.1.3 函数的期望

已知概率密度函数 p ( x ) p(x) p(x),那 x x x的期望就是
E [ x ] = ∫ x p ( x ) d x ≈ ∑ i = 1 n x i p ( x i ) ( x i − x i − 1 ) , ( x 0 < x 1 < ⋯ < x n ) ≈ 1 n ∑ i = 1 n x i , x i ∼ p ( x ) \begin{aligned} \mathbb{E}[x] &= \int xp(x)dx \\ &\approx \sum^n_{i=1}x_ip(x_i)(x_i-x_{i-1}),\quad(x_0<x_1<\cdots<x_n) \\ &\approx \frac{1}{n}\sum^n_{i=1}x_i,\quad x_i\sim p(x) \end{aligned} E[x]=xp(x)dxi=1nxip(xi)(xixi1),(x0<x1<<xn)n1i=1nxi,xip(x)
第一行就是那个函数期望公式。第二行代表的是数值积分,就是求函数与x轴的面积的那个意义。第三行是采样计算,采样出若干个点算平均值,这个没有用到概率,但是采样出来的数据已经有概率意义了,就是概率大的多出现、概率小的出现次数也少。

那想必下面这个公式,大家应该还有印象吧。
E x ∼ p ( x ) [ f ( x ) ] = ∫ f ( x ) p ( x ) d x ≈ 1 n ∑ i = 1 n f ( x i ) , x i ∼ p ( x ) \mathbb{E}_{x \sim p(x)}[f(x)]= \int f(x)p(x)dx \approx \frac{1}{n} \sum^n_{i=1}f(x_i), \quad x_i \sim p(x) Exp(x)[f(x)]=f(x)p(x)dxn1i=1nf(xi),xip(x)

1.2 KL散度

参考:初学机器学习:直观解读KL散度的数学概念 - 知乎 (zhihu.com)

文章里的例子很贴切,公式解释挺好理解的,通俗易懂。这里我就只列一下定义公式,不做过多解释了。

1.2.1 KL散度

KL散度(Kullback-Leibler Divergence):用来衡量两个分布(比如两条直线之间的匹配程度的方法)

定义公式:
D K L ( p ∣ ∣ q ) = ∑ i = 1 N [ p ( x i ) l o g p ( x i ) q ( x i ) ] = ∫ p ( x ) l n p ( x ) q ( x ) d x = E x ∼ p ( x ) [ l o g p ( x ) q ( x ) ] \begin{aligned} D_{KL}(p||q) &= \sum^{N}_{i=1} \bigg[ p(x_{i}) log \frac{p(x_{i})}{q(x_{i})} \bigg] \\ &= \int p(x) ln \frac{p(x)}{q(x)} dx \\ &= \mathbb{E}_{x \sim p(x)}\bigg[ log\frac{p(x)}{q(x)} \bigg] \end{aligned} \\ DKL(p∣∣q)=i=1N[p(xi)logq(xi)p(xi)]=p(x)lnq(x)p(x)dx=Exp(x)[logq(x)p(x)]
其中, q ( x ) q(x) q(x)是近似分布, p ( x ) p(x) p(x)是想要用 q ( x ) q(x) q(x)拟合的真实分布。所以如果两个分布完全匹配的话,应该是 D K L ( p ∣ ∣ q ) = 0 D_{KL}(p||q)=0 DKL(p∣∣q)=0. 所以KL散度越小越好,也就是近似分布与真实分布匹配的就越好。后面两行后面扩散模型公式推导会用到。

这里注意一下, D K L ( p ∣ ∣ q ) ≠ D K L ( q ∣ ∣ p ) D_{KL}(p||q) \neq D_{KL}(q||p) DKL(p∣∣q)=DKL(q∣∣p),毕竟公式里的 p p p q q q的位置也不一样嘛。 D K L ( p ∣ ∣ q ) D_{KL}(p||q) DKL(p∣∣q)我们叫它前向KL散度, D K L ( q ∣ ∣ p ) D_{KL}(q||p) DKL(q∣∣p)是反向KL散度。(这个有需要的时候再扩展吧。)

1.2.2 高斯分布的KL散度

假设分布 p p p q q q满足高斯分布,那它们的KL散度的公式就可以写成下面的形式。(推导过程就不写了,有yi点麻烦)
K L ( p , q ) = l o g σ 2 σ 1 + σ 1 2 + ( μ 1 − μ 2 ) 2 2 σ 2 2 − 1 2 KL(p,q)=log\frac{\sigma_2}{\sigma_1}+\frac{\sigma_1^2+(\mu_1-\mu_2)^2}{2\sigma_2^2}-\frac{1}{2} KL(p,q)=logσ1σ2+2σ22σ12+(μ1μ2)221
(还记得啥是正态分布…吧…,我相信你记得!)
f ( x ) = 1 2 π σ e x p ( − ( x − μ ) 2 2 σ 2 ) , σ = ∑ i = 1 n ( x i − μ ) 2 n f(x)=\frac{1}{\sqrt{2\pi}\sigma}exp\bigg(-\frac{(x-\mu)^2}{2\sigma^2}\bigg) , \quad \sigma = \sqrt{\frac{\sum^{n}_{i=1}(x_i-\mu)^2}{n}} f(x)=2π σ1exp(2σ2(xμ)2),σ=ni=1n(xiμ)2

1.3 VAE

VAE它来了!想必涉猎过生成模型的都听过它的大名吧。之前搞GAN的时候听过但没打算学,结果扩散模型火了,又提到VAE,那就了解了解吧,总得知道谁为啥好,好在哪里,谁有啥不好,不好在哪里。(怎么越学越多啊o(≧口≦)o

参考:变分自编码器(一):原来是这么一回事 - 科学空间|Scientific Spaces (kexue.fm)

整个讲解浅显易懂,尤其是VAE的发展过程,涉及到的公式的含义,讲的挺清晰的,建议大家细细品读。这篇文章:变分自编码器(二):从贝叶斯观点出发 - 科学空间|Scientific Spaces (kexue.fm),我觉得也得好好看看,里面的概念和公式推导对之后扩散模型公式理解挺有帮助的。

1.3.1 单层VAE

接下来就用我自己的话大致解释一下VAE是怎么回事。

VAE毕竟也是个生成模型,那生成器是要有的。那用谁来生成?生成之后跟谁比较然后优化呢?VAE的思路是,用我手里的数据 X X X(真实样本)去拟合一个分布 p ( X ) p(X) p(X),然后根据 p ( X ) p(X) p(X)采样出来数据 Z Z Z,通过生成器 g ( Z ) g(Z) g(Z)生成 X ^ \hat{X} X^,用 X ^ \hat{X} X^去与 X X X对比,也就是希望把开始的 X X X给还原回来。大概就是这么个思路。苏神画了VAE的结构图,挺好理解的,对吧!

img

上面这个图当中,有几个点需要注意:

  • VAE为每个样本构造了专属于该样本的正态分布,然后采样来重构。

    • 这个涉及到后验分布。不是假设 p ( Z ) p(Z) p(Z)是正态分布的,而是假设 p ( Z ∣ X ) p(Z|X) p(ZX)(后验分布)是正态分布,可以理解吗?就是我在知道X的情况Z的概率属于正态分布,这个情况就是后验分布。因为如果直接假设 p ( Z ) p(Z) p(Z)是正态分布,采样得到若干 Z Z Z,然后生成 X ^ \hat{X} X^,我i们不能判断 X ^ \hat{X} X^与原数据 X X X的分布是否一样,毕竟原数据的分布我们不知道。

    • 至于为什么要专属的呢,是因为我们希望的是由 X X X样本采样出来 Z Z Z,能够还原为 X X X,就是一对一的关系,避免我随便一个 Z Z Z生成的 X ^ \hat{X} X^不知道对应着哪个 X X X.

    • 还有为什么是正态分布呢?这就又要提到KL散度了,所以为什么用到KL散度了呢?… (啊啊啊啊~怎么这么多问题!一会儿再讲!冷静!慢慢来!先往下看!我会提醒你的:)

    • 你先假设,假设是正态分布。

  • 均值方差计算模块产生各个样本的均值和方差。这里均值就代表着采样得到的结果,方差就是噪声。

    • 这里的采样结果 Z Z Z是有均值和方差共同影响生成的。训练希望 X ^ \hat{X} X^接近 X X X,那也就意味着,希望噪声没那么强,想让噪声越小越好。但是没有噪声,那得到也只是个确定的结果,也不就没有生成的意义了嘛。

    • VAE为了防止噪声为0,保证生成的能力。规定 p ( Z ∣ X ) p(Z|X) p(ZX)接近标准正态分布 N ( 0 , I ) \mathcal{N}(0,I) N(0,I)。这里就比较巧妙,先放推导公式:
      p ( Z ) = ∑ X p ( Z ∣ X ) p ( X ) = ∑ X N ( 0 , I ) p ( X ) = N ( 0 , I ) ∑ X p ( X ) = N ( 0 , I ) \begin{aligned} p(Z) &= \sum_{X}p(Z|X)p(X) \\ &= \sum_{X}\mathcal{N}(0,I)p(X) \\ &= \mathcal{N}(0,I)\sum_{X}p(X) \\ &= \mathcal{N}(0,I) \end{aligned} p(Z)=Xp(ZX)p(X)=XN(0,I)p(X)=N(0,I)Xp(X)=N(0,I)
      还记得之前说过的先验分布和后验分布吧。你想想看,在规定 p ( Z ∣ X ) p(Z|X) p(ZX)接近标准正态分布 N ( 0 , I ) \mathcal{N}(0,I) N(0,I)后,先验分布 p ( Z ) p(Z) p(Z)也满足了正态分布,那是不是就意味着,我们就只是从一个正态分布中采样出来若干个 Z Z Z,这些 Z Z Z也满足正态分布,确确实实地保留着随机性。同时我们也可以判断由 Z Z Z生成的 X ^ \hat{X} X^与原数据 X X X的分布是否一样,因为都是接近正态分布的嘛。

      妙啊!兜来兜去又转回来了!(要是没有理解我的解释的话,可以去看一下原文,会讲的更详细一点)

    • 那怎么样让 p ( Z ∣ X ) p(Z|X) p(ZX)接近标准正态分布 N ( 0 , I ) \mathcal{N}(0,I) N(0,I)呢?KL散度来啦!用 K L ( N ( μ , σ 2 ) ∣ ∣ N ( 0 , I ) ) KL\bigg(\mathcal{N}(\mu,\sigma^2)||\mathcal{N}(0,I)\bigg) KL(N(μ,σ2)∣∣N(0,I))来作为额外的loss。

      至于之前问为什么选择正态分布,也是与KL散度有关系,因为公式中存在除法,会涉及到分母为零的情况。正态分布所有点的概率密度都是非负的,所以就避免了这个问题。

      这一部分的公式推导很多,但是我感觉目前不用了解太详细。毕竟VAE在这里只是补充了解的作用。如果想深入学习的话,看原文!

下面这张图我觉得挺好的,贴上来看看。

img

其实VAE里也有所谓对抗的过程,之前提到希望 X ^ \hat{X} X^接近 X X X就让噪声越小越好,但是KL Loss又希望有高斯噪声去接近正态分布。这就是一个对抗的过程,但是是共同进步的。与GAN不同,GAN是在训练生成器G的时候,将判别器D冻住。

VAE大概就是这样啦!(o゜▽゜)o☆

1.3.2 重参数技巧

然后还有一个小点,重参数技巧(reparameterization trick)。这个对扩散模型公式推导有大用!

我们是从 p ( Z ∣ X k ) p(Z|X_k) p(ZXk)中采样出 Z k Z_k Zk,没问题吧。我们知道这是正态分布的,但是其实均值和方差都是模型算出来,之后还要通过backward优化这些参数,采样这个动作是不可导的,但是结果是可导的。

所以我们从 N ( μ , σ 2 ) \mathcal{N}(\mu,\sigma^2) N(μ,σ2)中采样一个 Z Z Z,就相当于从标准正态分布 N ( 0 , I ) \mathcal{N}(0,I) N(0,I)中采样一个 ϵ \epsilon ϵ,然后让 Z = μ + ϵ × σ Z=\mu + \epsilon \times \sigma Z=μ+ϵ×σ. 大概就是这个意思。这段话有大用!

1.4 负对数似然

这个在后面求loss函数的时候会涉及到。

1.4.1 似然函数

似然(likelihood)针对的是影响概率的位置参数,根据观察结果,来估计概率模型的参数。

数学表示就是:假设 X X X是离散随机变量,其概率质量函数 p p p依赖于参数 θ \theta θ,则
L ( θ ∣ x ) = p θ ( x ) = P θ ( X = x ) L(\theta | x) = p_{\theta}(x) = P_{\theta}(X = x) L(θx)=pθ(x)=Pθ(X=x)
其中, L ( θ ∣ x ) L(\theta|x) L(θx)就是参数 θ \theta θ的似然函数, x x x为随机变量 X X X的某一值。

1.4.2 最大似然估计

最大似然估计(Maximum Likelihood Estimation, MLE)就是:

我们有一个数据分布 P d a t a ( x ) P_{data}(x) Pdata(x),但是不知道分布的数学表达。所以就定义一个分布模型 P G ( x ; θ ) P_G(x;\theta) PG(x;θ),分布由参数 θ \theta θ决定。设 L L L是分布模型 P G ( x ; θ ) P_G(x;\theta) PG(x;θ)的样本的似然函数,我们要求出一个 θ \theta θ,使得含有参数 θ \theta θ的似然函数 L L L最大,也就是让我们定义的分布模型越接近数据分布。

似然函数表达式如下:
L = ∏ i = 1 m P G ( x i ; θ ) L = \prod^m_{i=1}P_G(x^i;\theta) L=i=1mPG(xi;θ)

1.4.3 对数似然

似然函数是很多项的乘积,取个对数是不是就相加了,计算相对更简单,求导也容易。就这么个作用。
l ( θ ) = ∑ i = 1 m l o g ( P G ( x i ; θ ) ) l(\theta)=\sum^m_{i=1}log \big( P_G(x^i;\theta) \big) l(θ)=i=1mlog(PG(xi;θ))

1.4.4 负对数似然

要做loss函数的话,就是要越小越好。似然函数我们是要越大越好,所以取负,就是越小越好啦。
l ( θ ) = − ∑ i = 1 m l o g ( P G ( x i ; θ ) ) l(\theta)= - \sum^m_{i=1}log \big( P_G(x^i;\theta) \big) l(θ)=i=1mlog(PG(xi;θ))

2 扩散模型

好!可算是到正文部分了,还在嘛(*≧︶≦))( ̄▽ ̄* )ゞ

附上一篇经典论文:Denoising Diffusion Probabilistic Models

在这里插入图片描述

一些个参考:

建议视频文字同时看,视频没跟上或者讲的不详细的,看文字版,手边放个演草纸推导一下。然后你会发现虽然不知道到底有没有用,但是推出来的感觉针布戳!我这里就不过多的涉及公式推导了,因为打公式打起来真的要命啊。建议自己去看给的参考链接,很详细。感觉这些公式对于理解代码来说也挺重要的。

我如果我没有理解错的话,所有的公式推导和化简的最终形态,就是最后的损失函数,这样就很简单合理地翻译成代码来训练模型啦!感觉公式推导化简完全就是理论抽象成简单的公式的过程,这就是数学的魅力吗ヽ(✿°▽゚)ノ。

扩散模型的过程其实和VAE有点像。整体思路就是先给数据加噪声,反反复复加噪声,让其接近正态分布,然后再还原回来。就这么个事!好!结束(bushi

理论上,模型主要分成两个部分,前向过程(forward process)反向过程(reverse process)。前向过程(扩散过程)就是给数据 x 0 x_0 x0加噪,让其充分接近正态分布图像 x T x_T xT(对应着下面这张图的从右向左过程);反向过程(逆扩散过程)就是去噪的过程,逐渐生成回 x 0 x_0 x0(从左向右的过程)。

在这里插入图片描述

有几个点可以留意一下:

  • 扩散过程中的当前图是由上一时间点的图像加噪来的(所有都是满足正态分布的)。但是由于遵循马尔可夫假设原则,实际计算上可以直接由 x 0 x_0 x0计算出来。
  • 反向过程,就是我们需要建立模型的环节,就是我们需要的生成模型了。那这个模型其实是拟合一个正态分布。当然优化的话,就是让模型去拟合扩散过程的正态分布啦,就要用到KL散度。
  • 优化目标。这个推导相当之复杂(开摆!)。总之通过一系列假设、化简、代换,最后由计算两个模型的KL散度,转化为计算噪声的拟合程度。也就是说由预测正态分布的均值、方差这些转化成了预测噪声。(这是咋想出来的?😔,只能说,🐂🍺!预测噪声这个点知道了的话,代码就能理解了。

2.1 扩散过程

扩散过程就是给数据一直加高斯噪声,直到这个数据变成了随机噪声。

具体的数学实现是怎么计算的呢!嘿!嘿!嘿!准备好了嘛(奸笑。

那先进行一些相关说明。我们假设原始数据 x 0 x_0 x0是满足分布 q ( x 0 ) q(x_0) q(x0)的,也就是 x ∼ q ( x 0 ) x \sim q(x_0) xq(x0)。因为是一遍遍加噪声嘛,所以我们设总共要 T T T步的扩散过程,每一步都要对上一步的数据 x t − 1 x_{t-1} xt1增加噪声,这个噪声的标准差 σ \sigma σ是由一个固定值 β t \beta_t βt来确定的,均值 μ \mu μ是由固定值 β t \beta_t βt和t时刻的数据 x t x_t xt确定的 ,所以加噪的操作就是
q ( x t ∣ x t − 1 ) = N ( x t ; 1 − β x t − 1 , β t I ) q(x_t|x_{t-1})=\mathcal{N}\big(x_t;\sqrt{1-\beta}x_{t-1}, \beta_tI\big) q(xtxt1)=N(xt;1β xt1,βtI)
整个过程是满足马尔可夫链的,所以就可以得到下面这个公式(提醒你一下,用到了[1.1.2](#1.1.2 基于马尔科夫假设的条件概率)的公式)
q ( x 1 : T ∣ x 0 ) = ∏ t = 1 T q ( x t ∣ x t − 1 ) q(x_{1:T}|x_0) = \prod^T_{t=1}q(x_t|x_{t-1}) q(x1:Tx0)=t=1Tq(xtxt1)
然后,精彩的来了!先说结论, x t x_t xt其实可以直接用 x 0 x_0 x0算出来

还记得重参数技巧嘛,我们可以将上面这个加噪的过程翻译一下:
x t = 1 − β t x t − 1 + β t ϵ t − 1 = α t x t − 1 + 1 − α t ϵ t − 1 \begin{aligned} x_t &= \sqrt{1-\beta_t}x_{t-1} + \sqrt{\beta_t}\epsilon_{t-1} \\ &= \sqrt{\alpha_t}x_{t-1} + \sqrt{1-\alpha_t}\epsilon_{t-1} \end{aligned} xt=1βt xt1+βt ϵt1=αt xt1+1αt ϵt1
这里为了方便之后的表达式书写,所以设 a t = 1 − β t a_t=1-\beta_t at=1βt,到这里没问题吧?

然后递推公式,t-1时刻也可以用t-2时刻的来表示。具体的推导过程不多说,直接上结论,反正最后化简成这玩应儿了
x t = α t x t − 1 + 1 − α t ϵ t − 1 = ⋯ = α t ‾ x 0 + 1 − α t ‾ ϵ \begin{aligned} x_t &= \sqrt{\alpha_t}x_{t-1} + \sqrt{1-\alpha_t}\epsilon_{t-1} \\ &= \cdots \\ &= \sqrt{\overline{\alpha_t}}x_0+\sqrt{1-\overline{\alpha_t}}\epsilon \end{aligned} xt=αt xt1+1αt ϵt1==αt x0+1αt ϵ
所以就可以用分布 q ( x t ∣ x 0 ) q(x_t|x_0) q(xtx0)来表示啦,然后翻译一下:
q ( x t ∣ x 0 ) = N ( x t ; α t ‾ x 0 , ( 1 − α t ‾ ) I ) q(x_t|x_0) = \mathcal{N}\big(x_t;\sqrt{\overline{\alpha_t}}x_0, (1-\overline{\alpha_t})I\big) q(xtx0)=N(xt;αt x0,(1αt)I)
是不是很神奇!是!这个先放在这里,后面有用。

正向的部分结束!

2.2 反向过程

2.2.1 训练网络建模

逆扩散过程就是从高斯噪声中恢复原始数据,也就是生成数据的过程。我们用神经网络来估计这些分布。反向过程也是一个马尔科夫链过程哦。那我们可以定义一个分布模型:
p θ ( x 0 : T ) = p ( x T ) ∏ t = 1 T p θ ( x t − 1 ∣ x t ) p θ ( x t − 1 ∣ x t ) = N ( x t − 1 ; μ θ ( x t , t ) , Σ θ ( x t , t ) ) , p ( x T ) = N ( x T ; 0 , I ) p_\theta(x_{0:T})=p(x_T) \prod^T_{t=1} p_\theta (x_{t-1}|x_t) \\ p_\theta(x_{t-1}|x_t) = \mathcal{N} \big(x_{t-1}; \mu_\theta(x_t, t), \Sigma_\theta(x_t, t)\big), \quad p(x_T) = \mathcal{N}(x_T; 0,I) pθ(x0:T)=p(xT)t=1Tpθ(xt1xt)pθ(xt1xt)=N(xt1;μθ(xt,t),Σθ(xt,t)),p(xT)=N(xT;0,I)
这里的 p ( x T ) = N ( x T ; 0 , I ) p(x_T) = \mathcal{N}(x_T;0,I) p(xT)=N(xT;0,I) p θ ( x t − 1 ∣ x t ) p_\theta(x_{t-1}|x_t) pθ(xt1xt)是参数化的高斯分布,其均值和方差就是 μ θ ( x t , t ) \mu_\theta(x_t, t) μθ(xt,t) Σ θ ( x t , t ) \Sigma_\theta(x_t, t) Σθ(xt,t),也就是我们要训练的网络啦。

好!记住它!下一个环节!

2.2.2 对比用的标准分布

还记得正向过程中我们留下的式子吧,就是分布 q ( x t ∣ x 0 ) q(x_t|x_0) q(xtx0)。你想想看,我们建好的模型 p θ ( x t − 1 ∣ x t ) p_\theta(x_{t-1}|x_t) pθ(xt1xt)的意义是什么?是不是由 x t x_t xt推到 x t − 1 x_{t-1} xt1的概率,那我们需要的标准是不是也得是由 x t x_t xt推到 x t − 1 x_{t-1} xt1的概率,所以应该是 q ( x t − 1 ∣ x t ) q(x_{t-1}|x_t) q(xt1xt)啊。

可是现在只有 q ( x t ∣ x 0 ) q(x_t|x_0) q(xtx0),怎么办?算啊!怎么算?马尔科夫链!直接算不了 q ( x t − 1 ∣ x t ) q(x_{t-1}|x_t) q(xt1xt),我们可以求 q ( x t − 1 ∣ x t , x 0 ) q(x_{t-1}|x_t,x_0) q(xt1xt,x0)嘛!
q ( x t − 1 ∣ x t , x 0 ) = q ( x t ∣ x t − 1 , x 0 ) q ( x t − 1 ∣ x 0 ) q ( x t ∣ x 0 ) ∝ e x p ( − 1 2 ( ( x t − a t x t − 1 ) 2 β t + ( x t − 1 − a ‾ t − 1 x 0 ) 2 1 − α ‾ t − 1 − ( x t − α ‾ t x 0 ) 2 1 − α ‾ t ) ) = e x p ( − 1 2 ( ( α t β t + 1 1 − α ‾ t − 1 ) x t − 1 2 − ( 2 α t β t x t + 2 α ‾ t − 1 1 − α ‾ t − 1 x 0 ) x t − 1 + C ( x t , x 0 ) ) ) \begin{aligned} q(x_{t-1}|x_t, x_0) &= q(x_t|x_{t-1}, x_0) \frac{q(x_{t-1}|x_0)}{q(x_t|x_0)} \\ &\propto exp\bigg( -\frac{1}{2} \big( \frac{(x_t-\sqrt{a_t}x_{t-1})^2}{\beta_t}+\frac{(x_{t-1}-\sqrt{\overline{a}_{t-1}}x_0)^2}{1-\overline{\alpha}_{t-1}}-\frac{(x_t-\sqrt{\overline{\alpha}_t}x_0)^2}{1-\overline{\alpha}_t} \big) \bigg) \\ &= exp \bigg( -\frac{1}{2} \big( (\frac{\alpha_t}{\beta_t}+\frac{1}{1-\overline{\alpha}_{t-1}}) x^2_{t-1} - (\frac{2\sqrt{\alpha_t}}{\beta_t}x_t+\frac{2\sqrt{\overline{\alpha}_{t-1}}}{1-\overline{\alpha}_{t-1}}x_0)x_{t-1}+C(x_t, x_0) \big) \bigg) \end{aligned} q(xt1xt,x0)=q(xtxt1,x0)q(xtx0)q(xt1x0)exp(21(βt(xtat xt1)2+1αt1(xt1at1 x0)21αt(xtαt x0)2))=exp(21((βtαt+1αt11)xt12(βt2αt xt+1αt12αt1 x0)xt1+C(xt,x0)))
这里C与 x t − 1 x_{t-1} xt1无关,所以忽略,看成常量就行。所以exp大括号里面就可以看成是一个关于 x t − 1 x_{t-1} xt1的一元二次的式子了。高中数学的记忆还在不在?配方会不会?就是 a x 2 + b x = a ( x + b 2 a ) 2 + C ax^2+bx=a(x+\frac{b}{2a})^2+C ax2+bx=a(x+2ab)2+C,把上面配个方,就成了个正态分布的形式!整理化简一下,这个正态分布 q ( x t − 1 ∣ x t , x 0 ) q(x_{t-1}|x_t,x_0) q(xt1xt,x0)的均值和方差就是:
μ ~ t ( x t , x 0 ) = α t ( 1 − α ‾ t − 1 ) 1 − α ‾ t x t + α ‾ t − 1 β t 1 − α ‾ t x 0 β ~ t = 1 − α ‾ t − 1 1 − α ‾ t β t \widetilde{\mu}_t(x_t, 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} x_0 \\ \widetilde{\beta}_t = \frac{1-\overline{\alpha}_{t-1}}{1-\overline{\alpha}_t} \beta_t μ t(xt,x0)=1αtαt (1αt1)xt+1αtαt1 βtx0β t=1αt1αt1βt
还可以再化简一步,还记得 x t x_t xt可以用 x 0 x_0 x0表示的那个环节吗?是不是 x 0 x_0 x0也可以用 x t x_t xt表示一下,就是移个项再除一下系数那种。就是这样:
x t = α t ‾ x 0 + 1 − α t ‾ ϵ ↓ x 0 = 1 α ‾ t ( x t − 1 − α ‾ t ϵ t ) x_t = \sqrt{\overline{\alpha_t}}x_0+\sqrt{1-\overline{\alpha_t}}\epsilon \\ \downarrow \\ x_0 = \frac{1}{\sqrt{\overline{\alpha}_t}}(x_t-\sqrt{1-\overline{\alpha}_t}\epsilon_t) xt=αt x0+1αt ϵx0=αt 1(xt1αt ϵt)
那均值里面有 x 0 x_0 x0,所以就可以进一步化简:(把方差也放过来,方便之后观看)
μ ~ t = 1 α t ( x t − β t 1 − α ‾ t ϵ t ) β ~ t = 1 − α ‾ t − 1 1 − α ‾ t β t \widetilde{\mu}_t = \frac{1}{\sqrt{\alpha_t}} \bigg( x_t - \frac{\beta_t}{\sqrt{1-\overline{\alpha}_t}}\epsilon_t \bigg) \\ \widetilde{\beta}_t = \frac{1-\overline{\alpha}_{t-1}}{1-\overline{\alpha}_t} \beta_t μ t=αt 1(xt1αt βtϵt)β t=1αt1αt1βt
q ( x t − 1 ∣ x t , x 0 ) q(x_{t-1}|x_t, x_0) q(xt1xt,x0)也可以写成正态分布的表达式:
q ( x t − 1 ∣ x t , x 0 ) = N ( x t − 1 ; μ ~ t ( x t , x 0 ) , β ~ t I ) q(x_{t-1}|x_t, x_0) = \mathcal{N}(x_{t-1};\widetilde{\mu} _t(x_t, x_0),\widetilde{\beta}_tI) q(xt1xt,x0)=N(xt1;μ t(xt,x0),β tI)
好!这下我们有了训练模型 p θ ( x t − 1 ∣ x t ) p_\theta(x_{t-1}|x_t) pθ(xt1xt)和模型的标准参考 q ( x t − 1 ∣ x t , x 0 ) q(x_{t-1}|x_t, x_0) q(xt1xt,x0)(可忽略 x 0 x_0 x0,因为马尔科夫链),接下来就是优化,也就是要知道loss函数是什么。

2.3 优化!

从这里开始,逐渐离谱,不想写了(阴暗爬行)我尽力整理归纳,你们尽力理解(扶额)(叹气)这些都是咋想到的呢?

前面所有的表达式,都是为了优化这步做准备。没记住没关系,要用到什么,我会再相应的地方提醒你或者重复一遍,别嫌我墨迹就行( ̄▽ ̄)*

2.3.1 Loss总项

首先,要用到[负对数似然函数](#1.4 负对数似然)(emmm…,这里怎么解释的都有,反正最后推导过程都一样,问题不大)。

我们在负对数似然函数的基础上,加上KL散度,这样有了一个上界,上界小了,负对数似然函数也能小。
− log ⁡ p θ ( x 0 ) ≤ − log ⁡ p θ ( x 0 ) + D K L ( q ( x 1 : T ∣ x 0 ) ∣ ∣ p θ ( x 1 : T ∣ x 0 ) ) = ⋯ = E q [ log ⁡ q ( x 1 : T ∣ x 0 ) p θ ( x 0 : T ) ] \begin{aligned} -\log{p_\theta(x_0)} &\leq -\log{p_\theta(x_0)}+D_{KL}(q(x_{1:T}|x_0)||p_\theta(x_{1:T}|x_0)) \\ &= \cdots \\ &=\mathbb{E}_q \big[ \log{\frac{q(x_{1:T}|x_0)}{p_\theta(x_{0:T})}} \big] \end{aligned} logpθ(x0)logpθ(x0)+DKL(q(x1:Tx0)∣∣pθ(x1:Tx0))==Eq[logpθ(x0:T)q(x1:Tx0)]
然后我们让
L = E q ( x 1 : T ∣ x 0 ) [ log ⁡ q ( x 1 : T ∣ x 0 ) p θ ( x 0 : T ) ] L = \mathbb{E}_{q(x_{1:T}|x_0)}\big[ \log{\frac{q(x_{1:T}|x_0)}{p_\theta(x_{0:T})}} \big] L=Eq(x1:Tx0)[logpθ(x0:T)q(x1:Tx0)]
然后就是展开、化简。
L = E q ( x 1 : T ∣ x 0 ) [ log ⁡ q ( x 1 : T ∣ x 0 ) p θ ( x 0 : T ) ] = ⋯ = D K L ( q ( x T ∣ x 0 ) ∣ ∣ p θ ( x T ) ) ⏟ L T + ∑ t = 2 T E q ( x t ∣ x 0 ) [ D K L ( q ( x t − 1 ∣ x t , x 0 ) ∣ ∣ p θ ( x t − 1 ∣ x t ) ) ] ⏟ L t − 1 − E q ( x 1 ∣ x 0 ) log ⁡ p θ ( x 0 ∣ x 1 ) ⏟ L 0 \begin{aligned} L &= \mathbb{E}_{q(x_{1:T}|x_0)}\big[ \log{\frac{q(x_{1:T}|x_0)}{p_\theta(x_{0:T})}} \big] \\ &= \cdots \\ &= \underbrace{D_{KL} \big( q(x_T|x_0) || p_\theta(x_T) \big)}_{L_T} + \sum^{T}_{t=2} \underbrace{\mathbb{E}_{q(x_t|x_0)} \big[ D_{KL}(q(x_{t-1}|x_t,x_0)||p_\theta(x_{t-1}|x_t)) \big]}_{L_{t-1}} - \underbrace{\mathbb{E}_{q(x_1|x_0)} \log{p_\theta(x_0|x_1)}}_{L_0} \end{aligned} L=Eq(x1:Tx0)[logpθ(x0:T)q(x1:Tx0)]==LT DKL(q(xTx0)∣∣pθ(xT))+t=2TLt1 Eq(xtx0)[DKL(q(xt1xt,x0)∣∣pθ(xt1xt))]L0 Eq(x1x0)logpθ(x0x1)
过程你别管,就是化简(偷懒)。反正就是最后剩下着三个部分。
L T = D K L ( q ( x T ∣ x 0 ) ∣ ∣ p θ ( x T ) ) L t − 1 = E q ( x t ∣ x 0 ) [ D K L ( q ( x t − 1 ∣ x t , x 0 ) ∣ ∣ p θ ( x t − 1 ∣ x t ) ) ] L 0 = E q ( x 1 ∣ x 0 ) log ⁡ p θ ( x 0 ∣ x 1 ) \begin{aligned} & L_T = D_{KL} \big( q(x_T|x_0) || p_\theta(x_T) \big) \\ & L_{t-1} = \mathbb{E}_{q(x_t|x_0)} \big[ D_{KL}(q(x_t-1|x_t,x_0)||p_\theta(x_{t-1}|x_t)) \big] \\ & L_0 = \mathbb{E}_{q(x_1|x_0)} \log{p_\theta(x_0|x_1)} \end{aligned} LT=DKL(q(xTx0)∣∣pθ(xT))Lt1=Eq(xtx0)[DKL(q(xt1∣xt,x0)∣∣pθ(xt1xt))]L0=Eq(x1x0)logpθ(x0x1)
接下来,这三项,就分别求呗。

2.3.2 L 0 L_0 L0分项

这部分没太看懂>︿<,等我去研究研究扩散模型的的代码,再回来补充。

论文中最后对loss进行了化简,没有算上这个部分,所以可以暂时忽略这一趴。

L 0 L_0 L0这部分相当于从连续空间到离散空间的解码loss,优化的是对数似然, L 0 L_0 L0可以用估计的 N ( x 0 ; μ θ ( x 1 , 1 ) , σ 1 2 I ) \mathcal{N}(x_0;\mu_\theta(x_1, 1),\sigma^2_1I) N(x0;μθ(x1,1),σ12I)来构建一个离散化的解码器来计算:
p θ ( x 0 ∣ x 1 ) = ∏ i = 1 D ∫ δ − ( x 0 i ) δ + ( x 0 i ) N ( x 0 ; μ θ i ( x 1 , 1 ) , σ 1 2 ) d x δ + ( x ) = { ∞ i f x = 1 x + 1 255 i f x < 1 δ − ( x ) = { − ∞ i f x = − 1 x − 1 255 i f x > − 1 \begin{aligned} p_{\theta}(x_0|x_1) &= \prod^D_{i=1} \int_{\delta_{-}(x_0^i)}^{\delta_{+}(x_0^i)} \mathcal{N}(x_0; \mu_\theta^i(x_1,1),\sigma_1^2)dx \\ \delta_{+}(x) &= \begin{cases} \infty & if \quad x = 1 \\ x+\frac{1}{255} & if \quad x < 1 \\ \end{cases} \\ \delta_{-}(x) &= \begin{cases} -\infty & if \quad x = -1 \\ x - \frac{1}{255} & if \quad x > -1 \\ \end{cases} \end{aligned} pθ(x0x1)δ+(x)δ(x)=i=1Dδ(x0i)δ+(x0i)N(x0;μθi(x1,1),σ12)dx={x+2551ifx=1ifx<1={x2551ifx=1ifx>1

2.3.3 L T L_T LT分项

回忆! q ( x T ∣ x 0 ) q(x_T|x_0) q(xTx0) p θ ( x T ) p_\theta(x_T) pθ(xT)是啥?
q ( x t ∣ x 0 ) = N ( x t ; α t ‾ x 0 , ( 1 − α t ‾ ) I ) p ( x T ) = N ( x T ; 0 , I ) q(x_t|x_0) = \mathcal{N}\big(x_t;\sqrt{\overline{\alpha_t}}x_0, (1-\overline{\alpha_t})I\big) \\ p(x_T) = \mathcal{N}(x_T;0,I) q(xtx0)=N(xt;αt x0,(1αt)I)p(xT)=N(xT;0,I)
这里DDPM论文里是将方差固定了,所以 L T L_T LT这项就是个常数了。

2.3.4 L t − 1 L_{t-1} Lt1小项

这里,有意思的来了,就是那个把预测均值转化成预测噪声的骚操作!这个经过实验证明,确实预测噪声要比预测均值效果要好。嗯,神奇!

还是回忆! q ( x t − 1 ∣ x t , x 0 ) q(x_{t-1}|x_t,x_0) q(xt1xt,x0) p θ ( x t − 1 ∣ x t ) p_\theta(x_{t-1}|x_t) pθ(xt1xt)是啥?
q ( x t − 1 ∣ x t , x 0 ) = N ( x t − 1 ; μ ~ t ( x t , x 0 ) , β ~ t I ) p θ ( x t − 1 ∣ x t ) = N ( x t − 1 ; μ θ ( x t , t ) , Σ θ ( x t , t ) ) q(x_{t-1}|x_t, x_0) = \mathcal{N}(x_{t-1};\widetilde{\mu} _t(x_t, x_0),\widetilde{\beta}_tI) \\ p_\theta(x_{t-1}|x_t) = \mathcal{N} \big(x_{t-1}; \mu_\theta(x_t, t), \Sigma_\theta(x_t, t)\big) q(xt1xt,x0)=N(xt1;μ t(xt,x0),β tI)pθ(xt1xt)=N(xt1;μθ(xt,t),Σθ(xt,t))
求它俩的KL散度。这里论文里是将 p θ ( x t − 1 ∣ x t ) p_\theta(x_{t-1}|x_t) pθ(xt1xt)的方差 Σ θ ( x t , t ) \Sigma_\theta(x_t, t) Σθ(xt,t)设置成一个与 β \beta β相关的常数了,还记得[两个正态分布的KL散度](#1.2.2 高斯分布的KL散度)怎么计算吧?
K L ( p , q ) = l o g σ 2 σ 1 + σ 1 2 + ( μ 1 − μ 2 ) 2 2 σ 2 2 − 1 2 KL(p,q)=log\frac{\sigma_2}{\sigma_1}+\frac{\sigma_1^2+(\mu_1-\mu_2)^2}{2\sigma_2^2}-\frac{1}{2} KL(p,q)=logσ1σ2+2σ22σ12+(μ1μ2)221
代进去,化简:
D K L ( q ( x t − 1 ∣ x t , x 0 ) ∣ ∣ p θ ( x t − 1 ∣ x t ) ) = 1 2 σ t 2 ∣ ∣ μ ~ t ( x t , x 0 ) − μ θ ( x t , t ) ∣ ∣ 2 + C D_{KL}(q(x_t-1|x_t,x_0)||p_\theta(x_{t-1}|x_t)) = \frac{1}{2\sigma^2_t}||\widetilde{\mu} _t(x_t, x_0) - \mu_{\theta}(x_t, t)||^2 + C DKL(q(xt1∣xt,x0)∣∣pθ(xt1xt))=2σt21∣∣μ t(xt,x0)μθ(xt,t)2+C
所以
L t − 1 = E q ( x t ∣ x 0 ) [ 1 2 σ t 2 ∣ ∣ μ ~ t ( x t , x 0 ) − μ θ ( x t , t ) ∣ ∣ 2 ] + C L_{t-1}=\mathbb{E}_{q(x_t|x_0)} \big[ \frac{1}{2\sigma^2_t}||\widetilde{\mu}_t(x_t, x_0) - \mu_{\theta}(x_t, t)||^2 \big] + C Lt1=Eq(xtx0)[2σt21∣∣μ t(xt,x0)μθ(xt,t)2]+C
还记得 μ ~ t ( x t , x 0 ) \widetilde{\mu}_t(x_t, x_0) μ t(xt,x0)是可以进一步化简的吧,就是 x 0 x_0 x0也可以用 x t x_t xt表示的那个:
x 0 = 1 α ‾ t ( x t − 1 − α ‾ t ϵ t ) μ ~ t = 1 α t ( x t − β t 1 − α ‾ t ϵ t ) x_0 = \frac{1}{\sqrt{\overline{\alpha}_t}}(x_t-\sqrt{1-\overline{\alpha}_t}\epsilon_t) \\ \widetilde{\mu}_t = \frac{1}{\sqrt{\alpha_t}} \bigg( x_t - \frac{\beta_t}{\sqrt{1-\overline{\alpha}_t}}\epsilon_t \bigg) x0=αt 1(xt1αt ϵt)μ t=αt 1(xt1αt βtϵt)
写标准一点的话,就是
μ ~ t ( x t , x 0 ) = 1 α t ( x t ( x 0 , ϵ ) − β t 1 − α ‾ t ϵ t ) \widetilde{\mu}_t(x_t, x_0) = \frac{1}{\sqrt{\alpha_t}} \bigg( x_t(x_0,\epsilon) - \frac{\beta_t}{\sqrt{1-\overline{\alpha}_t}}\epsilon_t \bigg) μ t(xt,x0)=αt 1(xt(x0,ϵ)1αt βtϵt)
先放一边!还有一项 μ θ ( x t , t ) \mu_{\theta}(x_t, t) μθ(xt,t),这个是我们建的模 p θ ( x t − 1 ∣ x t ) p_\theta(x_{t-1}|x_t) pθ(xt1xt)的均值。这里作者的骚操作就来了, μ ~ t ( x t , x 0 ) \widetilde{\mu}_t(x_t, x_0) μ t(xt,x0)最后是可以用 x t x_t xt和随机变量 ϵ \epsilon ϵ表示,对于我们的模型来说, x t x_t xt是什么?是不是我前向的时候加噪得到的乱糟的图像,所以是已知的,但是噪声模型它不知道啊,所以我们是不是可以预测一个噪声去拟合设立的标准分布!也就相当于用均值去拟合,对不对!

所以:
μ θ ( x t , t ) = μ ~ t ( x t , x 0 ( x t , ϵ θ ) ) = μ ~ t ( x t , 1 α ‾ t ( x t − 1 − α ‾ t ϵ θ ( x t ) ) ) = 1 α t ( x t − β t 1 − α ‾ t ϵ θ ( x t , t ) ) \begin{aligned} \mu_{\theta}(x_t, t) &= \widetilde{\mu}_t(x_t, x_0(x_t,\epsilon_{\theta})) \\ &= \widetilde{\mu}_t \bigg( x_t, \frac{1}{\sqrt{\overline{\alpha}_t}}(x_t-\sqrt{1-\overline{\alpha}_t}\epsilon_{\theta}(x_t)) \bigg) \\ &= \frac{1}{\sqrt{\alpha}_t} \bigg( x_t-\frac{\beta_t}{\sqrt{1-\overline{\alpha}_t}}\epsilon_{\theta}(x_t,t) \bigg) \end{aligned} μθ(xt,t)=μ t(xt,x0(xt,ϵθ))=μ t(xt,αt 1(xt1αt ϵθ(xt)))=α t1(xt1αt βtϵθ(xt,t))
这俩代进去:
L t − 1 − C = E x 0 , ϵ [ 1 2 σ t 2 ∣ ∣ 1 α t ( x t ( x 0 , ϵ ) − β t 1 − α ‾ t ϵ t ) − 1 α t ( x t − β t 1 − α ‾ t ϵ θ ( x t , t ) ) ∣ ∣ 2 ] = E x 0 , ϵ [ β t 2 2 σ t 2 α t ( 1 − α ‾ t ) ∣ ∣ ϵ − ϵ θ ( α ‾ t x 0 + 1 − α ‾ t ϵ , t ) ∣ ∣ 2 ] \begin{aligned} L_{t-1} - C &= \mathbb{E}_{x_0,\epsilon} \bigg[ \frac{1}{2\sigma^2_t}|| \frac{1}{\sqrt{\alpha_t}} \bigg( x_t(x_0,\epsilon) - \frac{\beta_t}{\sqrt{1-\overline{\alpha}_t}}\epsilon_t \bigg) - \frac{1}{\sqrt{\alpha}_t} \bigg( x_t-\frac{\beta_t}{\sqrt{1-\overline{\alpha}_t}}\epsilon_{\theta}(x_t,t) \bigg) ||^2 \bigg] \\ &= \mathbb{E}_{x_0,\epsilon} \bigg[ \frac{\beta^2_t}{2\sigma^2_t \alpha_t(1-\overline{\alpha}_t)} || \epsilon - \epsilon_{\theta}(\sqrt{\overline{\alpha}_t}x_0 + \sqrt{1-\overline{\alpha}_t} \epsilon, t) ||^2 \bigg] \end{aligned} Lt1C=Ex0,ϵ[2σt21∣∣αt 1(xt(x0,ϵ)1αt βtϵt)α t1(xt1αt βtϵθ(xt,t))2]=Ex0,ϵ[2σt2αt(1αt)βt2∣∣ϵϵθ(αt x0+1αt ϵ,t)2]

2.3.5 整理总结

论文里,作者又进一步简化,直接系数不要了,化简成这样:
L s i m p l e ( θ ) = E x 0 , ϵ [ ∣ ∣ ϵ − ϵ θ ( α ‾ t x 0 + 1 − α ‾ t ϵ , t ) ∣ ∣ 2 ] L_{simple}(\theta)= \mathbb{E}_{x_0,\epsilon} \bigg[ || \epsilon - \epsilon_{\theta}(\sqrt{\overline{\alpha}_t}x_0 + \sqrt{1-\overline{\alpha}_t} \epsilon, t) ||^2 \bigg] Lsimple(θ)=Ex0,ϵ[∣∣ϵϵθ(αt x0+1αt ϵ,t)2]

扩散模型理论部分就先写到这里吧!我去看看代码ヽ(゜▽゜ )-C<(/;◇;)/~

感谢观看!

  • 13
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值