【AI理论学习】深入理解扩散模型:Diffusion Models(DDPM)(理论篇)

news2025/2/25 15:25:24

深入理解扩散模型:Diffusion Models

  • 引言
  • 扩散模型的原理
    • 扩散过程
    • 反向过程
    • 优化目标
  • 模型设计
  • 代码实现
  • Stable Diffusion、DALL-E、Imagen背后共同的套路
    • Stable Diffusion
    • DALL-E series
    • Imagen
    • Text encoder
    • Decoder
    • 什么是FID(Frechet Inception Distance)
    • 什么是CLIP(Contrastive Language-Image Pre-Training)
  • Diffusion Model: Summary
    • Diffusion Model in PyTorch
  • 参考资料

本文综合最近阅读的关于扩散模型的一些基础博客和文章整理而成。主要参考的内容来自 Calvin Luo 的论文,针对的对象主要是对扩散模型已经有一些基础了解的读者。

引言

继OpenAI在2021提出的文本转图像模型DALLE之后,越来越多的大公司卷入这个方向,例如谷歌相继推出了ImagenParti。一些主流的文本转图像模型,例如DALL·E 2stable-diffusionImagen采用了扩散模型(Diffusion Model)作为图像生成模型,这也引发了对扩散模型的研究热潮。

与GAN相比,扩散模型训练更稳定,而且能够生成更多样的样本,OpenAI的论文Diffusion Models Beat GANs on Image Synthesis也证明了<font color='red>扩散模型能够超越GAN。
Diffusion Models Beat GANs on Image Synthesis
论文地址:https://arxiv.org/abs/2105.05233

简单来说,扩散模型包含两个过程:前向扩散过程和反向生成过程前向扩散过程是对一张图像逐渐添加高斯噪音直至变成随机噪音,而反向生成过程是去噪音过程,我们将从一个随机噪音开始逐渐去噪音直至生成一张图像,这也是我们要求解或者训练的部分。扩散模型与其它主流生成模型的对比如下所示:
扩散模型与其他主流生成模型
目前所采用的扩散模型大都是来自于2020年的工作DDPM: Denoising Diffusion Probabilistic Models,DDPM对之前的扩散模型(具体见Deep Unsupervised Learning using Nonequilibrium Thermodynamics)进行了简化,并通过变分推断variational inference)来进行建模,这主要是因为扩散模型也是一个隐变量模型latent variable model),相比VAE这样的隐变量模型,扩散模型的隐变量是和原始数据是同维度的,而且推理过程(即扩散过程)往往是固定的本文将基于DDPM详细介绍扩散模型的原理,并给出具体的代码实现和分析。
Denoising Diffusion Probabilistic Models
论文地址:https://arxiv.org/abs/2006.11239

扩散模型的原理

扩散模型包括两个过程:前向过程forward process)和反向过程reverse process),其中前向过程又称为为扩散过程diffusion process),如下图所示。无论是前向过程还是反向过程都是一个参数化的马尔可夫链Markov chain ),其中反向过程可以用来生成数据,这里我们将通过变分推断来进行建模和求解
扩散模型的原理

扩散过程

扩散过程是指的对数据逐渐增加高斯噪声直至数据完全变成随机噪声的过程。对于原始数据 x 0 ∼ q ( x 0 ) x_0\sim q(x_0) x0q(x0),总共包含 T T T步的扩散过程的每一步都是对上一步得到的数据 x t − 1 x_{t-1} xt1按如下方式增加高斯噪声:
q ( x t ∣ x t − 1 ) = N ( x t ; 1 − β t x t − 1 , β t I ) q(x_t|x_{t-1})=\mathcal{N}(x_t;\sqrt{1-\beta_t}x_{t-1},\beta_t I) q(xtxt1)=N(xt;1βt xt1,βtI)
这里 { β t } t = 1 T \{\beta_t\}_{t=1}^T {βt}t=1T为每一步所采用的方差,它介于 0   1 0~1 0 1之间。对于扩散模型,往往称不同step的方差设定为variance schedule或者noise schedule,通常情况下,越后面的step会采用更大的方差,即满足 β 1 < β 2 < . . . < β T \beta_1<\beta_2<...<\beta_T β1<β2<...<βT。在一个设计好的variance schedule下,如果扩散步数 T T T足够大,那么最终得到的 x T x_T xT就完全丢失了原始数据而变成了一个随机噪音。 扩散过程的每一步都生成一个带噪音的数据 x t x_t xt,整个扩散过程也就是一个马尔卡夫链
q ( x 1 : T ∣ x 0 ) = ∏ t = 1 T q ( x t ∣ x t − 1 ) q(x_{1:T}|x_0)= {\textstyle \prod_{t=1}^{T}}q(x_t|x_{t-1}) q(x1:Tx0)=t=1Tq(xtxt1)
Forward diffusion process
另外,要指出的是,扩散过程往往是固定的,即采用一个预先定义好的variance schedule,比如DDPM就是一个线性的variance schedule。扩散过程的一个重要特性是我们可以直接基于原始数据 x 0 x_0 x0来对任意 t t t步的 x t x_t xt进行采样: x t   q ( x t ∣ x 0 ) x_t~ q(x_t|x_0) xt q(xtx0)。这里定义 α t = 1 − β t \alpha_t=1-\beta_t αt=1βt α ˉ t = ∏ i = 1 t α i \bar{\alpha}_t= {\textstyle \prod_{i=1}^{t}\alpha _i} αˉt=i=1tαi,通过重参数技巧(和VAE类似),那么有:
Xt
上述推导过程利用了两个方差不同的高斯分布 N ( 0 , σ 1 2 I ) \mathcal{N}(0,\sigma _1^2\mathtt{I}) N(0,σ12I) N ( 0 , σ 2 2 I ) \mathcal{N}(0,\sigma _2^2\mathtt{I}) N(0,σ22I)相加等于一个新的高斯分布 N ( 0 , ( σ 1 2 + σ 2 2 ) I ) \mathcal{N}(0,(\sigma _1^2+\sigma _2^2)\mathtt{I}) N(0,(σ12+σ22)I)。反重参数化后,我们得到:
q ( x t ∣ x 0 ) = N ( x t ; α ˉ t x 0 , ( 1 − α ˉ t ) I ) q(\mathrm{x}_t|\mathrm{x}_0)=\mathcal{N}(\mathrm{x}_t;\sqrt{\bar{\alpha}_t}\mathrm{x}_0,(1-\bar{\alpha}_t)\mathtt{I}) q(xtx0)=N(xt;αˉt x0,(1αˉt)I)

