DDPM理论基础解析
DDPM
- 加噪过程
- 去噪过程
DDPM模型主要分为两个过程:
1、Forward加噪过程(从右往左),数据集的真实图片中逐步加入高斯噪声,最终变成一个杂乱无章的高斯噪声,这个过程一般发生在训练的时候。加噪过程满足一定的数学规律。
2、Reverse去噪过程(从左往右),指对加了噪声的图片逐步去噪,从而还原出真实图片,这个过程一般发生在预测生成的时候。尽管在这里说的是加了噪声的图片,但实际去预测生成的时候,是随机生成一个高斯噪声来去噪。去噪的时候不断根据 X t X_t Xt的图片生成 X t − 1 X_{t-1} Xt−1的噪声,从而实现图片的还原。
加噪过程
Forward加噪过程主要符合如下的公式:
x
t
=
α
t
x
t
−
1
+
1
−
α
t
z
t
(1)
x_t=\sqrt{\alpha_t} x_{t-1}+\sqrt{1-\alpha_t} z_{t} \tag{1}
xt=αtxt−1+1−αtzt(1)其中
α
t
\sqrt{\alpha_t}
αt是预先设定好的超参数,被称为Noise schedule,通常是小于1的值,在论文中
α
t
\alpha_t
αt的值从0.9999到0.998。
ϵ
t
−
1
∼
N
(
0
,
1
)
\epsilon_{t-1} \sim N(0, 1)
ϵt−1∼N(0,1)是高斯噪声。由公式(1)迭代推导。
x
t
=
a
t
(
a
t
−
1
x
t
−
2
+
1
−
α
t
−
1
z
2
)
+
1
−
α
t
z
1
=
a
t
a
t
−
1
x
t
−
2
+
(
a
t
(
1
−
α
t
−
1
)
z
2
+
1
−
α
t
z
1
)
x_t=\sqrt{a_t}\left(\sqrt{a_{t-1}} x_{t-2}+\sqrt{1-\alpha_{t-1}} z_2\right)+\sqrt{1-\alpha_t} z_1=\sqrt{a_t a_{t-1}} x_{t-2}+\left(\sqrt{a_t\left(1-\alpha_{t-1}\right)} z_2+\sqrt{1-\alpha_t} z_1\right)
xt=at(at−1xt−2+1−αt−1z2)+1−αtz1=atat−1xt−2+(at(1−αt−1)z2+1−αtz1)其中每次加入的噪声都服从高斯分布
z
1
,
z
2
,
…
∼
N
(
0
,
1
)
z_1, z_2, \ldots \sim \mathcal{N}(0, 1)
z1,z2,…∼N(0,1),两个高斯分布的相加高斯分布满足公式:
N
(
0
,
σ
1
2
)
+
N
(
0
,
σ
2
2
)
∼
N
(
0
,
(
σ
1
2
+
σ
2
2
)
)
\mathcal{N}\left(0, \sigma_1^2 \right)+\mathcal{N}\left(0, \sigma_2^2 \right) \sim \mathcal{N}\left(0,\left(\sigma_1^2+\sigma_2^2\right) \right)
N(0,σ12)+N(0,σ22)∼N(0,(σ12+σ22)) ,因此,得到
x
t
x_t
xt 的公式为:
x
t
=
a
t
a
t
−
1
x
t
−
2
+
1
−
α
t
α
t
−
1
z
2
x_t = \sqrt{a_t a_{t-1}} x_{t-2}+\sqrt{1-\alpha_t \alpha_{t-1}} z_2
xt=atat−1xt−2+1−αtαt−1z2因此不断往里面套,就可以直接得出
x
0
x_0
x0 到
x
t
x_t
xt的公式:
x
t
=
α
t
‾
x
0
+
1
−
α
t
‾
z
t
x_t=\sqrt{\overline{\alpha_t}} x_0+\sqrt{1-\overline{\alpha_t}} z_t
xt=αtx0+1−αtzt其中
α
t
‾
=
∏
i
t
α
i
\overline{\alpha_t}=\prod_i^t \alpha_i
αt=∏itαi,这是随Noise schedule设定好的超参数,
z
t
−
1
∼
N
(
0
,
1
)
z_{t-1} \sim N(0, 1)
zt−1∼N(0,1) 也是个高斯噪声。通过上述两个公式,我们可以不断的将图片进行破坏加噪。
去噪过程
反向过程就是通过估测噪声,多次迭代逐渐将被破坏的
x
t
x_t
xt恢复成
x
0
x_0
x0,在恢复时刻,我们已经知道的是
x
t
x_t
xt,这是图片在t 时刻的噪声图。一下子从
x
t
x_t
xt恢复成
x
0
x_0
x0是不可能的,我们只能一步一步的往前推,首先从
x
t
x_t
xt恢复成
x
t
−
1
x_{t-1}
xt−1。根据贝叶斯公式,已知
x
t
x_t
xt反推
x
t
−
1
x_{t-1}
xt−1:
q
(
x
t
−
1
∣
x
t
,
x
0
)
=
q
(
x
t
∣
x
t
−
1
,
x
0
)
q
(
x
t
−
1
∣
x
0
)
q
(
x
t
∣
x
0
)
q\left(x_{t-1} \mid x_t, x_0\right)=q\left(x_t \mid x_{t-1}, x_0\right) \frac{q\left(x_{t-1} \mid x_0\right)}{q\left(x_t \mid x_0\right)}
q(xt−1∣xt,x0)=q(xt∣xt−1,x0)q(xt∣x0)q(xt−1∣x0)
右边的三个东西都可以从
x
0
x_0
x0开始推得到:
q
(
x
t
−
1
∣
x
0
)
=
a
ˉ
t
−
1
x
0
+
1
−
a
ˉ
t
−
1
z
∼
N
(
a
ˉ
t
−
1
x
0
,
1
−
a
ˉ
t
−
1
)
q
(
x
t
∣
x
0
)
=
a
ˉ
t
x
0
+
1
−
α
ˉ
t
z
∼
N
(
a
ˉ
t
x
0
,
1
−
α
ˉ
t
)
q
(
x
t
∣
x
t
−
1
,
x
0
)
=
a
t
x
t
−
1
+
1
−
α
t
z
∼
N
(
a
t
x
t
−
1
,
1
−
α
t
)
q\left(x_{t-1} \mid x_0\right)=\sqrt{\bar{a}_{t-1}} x_0+\sqrt{1-\bar{a}_{t-1}} z \sim \mathcal{N}\left(\sqrt{\bar{a}_{t-1}} x_0, 1-\bar{a}_{t-1}\right)\\q\left(x_t \mid x_0\right) = \sqrt{\bar{a}_t} x_0+\sqrt{1-\bar{\alpha}_t} z \sim \mathcal{N}\left(\sqrt{\bar{a}_t} x_0 , 1-\bar{\alpha}_t\right)\\q\left(x_t \mid x_{t-1}, x_0\right)=\sqrt{a_t} x_{t-1}+\sqrt{1-\alpha_t} z \sim \mathcal{N}\left(\sqrt{a_t} x_{t-1}, 1-\alpha_t\right)
q(xt−1∣x0)=aˉt−1x0+1−aˉt−1z∼N(aˉt−1x0,1−aˉt−1)q(xt∣x0)=aˉtx0+1−αˉtz∼N(aˉtx0,1−αˉt)q(xt∣xt−1,x0)=atxt−1+1−αtz∼N(atxt−1,1−αt)因此,由于右边三个东西均满足正态分布,
q
(
x
t
−
1
∣
x
t
,
x
0
)
q\left(x_{t-1} \mid x_t, x_0\right)
q(xt−1∣xt,x0)满足分布如下:
∝
exp
(
−
1
2
(
(
x
t
−
α
t
x
t
−
1
)
2
β
t
+
(
x
t
−
1
−
α
ˉ
t
−
1
x
0
)
2
1
−
α
ˉ
t
−
1
−
(
x
t
−
α
ˉ
t
x
0
)
2
1
−
α
ˉ
t
)
)
\propto \exp \left(-\frac{1}{2}\left(\frac{\left(x_t-\sqrt{\alpha_t} x_{t-1}\right)^2}{\beta_t}+\frac{\left(x_{t-1}-\sqrt{\bar{\alpha}_{t-1}} x_0\right)^2}{1-\bar{\alpha}_{t-1}}-\frac{\left(x_t-\sqrt{\bar{\alpha}_t} x_0\right)^2}{1-\bar{\alpha}_t}\right)\right)
∝exp(−21(βt(xt−αtxt−1)2+1−αˉt−1(xt−1−αˉt−1x0)2−1−αˉt(xt−αˉtx0)2))把标准正态分布展开后,乘法就相当于加,除法就相当于减,把他们汇总,继续化简,咱们现在要求的是上一时刻的分布
∝
exp
(
−
1
2
(
(
x
t
−
α
t
x
t
−
1
)
2
β
t
+
(
x
t
−
1
−
α
ˉ
t
−
1
x
0
)
2
1
−
α
ˉ
t
−
1
−
(
x
t
−
α
ˉ
t
x
0
)
2
1
−
α
ˉ
t
)
)
=
exp
(
−
1
2
(
x
t
2
−
2
α
t
x
t
x
t
−
1
+
α
t
x
t
−
1
2
β
t
+
x
t
−
1
2
−
2
α
ˉ
t
−
1
x
0
x
t
−
1
+
α
ˉ
t
−
1
x
0
2
1
−
α
ˉ
t
−
1
−
(
x
t
−
α
ˉ
t
x
0
)
2
1
−
α
ˉ
t
)
)
=
exp
(
−
1
2
(
(
α
t
β
t
+
1
1
−
α
ˉ
t
−
1
)
x
t
−
1
2
−
(
2
α
t
β
t
x
t
+
2
α
ˉ
t
−
1
1
−
α
ˉ
t
−
1
x
0
)
x
t
−
1
+
C
(
x
t
,
x
0
)
)
)
\begin{aligned} & \propto \exp \left(-\frac{1}{2}\left(\frac{\left(x_t-\sqrt{\alpha_t} x_{t-1}\right)^2}{\beta_t}+\frac{\left(x_{t-1}-\sqrt{\bar{\alpha}_{t-1}} x_0\right)^2}{1-\bar{\alpha}_{t-1}}-\frac{\left(x_t-\sqrt{\bar{\alpha}_t} x_0\right)^2}{1-\bar{\alpha}_t}\right)\right) \\ & =\exp \left(-\frac{1}{2}\left(\frac{x_t^2-2 \sqrt{\alpha_t} x_t x_{t-1}+\alpha_t x_{t-1}^2}{\beta_t}+\frac{x_{t-1}^2-2 \sqrt{\bar{\alpha}_{t-1}} x_0 x_{t-1}+\bar{\alpha}_{t-1} x_0^2}{1-\bar{\alpha}_{t-1}}-\frac{\left(x_t-\sqrt{\bar{\alpha}_t} x_0\right)^2}{1-\bar{\alpha}_t}\right)\right) \\ & =\exp \left(-\frac{1}{2}\left(\left(\frac{\alpha_t}{\beta_t}+\frac{1}{1-\bar{\alpha}_{t-1}}\right) x_{t-1}^2-\left(\frac{2 \sqrt{\alpha_t}}{\beta_t} x_t+\frac{2 \sqrt{\bar{\alpha}_{t-1}}}{1-\bar{\alpha}_{t-1}} x_0\right) x_{t-1}+C\left(x_t, x_0\right)\right)\right) \end{aligned}
∝exp(−21(βt(xt−αtxt−1)2+1−αˉt−1(xt−1−αˉt−1x0)2−1−αˉt(xt−αˉtx0)2))=exp(−21(βtxt2−2αtxtxt−1+αtxt−12+1−αˉt−1xt−12−2αˉt−1x0xt−1+αˉt−1x02−1−αˉt(xt−αˉtx0)2))=exp(−21((βtαt+1−αˉt−11)xt−12−(βt2αtxt+1−αˉt−12αˉt−1x0)xt−1+C(xt,x0)))正态分布满足公式,
exp
(
−
(
x
−
μ
)
2
2
σ
2
)
=
exp
(
−
1
2
(
1
σ
2
x
2
−
2
μ
σ
2
x
+
μ
2
σ
2
)
)
\exp \left(-\frac{(x-\mu)^2}{2 \sigma^2}\right)=\exp \left(-\frac{1}{2}\left(\frac{1}{\sigma^2} x^2-\frac{2 \mu}{\sigma^2} x+\frac{\mu^2}{\sigma^2}\right)\right)
exp(−2σ2(x−μ)2)=exp(−21(σ21x2−σ22μx+σ2μ2)),其中
σ
\sigma
σ就是方差,
μ
\mu
μ就是均值,配方后我们就可以获得均值和方差。
此时的均值为: μ ~ t ( x t , x 0 ) = α t ( 1 − α ˉ t − 1 ) 1 − α ˉ t x t + α ˉ t − 1 β t 1 − α ˉ t x 0 \tilde{\mu}_t\left(x_t, x_0\right)=\frac{\sqrt{\alpha_t}\left(1-\bar{\alpha}_{t-1}\right)}{1-\bar{\alpha}_t} x_t+\frac{\sqrt{\bar{\alpha}_{t-1}} \beta_t}{1-\bar{\alpha}_t} x_0 μ~t(xt,x0)=1−αˉtαt(1−αˉt−1)xt+1−αˉtαˉt−1βtx0根据之前的公式, x t = α t ‾ x 0 + 1 − α t ‾ z t x_t=\sqrt{\overline{\alpha_t}} x_0+\sqrt{1-\overline{\alpha_t}} z_t xt=αtx0+1−αtzt,我们可以使用 x t x_t xt 反向估计得到 x 0 x_0 x0,其满足分布 x 0 = 1 α ˉ t ( x t − 1 − α ˉ t z t ) x_0=\frac{1}{\sqrt{\bar{\alpha}_t}}\left(\mathrm{x}_t-\sqrt{1-\bar{\alpha}_t} z_t\right) x0=αˉt1(xt−1−αˉtzt)。
最终得到均值为
μ
~
t
=
1
a
t
(
x
t
−
β
t
1
−
a
ˉ
t
z
t
)
\tilde{\mu}_t=\frac{1}{\sqrt{a_t}}\left(x_t-\frac{\beta_t}{\sqrt{1-\bar{a}_t}} z_t\right)
μ~t=at1(xt−1−aˉtβtzt),
z
t
z_t
zt代表t时刻的噪音是什么。由
z
t
z_t
zt无法直接获得,网络便通过当前时刻的
x
t
x_t
xt 经过神经网络计算
z
t
z_t
zt。
ϵ
θ
(
x
t
,
t
)
\epsilon_\theta\left(x_t, t\right)
ϵθ(xt,t)也就是上面提到的
z
t
z_t
zt。
ϵ
θ
\epsilon_\theta
ϵθ代表神经网络。
x
t
−
1
=
1
α
t
(
x
t
−
1
−
α
t
1
−
α
ˉ
t
ϵ
θ
(
x
t
,
t
)
)
+
σ
t
z
x_{t-1}=\frac{1}{\sqrt{\alpha_t}}\left(x_t-\frac{1-\alpha_t}{\sqrt{1-\bar{\alpha}_t}} \epsilon_\theta\left(x_t, t\right)\right)+\sigma_t z
xt−1=αt1(xt−1−αˉt1−αtϵθ(xt,t))+σtz由于加噪过程中的真实噪声
ϵ
\epsilon
ϵ 在复原过程中是无法获得的,因此DDPM的关键就是训练一个由
x
t
x_t
xt和t估测橾声的模型
ϵ
θ
(
x
t
,
t
)
\epsilon_\theta\left(x_t, t\right)
ϵθ(xt,t),其中
θ
\theta
θ就是模型的训练参数,
σ
t
\sigma_t
σt 也是一个高斯噪声
σ
t
∼
N
(
0
,
1
)
\sigma_t \sim N(0,1)
σt∼N(0,1),用于表示估测与实际的差距。在DDPM中,使用U-Net作为估测噪声的模型。
本质上,我们就是训练这个Unet模型,该模型输入为 x t x_t xt和t,输出为 x t x_t xt时刻的高斯噪声。即利用 x t x_t xt和 t 预测这一时刻的高斯噪声。这样就可以一步一步的再从噪声回到真实图像。