Diffusion Model
文章目录
- `Diffusion Model`
- `Denoising Diffusion Probabilistic Model(DDPM)`
- 去噪过程:
- `Denoise`结构
- 训练过程
- `Text-to-image Generation Model`
- `High Resolution Image Synthesis With_Latent Diffusion Models (Stable Diffusion)`
- 基本结构与推理过程
- `Text Encoder`
- `Decoder`
- `Generation Model`
- `DDPM`算法简析
所学内容来源于李宏毅2023扩散模型,
DDPM
链接:【生成式AI】Diffusion Model 概念讲解 (1/2)_哔哩哔哩_bilibili
Stable Diffusion
链接:https://www.bilibili.com/video/BV14c411J7f2?p=2
Denoising Diffusion Probabilistic Model(DDPM)
去噪过程:
去噪过程又称为推理过程,测试过程和后向扩散过程。一个训练好的Denoise
模型,它的去噪过程,是一张正态分布噪声图逐渐经过去噪还原为清晰图片的过程。在最初,输入一张从正态分布中simple
出来的噪声图,以及该图片对应的时间步time embedding
,经过去噪,会得到一张较为清晰的图。然后以此类推,将较为清晰的图输入到同一个Denoise Model
中,继续输入一个新的time embedding
,就可以得到更加清晰的图……最后就可以生成出所需要的图片。
很显然,Denoise
模型在这里需要两个输入,一个是需要去噪的图片,一个是时间步time embedding
或者称为time step
。时间步的作用,无疑是说明当前去噪的力度,也说明当前噪声的强度。在最初的时间步,Denoise
进行较大的去噪,逐步地,后面的时间步使得Denoise
进行较小的去噪。
Denoise
结构
DDPM
的里面是一个噪声预测器(noise predictor
)。Noise Predictor
接收一个图片和时间步作为输入,然后生成一张noise
,然后Denoise
利用这张noise
进行去噪。具体而言,是将输入图片减去这个预测出来的noise
以达到去噪效果。
训练过程
从Denoise
结构可以很明显地看出,noise predictor
预测出来的噪声应该需要一个ground-truth
作为监督。这个ground-truth
是去噪效果最好的一个噪声,对应的,预测出来用于去噪的噪声并不一定使得去噪效果最好,这时候就需要这个ground-truth
监督。
noise predictor
能否预测出一个好的noise
,体现出noise predictor
的优劣,具体在于其内部的参数
θ
\theta
θ是否达到了最优。所以我们需要训练noise predictor
。
训练过程有一个重要的过程,称为加噪过程,又称为前向扩散过程。如下图,具体而言,在正态高斯分布中simple
出一张随机噪声,然后将这个随机噪声加到清晰图片上,得到较为模糊的图片,同时记录此时的时间步time step
。
很明显,加噪后的图片和此时的时间步time step
就是Denoise
和noise predictor
的输入input
,而所加的噪声就是ground-truth
。将这三个数据交给Denoise
去噪,noise predictor
会输出一个噪声,然后与ground-truth
计算损失即可。
所以,训练过程离不开去噪过程和加噪过程。显然,去噪过程和加噪过程操作是相反的。
Text-to-image Generation Model
如果我们想要通过文字引导生成我们想要的图片呢?Text-to-image Generation Model
包含Text-to-image Generator
,通过给其输入cat,chicken,rabit
等文字,使得其生成特定的图片。
实际上,这个Text-to-image Generator
和Noise Predictor
相差不大,只是Text-to-image Generator
需要额外一个输入,即文本作为第三个输入,以引导其生成过程。
使用Text-to-image Generator
进行去噪,去噪过程每一步还需要额外给Denoise
添加文本作为引导。
加噪过程也如此,每一步都将文本作为输入。
High Resolution Image Synthesis With_Latent Diffusion Models (Stable Diffusion)
基本结构与推理过程
基本结构包含三个组件,Text Encoder
,Generation Model
和Decoder
。stable diffusion
的生成图片的大致流程是:首先输入一段文本,经过Text Encoder
处理为一个词向量,然后交给Generation Model
,同时输入一个从正态高斯分布simple
出来的随机噪声,生成一个latent representation
,就是所谓的“中间产物”。然后这个latent representation
交给Decoder
,生成图片。
这个生成图片的流程,又称为推理过程和测试过程。
论文中的stable diffusion
结构与上面提到的基本结构大差不差:
训练stable diffusion
时,三个组件是分别训练的。
Text Encoder
text encoder
的作用是接收一段文本,然后将其转换为一组词向量。text encoder
通常是一个预训练的encoder
。有实验证明显示,text encoder
在stable diffusion
中的作用相当大,如下图,随着更大的text encoder
,其曲线更加趋向右下方。愈趋向右下方,Diffusion Model
性能越好。
首先解释一下FID
。FID
描述了两张图特征的接近程度。将两张图片分别送入CNN进行降维,得到两个表征向量。这两个表征描述了两张图片的分布。一般认为是两个不同的高斯分布。FID
就是两个高斯分布的距离,距离越小,FID
越小,则两个分布越接近;两个向量越接近,则两张图片特征越接近。
由此看来,FID
越小,生成图片与原始图片越相似。也就是说,FID
越小越好。
然后来解释一下CLIP Score
。CLIP Score
则是描述了文本与生成图片之间的符合度。首先将一段文本送入Text Encoder
,输出为文本的embedding
向量。然后将生成图片送入Image Encoder
,输出一个图片的embedding
向量。CLIP Score
就是两个向量的高斯分布的距离。CLIP Score
足够大,则说明这段文本能够很好地描述这个图片,或者说这个生成图片符合文本需要,也说明这段文本与图片足够匹配。也就是说,CLIP Score
越大越好。
所以,上面那张曲线图,曲线愈趋向右下方,则代表着更大的Text Encoder
有着更小的FID
,更大的CLIP Score
,则对应Diffusion Model
有着更好的性能。
Decoder
Decoder
的作用通常是将一个laten representation
还原为图片。
如何描述我们训练出来的Decoder
的还原是好是坏?为了便于我们描述Decoder
的好坏,我们需要Auto-Encoder
辅助Decoder
训练。训练Decoder
的时候,将图片送入Auto-Encoder
进行降维,生成latent representation
,然后交给Decoder
还原为生成图片,对两张图片的损失梯度下降,最优情况的Decoder
就随着Auto-Encoder
一起训练好了,就可以直接拿来使用。
很明显,对Decoder
的训练需要的图片,并不依赖于Diffusion Model
训练时候的数据。也就是说,可以随便找图片数据来训练Auto-Encoder
和Decoder
而无必要从Diffusion Model
训练时所用的数据中找图片,这样做可以最大化Decoder
的还原能力。
Generation Model
Generation Model
从Text Encoder
接收文本词向量,然后将上一个时间步的latent representation
去噪处理为当前时间步的latent representation
,交给Decoder
作最后的处理。
训练Generation Model
本质上与训练DDPM
没有太大区别。训练是一个加噪的过程。首先将清晰图片经过一个训练好的Auto-Encoder
转换为latent representation
,然后加入从正态高斯分布simple
的noise
,得到当前时间步Step 1
的latent representation
。以此类推,不断加噪至指定步数1000。
训练的过程实际上是在训练Generation Model
中的Noise Predictor
,除了像“A cat in the snow”
这样的文本作为Noise Predictor
的输入Input
之外,还有当前时间步以及加噪的结果作为输入。如下图:
Noise Predictor
在训练的过程中,接收latent representation
,Text embedding
和Time step
作为输入,预测出噪声,与当前时间步所加噪声ground-truth
对比,计算损失,梯度下降。
我们训练好了Generation Model
后,就可以用它来进行去噪(推理过程):给定一个为pure noise
的latent representation
以及文本,依次迭代去噪,每次计算去噪完的latent representation
的CLIP Score
,足够高了就可以将此latent representation
交给Decoder
生成为图片。
DDPM
算法简析
这个是DDPM
的算法图,分别是训练的算法图与推理的算法图,也就是分别对应着加噪(前向扩散过程)的算法图和去噪(反向扩散过程)的算法图。该部分省略了公式推导。
Training
部分。x0
是待加噪的图片,t
是当前时间步,
α
‾
\overline{\alpha}
α是超参数,一般设置为尽可能接近1,
ϵ
\large{\epsilon}
ϵ是从正态高斯分布中simple
出来的噪声,
ϵ
θ
\large{\epsilon_{\theta}}
ϵθ代表Noise Predictor
。
α
‾
x
0
+
1
−
α
‾
ϵ
\large{\sqrt{\overline{\alpha}}x_0 + \sqrt{1 - \overline{\alpha}}\epsilon}
αx0+1−αϵ部分代表加噪后的图片,
ϵ
θ
(
α
‾
x
0
+
1
−
α
‾
ϵ
,
t
)
\large{\epsilon_{\theta}(\sqrt{\overline{\alpha}}x_0 + \sqrt{1 - \overline{\alpha}}\epsilon, t)}
ϵθ(αx0+1−αϵ,t)则代表了Noise Predictor
利用时间步和加噪后的图片预测出拿来去噪的Noise
。
ϵ
−
ϵ
θ
(
α
‾
x
0
+
1
−
α
‾
ϵ
,
t
)
\large{\epsilon-\epsilon_{\theta}(\sqrt{\overline{\alpha}}x_0 + \sqrt{1 - \overline{\alpha}}\epsilon, t)}
ϵ−ϵθ(αx0+1−αϵ,t)则代表了预测的噪声和加噪所利用的噪声的差别。然后对损失梯度下降即可。
Sampling
部分。
x
t
x_t
xt是待去噪的图片,t
是时间步,
x
t
−
1
x_{t-1}
xt−1是去噪后的图片,
α
\alpha
α依然是超参数,与前面一样。z
是从正态高斯分布中simple
出来的噪声,
σ
\sigma
σ是超参数。
1
−
α
1
−
α
ϵ
θ
(
x
t
,
t
)
\large{\frac{1 - \alpha}{\sqrt{1 - \alpha}}\epsilon_{\theta}(x_t, t)}
1−α1−αϵθ(xt,t)代表Noise Predictor
预测出来的噪声,
x
t
−
1
−
α
1
−
α
ϵ
θ
(
x
t
,
t
)
\large{x_t - \frac{1 - \alpha}{\sqrt{1 - \alpha}}\epsilon_{\theta}(x_t, t)}
xt−1−α1−αϵθ(xt,t)则代表去噪。最末尾加上一个
σ
t
z
\sigma_tz
σtz是为了提高扩散的泛化能力。
本文毕。