Denoising Diffusion Probabilistic Model原理+代码复现

DDPM原理推导

复现的源码:denoising-diffusion-pytorch | https://github.com/FMsunyh/denoising-diffusion-pytorch

自己的学习心得和部分笔记,希望对您有所帮助。

更新记录

  • 2023-11-15 Training Process推导
  • 2023-11-19 Sampling Process推导

前提知识

1.Markov:当前位置的概率只会受前一时刻概率影响

马尔可夫链的定义,在任何一本随机过程书籍中都可以查到的内容。

p ( x t + 1 ∣ x t , x t − 1 , . . . , x 1 ) = p ( x t + 1 ∣ x t ) (1) p(x_{t+1}|x_{t},x_{t-1},...,x_{1})=p(x_{t+1}|x_{t}) \tag{1} p(xt+1xt,xt1,...,x1)=p(xt+1xt)(1)

这个定义以及它的性质,在后面的证明中会使用到。

解释性例子

无记忆性,当天的股票表现仅仅是和前一天有关,与历史其他状态无关。

2.正态分布(高斯分布)叠加性

当有两个独立的正态分布变量 X X X Y Y Y时,它们的均值与方差分别为 μ x μ_x μx, μ y μ_y μy σ x 2 σ^2_x σx2, σ y 2 σ^2_y σy2。我们要使用到的2条性质如下:

相加性 U = X + Y U=X+Y U=X+Y

均值: E ( U ) = E ( X + Y ) = μ x + μ y E(U) = E(X + Y) = \mu_x + \mu_y E(U)=E(X+Y)=μx+μy
方差: V a r ( U ) = V a r ( X + Y ) = σ x 2 + σ y 2 Var(U) = Var(X + Y) = \sigma^2_x + \sigma^2_y Var(U)=Var(X+Y)=σx2+σy2

即,它们的和也满足正态分布 U = X + Y U=X+Y U=X+Y ~ N ( μ x + μ y , σ x 2 + σ y 2 ) N(\mu_x+\mu_y, \sigma^2_x + \sigma^2_y) N(μx+μy,σx2+σy2)

相减性 V = X − Y V=X-Y V=XY

均值: E ( V ) = E ( X − Y ) = μ x − μ y E(V) = E(X - Y) = \mu_x - \mu_y E(V)=E(XY)=μxμy
方差: V a r ( V ) = V a r ( X − Y ) = σ x 2 + σ y 2 Var(V) = Var(X - Y) = \sigma^2_x + \sigma^2_y Var(V)=Var(XY)=σx2+σy2

即,它们的差也满足正态分布 U = X − Y U=X-Y U=XY ~ N ( μ x − μ y , σ x 2 + σ y 2 ) N(\mu_x-\mu_y, \sigma^2_x + \sigma^2_y) N(μxμy,σx2+σy2)

3.贝叶斯:

P ( B ∣ A ) = P ( A ∣ B ) ⋅ P ( B ) P ( A ) P(B | A) = \frac{{P(A | B) \cdot P(B)}}{{P(A)}} P(BA)=P(A)P(AB)P(B)

P ( A ) P(A) P(A)是常数,已知的, P ( B ) P(B) P(B)是先验概率, P ( A ∣ B ) P(A | B) P(AB)是似然, P ( B ∣ A ) P(B | A) P(BA)是后验概率。

A是数据,可以理解为我们的训练数据,B就是你当前的认知,而 P ( B ∣ A ) P(B | A) P(BA)就是我们学习了新的数据后,得到的新认知。

4.在给定条件C下的贝叶斯:

P ( B ∣ A , C ) = P ( A ∣ B , C ) ⋅ P ( B ∣ C ) P ( A ∣ C ) P(B | A, C) = \frac{{P(A | B, C) \cdot P(B | C)}}{{P(A | C)}} P(BA,C)=P(AC)P(AB,C)P(BC)

END


Forward Process

前向过程,也就是给原图加噪过程,从 x 0 x_0 x0 x t x_t xt的过程,该过程可以视为马尔科夫链过程,满足::

p ( x t ∣ x t − 1 ) = N ( x t ; α t x t − 1 , β t I ) p(x_t|x_{t-1})=\mathcal{N}(x_t;\sqrt{\alpha_t}x_{t-1}, \beta_t I) p(xtxt1)=N(xt;αt xt1,βtI)

