Diffusion Model · 李宏毅2023

你永远可以相信

[TOC]

【李宏毅】2025最新的Diffusion Model教程!1小时清楚扩散模型原理,简直不要太爽!人工智能|机器学习|OpenAI_哔哩哔哩_bilibili

Denoise Model

Denoise

  • 第一步,从正态分布中随机一个二维向量(纯噪声)作为最开始的输入
  • 第二步,假设迭代次数为1000,将输入送入Denoise Model进行推理,得到新的图片
  • 不断重复步骤(同时需要输入当前step数字,表示噪声的严重程度,见图片下方)
  • 完成迭代,得到生成的图片

输入与输出

Input and Output

如果直接让模型输出denoise之后的图片,本质上需要让模型学会生成新的图片,实践证明是一件比较难的事情

但是我们将模型训练成一个Noise Predicter,推理出图片中的噪音是什么样的

最后使用图片减去噪音,则可以得到迭代出的图片

Train

数据可以自己造,迭代一定次数,每次生成一个正态分布随机出的噪声

Forward Process

生成的噪声就是ground truth

Text2Img

一般来说我们希望通过文字prompt生成想要的图片,而不是让模型自己决定生成什么样的图片

但其实也很简单,将文字作为输入送入到Denoise Model中即可

text2img Denoise Model text2img Denoise Model

Diffusion图片生成

主流的图片生成模型Stable Diffusion、DALLE……的Framework基本都差不多

Framework

  • Generation Model的输入来自于,最后输出一个类似压缩版本的图片向量
    • 文字经过text encoder得到向量
    • 从正态分布中随机一个初始向量
  • 通过Decoder生成高清图片

Text Encoder

Text Encoder对性能的影响

文字Encoder对最终模型的影响远大于Noise Predictor,不管采用多大的U-Net,似乎效果没什么变

Decoder

取决于Framework中的技术路线

  • Generation Model生成一张小图,Decoder进行高清图生成

    • 找大量图片进行down sample,即可完成数据集制作
  • Generation Model生成Latent representation(潜在表示)

    • 使用auto-encoder的方法进行训练

Generation Model

  • Diffusion Model
    • 输出:图片
  • Generation Model
    • 输出:Latent Representation

同样会使用Forward Process进行数据生成

因此随机的noise应该加在Latent Representation上

数学推导

优化目标

图像生成的本质:

本质

从一个高斯中随机出的向量$z$,通过生成网络$G(z)$得到的分布$x$,希望尽可能接近真实

  • 文字等其他信息作为condition(本质上是条件概率)

记模型的参数为$\theta$,则模型的概率分布为$P_\theta{(x)}$,真实数据的分布为$P_{data}{(x)}$

$$ Sample \left\{ x^1, x^2, ..., x^m\right \} \space from \space P_{data}(x)\\ \theta^*=\arg \max_\theta \prod_{i=1}^{m}P_\theta{(x^i)} $$

希望模型能以尽可能高的概率生成我们观察到的数据

$$ \theta^*=\arg \max_\theta \sum_{i=1}^{m}\log P_\theta{(x^i)} =\arg \max_\theta \frac{1}{m}\sum_{i=1}^{m}\log P_\theta{(x^i)} $$

只要我们从真实数据中采样的数据量$m$​足够大,就可以用真实数据的期望,代替样本的均值

$$ \theta^*=\arg \max_\theta \mathbb{E}_{x\sim P_{data}}\left [ \log P_\theta(x) \right] $$

转换成积分形式:

$$ \theta^*=\arg \max_\theta \int P_{data}(x)\log P_\theta(x) dx $$

概率乘上数值

KL散度

有两个概率分布:

  • P分布:代表真实的情况或我们观察到的数据分布。
  • Q分布:代表我们模型预测的分布、一个近似分布

现在的问题是:如果我们使用Q分布来编码来自P分布的数据,会犯多大的“错误”?会损失多少信息?

使用KL散度进行表示

KL散度是不对称的

  • 用Q近似P的损失 不等于 用P近似Q的损失

对于离散型变量:

$$ D_{KL}(P\mid\mid Q) = \sum_i P(i)\log (\frac{P(i)}{Q(i)}) $$
  • $P(i)$是事件$i$在真实分布$P$中发生的概率。
  • $Q(i)$是事件$i$在近似分布$Q$中发生的概率。

对于连续型变量:

