![cover](https://img-blog.csdnimg.cn/3c3c995b894f4083bca7f16aa6ca9091.png)
Diffusion Model 深入剖析
本文深入到 Diffusion Model 内部,深入剖析 Diffusion Model 的工作原理以及它是如何生成图像的。本文要点总结:1. 扩散模型分为正向扩散和逆向扩散两部分。2. 正向扩散可以使用闭合的公式来完成。3. 可以使用经过训练的神经网络完成逆向扩散。4. 为了逼近去噪步骤 q,我们只需要使用神经网络εθ 来近似噪声 εt。5. 对简化损失函数的训练产生更好的样本质量。
Diffusion Model 深入剖析
最近AI生成艺术领域非常火热,从 Midjourney 到 Stable Diffusion,不管你是绘画高手还是艺术小白,只要输入想要绘制内容的描述或者基础图像,就可以生成富有艺术感的画作! 这些风格各异、以假乱真的AI生成图像背后,离不开 Diffusion Model 。之前文章《Stable Diffusion原理详解》中我对 Diffusion Model 做了简要的介绍,本文将深入到 Diffusion Model 内部,深入剖析 Diffusion Model 的工作原理以及它是如何生成图像的。
概述
Diffusion Model的训练可以分为两部分:
- 正向扩散过程 → 为图像添加噪声。
- 反向扩散过程 → 去除图像中的噪声。
正向扩散过程
正向扩散过程向输入图像 x 0 x_0 x0 逐步加入高斯噪声,一共 T T T 步。该过程将产生一系列噪声图像样本 x 1 , … , x T x_1, \dots , x_T x1,…,xT。
当 T → ∞ T \to \infin T→∞ 时,最终的结果将变成一张完全噪声图像,就好像它是从各向同性高斯分布中采样的一样。
但是我们可以使用一个闭合公式在特定的时间步长 t t t 直接对有噪声的图像进行采样,而不是设计一种算法来迭代地向图像添加噪声。
正向扩散可以用如下公式描述:
q
(
x
t
∣
x
t
−
1
)
=
N
(
x
t
;
1
−
β
t
x
t
−
1
,
β
t
I
)
(1)
q(x_t | x_{t-1}) = \mathcal{N}(x_t; \sqrt {1-\beta_t}x_{t-1}, \beta_tI) \tag{1}
q(xt∣xt−1)=N(xt;1−βtxt−1,βtI)(1)
其中
t
t
t 是时间帧(从 0 到
T
T
T),
x
t
x_t
xt 是从真实数据分布
q
(
x
)
q(x)
q(x) 中采样的数据样本(例如
x
0
∼
q
(
x
)
x_0 \sim q(x)
x0∼q(x)),
β
t
\beta_t
βt 是 variance schedule,
0
≤
β
t
≤
1
0 \le \beta_t \le 1
0≤βt≤1,且
β
0
\beta_0
β0 较小,
β
T
\beta_T
βT 较大。
I
I
I 是单位矩阵。
公式推导
可以使用重参数化技巧(Reparameterization Trick)推导出闭合公式。
如果 z ∼ N ( μ , σ 2 ) z \sim \mathcal{N}(\mu, \sigma^2) z∼N(μ,σ2) ,那么 z z z 可以写成 z = μ + σ ε z = \mu + \sigma\varepsilon z=μ+σε 的形式,其中 ε ∼ N ( 0 , 1 ) \varepsilon \sim \mathcal{N}(0, 1) ε∼N(0,1)。这就是 重参数化技巧 。
利用这个技巧,我们可以将采样图像
x
t
x_t
xt 表示为如下形式:
x
t
=
1
−
β
t
x
t
−
1
+
β
t
ε
t
−
1
(2)
x_t = \sqrt{1-\beta_t}x_{t-1}+\sqrt{\beta_t}\varepsilon_{t-1} \tag{2}
xt=1−βtxt−1+βtεt−1(2)
这样我们就可以递归地展开它得到闭式公式:
x
t
=
1
−
β
t
x
t
−
1
+
β
t
ε
t
−
1
…
…
ε
∼
N
(
0
,
I
)
=
α
t
x
t
−
1
+
1
−
α
t
ε
t
−
1
…
…
设
α
t
=
1
−
β
t
=
α
t
(
α
t
−
1
x
t
−
2
+
1
−
α
t
−
1
ε
t
−
2
)
+
1
−
α
t
ε
t
−
1
…
…
递
归
展
开
x
t
−
1
=
α
t
α
t
−
1
x
t
−
2
+
α
t
(
1
−
α
t
−
1
)
ε
t
−
2
+
1
−
α
t
ε
t
−
1
…
…
乘
法
分
配
律
乘
开
=
α
t
α
t
−
1
x
t
−
2
+
1
−
α
t
α
t
−
1
ε
ˉ
t
−
2
…
…
怎
么
突
然
得
到
这
个
结
果
?
⋮
=
α
t
α
t
−
1
…
α
1
x
0
+
1
−
α
t
α
t
−
1
…
α
1
ε
=
α
t
ˉ
x
0
+
1
−
α
ˉ
t
ε
…
…
α
t
ˉ
=
∏
i
=
1
t
α
i
\begin{aligned} x_t &= \sqrt{1-\beta_t}x_{t-1}+\sqrt{\beta_t}\varepsilon_{t-1}&\dots\dots \varepsilon \sim \mathcal{N}(0, I)\\ &=\sqrt{\alpha_t}\:\fcolorbox{red}{white}{$x_{t-1}$}+\sqrt{1-\alpha_t}\varepsilon_{t-1}&\dots\dots 设\alpha_t = 1-\beta_t\\ &=\sqrt{\alpha_t}\:\fcolorbox{red}{white}{$\Big(\sqrt{\alpha_{t-1}}x_{t-2}+\sqrt{1-\alpha_{t-1}}\varepsilon_{t-2}\Big)$}+\sqrt{1-\alpha_t}\varepsilon_{t-1}&\dots\dots 递归展开x_{t-1}\\ &=\sqrt{\alpha_t\alpha_{t-1}}x_{t-2}+\:\fcolorbox{red}{white}{$\sqrt{\alpha_t(1-\alpha_{t-1})}\varepsilon_{t-2}+\sqrt{1-\alpha_t}\varepsilon_{t-1}$}&\dots\dots 乘法分配律乘开\\ &=\sqrt{\alpha_t\alpha_{t-1}}x_{t-2}+\:\fcolorbox{red}{white}{$\sqrt{1-\alpha_t\alpha_{t-1}}\bar{\varepsilon}_{t-2}$}&\dots\dots \textcolor{red}{怎么突然得到这个结果?}\\ &\quad\vdots\\ &=\sqrt{\alpha_t\alpha_{t-1}\dots\alpha_1}x_0 + \sqrt{1-\alpha_t\alpha_{t-1}\dots\alpha_1}\varepsilon\\ &=\sqrt{\bar{\alpha_t}}x_0+\sqrt{1-\bar{\alpha}_t}\varepsilon&\dots\dots \bar{\alpha_t}=\prod_{i=1}^t\alpha_i \end{aligned}
xt=1−βtxt−1+βtεt−1=αtxt−1+1−αtεt−1=αt(αt−1xt−2+1−αt−1εt−2)+1−αtεt−1=αtαt−1xt−2+αt(1−αt−1)εt−2+1−αtεt−1=αtαt−1xt−2+1−αtαt−1εˉt−2⋮=αtαt−1…α1x0+1−αtαt−1…α1ε=αtˉx0+1−αˉtε……ε∼N(0,I)……设αt=1−βt……递归展开xt−1……乘法分配律乘开……怎么突然得到这个结果?……αtˉ=i=1∏tαi
注意:所有 ε \varepsilon ε 都是独立同分布的标准正态随机变量。
这里使用不同的符号和下标区分它们很重要,因为它们是独立的并且它们的值在采样后可能不同。
上面的公式推导最难理解的是第4行到第5行,很多人卡在这一步止步不前,下面我将给出详细的推导步骤并解释它是如何工作的:
我们设:
α
t
(
1
−
α
t
−
1
)
ε
t
−
2
=
X
1
−
α
t
ε
t
−
1
=
Y
\begin{aligned} \sqrt{\alpha_t(1-\alpha_{t-1})}\varepsilon_{t-2} &= X\\ \sqrt{1-\alpha_t}\varepsilon_{t-1} &= Y \end{aligned}
αt(1−αt−1)εt−21−αtεt−1=X=Y
即
x
t
=
α
t
α
t
−
1
x
t
−
2
+
α
t
(
1
−
α
t
−
1
)
ε
t
−
2
⏟
X
+
1
−
α
t
ε
t
−
1
⏟
Y
x_t=\sqrt{\alpha_t\alpha_{t-1}}x_{t-2}+\underbrace{\sqrt{\alpha_t(1-\alpha_{t-1})}\varepsilon_{t-2}}_X+\underbrace{\sqrt{1-\alpha_t}\varepsilon_{t-1}}_Y
xt=αtαt−1xt−2+X
αt(1−αt−1)εt−2+Y
1−αtεt−1
应用从重参数化技巧
0
+
α
t
(
1
−
α
t
−
1
)
ε
t
−
2
⟹
X
∼
N
(
0
,
α
t
(
1
−
α
t
−
1
)
I
)
0
+
1
−
α
t
ε
t
−
1
⟹
Y
∼
N
(
0
,
(
1
−
α
t
)
I
)
\begin{aligned} 0 + \sqrt{\alpha_t(1-\alpha_{t-1})}\varepsilon_{t-2} &\implies X \sim \mathcal{N}(0, \alpha_t(1-\alpha_{t-1})I)\\ 0 + \sqrt{1-\alpha_t}\varepsilon_{t-1} &\implies Y \sim \mathcal{N}(0, (1-\alpha_{t})I) \end{aligned}
0+αt(1−αt−1)εt−20+1−αtεt−1⟹X∼N(0,αt(1−αt−1)I)⟹Y∼N(0,(1−αt)I)
设
Z
=
X
+
Y
Z = X + Y
Z=X+Y ,我们知道,如果
X
∼
N
(
μ
X
,
σ
X
2
)
,
Y
∼
N
(
μ
Y
,
σ
Y
2
)
X \sim \mathcal{N}(\mu_X, \sigma_X^2), \quad Y \sim \mathcal{N}(\mu_Y, \sigma_Y^2)
X∼N(μX,σX2),Y∼N(μY,σY2),则
Z
∼
N
(
μ
X
+
μ
Y
,
σ
X
2
+
σ
Y
2
)
Z \sim \mathcal{N}(\mu_X+\mu_Y, \sigma_X^2+\sigma_Y^2)
Z∼N(μX+μY,σX2+σY2)
代入
X
X
X 和
Y
Y
Y 的实际数值可得
μ
X
=
0
μ
Y
=
0
σ
X
2
+
σ
Y
2
=
α
t
(
1
−
α
t
−
1
)
+
(
1
−
α
t
)
=
α
t
−
α
t
α
t
−
1
+
1
−
α
t
=
1
−
α
t
α
t
−
1
\begin{aligned} \mu_X &= 0 \qquad \mu_Y = 0\\ \\ \sigma_X^2+\sigma_Y^2 &= \alpha_t(1-\alpha_{t-1}) + (1-\alpha_{t})\\ &=\cancel{\alpha_t}-\alpha_t\alpha_{t-1}+1-\cancel{\alpha_{t}}\\ &=1-\alpha_t\alpha_{t-1} \end{aligned}
μXσX2+σY2=0μY=0=αt(1−αt−1)+(1−αt)=αt
−αtαt−1+1−αt
=1−αtαt−1
所以
Z
∼
N
(
0
,
(
1
−
α
t
α
t
−
1
)
I
)
Z \sim \mathcal{N}(0, (1-\alpha_t\alpha_{t-1})I)
Z∼N(0,(1−αtαt−1)I),应用重参数化技巧即可得到:
X
+
Y
=
Z
∼
N
(
0
,
(
1
−
α
t
α
t
−
1
)
I
)
=
0
+
1
−
α
t
α
t
−
1
ε
ˉ
t
−
2
=
1
−
α
t
α
t
−
1
ε
ˉ
t
−
2
X+Y = Z \sim \mathcal{N}(0, (1-\alpha_t\alpha_{t-1})I)=0+\sqrt{1-\alpha_t\alpha_{t-1}}\:\bar\varepsilon_{t-2}=\sqrt{1-\alpha_t\alpha_{t-1}}\:\bar\varepsilon_{t-2}
X+Y=Z∼N(0,(1−αtαt−1)I)=0+1−αtαt−1εˉt−2=1−αtαt−1εˉt−2
这就得到了第五行的结果。
重复以上步骤,最终我们将得到一个仅取决于输入图像
x
0
x_0
x0 的公式:
x
t
=
α
t
ˉ
x
0
+
1
−
α
ˉ
t
ε
(3)
x_t=\sqrt{\bar{\alpha_t}}x_0+\sqrt{1-\bar{\alpha}_t}\varepsilon \tag{3}
xt=αtˉx0+1−αˉtε(3)
这样我们就可以使用公式(3)在任何时间帧
t
t
t 直接对
x
t
x_t
xt 进行采样,这极大提高了正向扩散过程的执行效率。
逆向扩散过程
逆向扩散过程可以用下面的公式描述:
q
(
x
t
−
1
∣
x
t
)
=
N
(
x
t
−
1
;
μ
~
t
(
x
t
,
x
0
)
,
β
~
t
I
)
q(x_{t-1}|x_{t}) = \mathcal{N}(x_{t-1};\tilde\mu_t(x_t, x_0),\tilde\beta_tI)
q(xt−1∣xt)=N(xt−1;μ~t(xt,x0),β~tI)
与正向过程不同,我们不能使用
q
(
x
t
−
1
∣
x
t
)
q(x_{t-1}|x_t)
q(xt−1∣xt) 来逆转噪声,因为它很难处理(无法计算)。
因此,我们需要训练神经网络
p
θ
(
x
t
−
1
∣
x
t
)
p_\theta(x_{t-1}|x_t)
pθ(xt−1∣xt) 来近似
q
(
x
t
−
1
∣
x
t
)
q(x_{t-1}|x_t)
q(xt−1∣xt):
p
θ
(
x
t
−
1
∣
x
t
)
=
N
(
x
t
−
1
;
μ
θ
(
x
t
,
t
)
,
∑
θ
(
x
t
,
t
)
)
p_\theta(x_{t-1}|x_{t}) = \mathcal{N}(x_{t-1};\mu_\theta(x_t, t),\sum_\theta (x_t, t))
pθ(xt−1∣xt)=N(xt−1;μθ(xt,t),θ∑(xt,t))
近似值 $p_\theta
(x|xₜ) $服从正态分布,其均值和方差需要满足:
{
μ
θ
(
x
t
,
t
)
:
=
μ
~
t
(
x
t
,
x
0
)
∑
θ
(
x
t
,
t
)
:
=
β
~
t
I
\begin{cases} \mu_\theta(x_t, t) &:= \tilde\mu_t(x_t, x_0)\\ \sum_\theta(x_t, t) &:= \tilde\beta_tI \end{cases}
{μθ(xt,t)∑θ(xt,t):=μ~t(xt,x0):=β~tI
损失函数
我们可以将损失定义为负对数似然:
Loss
=
−
log
(
p
θ
(
x
0
)
)
\text{Loss} = -\log(p_\theta(x_0))
Loss=−log(pθ(x0))
其中
p
θ
(
x
0
)
p_\theta(x_0)
pθ(x0) 依赖于
x
1
,
x
2
,
…
,
x
T
x_1, x_2, \dots, x_T
x1,x2,…,xT ,因此处理起来很棘手。
不难发现,这里的设置与变分下界中的设置非常相似。因此我们可以绕开棘手的损失函数本身,转而优化变分下界。通过优化可计算下界,我们可以间接优化棘手的损失函数。
下面是变分下界的推导和展开:
−
log
p
θ
(
x
0
)
≤
−
log
p
θ
(
x
0
)
+
D
K
L
(
q
(
x
1
:
T
∣
x
0
)
∣
∣
p
θ
(
x
1
:
T
∣
x
0
)
)
⋮
−
log
p
θ
(
x
0
)
≤
E
q
[
log
q
(
x
1
:
T
∣
x
0
)
p
θ
(
x
0
:
T
)
]
⋮
−
log
p
θ
(
x
0
)
≤
E
q
[
D
K
L
(
q
(
x
T
∣
x
0
)
∣
∣
p
θ
(
x
T
)
)
⏟
L
T
+
∑
t
=
2
T
D
K
L
(
q
(
x
t
−
1
∣
x
t
,
x
0
)
∣
∣
p
θ
(
x
t
−
1
∣
x
t
)
)
⏟
L
t
−
1
−
log
p
θ
(
x
0
∣
x
1
)
⏟
L
0
]
\begin{aligned} -\log p_\theta(x_0) &\le -\log p_\theta(x_0) + D_{KL}\big(q(x_{1:T}\:|\:x_0)\:||\:p_\theta(x_{1:T}\:|\:x_0)\big)\\ \vdots\\ -\log p_\theta(x_0) &\le \mathbb{E}_q\Big[\log \frac{q(x_{1:T}|x_0)}{p_\theta(x_{0:T})}\Big]\\ \vdots\\ -\log p_\theta(x_0) &\le \mathbb{E}_q\Big[\underbrace{D_{KL}(q(x_T|x_0)||p_\theta(x_T))}_{L_T} + \sum_{t=2}^T \underbrace{D_{KL}(q(x_{t-1}|x_t,x_0)||p_\theta(x_{t-1}|x_t))}_{L_{t-1}} \underbrace{-\log p_\theta(x_0|x_1)}_{L_0}\Big] \end{aligned}
−logpθ(x0)⋮−logpθ(x0)⋮−logpθ(x0)≤−logpθ(x0)+DKL(q(x1:T∣x0)∣∣pθ(x1:T∣x0))≤Eq[logpθ(x0:T)q(x1:T∣x0)]≤Eq[LT
DKL(q(xT∣x0)∣∣pθ(xT))+t=2∑TLt−1
DKL(q(xt−1∣xt,x0)∣∣pθ(xt−1∣xt))L0
−logpθ(x0∣x1)]
其中
E
q
[
log
q
(
x
1
:
T
∣
x
0
)
p
θ
(
x
0
:
T
)
]
\mathbb{E}_q\Big[\log \frac{q(x_{1:T}|x_0)}{p_\theta(x_{0:T})}\Big]
Eq[logpθ(x0:T)q(x1:T∣x0)] 就是变分下界;展开后的公式由3部分构成,我将其分别命名为
L
T
,
L
t
−
1
,
L
0
L_T, L_{t-1}, L_0
LT,Lt−1,L0。下面重点解释一下这3部分。
L T L_T LT : 常数项
L T = D K L ( q ( x T ∣ x 0 ) ∣ ∣ p θ ( x T ) ) L_T = D_{KL}(q(x_T|x_0)||p_\theta(x_T)) LT=DKL(q(xT∣x0)∣∣pθ(xT))
由于 q ( x T ∣ x 0 ) q(x_T|x_0) q(xT∣x0) 没有可学习的参数, p θ ( x T ) p_\theta(x_T) pθ(xT) 只是一个高斯噪声概率,因此这一项在训练期间是一个常数,可以忽略。
L t − 1 L_{t-1} Lt−1 : 逐步去噪项
L t − 1 = D K L ( q ( x t − 1 ∣ x t , x 0 ) ∣ ∣ p θ ( x t − 1 ∣ x t ) ) L_{t-1} = D_{KL}(q(x_{t-1}|x_t,x_0)||p_\theta(x_{t-1}|x_t)) Lt−1=DKL(q(xt−1∣xt,x0)∣∣pθ(xt−1∣xt))
这一项对目标去噪步骤
q
q
q 和近似去噪步骤
p
θ
p_\theta
pθ 进行比较。这里通过以
x
0
x_0
x0 为条件,让
q
(
x
t
−
1
∣
x
t
,
x
0
)
q(x_{t-1}|x_t, x_0)
q(xt−1∣xt,x0) 变得易于处理。我们分别来看
q
q
q 和
p
θ
p_\theta
pθ
q
(
x
t
−
1
∣
x
t
,
x
0
)
=
N
(
x
t
−
1
;
μ
~
(
x
t
,
x
0
)
,
β
~
t
I
)
β
~
t
=
1
−
α
ˉ
t
−
1
1
−
α
ˉ
t
⋅
β
t
μ
~
(
x
t
,
x
0
)
=
α
t
(
1
−
α
ˉ
t
−
1
)
1
−
α
ˉ
t
x
t
+
α
ˉ
t
−
1
β
t
1
−
α
ˉ
t
x
0
⋮
μ
~
(
x
t
)
=
1
α
t
(
x
t
−
1
−
α
t
1
−
α
ˉ
t
ε
t
)
q(x_{t-1}|x_t,x_0) = \mathcal{N}(x_{t-1};\tilde\mu(x_t, x_0), \tilde\beta_tI)\\ \tilde\beta_t = \frac{1-\bar\alpha_{t-1}}{1-\bar\alpha_t} \sdot \beta_t\\ \tilde\mu(x_t, x_0) = \frac{\sqrt{\alpha_t}(1-\bar\alpha_{t-1})}{1-\bar\alpha_t}x_t + \frac{\sqrt{\bar\alpha_{t-1}}\beta_t}{1-\bar\alpha_t}x_0\\ \vdots \\ \tilde\mu(x_t) = \frac{1}{\sqrt{\alpha_t}}\Big(x_t-\frac{1-\alpha_t}{\sqrt{1-\bar\alpha_t}}\varepsilon_t\Big)
q(xt−1∣xt,x0)=N(xt−1;μ~(xt,x0),β~tI)β~t=1−αˉt1−αˉt−1⋅βtμ~(xt,x0)=1−αˉtαt(1−αˉt−1)xt+1−αˉtαˉt−1βtx0⋮μ~(xt)=αt1(xt−1−αˉt1−αtεt)
经过一系列的推导,
q
(
x
t
−
1
∣
x
t
,
x
0
)
q(x_{t-1}|x_t,x_0)
q(xt−1∣xt,x0) 的均值
μ
~
t
\tilde\mu_t
μ~t 如上所示。其中
x
0
=
1
α
ˉ
t
(
x
t
−
1
−
α
ˉ
t
ε
t
)
x_0 = \frac{1}{\sqrt{\bar\alpha_t}}\Big(x_t-\sqrt{1-\bar\alpha_t}\varepsilon_t\Big)
x0=αˉt1(xt−1−αˉtεt) 。
为了逼近目标去噪步骤
q
q
q,我们只需要使用神经网络来逼近其均值。因此,我们将近似均值
μ
θ
\mu_\theta
μθ 设置为与目标均值
μ
~
t
\tilde{\mu}_t
μ~t 相同的形式(使用可学习的神经网络
ε
θ
\varepsilon_\theta
εθ):
μ
~
(
x
t
)
=
1
α
t
(
x
t
−
1
−
α
t
1
−
α
ˉ
t
ε
t
)
μ
θ
(
x
t
,
t
)
=
1
α
t
(
x
t
−
1
−
α
t
1
−
α
ˉ
t
ε
θ
(
x
t
,
t
)
)
\begin{aligned} \tilde\mu(x_t) &= \frac{1}{\sqrt{\alpha_t}}\Big(x_t-\frac{1-\alpha_t}{\sqrt{1-\bar\alpha_t}}\boxed{\varepsilon_t}\Big)\\ \mu_\theta(x_t,t) &= \frac{1}{\sqrt{\alpha_t}}\Big(x_t-\frac{1-\alpha_t}{\sqrt{1-\bar\alpha_t}}\boxed{\varepsilon_\theta(x_t,t)}\Big) \end{aligned}
μ~(xt)μθ(xt,t)=αt1(xt−1−αˉt1−αtεt)=αt1(xt−1−αˉt1−αtεθ(xt,t))
目标均值和近似均值之间的比较可以使用均方误差 (MSE) 来完成:
L
t
=
E
x
0
,
ε
[
1
2
σ
t
2
∣
∣
μ
~
t
(
x
t
)
−
μ
θ
(
x
t
,
t
)
∣
∣
2
]
=
E
x
0
,
ε
[
1
2
σ
t
2
∣
∣
1
α
t
(
x
t
−
1
−
α
t
1
−
α
ˉ
t
ε
t
)
−
1
α
t
(
x
t
−
1
−
α
t
1
−
α
ˉ
t
ε
θ
(
x
t
,
t
)
)
∣
∣
2
]
=
E
x
0
,
ε
[
(
1
−
α
t
)
2
2
α
t
(
1
−
α
ˉ
t
)
σ
t
2
∣
∣
ε
t
−
ε
θ
(
x
t
,
t
)
∣
∣
2
]
\begin{aligned} L_t &= \mathbb{E}_{x_0,\varepsilon}\Big[\frac{1}{2\sigma_t^2} ||\tilde{\mu}_t(x_t)-\mu_\theta(x_t, t)||^2 \Big]\\ &= \mathbb{E}_{x_0,\varepsilon}\Big[\frac{1}{2\sigma_t^2} ||\frac{1}{\sqrt{\alpha_t}}\big(x_t-\frac{1-\alpha_t}{\sqrt{1-\bar\alpha_t}}\varepsilon_t\big) - \frac{1}{\sqrt{\alpha_t}}\big(x_t-\frac{1-\alpha_t}{\sqrt{1-\bar\alpha_t}}\varepsilon_\theta(x_t,t)\big)||^2 \Big]\\ &= \mathbb{E}_{x_0,\varepsilon}\Big[\frac{(1-\alpha_t)^2}{2\alpha_t(1-\bar\alpha_t)\sigma_t^2}||\varepsilon_t-\varepsilon_\theta(x_t,t)||^2\Big] \end{aligned}
Lt=Ex0,ε[2σt21∣∣μ~t(xt)−μθ(xt,t)∣∣2]=Ex0,ε[2σt21∣∣αt1(xt−1−αˉt1−αtεt)−αt1(xt−1−αˉt1−αtεθ(xt,t))∣∣2]=Ex0,ε[2αt(1−αˉt)σt2(1−αt)2∣∣εt−εθ(xt,t)∣∣2]
上面公式中
(
1
−
α
t
)
2
2
α
t
(
1
−
α
ˉ
t
)
σ
t
2
\frac{(1-\alpha_t)^2}{2\alpha_t(1-\bar\alpha_t)\sigma_t^2}
2αt(1−αˉt)σt2(1−αt)2 是个常数,可以忽略掉,因此简化后的逐步去噪损失为:
L
t
simple
=
E
t
∼
[
1
,
T
]
,
x
0
,
ε
t
[
∣
∣
ε
t
−
ε
θ
(
x
t
,
t
)
∣
∣
2
]
L_t^{\text{simple}} = \mathbb{E}_{t \sim [1,T],x_0,\varepsilon_t}\Big[||\varepsilon_t-\varepsilon_\theta(x_t,t)||^2\Big]
Ltsimple=Et∼[1,T],x0,εt[∣∣εt−εθ(xt,t)∣∣2]
实践中,通过忽略加权项并简单地将目标噪声和预测噪声与 MSE 进行比较,可以获得更好的结果。
因此,事实证明,为了逼近所需的去噪步骤 q q q ,我们只需要使用神经网络 ε θ \varepsilon_\theta εθ 来逼近噪声 ε t \varepsilon_t εt。
L 0 L_0 L0 : 重构项
这是最后一步去噪的重构损失,在训练过程中可以忽略,原因如下:
- 可以使用 L t − 1 L_{t-1} Lt−1 中的相同神经网络对其进行近似。
- 忽略它会使样本质量更好,且更易于实施。
简化损失函数
上面分别解释了
L
T
,
L
t
−
1
,
L
0
L_T, L_{t-1}, L_0
LT,Lt−1,L0 。我们可以发现
L
T
L_T
LT 和
L
0
L_0
L0 都可以忽略,那么我们的损失函数就可以简化为:
L
simple
=
E
t
,
x
0
,
ε
[
∣
∣
ε
t
−
ε
θ
(
x
t
,
t
)
∣
∣
2
]
x
t
=
α
t
ˉ
x
0
+
1
−
α
ˉ
t
ε
L_{\text{simple}} = \mathbb{E}_{t,x_0,\varepsilon}\Big[||\varepsilon_t-\varepsilon_\theta(x_t,t)||^2\Big]\\ x_t=\sqrt{\bar{\alpha_t}}x_0+\sqrt{1-\bar{\alpha}_t}\varepsilon
Lsimple=Et,x0,ε[∣∣εt−εθ(xt,t)∣∣2]xt=αtˉx0+1−αˉtε
U-Net 模型
数据集
在每轮迭代:
- 为每个训练样本(图像)选择一个随机时间步长 t t t。
- 将高斯噪声(对应于 t t t)应用于每个图像。
- 将时间步长转换为嵌入(向量)。
训练
官方给出的训练算法如下:
下面详细解释一下训练步骤是如何工作的:
逆向扩散
我们可以使用上述算法从噪声中生成图像。 下图是具体说明:
注意,在最后一步中,我们只是简单地输出学习到的均值 μ θ ( x 1 , 1 ) \mu_\theta(x_1, 1) μθ(x1,1),而不向其添加噪声。
总结
最后对本文的要点做一个总结:
- 扩散模型分为正向扩散和逆向扩散两部分。
- 正向扩散可以使用闭合的公式来完成。
- 可以使用经过训练的神经网络完成逆向扩散。
- 为了逼近去噪步骤 q q q,我们只需要使用神经网络 ε θ \varepsilon_\theta εθ 来近似噪声 ε t \varepsilon_t εt。
- 对简化损失函数的训练产生更好的样本质量。
![Logo](https://devpress.csdnimg.cn/79de2bf0b7994defa4242ef90d5513fa.jpg)
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)