x t = α t x t − 1 + β t ϵ t      ϵ t ∼ N ( 0 , I ) x_t = \sqrt{\alpha_t} x_{t-1} + \sqrt{\beta_t} \epsilon_t \; \; \epsilon_t \sim \mathcal{N}(0,I) xt=αt xt1+βt ϵtϵtN(0,I)

α t = 1 − β t \alpha_t=1-\beta_t αt=1βt

其中 β t ∈ ( 0 , 1 ) \beta_t \in(0,1) βt(0,1)为高斯分布的方差超差,并满足 β 1 < β 2 < . . . < β T \beta_1<\beta_2<...<\beta_T β1<β2<...<βT

前两行公式是一个意思,表示 x t − 1 x_{t-1} xt1加上一个高斯噪声得到 x t x_{t} xt α t = 1 − β t \alpha_t=1-\beta_t αt=1βt是一个超参数,已知值。

推导 x t x_{t} xt x 0 x_{0} x0的关系,对公式$x_t = \sqrt{\alpha_t} x_{t-1} + \sqrt{\beta_t} \epsilon_t ; ; \epsilon_t \sim \mathcal{N}(0,I) $进行展开:

x t = α t x t − 1 + β t ϵ t      ϵ t ∼ N ( 0 , I ) x t − 1 = α t − 1 x t − 2 + β t − 1 ϵ t − 1      ϵ t − 1 ∼ N ( 0 , I ) . . . x 1 = α 1 x 0 + β 1 ϵ 1      ϵ 1 ∼ N ( 0 , I ) \begin{aligned} x_t &= \sqrt{\alpha_t} x_{t-1} + \sqrt{\beta_t} \epsilon_t \; \; \epsilon_t \sim \mathcal{N}(0,I) \\ x_{t-1} &= \sqrt{\alpha_{t-1}} x_{t-2} + \sqrt{\beta_{t-1}} \epsilon_{t-1} \; \; \epsilon_{t-1} \sim \mathcal{N}(0,I) \\ ... \\ x_1 &= \sqrt{\alpha_{1}} x_0 + \sqrt{\beta_1} \epsilon_1 \; \; \epsilon_1 \sim \mathcal{N}(0,I) \\ \end{aligned} xtxt1...x1=αt xt1+βt ϵtϵtN(0,I)=αt1 xt2+βt1 ϵt1ϵt1N(0,I)=α1 x0+β1 ϵ1ϵ1N(0,I)