扩散过程的这个特性很重要。首先,可以看到 x t \mathrm{x}_t xt其实可以看成是原始数据 x 0 \mathrm{x}_0 x0和随机噪音 ϵ \epsilon ϵ的线性组合,其中 α ˉ t \sqrt{\bar{\alpha}_t} αˉt 1 − α ˉ t \sqrt{1-\bar{\alpha}_t} 1αˉt 为组合系数,它们的平均和等于1,可以称两者分别为signal_ratenoise_rate

参考:https://keras.io/examples/generative/ddim/#diffusion-schedule和Variational Diffusion Models

更进一步,可以基于 α ˉ t \bar{\alpha}_t αˉt而不是 β t \beta_t βt来定义noise schedule(见Improved Denoising Diffusion Probabilistic Models所设计的cosine schedule),因为这样处理更直接,比如我们直接将 α ˉ T \bar{\alpha}_T αˉT设定为一个接近0的值,那么就可以保证最终得到的 x T \mathrm{x}_T xT近似为一个随机噪声。其次,后面的建模和分析过程将使用这个特性。
扩散过程

反向过程

扩散过程是将数据噪声化,那么反向过程就是一个去噪的过程。如果我们知道反向过程的每一步的真实分布 q ( x t − 1 ∣ x t ) q(\mathrm{x}_{t-1}|\mathrm{x}_t) q(xt1xt),那么从一个随机噪音 x t ∼ N ( 0 , I ) \mathrm{x}_t\sim \mathcal{N}(0,\mathtt{I}) xtN(0,I)开始,逐渐去噪,就能生成一个真实的样本,所以反向过程也就是生成数据的过程。
反向过程
估计分布 q ( x t − 1 ∣ x t ) q(\mathrm{x}_{t-1}|\mathrm{x}_t) q(xt1xt)需要用到整个训练样本,可以用神经网络来估计这些分布。这里,将反向过程也定义为一个马尔可夫链,只不过它是由一系列用神经网络参数化的高斯分布来组成 p θ ( x 0 ; T ) = p ( x T ) ∏ t = 1 T p ( x t − 1 ∣ x t ) p_\theta(\mathrm{x}_{0;T})=p(\mathrm{x}_T)\prod_{t=1}^{T}p(\mathrm{x}_{t-1}|\mathrm{x}_t) pθ(x0;T)=p(xT)t=1Tp(xt1xt) p θ ( x t − 1 ∣ x t ) = N ( x t − 1 ; μ θ ( x t , t ) , ∑ θ ( x t , t ) ) p_\theta(\mathrm{x}_{t-1}|\mathrm{x}_t)=\mathcal{N}(\mathrm{x}_{t-1};\mu_\theta(\mathrm{x}_t,t), {\textstyle \sum_{\theta}(\mathrm{x}_t,t)}) pθ(xt1xt)=N(xt1;μθ(xt,t),θ(xt,t))
这里 p ( x T ) = N ( x T ; 0 , I ) p(\mathrm{x}_T)=\mathcal{N}(\mathrm{x}_T;0,\mathtt{I}) p(xT)=N(xT;0,I),而 p θ ( x t − 1 ∣ x t ) p_\theta(\mathrm{x}_{t-1}|\mathrm{x}_t) pθ(xt1xt)为参数化的高斯分布,它们的均值和方差由训练的网络 μ θ ( x t , t ) \mu_\theta(\mathrm{x}_t,t) μθ(xt,t) ∑ θ ( x t , t ) {\textstyle \sum_{\theta}}(\mathrm{x}_t,t) θ(xt,t)给出。实际上,扩散模型就是要得到这些训练好的网络,因为它们构成了最终的生成模型