$$ D_{KL}(P\mid\mid Q) = \int_{-\infty}^{\infty}p(x)\log (\frac{p(x)}{q(x)})dx $$

这里使用的是概率密度函数


$$ \int P_{data}(x)\log P_\theta(x) dx = \int P_{data}(x)\log P_\theta{(x)}dx - \int P_{data}(x) \log P_{data}(x)dx + \int P_{data}(x) \log P_{data}(x)dx \\ = \int P_{data}(x)\log \frac{P_\theta(x)}{P_{data}(x)}dx + \int P_{data}(x) \log P_{data}(x)dx $$

第二项是与$\theta$无关的一项(常数),这样不影响$\theta$​优化,因此可以直接舍弃

$$ \theta^* = \arg \max_\theta \int P_{data}(x)\log \frac{P_\theta(x)}{P_{data}(x)}dx\\ = \arg \max_\theta \left [ -\int P_{data}(x)\log \frac{P_{data}(x)}{P_\theta(x)}dx\right ]\\ = \arg \min_\theta \left [ \int P_{data}(x)\log \frac{P_{data}(x)}{P_\theta(x)}dx\right ]\\ = \arg \min_\theta D_{KL}(P_{data}\mid\mid P_\theta) $$

Denoising Diffusion Probabilistic Models

那么如何计算$P_\theta(x)$​呢?对于DDPM,图片是逐渐Denoise得到的

我们假设最后得到的干净图片是$x_0$,一开始的随机噪声是$x_T \sim \mathcal{N}(0,I)$​


先补充一些数学

马尔可夫性质(离散时间)

对于一个随机过程$\left { X_t \right }_{t\in T}$,$T$是离散的时间序列$\left { 0,1,2,…\right}$

若对于任意时间点$t$,满足:

$$ P(X_t=x\mid X_{t-1}=x_{t-1},...,X_1=x_1) = P(X_t=x\mid X_{t-1}=x_{t-1}) $$

也就是说,给定当前状态,未来状态与过去状态条件独立。这就是“无记忆性”。

重参数化技巧

对于深度学习过程,若途中从高斯中进行采样,是不可导的,无法进行反向传播

1
x = torch.normal(mean=mu, std=sigma)

x的产生是随机的,无法写出关于参数的函数,无法反向传播到mu和sigma

因此我们希望引入一个具体的表达方式,方便求导

可以采用的是:

$$ x = \mu + \sigma \odot \epsilon $$

其中$\epsilon \sim \mathcal{N} (0,I)$,$\odot$表示逐元素乘法,$I$是单位矩阵

1
2
3
4
5
6
7
8
9
A = [[1, 2],
     [3, 4]]

B = [[5, 6],
     [7, 8]]

A ⊙ B = [[1*5, 2*6],
         [3*7, 4*8]] = [[5, 12],
                        [21, 32]]

我们只需要学习$\mu,\sigma$,而$\epsilon$作为随机噪声,在单次的传播过程中是固定的,不影响求导

$$ \mu = \left [\mu_1, \mu_2, ..., \mu_d\right]\\ \sigma = \left [\sigma_1, \sigma_2, ..., \sigma_d\right]\\ \epsilon = \left [\epsilon_1, \epsilon_2, ..., \epsilon_d\right],\epsilon \sim \mathcal{N}(0,1) $$

因此

$$ x = \mu + \sigma \odot \epsilon\\ x_i = \mu_i + \sigma_i \cdot \epsilon_i,\forall i\\ \therefore x_i\sim \mathcal{N}(\mu_i,\sigma^2_i) $$

各维度是独立的

分布

假设你想知道"今天是否下雨了"(未知事物),但你无法直接看窗外。

  • 先验分布:在没有任何证据时,你根据历史数据猜测"今天下雨的概率是20%"
  • 证据:你听到有人说"地上是湿的"
  • 后验分布:在知道"地上是湿的"这个证据后,你更新对"今天下雨"的概率判断(比如变成70%)

正态分布(高斯分布)

  • 性质1:均值与方差的线性组合

若$z = ay+b$,且$y\sim \mathcal{N}(\mu, \sigma^2)$,其他均为常数

则:

$$ z \sim \mathcal{N}(a\mu + b,a^2\sigma^2 ) $$
  • 性质2:独立正态分布的和

若$y_1,y_2$都是独立的正态分布变量,则他们的和$z=y_1+y_2$也是正态分布