x t − 1 x_{t-1} xt1 β t = 1 − α t \beta_t=1-\alpha_t βt=1αt 代入 x t x_{t} xt,得到:
x t = α t x t − 1 + β t ϵ t = α t ( α t − 1 x t − 2 + 1 − α t − 1 ϵ t − 1 ) + 1 − α t ϵ t = α t α t − 1 x t − 2 + α t 1 − α t − 1 ϵ t − 1 + 1 − α t ϵ t = α t α t − 1 x t − 2 + α t − α t α t − 1 ϵ t − 1 + 1 − α t ϵ t = α t α t − 1 x t − 2 + α t − α t α t − 1 2 + 1 − α t 2 ϵ t − 2 = α t α t − 1 x t − 2 + 1 − α t α t − 1 ϵ t − 2 = … = ∏ i = 1 t α i x 0 + 1 − ∏ i = 1 t α i ϵ 0 = α t ˉ x 0 + 1 − α t ˉ ϵ 0 ;设: α ˉ t = α 1 . . . α t ∼ N ( x t , α t ˉ x 0 , ( 1 − α t ˉ ) I ) \begin{aligned} x_t &= \sqrt{\alpha_t} x_{t-1} + \sqrt{\beta_t} \epsilon_t \\ &=\sqrt{\alpha_t} (\sqrt{\alpha_{t-1}} x_{t-2} + \sqrt{1-\alpha_{t-1}} \epsilon_{t-1}) + \sqrt{1-\alpha_t} \epsilon_t \\ &=\sqrt{\alpha_t} \sqrt{\alpha_{t-1}} x_{t-2} + \sqrt{\alpha_t} \sqrt{1-\alpha_{t-1}} \epsilon_{t-1} + \sqrt{1-\alpha_t} \epsilon_t \\ &=\sqrt{\alpha_t\alpha_{t-1}} x_{t-2} + \sqrt{\alpha_t-\alpha_t\alpha_{t-1}} \epsilon_{t-1} + \sqrt{1-\alpha_t} \epsilon_t \\ &=\sqrt{\alpha_t\alpha_{t-1}} x_{t-2} + \sqrt{\sqrt{\alpha_t-\alpha_t\alpha_{t-1}}^2 + \sqrt{1-\alpha_t}^2} \epsilon_{t-2} \\ &=\sqrt{\alpha_t\alpha_{t-1}} x_{t-2} + \sqrt{1-\alpha_t\alpha_{t-1}} \epsilon_{t-2} \\ &=\dots \\ &=\sqrt{\prod_{i=1}^t{\alpha_i}}x_0 + \sqrt{1-\prod_{i=1}^t{\alpha_i}}\epsilon_0 \\ &=\sqrt{\bar{\alpha_t}}x_0 + \sqrt{1-\bar{\alpha_t}}\epsilon_0;设:\bar{\alpha}_t= \alpha_1...\alpha_t \\ &\sim \mathcal{N}(x_t, \sqrt{\bar{\alpha_t}}x_0, (1-\bar{\alpha_t})I) \end{aligned} xt=αt xt1+βt ϵt=αt (αt1 xt2+1αt1 ϵt1)+1αt ϵt=αt αt1 xt2+αt 1αt1 ϵt1+1αt ϵt=αtαt1 xt2+αtαtαt1 ϵt1+1αt ϵt=αtαt1 xt2+αtαtαt1 2+1αt 2 ϵt2=αtαt1 xt2+1αtαt1 ϵt2==i=1tαi x0+1i=1tαi ϵ0=αtˉ x0+1αtˉ ϵ0;设:αˉt=α1...αtN(xt,αtˉ x0,(1αtˉ)I)

其中,
公式$\sqrt{\sqrt{\alpha_t-\alpha_t\alpha_{t-1}}^2 + \sqrt{1-\alpha_t}^2} \epsilon_{t-2} $ ,用到了2个高斯分布相加的性质;
公式 α t ˉ x 0 + 1 − α t ˉ ϵ 0 \sqrt{\bar{\alpha_t}}x_0 + \sqrt{1-\bar{\alpha_t}}\epsilon_0 αtˉ x0+1αtˉ ϵ0, 用到了参数重整技巧

最后得到 x t 和 x 0 x_{t}和x_0 xtx0的关系, p ( x t ∣ x 0 ) p(x_{t}|x_0) p(xtx0)
p ( x t ∣ x 0 ) = α ˉ t x 0 + 1 − α ˉ t ϵ      ϵ ∼ N ( 0 , I ) p(x_{t}|x_0) = \sqrt{\bar{\alpha}_{t}}x_0 + \sqrt{1-\bar{\alpha}_{t}}\epsilon \; \; \epsilon \sim \mathcal{N}(0, I) p(xtx0)=αˉt x0+1αˉt ϵϵN(0,I)

到这里,我们就可以知道,已知 x 0 x_0 x0 α ˉ t \bar{\alpha}_{t} αˉt ϵ \epsilon ϵ高斯采样,直接得到 x t x_{t} xt

回到论文中的公式
Denoising Diffusion Probabilistic Model原理+代码复现_第1张图片

  • Step1 随机挑选一张训练图 x 0 x_0 x0
  • Step2 选择time step t t t生成高斯noisy,称之为GT noisy。
  • Step3 红色框表达的就是(clean image+noisy), x 0 x_0 x0+noisy,得到一张noisy image,再结合time step t t t,输入到模型,模型输出是一个predict noisy。
  • Step4 GT noisy和predict noisy做差,求目标函数。
  • 重复Step1~4。

两个高斯分布求距离,论文中用了KL散度去计算距离。

END


Sampling Process

贝叶斯公式
p ( x t − 1 ∣ x t ) = p ( x t ∣ x t − 1 ) ⋅ p ( x t − 1 ) p ( x t ) p(x_{t-1}|x_t) = \frac{{p(x_t | x_{t-1}) \cdot p(x_{t-1})}}{{p(x_t)}} p(xt1xt)=p(xt)p(xtxt1)p(xt1)