虽然分布 q ( x t − 1 ∣ x t ) q(\mathrm{x}_{t-1}|\mathrm{x}_t) q(xt1xt)是不可直接处理的,但是加上条件 x 0 \mathrm{x}_0 x0的后验分布 q ( x t − 1 ∣ x t , x 0 ) q(\mathrm{x}_{t-1}|\mathrm{x}_t, \mathrm{x}_0) q(xt1xt,x0)却是可处理的,这里有: q ( x t − 1 ∣ x t , x 0 ) = N ( x t − 1 ; μ ~ ( x t , x 0 , β ~ t I ) ) q(\mathrm{x}_{t-1}|\mathrm{x}_t, \mathrm{x}_0)=\mathcal{N}(\mathrm{x}_{t-1};\tilde{\mu}(\mathrm{x}_t,\mathrm{x}_0,\tilde{\beta}_t\mathtt{I})) q(xt1xt,x0)=N(xt1;μ~(xt,x0,β~tI))
下面来具体推导这个分布。首先根据贝叶斯公式,有: 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 ) q(\mathrm{x}_{t-1}|\mathrm{x}_t,\mathrm{x}_0)=q(\mathrm{x}_t|\mathrm{x}_{t-1}, \mathrm{x}_0)\frac{q(\mathrm{x}_{t-1}|\mathrm{x}_0)}{q(\mathrm{x}_t|\mathrm{x}_0)} q(xt1xt,x0)=q(xtxt1,x0)q(xtx0)q(xt1x0)
由于扩散过程的马尔可夫链特性,知道分布 q ( x t − 1 ∣ x t , x 0 ) = q ( x t ∣ x t − 1 ) = N ( x t ; 1 − β t x t − 1 , β t I ) q(\mathrm{x}_{t-1}|\mathrm{x}_t,\mathrm{x}_0)=q(\mathrm{x}_t|\mathrm{x}_{t-1})=\mathcal{N}(\mathrm{x}_t;\sqrt{1-\beta_t}\mathrm{x}_{t-1},\beta_t\mathtt{I}) q(xt1xt,x0)=q(xtxt1)=N(xt;1βt xt1,βtI)(这里条件 x 0 \mathrm{x}_0 x0是多余的),而由前面得到的扩散过程特性可知: q ( x t − 1 ∣ x 0 ) = N ( x t − 1 ; α ˉ t − 1 x 0 , ( 1 − α ˉ t − 1 ) I ) q(\mathrm{x}_{t-1}|\mathrm{x}_{0})=\mathcal{N}(\mathrm{x}_{t-1};\sqrt{\bar{\alpha}_{t-1}}\mathrm{x}_0,(1-\bar{\alpha}_{t-1})\mathtt{I}) q(xt1x0)=N(xt1;αˉt1 x0,(1αˉt1)I) q ( x t ∣ x 0 ) = N ( x t ; α ˉ t x 0 , ( 1 − α ˉ t ) I ) q(\mathrm{x}_{t}|\mathrm{x}_{0})=\mathcal{N}(\mathrm{x}_{t};\sqrt{\bar{\alpha}_{t}}\mathrm{x}_0,(1-\bar{\alpha}_{t})\mathtt{I}) q(xtx0)=N(xt;αˉt x0,(1αˉt)I)
所以,有:
反向过程
这里的 C ( x t , x 0 ) C(\mathrm{x}_t, \mathrm{x}_0) C(xt,x0)是一个和 x t − 1 \mathrm{x}_{t-1} xt1无关的部分,所以省略。根据高斯分布的概率密度函数定义和上述结果(配平方),可以得到分布 q ( x t ∣ x t − 1 , x 0 ) q(\mathrm{x}_{t}|\mathrm{x}_{t-1}, \mathrm{x}_{0}) q(xtxt1,x0)的均值和方差:
均值和方差
可以看到方差是一个定量(扩散过程参数固定),而均值是一个依赖 x 0 \mathrm{x}_0 x0 x t \mathrm{x}_t xt的函数。这个分布将会被用于推导扩散模型的优化目标。

优化目标