$$ z\sim \mathcal{N}(\mu_1+\mu_2, \sigma^2_1+\sigma_2^2) $$

加噪

加噪是一个正向过程

从数据集的原始图片$x_0$出发,最终需要得到$x_T \sim \mathcal{N}(0,I)$

如果每一步按照前文所说进行简单加噪

$$ x_t =x_{t-1} + \epsilon_t, \quad \epsilon_t\sim \mathcal{N}(0,\sigma^2I) $$

其中$\sigma$可以让我们自己定义

故随着时间累计:

$$ x_t = x_0 + \sum_{i=1}^t\epsilon_i $$

$\epsilon_i$是独立同分布的,故

$$ x_t \sim \mathcal{N}\left ( x_0, t\sigma^2I \right) $$

这样无法保证最后$x^T$是一个标准正态分布

且随着$t$增加,数值的不稳定性会上升


加噪目标:

  • 最终是标准正态分布的纯噪声
  • 加噪可控、平滑过渡
  • 数值稳定

设计:

$$ x_t = \sqrt{1-\beta_t}\cdot x_{t-1} + \sqrt{\beta_t}\cdot \epsilon_t $$

其中$\beta_t$是预先设定的缩放系数,在$(0,1)$之间

从原理上能够解释为:衰减旧图片,添加新噪声

推导一下方差:

$$ \text{Var}(x_t) = \text{Var}(\sqrt{1-\beta_t}\cdot x_{t-1} + \sqrt{\beta_t}\cdot \epsilon_t)\\ = (1-\beta_t)\text{Var}(x_{t-1}) + \beta_t\text{Var}(\epsilon_t) $$

如果$x_{t-1}$之前的方差都是按照某种方式保持的很好,方差为1

同时我们知道$\epsilon_t$是标准正态分布,方差也是1

$$ \text{Var}(x_t)= (1-\beta_t)\text{Var}(x_{t-1}) + \beta_t\text{Var}(\epsilon_t) = 1-\beta_t + \beta_t = 1 $$

所以后续按照此方法,能够始终保持数值稳定

高效加噪

一般迭代次数还是足够多的, 如果使用循环就会很慢

我们可以对公式进行展开:

  • 迭代1次
$$ x_1 = \sqrt{1-\beta_1}\cdot x_0 + \sqrt{\beta_1}\cdot \epsilon_1 $$
  • 迭代2次
$$ x_2 = \sqrt{1-\beta_2}\cdot x_1 + \sqrt{\beta_2}\cdot \epsilon_2 \\ = \sqrt{1-\beta_2}\cdot (\sqrt{1-\beta_1}\cdot x_0 + \sqrt{\beta_1}\cdot \epsilon_1) + \sqrt{\beta_2}\cdot \epsilon_2 \\ = \sqrt{(1-\beta_1)(1-\beta_2)}x_0 + \sqrt{(1-\beta_2)\beta_1} \cdot \epsilon_1 + \sqrt{\beta_2} \cdot \epsilon_2 $$
  • 迭代3次
$$ x_3 = \sqrt{(1 - \beta_3)(1 - \beta_2)(1 - \beta_1)} \cdot x_0 + \sqrt{(1 - \beta_3)(1 - \beta_2)\beta_1} \cdot \epsilon_1 + \sqrt{(1 - \beta_3)\beta_2} \cdot \epsilon_2 + \sqrt{\beta_3} \cdot \epsilon_3 $$

$$ \alpha_i = 1-\beta_i,\quad \overline{\alpha}_t = \prod_{i=1}^{t}\alpha_i $$
  • $x_0$的系数:$\sqrt{\overline{\alpha}_t}$
  • $\epsilon_i$的系数:$\sqrt{\beta_i\prod_{j=i+1}^t \alpha_j} = \sqrt{\beta_i\cdot\frac{\overline{\alpha}_t}{\overline{\alpha}_i}}$

得:

$$ x_t = \sqrt{\overline{\alpha}_t}x_0 + \sum_{i=1}^t\sqrt{\beta_i\cdot\frac{\overline{\alpha}_t}{\overline{\alpha}_i}}\cdot \epsilon_i $$

左边是定值,右边显然服从某个正态分布

并且方差完全取决于系数,令

$$ \sigma^2_t=\sum_{i=1}^t\beta_i\cdot\frac{\overline{\alpha}_t}{\overline{\alpha}_i} = \sum_{i=1}^t\beta_i\prod_{k=i+1}^t(1-\beta_k) $$