问题是: p ( x t − 1 )    , p ( x t ) p(x_{t-1}) \; , p(x_t) p(xt1),p(xt)未知,因为无法直接从 x t x_t xt推导 x t − 1 x_{t-1} xt1
但是可以在 x 0 x_0 x0的条件下进行推导,引入条件贝叶斯公式:

p ( x t − 1 ∣ x t , x 0 ) = p ( x t ∣ x t − 1 , x 0 ) ⋅ p ( x t − 1 ∣ x 0 ) p ( x t ∣ x 0 ) = p ( x t ∣ x t − 1 ) ⋅ p ( x t − 1 ∣ x 0 ) p ( x t ∣ x 0 ) (3) p(x_{t-1}|x_t, x_0) = \frac{{p(x_t | x_{t-1}, x_0) \cdot p(x_{t-1}|x_0)}}{{p(x_t|x_0)}} = \frac{{p(x_t | x_{t-1}) \cdot p(x_{t-1}|x_0)}}{{p(x_t|x_0)}} \tag{3} p(xt1xt,x0)=p(xtx0)p(xtxt1,x0)p(xt1x0)=p(xtx0)p(xtxt1)p(xt1x0)(3)

由前向过程,可以得到以下3式,将以下3式代入,化简一下:

p ( x t − 1 ∣ x 0 ) = α ˉ t − 1 x 0 + 1 − α ˉ t − 1 ϵ ∼ N ( α ˉ t − 1 x 0 , 1 − α ˉ t − 1 ) p ( x t ∣ x 0 ) = α ˉ t x 0 + 1 − α ˉ t ϵ ∼ N ( α ˉ t x 0 , 1 − α ˉ t ) p ( x t ∣ x t − 1 ) = α t x t − 1 + 1 − α ˉ t ϵ ∼ N ( α t x t − 1 , 1 − α ˉ t ) \begin{aligned} p(x_{t-1}|x_0) &= \sqrt{\bar{\alpha}_{t-1}}x_0 + \sqrt{1-\bar{\alpha}_{t-1}}\epsilon \sim \mathcal{N}(\sqrt{\bar{\alpha}_{t-1}}x_0, 1-\bar{\alpha}_{t-1}) \\ p(x_{t}|x_0) &= \sqrt{\bar{\alpha}_{t}}x_0 + \sqrt{1-\bar{\alpha}_{t}}\epsilon \sim \mathcal{N}(\sqrt{\bar{\alpha}_{t}}x_0, 1-\bar{\alpha}_{t}) \\ p(x_{t}|x_{t-1}) &= \sqrt{\alpha_{t}}x_{t-1} + \sqrt{1-\bar{\alpha}_{t}}\epsilon \sim \mathcal{N}(\sqrt{\alpha_{t}}x_{t-1}, 1-\bar{\alpha}_{t}) \end{aligned} p(xt1x0)p(xtx0)p(xtxt1)=αˉt1 x0+1αˉt1 ϵN(αˉt1 x0,1αˉt1)=αˉt x0+1αˉt ϵN(αˉt x0,1αˉt)=αt xt1+1αˉt ϵN(αt xt1,1αˉt)

开始化简:

p ( x t − 1 ∣ x t , x 0 ) = p ( x t ∣ x t − 1 , x 0 ) ⋅ p ( x t − 1 ∣ x 0 ) p ( x t ∣ x 0 ) = p ( x t ∣ x t − 1 ) ⋅ p ( x t − 1 ∣ x 0 ) p ( x t ∣ x 0 ) = N ( α t x t − 1 , 1 − α ˉ t ) ⋅ N ( α ˉ t − 1 x 0 , 1 − α ˉ t − 1 ) N ( α ˉ t x 0 , 1 − α ˉ t ) \begin{aligned} p(x_{t-1}|x_t, x_0) &= \frac{{p(x_t | x_{t-1}, x_0) \cdot p(x_{t-1}|x_0)}}{{p(x_t|x_0)}} \\ &= \frac{{p(x_t | x_{t-1}) \cdot p(x_{t-1}|x_0)}}{{p(x_t|x_0)}} \\ &=\frac{\mathcal{N}(\sqrt{\alpha_{t}}x_{t-1}, 1-\bar{\alpha}_{t}) \cdot \mathcal{N}(\sqrt{\bar{\alpha}_{t-1}}x_0, 1-\bar{\alpha}_{t-1})} {\mathcal{N}(\sqrt{\bar{\alpha}_{t}}x_0, 1-\bar{\alpha}_{t})} \end{aligned} p(xt1xt,x0)=p(xtx0)p(xtxt1,x0)p(xt1x0)=p(xtx0)p(xtxt1)p(xt1x0)=N(αˉt x0,1αˉt)N(αt xt1,1αˉt)N(αˉt1 x0,1αˉt1)

