可以观看Diffusion model来学习一些Diffusion model内容:链接
Diffusion model
Diffusion model定义了总的来说就是包含一个扩散过程和一个逆扩散过程,扩散过程中使用马尔可夫链将噪声加入到数据中,逆扩散过程是用噪声构造所需的数据样本。这两个过程都是迭代完成的。
训练好的模型就没有前向过程了。
前向传播过程:
反向扩散过程
总过程:
前向过程
①首先引入一个式子
α
t
=
1
−
β
t
\alpha_t=1-\beta_t
αt=1−βt,其中
β
\beta
β要越来越大,论文中是0.0001到0.002,也就是说
α
\alpha
α要越来越小。
其中
α
t
\alpha_t
αt类似于如下图。(注意:可以使用线性变小,也可使用其他的方法)
②然后再来看
设
x
t
x_t
xt是t时刻的一个分布,可以看上面前向过程的图,可以看出
x
t
x_t
xt时刻当前分布是由
x
t
−
1
x_{t-1}
xt−1时刻计算出来,加了些噪音,类似于RNN递归结构。
公式 为
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
z
1
z_1
z1可以理解为噪音。
α
t
\sqrt{\alpha_t}
αt和
1
−
α
t
\sqrt{1-\alpha_t}
1−αt可以理解为两个权重。
③然后看最开始的公式,越到最后 α t \alpha_t αt越小,也就是 α t \sqrt{\alpha_t} αt越小, 1 − α t \sqrt{1-\alpha_t} 1−αt越大,说明越往后加的噪声影响越大。
现在想一个问题,如果是递归,从
x
0
x_0
x0运算到
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
−
1
=
α
t
−
1
x
t
−
2
+
1
−
α
t
−
1
z
2
x_{t-1}=\sqrt{\alpha_{t-1}}x_{t-2}+\sqrt{1-\alpha_{t-1}}z_2
xt−1=αt−1xt−2+1−αt−1z2
然后带入到
x
t
x_t
xt中得到:
x
t
=
α
t
(
α
t
−
1
x
t
−
2
+
1
−
α
t
−
1
z
2
)
+
1
−
α
t
z
1
x_t=\sqrt{\alpha_t}(\sqrt{\alpha_{t-1}}x_{t-2}+\sqrt{1-\alpha_{t-1}}z_2)+\sqrt{1-\alpha_t}z_1
xt=αt(αt−1xt−2+1−αt−1z2)+1−αtz1
展开:
x
t
=
α
t
α
t
−
1
x
t
−
2
+
(
a
t
(
1
−
α
t
−
1
)
z
2
+
1
−
α
t
z
1
)
x_t=\sqrt{\alpha_t}\sqrt{\alpha_{t-1}}x_{t-2}+(\sqrt{a_t(1-\alpha_{t-1})}z_2+\sqrt{1-\alpha_t}z_1)
xt=αtαt−1xt−2+(at(1−αt−1)z2+1−αtz1)
⑤因为
z
1
和
z
2
z_1和z_2
z1和z2都符合高斯分布分别为
N
(
0
,
1
−
α
t
)
N(0,1-\alpha_t)
N(0,1−αt)和
N
(
0
,
α
t
(
1
−
α
t
−
1
)
)
N(0,\alpha_t(1-\alpha_{t-1}))
N(0,αt(1−αt−1))
相加后仍然符合高斯分布:
所以可以化简为:
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
t
x_t
xt直接算到
x
0
x_0
x0
⑥逆向过程就是
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(x_{t-1}|x_t,x_0)= q(x_{t}|x_{t-1},x_0)\frac{q(x_{t-1}|x_{0})}{q(x_{t}|x_{0})}
q(xt−1∣xt,x0)=q(xt∣xt−1,x0)q(xt∣x0)q(xt−1∣x0)
根据上面⑤讲的:
⑦正态分布:一个数学期望为μ、方差为
σ
2
σ^2
σ2的正态分布
X
∼
N
(
μ
,
σ
2
)
X\sim N(μ,σ^2)
X∼N(μ,σ2)
函数为:
e
x
p
(
−
(
X
−
μ
)
2
2
σ
2
)
exp(-\frac{(X-μ)^2}{2σ^2})
exp(−2σ2(X−μ)2)
正态分布展开后,乘法就相当于加,除法就相当于减。
则
q
(
x
t
∣
x
t
−
1
,
x
0
)
q
(
x
t
−
1
∣
x
0
)
q
(
x
t
∣
x
0
)
q(x_{t}|x_{t-1},x_0)\frac{q(x_{t-1}|x_{0})}{q(x_{t}|x_{0})}
q(xt∣xt−1,x0)q(xt∣x0)q(xt−1∣x0)
继续化简:
⑧
C是个常数项,不影响。
这个式子跟上面的式子进行对比,可以得到期望和方差。
根据公式⑧可以得到
之前说
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{\overline\alpha_{t}}}(x_t-\sqrt{1-\overline\alpha_t}z_t)
x0=αt1(xt−1−αtzt)
最终结果
u
~
=
1
α
‾
t
(
x
t
−
β
t
1
−
α
‾
t
z
t
)
\widetilde u =\frac{1}{\sqrt{\overline\alpha_{t}}}(x_t-\frac{\beta_t}{\sqrt{1-\overline\alpha_t}}z_t)
u
=αt1(xt−1−αtβtzt)
⑨
z
t
z_t
zt 怎么求?
z
t
z_t
zt其实就是我们要估计的每一个时刻的噪声
我们可以训练一个模型来进行计算,一些相关论文里使用的unet结构来进行计算。
UNet是一样的,传进来输入是不同的。
DDPM论文中的训练和采样方法(就是那两个阶段)
Training
(2)首先先取数据->(3)构建T序列->(4)加符合正态分布的噪声->(5)模型学习
细节:
①在3中假设batch是4个,T为200,每一个img会随机取T值,比如
T
1
T_1
T1=30,
T
2
T_2
T2=150,
T
3
T_3
T3=60,
T
4
T_4
T4=180,
②在5中,其中
ϵ
θ
\epsilon_{\theta}
ϵθ为神经网络模型,通过输入
x
t
x_t
xt和
t
t
t预测
ϵ
\epsilon
ϵ,目标为缩小与真实的
ϵ
\epsilon
ϵ的差距。
t
t
t相当于是一个时刻(t越大,噪声越大,要告诉模型),类似于transformer的位置编码。
再看一下损失,前面的
ϵ
\epsilon
ϵ为真实值,减去后面那一坨(预测值),就是损失。
总的来说就是为了得到Unet模型,在unet中还有attention。
Sampling
(1)首先随机得到一个正态分布->(2)循环(从T->0) ->(3)噪音点,最后一步不用加,t>1时候加->(4)最重要公式,得到
x
t
−
1
x_{t-1}
xt−1(高斯分布重采样)
细节: 代码中在第四步还有重采样过程,得到了u和σ分布,需要采样得到实际图像。