Diffusion Model
Tip
diffusion model 有很多变形,这里主要讲 Denoise Diffusion Probabillistic Models (DDPM) 论文链接
Diffusion Model 如何运作(生成一张图片)
- 生成出一张同样规格的,有 noise 的图片
- 通过一个 denoise network (这个 denoise model 是什么样的后面再讲)
- 输出滤掉一点 noise 的图片
- 不断 denoise
denoise 步骤一般会有一个编号,从 step 1000 一直降到 step 1
这整个过程叫 reverse process
The sculpture is already complete within the marble block, before I start my work.It is already there, I just have to chisel away the superfluous material. - Michelangelo
雕像本来就在大理石里面,只是把杂讯去掉。
denoise model 是什么样的
-
每次使用的都是同一个 denoise model
-
但是由于每次输入的图片都很不一样,从 noise 多到少,所以这个 model 除了图片的输入外还有一个输入 “noise 的严重程度”
-
内部实际是一个 noise predicter,真正模型训练的输出是预测噪声是什么,然后把原图片减去噪声作为输出
denoise model 里的 noise predictor 如何训练
noise predictor 需要一个 Ground Truth,而且是每个step都需要一个,这些数据从哪里来?
答案是由原始图片从 step 1 到 step 1000 一步步把 random noise 加上来
Tip
注意因为 Model 里是一个 noise predictor,所以Ground Truth是加的噪音不是加完噪声的图片
单纯训练生图讲完了,如何把文字考虑进来呢?
就是 noise predicter 的输入把文字也加上
Stable Diffusion
今天最好的 sota 影响生成模型,他背后的套路是什么样的?
三个元件:(分开训练再组合起来) 1. Text Encoder 2. Generation Model:输入 Text Encoder 的输出,产生一个中间产物(是图片的压缩版本) 3. Decoder:把压缩还原回图片
Stable Diffusion就有这样的3个组成
DALL-E series
如何评判生成的模型是否好?
FID
使用一个 pretrain 的分类 model
算两组 representation 的距离,越小越好
CLIP
Decoder
训练只需要图片资料
中间产物有两种case,要么是要把小图decode成大图,要么是要把latent representation decode
对应两种不同的训练方法:
- 小图:把所有影像资料down sampling成小图,然后训练把小图变成大图
- latent:训练一个encoder生成latent,然后再用decoder生成图片,要原图和生成的图越接近越好,
2的这个,就是VAE(Variational Autoencoder)变分自编码器吧?
Generation model
前面我们已经讲过 diffusion model 了,现在不一样的地方是:之前的 diffusion process 是直接把 noise 加到图片上,但是现在生成的东西已经不是图片了,而是中间产物(latent/小图),所以,我们的 noise 要加到中间产物上
训练:
整体训练的流程:
Diffusion Model 原理剖析
算法伪代码
符号说明:
- \(\beta_t\):第 t 步设置的噪声强度;
- \(\alpha_t\):第 t 步保留信号的比例;
- \(\bar{\alpha_t}\):从第 1 步累计到第 t 步后,总共还保留多少原始信号。
下面这里是我自己简单读一下,后面细节还会再做解释
Algorithm 1 Training
- repeat until 收敛
- 从真实数据分布\(q(x_0)\)中采样一个样本\(x_0\)
- 均匀随机(Uniform)选择一个时间步,1...T
- 生成一份标准高斯噪声\(\epsilon\),他的形状要和\(x_0\)完全一样,只是这里面的所有书会来自标准正态分布\(\mathcal{N}(0, 1)\)
-
构造带噪样本,并训练模型预测噪声 \(\nabla_{theta}||\epsilon - \epsilon_{\theta}(\sqrt{\bar{\alpha_t}} x_0 + \sqrt{1 - \bar{\alpha_t}} \epsilon, t)||^2\)
- 构造 \(x_t = \sqrt{\bar{\alpha_t}} x_0 + \sqrt{1 - \bar{\alpha_t}} \epsilon\),其中\(\sqrt{\bar{\alpha_t}} x_0\)是保留下来的原图信号,\(\sqrt{1 - \bar{\alpha_t}} \epsilon\)是加入的噪声
-
把 \(x_t\)和\(t\)输入神经网络,写作\(\epsilon_{\theta}(x_t, t)\)
- \(\theta\):神经网络的参数
- \(x_t\):带噪图像
- \(t\):当前噪声等级,就是之前说的要把noise的严重程度输入进来
- \(\epsilon_{\theta}(x_t, t)\):模型预测出来的噪声
-
比较预测噪声与真实噪声,\(loss = ||\epsilon - \epsilon_{\theta}(x_t, t)||^2\),真正加入的噪声与模型猜出来的噪声
Algorithm 2 Sampling,是指模型训练完后,真正生成新图片的过程
- 先生成一份纯高斯噪声,和图片完全无关
- \(for \ t = T, ..., 1\),从最大的噪声等级逐步往回去噪
- 生成一份随机噪声\(z \sim \mathcal{N}(0, 1)\)
-
\(x_{t-1} = \mu_{\theta}(x_t, t) + \sigma_{t} z\)
- 其中第一大部分\(\mu_{\theta}(x_t, t) = \frac{1}{\sqrt{\alpha_t}}(x_t - \frac{1 - \alpha_t}{\sqrt{1 - \bar{\alpha_t} }} \epsilon_{\theta}(x_t, t))\),表示模型认为,更干净一点的\(x_{t - 1}\)中心位置应该在哪里
Training
实际上训练的部分和上面讲概念的时候有不一样的地方
- 想象中,每个step是一点一点加noise,denoise的时候也一点一点去 noise
- 实际上,根据\(\sqrt{\bar{\alpha_t}}\)直接获得一个混入噪音的图,然后直接预测混入的噪音,而非\(\sqrt{\bar{\alpha_t}}*noise\)
Sampling
影像生成模型本质上共同的目标
【扩散模型 - Diffusion Model【李宏毅2023】】
还剩原理剖析的 234 没看,我先去看别的东西了。