p ( x t − 1 ∣ x t , x 0 ) ∝ e x p ( − 1 2 ( ( x t − α t x t − 1 ) 2 β t ) + ( x t − 1 − α ˉ t − 1 x 0 ) 2 1 − α ˉ t − 1 − ( x t − α ˉ t x 0 ) 2 1 − α ˉ t ) p(x_{t-1}|x_t, x_0) \propto exp(-\frac{1}{2}(\frac{(x_t-\sqrt{\alpha_t}x_{t-1})^2}{\beta_t})+\frac{(x_{t-1}-\sqrt{\bar{\alpha}}_{t-1}x_0)^2}{1-\bar{\alpha}_{t-1}}-\frac{(x_t-\sqrt{\bar{\alpha}_t}x_0)^2}{1-\bar{\alpha}_t}) p(xt1xt,x0)exp(21(βt(xtαt xt1)2)+1αˉt1(xt1αˉ t1x0)21αˉt(xtαˉt x0)2)

T i p s   N o r m a l   d i s t r i b u t i o n : e x p ( − ( x − μ ) 2 2 σ 2 ) = e x p ( − 1 2 ( 1 σ 2 x 2 − 2 μ σ 2 x + μ 2 σ 2 ) ) Tips\ Normal\ distribution:exp(-\frac{(x-\mu)^2}{2\sigma^2})=exp(-\frac{1}{2}(\frac{1}{\sigma^2}x^2-\frac{2\mu}{\sigma^2}x+\frac{\mu^2}{\sigma^2})) Tips Normal distributionexp(2σ2(xμ)2)=exp(21(σ21x2σ22μx+σ2μ2))

利用指数幂的相关运算,进行整理
Denoising Diffusion Probabilistic Model原理+代码复现_第2张图片

参考论文 Understanding Diffusion Models: A Unified Perspective

从上式,我们可以知道, x t − 1 x_{t-1} xt1是满足均值为 μ \mu μ,方差为 σ \sigma σ,它们的取值分别为:

σ 2 = β t ( 1 − α ˉ t − 1 ) α t ( 1 − α ˉ t − 1 ) + β t \sigma^2 = \frac{\beta_t(1-\bar{\alpha}_{t-1})}{\alpha_t(1-\bar{\alpha}_{t-1})+\beta_t} σ2=αt(1αˉt1)+βtβt(1αˉt1)

μ = α t ( 1 − α ˉ t − 1 ) 1 − α t ˉ x t + α ˉ t − 1 β t 1 − α ˉ t x 0 \mu = \frac{\sqrt{\alpha_t}(1-\bar{\alpha}_{t-1})}{1-\bar{\alpha_t}}x_t+\frac{\sqrt{\bar{\alpha}_{t-1}}\beta_t}{1-\bar{\alpha}_t}x_0 μ=1αtˉαt (1αˉt1)xt+1αˉtαˉt1 βtx0

x 0 是未知的 , 我们可以选择一个未知的函数使得 x 0 = f ( x t ) ,但是观察之前的公式可以得知,从 x 0 推导 x t 的公式取逆就是一条满足的公式【没理解?】 x_0是未知的,我们可以选择一个未知的函数使得x_0=f(x_t),但是观察之前的公式可以得知,从x_0推导x_t的公式取逆就是一条满足的公式【没理解?】 x0是未知的,我们可以选择一个未知的函数使得x0=f(xt),但是观察之前的公式可以得知,从x0推导xt的公式取逆就是一条满足的公式【没理解?】

x 0 = 1 α ˉ t ( x t − 1 − α ˉ t ϵ t ) x_0 = \frac{1}{\sqrt{\bar{\alpha}}_t}(x_t-\sqrt{1-\bar{\alpha}_t}\epsilon_t) x0=αˉ t1(xt1αˉt ϵt)

