跳转至

Diffusion Model

Tip

diffusion model 有很多变形,这里主要讲 Denoise Diffusion Probabillistic Models (DDPM) 论文链接

Diffusion Model 如何运作(生成一张图片)

1783508355663

  1. 生成出一张同样规格的,有 noise 的图片
  2. 通过一个 denoise network (这个 denoise model 是什么样的后面再讲)
  3. 输出滤掉一点 noise 的图片
  4. 不断 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,真正模型训练的输出是预测噪声是什么,然后把原图片减去噪声作为输出

1783508805858

denoise model 里的 noise predictor 如何训练

noise predictor 需要一个 Ground Truth,而且是每个step都需要一个,这些数据从哪里来?

答案是由原始图片从 step 1 到 step 1000 一步步把 random noise 加上来

Tip

注意因为 Model 里是一个 noise predictor,所以Ground Truth是加的噪音不是加完噪声的图片

单纯训练生图讲完了,如何把文字考虑进来呢?

就是 noise predicter 的输入把文字也加上

1783509816390

Stable Diffusion

今天最好的 sota 影响生成模型,他背后的套路是什么样的?

三个元件:(分开训练再组合起来) 1. Text Encoder 2. Generation Model:输入 Text Encoder 的输出,产生一个中间产物(是图片的压缩版本) 3. Decoder:把压缩还原回图片

1783516259776

Stable Diffusion就有这样的3个组成

1783514879038

DALL-E series

1783514927676

如何评判生成的模型是否好?

FID

使用一个 pretrain 的分类 model

算两组 representation 的距离,越小越好

1783515471225

CLIP

1783515601622

Decoder

训练只需要图片资料

中间产物有两种case,要么是要把小图decode成大图,要么是要把latent representation decode

对应两种不同的训练方法:

  1. 小图:把所有影像资料down sampling成小图,然后训练把小图变成大图
  2. latent:训练一个encoder生成latent,然后再用decoder生成图片,要原图和生成的图越接近越好,

2的这个,就是VAE(Variational Autoencoder)变分自编码器吧?

1783516037020

Generation model

前面我们已经讲过 diffusion model 了,现在不一样的地方是:之前的 diffusion process 是直接把 noise 加到图片上,但是现在生成的东西已经不是图片了,而是中间产物(latent/小图),所以,我们的 noise 要加到中间产物上

训练:

1783516676093

整体训练的流程:

1783516745994

Diffusion Model 原理剖析

算法伪代码

diffusion model 伪代码

符号说明:

\[\alpha_t = 1 - \beta_t\]
\[\bar{\alpha_{t}} = \Pi_{s=1}^{t} \alpha_s\]
  • \(\beta_t\):第 t 步设置的噪声强度;
  • \(\alpha_t\):第 t 步保留信号的比例;
  • \(\bar{\alpha_t}\):从第 1 步累计到第 t 步后,总共还保留多少原始信号。 ​

下面这里是我自己简单读一下,后面细节还会再做解释

Algorithm 1 Training

  1. repeat until 收敛
  2. 从真实数据分布\(q(x_0)\)中采样一个样本\(x_0\)
  3. 均匀随机(Uniform)选择一个时间步,1...T
  4. 生成一份标准高斯噪声\(\epsilon\),他的形状要和\(x_0\)完全一样,只是这里面的所有书会来自标准正态分布\(\mathcal{N}(0, 1)\)
  5. 构造带噪样本,并训练模型预测噪声 \(\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,是指模型训练完后,真正生成新图片的过程

  1. 先生成一份纯高斯噪声,和图片完全无关
  2. \(for \ t = T, ..., 1\),从最大的噪声等级逐步往回去噪
  3. 生成一份随机噪声\(z \sim \mathcal{N}(0, 1)\)
  4. \(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

实际上训练的部分和上面讲概念的时候有不一样的地方

1783517353486

  • 想象中,每个step是一点一点加noise,denoise的时候也一点一点去 noise
  • 实际上,根据\(\sqrt{\bar{\alpha_t}}\)直接获得一个混入噪音的图,然后直接预测混入的噪音,而非\(\sqrt{\bar{\alpha_t}}*noise\)

Sampling

1783519295889

影像生成模型本质上共同的目标

【扩散模型 - Diffusion Model【李宏毅2023】】

还剩原理剖析的 234 没看,我先去看别的东西了。

评论