扩散模型求解复杂反应的例子(Diffusion扩散模型学习1——Pytorch搭建DDPM实现图片生成)
学习前言
我又死了我又死了我又死了!
源码下载地址
https://github.com/bubbliiiing/ddpm-pytorch
喜欢的可以点个star噢 。
网络构建
一 、什么是Diffusion
如上图所示 。DDPM模型主要分为两个过程:
1 、Forward加噪过程(从右往左) ,数据集的真实图片中逐步加入高斯噪声 ,最终变成一个杂乱无章的高斯噪声,这个过程一般发生在训练的时候。加噪过程满足一定的数学规律 。
2 、Reverse去噪过程(从左往右) ,指对加了噪声的图片逐步去噪 ,从而还原出真实图片 ,这个过程一般发生在预测生成的时候 。尽管在这里说的是加了噪声的图片 ,但实际去预测生成的时候 ,是随机生成一个高斯噪声来去噪 。去噪的时候不断根据X
t
X_t
Xt的图片生成X
t
−
1
X_{t-1}
Xt−1的噪声 ,从而实现图片的还原 。1 、加噪过程
Forward加噪过程主要符合如下的公式:
x
t
=
α
t
x
t
−
1
+
1
−
α
t
z
1
x_t=\sqrt{\alpha_t} x_{t-1}+\sqrt{1-\alpha_t} z_{1}
xt=αtxt−1+1−αtz1 其中α
t
\sqrt{\alpha_t}
αt是预先设定好的超参数 ,被称为Noise schedule ,通常是小于1的值 ,在论文中α
t
\alpha_t
αt的值从0.9999到0.998 。ϵ
t
−
1
∼
N
(
,
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
(
,
1
)
z_1, z_2, \ldots \sim \mathcal{N}(0, 1)
z1,z2,…∼N(0,1),两个高斯分布的相加高斯分布满足公式:N
(
,
σ
1
2
)
+
N
(
,
σ
2
2
)
∼
N
(
,
(
σ
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
x_0
x0到x
t
x_t
xt的公式:
x
t
=
α
t
‾
x
+
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
(
,
1
)
z_{t-1} \sim N(0, 1)
zt−1∼N(0,1)也是一个高斯噪声 。通过上述两个公式 ,我们可以不断的将图片进行破坏加噪 。2 、去噪过程
反向过程就是通过估测噪声 ,多次迭代逐渐将被破坏的
x
t
x_t
xt恢复成x
x_0
x0 ,在恢复时刻 ,我们已经知道的是x
t
x_t
xt ,这是图片在t
t
t时刻的噪声图。一下子从x
t
x_t
xt恢复成x
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
)
=
q
(
x
t
∣
x
t
−
1
,
x
)
q
(
x
t
−
1
∣
x
)
q
(
x
t
∣
x
)
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开始推得到:
q
(
x
t
−
1
∣
x
)
=
a
ˉ
t
−
1
x
+
1
−
a
ˉ
t
−
1
z
∼
N
(
a
ˉ
t
−
1
x
,
1
−
a
ˉ
t
−
1
)
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(xt−1∣x0)=aˉt−1x0+1−aˉt−1z∼N(aˉt−1x0,1−aˉt−1)q
(
x
t
∣
x
)
=
a
ˉ
t
x
+
1
−
α
ˉ
t
z
∼
N
(
a
ˉ
t
x
,
1
−
α
ˉ
t
)
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(xt∣x0)=aˉtx0+1−αˉtz∼N(aˉtx0,1−αˉt)q
(
%创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!