只是其中一个公式,

代入

μ = 1 α t ( x t − β t 1 − α ˉ t ϵ t ) \mu=\frac{1}{\sqrt{\alpha_t}}(x_t-\frac{\beta_t}{\sqrt{1-\bar\alpha}_t}\epsilon_t) μ=αt 1(xt1αˉ tβtϵt)

因为 ϵ t \epsilon_t ϵt是高斯噪音,用神经网络去拟合,也就是我们训练大模型的网络Unet,表示为: ϵ θ ( x t , t ) \epsilon_\theta(x_t,t) ϵθ(xt,t)
从而也可以得到要优化的目标,就是拟合出每一步的噪音, ∣ ∣ ϵ t − ϵ θ ( x t , t ) ∣ ∣ 2 ||\epsilon_t-\epsilon_\theta(x_t,t)||^2 ∣∣ϵtϵθ(xt,t)2

最后的采样公式,利用重参数技巧:

x t − 1 = 1 α t ( x t − β t 1 − α ˉ t ϵ θ ( x t , t ) ) + σ t ϵ      ϵ ∼ N ( 0 , I ) x_{t-1}=\frac{1}{\sqrt{\alpha_t}}(x_t-\frac{\beta_t}{\sqrt{1-\bar\alpha}_t}\epsilon_\theta(x_t,t))+\sigma_t\epsilon \;\; \epsilon \sim \mathcal{N}(0 , I) xt1=αt 1(xt1αˉ tβtϵθ(xt,t))+σtϵϵN(0,I)

END


资源汇总

  • Stable Diffusion: https://github.com/CompVis/stable-diffusion

  • DDPM 相关资料

    • 论文:Denoising Diffusion Probabilistic Models | https://arxiv.org/abs/2006.11239
    • 代码:tf version: https://github.com/hojonathanho/diffusion | pytorch version: https://github.com/lucidrains/denoising-diffusion-pytorch
  • DDIM 相关资料

    • 论文:Denoising Diffusion Implicit Models | https://arxiv.org/abs/2010.02502
    • 代码: https://github.com/ermongroup/ddim
  • PNDM/PLMS 相关资料

    • 论文:Pseudo Numerical Methods for Diffusion Models on Manifolds | https://openreview.net/forum?id=PlKWVd2yBkY
    • 代码: https://github.com/luping-liu/PNDM
  • VAE 相关资料

    • Variational inference & deep learning | https://pure.uva.nl/ws/files/17891313/Thesis.pdf
  • 相关论文

    • U-Net: Convolutional Networks for Biomedical Image Segmentation | https://arxiv.org/abs/1505.04597
    • Attention Is All You Need | https://arxiv.org/abs/1706.03762
  • 重参数技巧

    • 重参数技巧 详解 | https://juejin.cn/post/7213239578664157221
  • 博文

    • 入门基础

      • How does Stable Diffusion work? | https://stable-diffusion-art.com/how-stable-diffusion-work/
      • Stable Diffusion 硬核生存指南:WebUI 中的 VAE | https://soulteary.com/2023/07/30/stable-diffusion-hardcore-survival-guide-vae-in-webui.html
    • 原理进阶

      • 珍妮的选择 | https://blog.51cto.com/u_15661962
      • 珍妮的选择(知乎) | https://zhuanlan.zhihu.com/p/576475987
      • Latent Diffusion:高分辨率图像合成 | https://www.jianshu.com/p/816c60d981b1
        • 本博文翻译质量高
  • 李宏毅

    • https://speech.ee.ntu.edu.tw/~hylee/ml/2023-spring.php
  • 参考源码

    • labml | https://nn.labml.ai/diffusion/ddpm/index.html
    • labmlai | https://github.com/labmlai/annotated_deep_learning_paper_implementations
    • CelebA Dataset | https://mmlab.ie.cuhk.edu.hk/projects/CelebA.html

AIGC群交流

Denoising Diffusion Probabilistic Model原理+代码复现_第3张图片
Denoising Diffusion Probabilistic Model原理+代码复现_第4张图片

你可能感兴趣的:(stable,diffusion,stable,diffusion)