上面介绍了扩散模型的扩散过程和反向过程,现在我们来从另外一个角度来看扩散模型:如果把中间产生的变量看成隐变量的话,那么扩散模型其实是包含T个隐变量的隐变量模型latent variable model),它可以看成是一个特殊的Hierarchical VAEs(见Understanding Diffusion Models: A Unified Perspective)
Understanding Diffusion Models: A Unified Perspective
A Markovian Hierarchical Variational Autoencoder with T hierarchical latents.
相比VAE来说,扩散模型的隐变量是和原始数据同维度的,而且encoder(即扩散过程)是固定的。既然扩散模型是隐变量模型,那么我们就可以基于变分推断来得到variational lower boundVLB,又称ELBO)作为最大化优化目标,这里有:
ELBO
这里最后一步是利用了Jensen's inequality(不采用这个不等式的推导见博客What are Diffusion Models?),对于网络训练来说,其训练目标为VLB取负
VLB取负
进一步对训练目标进行分解可得:
对训练目标进行分解
可以看到最终的优化目标共包含 T + 1 T+1 T+1项,其中 L 0 L_0 L0可以看成是原始数据重建,优化的是负对数似然, L 0 L_0 L0可以用估计的 N ( x 0 ; μ θ ( x 1 , 1 ) , ∑ θ ( x 1 , 1 ) \mathcal{N}(\mathrm{x}_0;\mu_\theta (\mathrm{x}_1,1), {\textstyle \sum_{\theta }}(\mathrm{x}_1,1) N(x0;μθ(x1,1),θ(x1,1)来构建一个离散化的decoder来计算(见DDPM论文3.3部分);
L T L_T LT计算的是最后得到的噪音的分布和先验分布的KL散度,这个KL散度没有训练参数,近似为0,因为先验 p ( x T ) = N ( 0 , I ) p(\mathrm{x}_T)=\mathcal{N}(0,\mathtt{I}) p(xT)=N(0,I),而扩散过程最后得到的随机噪音 p ( x T ∣ x 0 ) p(\mathrm{x}_T|\mathrm{x}_0) p(xTx0)也近似为 N ( 0 , I ) \mathcal{N}(0,\mathtt{I}) N(0,I)
L t − 1 L_{t-1} Lt1则是计算的是估计分布 p θ ( x t − 1 ∣ x t ) p_\theta(\mathrm{x}_{t-1}|\mathrm{x}_t) pθ(xt1xt)和真实后验分布 q ( x t − 1 ∣ x t , x 0 ) q(\mathrm{x}_{t-1}|\mathrm{x}_t,\mathrm{x}_0) q(xt1xt,x0)的KL散度,这里希望我们估计的去噪过程和依赖真实数据的去噪过程近似一致
Depicted is an alternate, lower-variance method to optimize a VDM
之所以在前面将 p θ ( x t − 1 ∣ x t ) p_\theta(\mathrm{x}_{t-1}|\mathrm{x}_t) pθ(xt1xt)定义为一个用网络参数化的高斯分布 N ( x t − 1 ; μ θ ( x t , t ) , ∑ θ ( x t , t ) ) \mathcal{N}(\mathrm{x}_{t-1};\mu_\theta(\mathrm{x}_t,t), {\textstyle \sum_{\theta}(\mathrm{x}_t,t)}) N(xt1;μθ(xt,t),θ(xt,t)),是因为要匹配的后验分布 q ( x t − 1 ∣ x t , x 0 ) q(\mathrm{x}_{t-1}|\mathrm{x}_t,\mathrm{x}_0) q(xt1xt,x0)也是一个高斯分布。对于训练目标 L 0 L_0 L0 L t − 1 L_{t-1} Lt1来说,都是希望得到训练好的网络 μ θ ( x t , t ) \mu_\theta(\mathrm{x}_t,t) μθ(xt,t) ∑ θ ( x t , t ) {\textstyle \sum_{\theta}(\mathrm{x}_t,t)} θ(xt,t)(对于 L 0 L_0 L0 t = 1 t=1 t=1)。
DDPM对 p θ ( x t − 1 ∣ x t ) p_\theta(\mathrm{x}_{t-1}|\mathrm{x}_t) pθ(xt1xt)做了进一步简化,采用固定的方差 ∑ θ ( x t , t ) = σ t 2 I {\textstyle \sum_{\theta}(\mathrm{x}_t,t)}=\sigma_t^2\mathtt{I} θ(xt,t)=σt2I,这里的 σ t 2 \sigma_t^2 σt2可以设定为 β t \beta_t βt或者 β ~ t \tilde{\beta}_t β~t(这其实是两个极端,分别是上限和下限,也可以采用可训练的方差,见论文Improved Denoising Diffusion Probabilistic Models和Analytic-DPM: an Analytic Estimate of the Optimal Reverse Variance in Diffusion Probabilistic Models)。
Improved Denoising Diffusion Probabilistic Models
Analytic-DPM: an Analytic Estimate of the Optimal Reverse Variance in Diffusion Probabilistic Models
这里假定 σ t 2 = β ~ t \sigma_t^2=\tilde{\beta}_t σt2=β~t,那么:
q ( x t − 1 ∣ x t , x 0 ) = N ( x t − 1 ; μ ~ ( x t , x 0 ) , σ t 2 I ) p θ ( x t − 1 ∣ x t ) = N ( x t − 1 ; μ θ ( x t , t ) , σ t 2 I ) q(\mathrm{x}_{t-1}|\mathrm{x}_t,\mathrm{x}_0)=\mathcal{N}(\mathrm{x}_{t-1};\tilde{\mu}(\mathrm{x}_t,\mathrm{x}_0),\sigma_t^2\mathtt{I})p_\theta (\mathrm{x}_{t-1}|\mathrm{x}_t)=\mathcal{N}(\mathrm{x}_{t-1};\mu_\theta (\mathrm{x}_t,t),\sigma_t^2\mathtt{I}) q(xt1xt,x0)=N(xt1;μ~(xt,x0),σt2I)pθ(xt1xt)=N(xt1;μθ(xt,t),σt2I)
对于两个高斯分布的KL散度,其计算公式为:
两个告诉分布的KL散度
那么就有:
DKl
那么优化目标 L t − 1 L_{t-1} Lt1即为: L t − 1 = E q ( x t ∣ x 0 ) [ 1 2 σ t 2 ∣ ∣ μ ~ t ( x t , x 0 ) − μ θ ( x t , t ) ∣ ∣ 2 ] L_{t-1}=\mathbb{E}_{q(\mathrm{x}_t|\mathrm{x}_0)}[\frac{1}{2\sigma _t^2} ||\tilde{\mu}_t(\mathrm{x}_t,\mathrm{x}_0)-\mu_\theta (\mathrm{x}_t,t)||^2] Lt1=Eq(xtx0)[2σt21∣∣μ~t(xt,x0)μθ(xt,t)2]
从上述公式来看,我们希望网络学习到的均值 μ θ ( x t , t ) \mu_\theta (\mathrm{x}_t,t) μθ(xt,t)和后验分布的均值 μ ~ t ( x t , x 0 ) \tilde{\mu}_t(\mathrm{x}_t,\mathrm{x}_0) μ~t(xt,x0)一致。不过DDPM发现预测均值并不是最好的选择。根据前面得到的扩散过程的特性,有: x t ( x 0 , ϵ ) = α ˉ t x 0 + 1 − α ˉ t ϵ  where  ϵ ∼ N ( 0 , I ) \mathrm{x}_{t}(\mathrm{x}_0,\epsilon)=\sqrt{\bar{\alpha }_t}\mathrm{x}_0+\sqrt{1-\bar{\alpha}_t\epsilon} \text{ where }\epsilon \sim\mathcal{N}(0,\mathtt{I} ) xt(x0,ϵ)=αˉt x0+1αˉtϵ  where ϵN(0,I)
将这个公式带入上述优化目标,可以得到:
优化目标
进一步地,对 μ θ ( x t ( x 0 , ϵ ) , t ) \mu_\theta(\mathrm{x}_t (\mathrm{x}_0, \epsilon), t) μθ(xt(x0,ϵ),t)也进行重参数化,变成: μ θ ( x t ( x 0 , ϵ ) , t ) = 1 α t ( x t ( x 0 , ϵ ) − β t 1 − α ˉ t ϵ θ ( x t ( x 0 , ϵ ) , t ) ) \mu_\theta(\mathrm{x}_t (\mathrm{x}_0, \epsilon), t)=\frac{1}{\sqrt{\alpha}_t}(\mathrm{x}_t(\mathrm{x}_0,\epsilon)-\frac{\beta_t}{\sqrt{1-\bar{\alpha}_t}}\epsilon_\theta(\mathrm{x}_t(\mathrm{x}_0,\epsilon), t)) μθ(xt(x0,ϵ),t)=α t1(xt(x0,ϵ)1αˉt βtϵθ(xt(x0,ϵ),t))
这里的 ϵ θ \epsilon_\theta ϵθ是一个基于神经网络的拟合函数,这意味着由原来的预测均值而换成预测噪音 ϵ \epsilon ϵ。我们将上述等式代入优化目标,可以得到:
优化目标
DDPM进一步对上述目标进行了简化,即去掉了权重参数,变成了 L t − 1 s i m p l e = E x 0 , ϵ ∼ N ( 0 , I ) [ ∣ ∣ ϵ − ϵ θ ( α ˉ t x 0 + 1 − α ˉ t ϵ , t ) ∣ ∣ 2 ] L_{t-1}^{simple}=\mathbb{E}_{\mathrm{x}_0,\epsilon \sim\mathcal{N}(0,\mathtt{I})}[||\epsilon -\epsilon _\theta (\sqrt{\bar{\alpha}_t}\mathrm{x}_0+\sqrt{1-\bar{\alpha}_t}\epsilon ,t )||^2] Lt1simple=Ex0,ϵN(0,I)[∣∣ϵϵθ(αˉt x0+1αˉt ϵ,t)2]。这里的 t t t [ 1 , T ] [1,T] [1,T]范围内取值(如前所述,其中取1时对应 L 0 L_0 L0)。由于去掉了不同 t t t的权重系数,所以这个简化的目标其实是VLB优化目标进行了reweight。从DDPM的对比实验结果来看,预测噪音比预测均值效果要好,采用简化版本的优化目标比VLB目标效果要好
Table2:
虽然扩散模型背后的推导比较复杂,但是最终得到的优化目标非常简单,就是让网络预测的噪音和真实的噪音一致。DDPM的训练过程也非常简单,如下图所示:随机选择一个训练样本->从1-T随机抽样一个t->随机产生噪音-计算当前所产生的带噪音数据(红色框所示)->输入网络预测噪音->计算产生的噪音和预测的噪音的L2损失->计算梯度并更新网络
Training and Sampling
一旦训练完成,其采样过程也非常简单,如上所示:我们从一个随机噪音开始,并用训练好的网络预测噪音,然后计算条件分布的均值(红色框部分),然后用均值加标准差乘以一个随机噪音,直至t=0完成新样本的生成(最后一步不加噪音)。

不过实际的代码实现和上述过程略有区别(见https://github.com/hojonathanho/diffusion/issues/5:先基于预测的噪音生成 x 0 \mathrm{x}_0 x0,并进行了clip处理(范围[-1, 1],原始数据归一化到这个范围),然后再计算均值。这应该算是一种约束,既然模型预测的是噪音,那么我们也希望用预测噪音重构处理的原始数据也应该满足范围要求

模型设计

前面我们介绍了扩散模型的原理以及优化目标,那么扩散模型的核心就在于训练噪音预测模型,由于噪音和原始数据是同维度的,所以我们可以选择采用AutoEncoder架构来作为噪音预测模型。DDPM所采用的模型是一个基于residual blockattention blockU-Net模型。如下所示:
U-Net模型
U-Net属于encoder-decoder架构,其中encoder分成不同的stages,每个stage都包含下采样模块来降低特征的空间大小(H和W),然后decoder和encoder相反,是将encoder压缩的特征逐渐恢复。U-Net在decoder模块中还引入了skip connection,即concat了encoder中间得到的同维度特征,这有利于网络优化。DDPM所采用的U-Net每个stage包含2个residual block,而且部分stage还加入了self-attention模块增加网络的全局建模能力。

另外,扩散模型其实需要的是个噪音预测模型,实际处理时,我们可以增加一个time embedding(类似transformer中的position embedding)来将timestep编码到网络中,从而只需要训练一个共享的U-Net模型。具体地,DDPM在各个residual block都引入了time embedding,如上图所示。

代码实现

最后,我们基于PyTorch框架给出DDPM的具体实现,这里主要参考了三套代码实现:

  • GitHub - hojonathanho/diffusion: Denoising Diffusion Probabilistic Models(官方TensorFlow实现)
  • GitHub - openai/improved-diffusion: Release for Improved Denoising Diffusion Probabilistic Models (OpenAI基于PyTorch实现的DDPM+)
  • GitHub - lucidrains/denoising-diffusion-pytorch: Implementation of Denoising Diffusion Probabilistic Model in Pytorch

Stable Diffusion、DALL-E、Imagen背后共同的套路

Framework
Framework
Component组件:

  1. Text Encoder: 使用Text Encoder将文本生成一个embedding,
  2. Generation Model:然后和噪声一起生成一个Generation Model,得到一个中间产物
  3. Decoder: 使用Decoder都得到带有噪声图片

Stable Diffusion

Stable Diffusion
High-Resolution Image Synthesis with Latent Diffusion Models
https://arxiv.org/abs/2112.10752

DALL-E series

DALL-E Series
Dall-e

Imagen

Imagen
link

Text encoder

text encoder
Image of encoder size
Photorealistic Text-to-Image Diffusion Models with Deep Language Understanding
https://arxiv.org/abs/2205.11487

Decoder

Decoder can be trained without labelled data.
Decoder

什么是FID(Frechet Inception Distance)

FID
FIDS

什么是CLIP(Contrastive Language-Image Pre-Training)

CLIP
Learning Transferable Visual Models From Natural Language Supervision
https://arxiv.org/abs/2103.00020

Diffusion Model: Summary

Diffusion Model1
Diffusion Model2

Diffusion Model in PyTorch

The easier way to use a Diffusion Model in PyTorch is to use the denoising-diffusion-pytorch package.

pip install denoising_diffusion_pytorch

一个示例代码:

import torch
from denoising_diffusion_pytorch import Unet, GaussianDiffusion
model = Unet(
    dim = 64,
    dim_mults = (1, 2, 4, 8)
)
model = Unet(
    dim = 64,
    dim_mults = (1, 2, 4, 8)
)
diffusion = GaussianDiffusion(
    model,
    image_size = 128,
    timesteps = 1000,   # number of steps
    loss_type = 'l1'    # L1 or L2
)
training_images = torch.randn(8, 3, 128, 128)
loss = diffusion(training_images)
loss.backward()
sampled_images = diffusion.sample(batch_size = 4)

结果

参考资料

  1. 从大一统视角理解扩散模型(Diffusion Models)
  2. What are Diffusion Models?
  3. Understanding Diffusion Models: A Unified Perspective
  4. Generative Modeling by Estimating Gradients of the Data Distribution
  5. Stable Diffusion、DALL-E、Imagen 背後共同的套路
  6. 带你深入理解扩散模型DDPM
  7. https://colab.research.google.com/github/huggingface/notebooks/blob/main/diffusers/stable_diffusion.ipynb#scrollTo=AAVZStIokTVv

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/427631.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

uni-app--》如何实现网上购物小程序(上)?

&#x1f3cd;️作者简介&#xff1a;大家好&#xff0c;我是亦世凡华、渴望知识储备自己的一名在校大学生 &#x1f6f5;个人主页&#xff1a;亦世凡华、 &#x1f6fa;系列专栏&#xff1a;uni-app &#x1f6b2;座右铭&#xff1a;人生亦可燃烧&#xff0c;亦可腐败&#xf…

YOLOv8源码逐行解读(yolov8.yaml)(更新中)

本人也是刚接触YOLO不久的菜鸟一个&#xff0c;写博客主要是记录自己的学习过程&#xff0c;如果有写的不对的地方欢迎大家批评指正&#xff01; yolov8.yaml 官方下载地址&#xff1a;https://github.com/ultralytics/ultralytics/tree/main/ultralytics/models/v8 # Ultral…

工业机器人三大主流行业浮动去毛刺应用深度详解

工业机器人是一种能够自动执行各种工业任务的机器人&#xff0c;它的使用不仅能将工人从繁重或有害的体力劳动中解放出来&#xff0c;解决当前劳动力短缺问题&#xff0c;而且能够提高生产效率和产品质量&#xff0c;增强企业整体竞争力&#xff0c;被广泛地应用于工业各个生产…

软件测试岗,4 轮面试成功拿下字节 Offer..........

一共经历了四轮面试&#xff1a;技术4面&#xff0b;HR面。 特整理出所涉及的全部知识点&#xff0c;并复盘了完整面试题及答案&#xff0c;分享给大家&#xff0c;希望能够帮到一些计划面试字节的朋友。 一、测试基础理论类 怎么编写案例?软件测试的两种方法测试结束的标准…

SpringBoot解析指定Yaml配置文件

再来个文章目录 文章目录前言1、自定义配置文件2、配置对象类3、YamlPropertiesSourceFactory下面还有投票&#xff0c;帮忙投个票&#x1f44d; 前言 最近在看某个开源项目代码并准备参与其中&#xff0c;代码过了一遍后发现多个自定义的配置文件用来装载业务配置代替数据库…

打造最小VR头显,软件开发商Bigscreen缘何跨进VR硬件市场?

今年2月&#xff0c;Bigscreen推出了一款非常轻薄的PC VR头显&#xff1a;Beyond。该头显的特点是采用两块1英寸Micro OLED屏幕&#xff08;RGB Stripe排列&#xff09;&#xff0c;可带来双眼5K分辨率&#xff0c;28 PPD&#xff0c;75Hz/90Hz刷新率和90x93FOV。目前Beyond虽还…

Linux移植:正点原子阿尔法IMX6ULL开发板Linux内核源码移植详细步骤(4.1.15版本内核)

Linux移植&#xff1a;正点原子阿尔法IMX6ULL开发板Linux内核源码移植详细步骤&#xff08;4.1.15版本内核&#xff09; 文章目录Linux移植&#xff1a;正点原子阿尔法IMX6ULL开发板Linux内核源码移植详细步骤&#xff08;4.1.15版本内核&#xff09;1.出厂源码编译1 修改顶层 …

Matlab simulink上手控制仿真学习笔记3-常用模块S Function及使用案例

讲得真的十分细致&#xff01;个人感觉看完前4节就差不多了。 今天记录的是S Function。 内容比较多&#xff0c;加个目录&#xff1a; S Function前置工作1.1 parameter.m1.2 plant.mfunction [sys,x0,str,ts,simStateCompliance] plant(t,x,u,flag,pa)function [sys,x0,str…

三电技术(电池(BMS)、电驱(MCU)、电控(VCU))

三电技术 1、概述 三电技术不仅是新能源汽车的核心技术&#xff0c;也是基础性技术。 三电是指电池&#xff0c;电驱(电机)&#xff0c;电控&#xff0c;简称 BMC。 2、电池 为了区分新能源汽车上的低压电池将其称为动力电池&#xff0c;“动力电池“也是行业术语。动力电…

毫无废话,四个小案例手把手教你Vue2基础轻松入门_学习笔记

四个小案例手把手教你Vue2基础轻松入门_学习笔记 本文将通过四个小案例介绍Vue2学习 根据 黑马程序员vue前端基础教程-4个小时带你快速入门vue 教程。 因教程中的网络项目和综合项目难度不高&#xff0c;且内容仅为综合使用&#xff0c;本笔记不另介绍。 * 源自教程&#xff0c…

【Linux】网络编程之套接字 --TCP

目录&#x1f308;前言&#x1f338;1、TCP相关API&#x1f361;1.1、socket函数&#x1f362;1.2、bind函数&#x1f367;1.3、listen函数&#x1f368;1.4、accept函数&#x1f370;1.5、connect函数&#x1f33a;2、TCP网络编程&#x1f361;2.1、简单TCP通信程序 -- 多进程…

【redis】验证redis是否正常运行以及报错解决方案

Redis 出现 “(error) NOAUTH Authentication required.” 错误&#xff0c;意味着客户端尝试向 Redis 服务器发送命令&#xff0c;但未提供身份验证或提供的身份验证信息不正确。这通常是由于 Redis 实例开启了密码认证机制导致的。 为了解决该问题&#xff0c;可以尝试以下…

代码随想录算法训练营第六天|242 有效的字母异位词 349 两个数组的交集 202 快乐数 1 两数之和

文章目录哈希表242 有效的字母异位词思路代码总结349 两个数组的交集思路代码总结202 快乐数思路代码总结1 两数之和思路代码总结哈希表 哈希碰撞&#xff1a;拉链法&#xff08;链表&#xff09;线性探测法&#xff08;顺序向后&#xff09; std::unordered_map, std::unorde…

LinuxGUI自动化测试框架搭建(四)-Hyper-V上安装Ubuntu操作系统

(四)-Hyper-V上安装Ubuntu操作系统 1 Ubuntu下载1.1 下载地址1.2 下载说明2 Hyper-V上安装Ubuntu2.1 创建虚拟机2.2 安装Ubuntu系统3 设置虚拟你网络4 关闭虚拟机检查点并移除DVD驱动器5 启动虚拟机6 配置Ubuntu网络7 网络测试1 Ubuntu下载 1.1 下载地址 官网地址:https://…

(十五)排序算法-归并排序

1 基本介绍 1.1 概述 归并排序&#xff08;Merge Sort&#xff09;是采用分治法的一个非常典型的应用。归并排序的思想就是先递归分解数组&#xff0c;再合并数组。 将数组分解最小之后&#xff0c;然后合并两个有序数组&#xff0c;基本思路是比较两个数组的最前面的数&…

华为浮动路由和BFD配置

拓扑图 电脑配置 pc1:192.168.10.1/24 pc2:192.168.20.1/24 AR1路由器配置 配置4个接口的地址 ge0/0/0:192.168.10.254/24 ge0/0/1:192.168.20.254/24 ge0/0/2:12.1.1.1/30 ge4/0/0:13.1.1.1/30 <Huawei>system-view Enter system view, return user view with CtrlZ…

机器学习笔记之正则化(五)Dropout

机器学习笔记之正则化——Dropout引言引子&#xff1a;题目描述(正则化相关)正确答案&#xff1a;ABCD\mathcal A\mathcal B\mathcal C\mathcal DABCD题目解析回顾&#xff1a;集成学习方法&#xff1a;Bagging\text{Bagging}BaggingDropout\text{Dropout}Dropout方法深度神经网…

黑马程序员微服务技术栈教程 - 1. SpringCloud 微服务治理

教程链接&#xff1a;https://www.bilibili.com/video/BV1LQ4y127n4 黑马的资料下载链接&#xff1a;https://pan.baidu.com/s/1zRmwSvSvoDkWh0-MynwERA&pwd1234 目录认识微服务单体架构分布式架构微服务微服务结构微服务技术对比SpringCloud总结 &#x1f380;服务拆分及远…

刷题day54:柱形图中最大矩形

题意描述&#xff1a; 给定 n 个非负整数&#xff0c;用来表示柱状图中各个柱子的高度。每个柱子彼此相邻&#xff0c;且宽度为 1 。 求在该柱状图中&#xff0c;能够勾勒出来的矩形的最大面积。 暴力方法&#xff1a; class Solution { public:int largestRectangleArea(ve…

软考第四章 局域网与城域网

局域网与城域网 传统局域网&#xff08;LAN&#xff09;是分组广播式网络&#xff0c;这是与分组交换式的广域网的主要区别。广播技术中&#xff0c;所有工作站都连接到共享的传输介质上&#xff0c;共享信道的分配技术是局域网的核心技术&#xff0c;而这一技术又与网络的拓扑…