此时有:$x_t\sim \mathcal{N}(0,\sigma^2_tI)$


这里有点跳跃,我们希望之间使用一个更简单的表示替换掉这个

如果我们能够找到一个方差相等的一项,就可以替换

这里智慧的假设是

$$ 1-\overline{\alpha}_t $$

使用数学归纳法进行证明,当 $t=2$​时:

$$ 1-\overline{\alpha}_t = 1-(1-\beta_1)(1-\beta_2) = \beta_1+\beta_2-\beta_1\beta_2\\ \sigma^2=\beta_1(1-\beta_2) + \beta_2 = \beta_1+\beta_2-\beta_1\beta_2 $$

两者相等

推导两者的递推关系

前者:

$$ 1-\overline{\alpha}_t = 1 - \overline{\alpha}_{t-1}\cdot(1-\beta_t) = (1-\beta_t)(1-\overline{\alpha}_{t-1}) + \beta_t $$

后者:

$$ \sigma_t^2 =\sum_{i=1}^t\beta_i\prod_{k=i+1}^t(1-\beta_k) \\ = \sum_{i=1}^{t-1}\beta_i(1-\beta_t)\prod_{k=i+1}^{t-1}(1-\beta_k) + \beta_t \\ = (1-\beta_t)\sum_{i=1}^{t-1}\beta_i\prod_{k=i+1}^{t-1}(1-\beta_k) + \beta_t \\ = (1-\beta_t)\sigma_{t-1}^2+\beta_t $$

两者递推关系相同,故有:

$$ \sigma^2_t = 1-\overline{\alpha}_t $$

原噪声项满足

$$ \sum_{i=1}^t\sqrt{\beta_i\cdot\frac{\overline{\alpha}_t}{\overline{\alpha}_i}}\cdot \epsilon_i \sim \mathcal{N}(0,(1-\overline{\alpha}_t)I) $$

替换成满足同一个分布的噪声项

$$ \sqrt{ 1-\overline{\alpha}_t}\cdot \epsilon $$

依旧可以使得$x_t \sim \mathcal{N}(0, (1-\overline{\alpha}_t)I)$

所以完全可以写成:

$$ x_t = \sqrt{\overline{\alpha}_t}x_0 +\sqrt{ 1-\overline{\alpha}_t}\cdot \epsilon, \quad \epsilon\sim\mathcal{N}(0,I) $$

至此,我们可以通过该公式直接从一个干净的$x_0$得到一个加噪图片$x_t$,极大简化了训练过程

并且该式符合重参数化的

为什么上面的公式是$\epsilon$?

由于我们保证数值稳定,因此本质上是加上关于$\epsilon_i$的一个线性组合(并且线性组合系数权重始终为1),因此等价于只加上一次的标准正态分布

去噪

去噪是训练的核心步骤与目标

定义真实的逆向分布:

$$ q\left(x_{t-1}\mid x_t\right) $$

由于上文所提到的运算关系,计算$q(x_t\mid x_{t-1})$​是没问题的


这里我们打断一下,不妨推导一下$q(x_t\mid x_{t-1})$的分布

首先有如下关系:

$$ x_t = \sqrt{1-\beta_t}\cdot x_{t-1} + \sqrt{\beta_t}\cdot \epsilon_t $$

则有(已知$x_{t-1}$的情况推$x_t$,故可以把$x_{t-1}$看作定值,且$\epsilon \sim \mathcal{N}(0,I)$):

$$ \mathbb{E}(x_t\mid x_{t-1}) = \sqrt{1-\beta_t}\mathbb{E}(x_{t-1}) + \sqrt{\beta_t}\mathbb{E}(\epsilon_t) = \sqrt{1-\beta_t}\cdot x_{t-1} \\ \text{Var}(x_t\mid x_{t-1}) = \beta_tI $$

故:

$$ q(x_t\mid x_{t-1})\sim \mathcal{N}(x_t;\sqrt{1-\beta_t}\cdot x_{t-1}, \beta_tI) $$

补充解释一下这个诡异的分号,其代表该分布是关于$x_t$的分布,即只有$x_t$是随机变量

??????


但是反过来计算逆向分布是一件非常难的事情

我们需要学一个模型,定义为:

$$ p_\theta\left(x_{t-1}|x_t\right) $$
使用 Hugo 构建
主题 StackJimmy 设计