0.前言
一个图的风格就是他所在的样本分布。随机从中采样,得到一个向量就像是一串秘钥、DNA,生成式模型从向量映射到整张图片。生成模型无外乎做的就是这个任务,只不过做的方式或者说工具不一样。
相比其他任务,生成任务更加困难。因为其在监督学习中训练集会给出一个标准答案,而图像生成的数据集里只有同类型的图片,并没有指导信息。为了解决这一问题,人们专门设计了一些用于生成图像的神经网络架构。这些架构中比较出名的有生成对抗模型(GAN)和变分自编码器(VAE)。
GAN算法思想是,既然不知道一幅图片好不好,就干脆再训练一个神经网络,用于辨别某图片是不是和训练集里的图片长得一样。生成图像的神经网络叫做生成器,鉴定图像的神经网络叫做判别器。两个网络互相对抗,共同进步。GAN的做法是让你写篇paper,你老板只告诉你写的好和不好。
VAE算法思想为使用了逆向思维:学习向量生成图像很困难,那就再同时学习怎么用图像生成向量。这样,把某图像变成向量,再用该向量生成图像,就应该得到一幅和原图像一模一样的图像。每一个向量的绘画结果有了一个标准答案,可以用一般的优化方法来指导网络的训练了。VAE中,把图像变成向量的网络叫做编码器,把向量转换回图像的网络叫做解码器。其中,解码器就是负责生成图像的模型。VAE的做法是让你看一篇文章,充分理解后,让你一字不落的默写出来。
DM扩散模型的做法则是给你一篇paper,不断往里面掺本科生毕设,让你从中找到本科生写的东西并改掉。最后给你一篇本科生的毕设让你改成一篇正经paper
1.算法详解
1.1.前向过程
训练集的图像
x
0
x_0
x0添加
T
T
T次噪声,使得
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有关的正态分布中采样出来的。
x
t
∼
N
(
μ
(
x
t
−
1
)
,
σ
2
I
)
x_t \sim N(\mu(x_{t-1}), \sigma^2I)
xt∼N(μ(xt−1),σ2I)
该过程为马尔科夫过程
,即当前时刻的状态仅由上一时刻的状态决定,而不由更早的状态决定。加噪声过程大概可以理解为一种特殊的加权平均,对每个像素值加噪声,表示为:
x
t
=
1
−
β
t
x
t
−
1
+
β
t
ϵ
x_t = \sqrt{1-\beta_t}x_{t-1} + \sqrt\beta_t\epsilon
xt=1−βtxt−1+βtϵ
归纳可推导:
(
1
−
β
t
)
(
1
−
β
t
−
1
)
(
1
−
β
t
−
2
)
x
t
−
3
+
1
−
(
1
−
β
t
)
(
1
−
β
t
1
)
(
1
−
β
t
2
)
ϵ
\sqrt{(1-\beta_{t})(1-\beta_{t-1})(1-\beta_{t-2})}x_{t-3} + \sqrt{1-(1-\beta_{t})(1-\beta_{t_1})(1-\beta_{t_2})}\epsilon
(1−βt)(1−βt−1)(1−βt−2)xt−3+1−(1−βt)(1−βt1)(1−βt2)ϵ
令
α
t
=
1
−
β
t
,
α
ˉ
=
∏
i
=
1
t
α
i
\alpha_t=1-\beta_{t},\bar\alpha=\prod_{i=1}^{t}\alpha_i
αt=1−βt,αˉ=∏i=1tαi则:
x
t
=
α
ˉ
t
x
0
+
1
−
α
t
ˉ
ϵ
x_t=\sqrt{\bar\alpha_t}x_0 + \sqrt{1-\bar{\alpha_t}}\epsilon
xt=αˉtx0+1−αtˉϵ
其中
β
t
\beta_t
βt是一个小于1的常数,在DDPM论文中,
β
1
=
1
0
−
4
\beta_1=10^{-4}
β1=10−4到
β
T
=
0.02
\beta_T=0.02
βT=0.02线性增长。随着
β
t
\beta_t
βt变大,
α
t
\alpha_t
αt越小,
α
ˉ
t
\bar\alpha_t
αˉt趋于0的速度越来越快,最后为0,图片也就等于
ϵ
\epsilon
ϵ所代表的正态分布。
1.2.反向过程
**正向过程加了T次随机噪声,反向过程为减去T次随机噪声。**大概形式为:
x
t
−
1
=
a
⋅
x
t
−
b
⋅
ϵ
θ
x_{t-1} = a \cdot x_t - b \cdot \epsilon_\theta
xt−1=a⋅xt−b⋅ϵθ
x
t
−
1
x_{t-1}
xt−1服从正态分布,表示为
x
t
−
1
∼
N
(
μ
~
t
,
β
~
t
I
)
x_{t-1} \sim N(\widetilde\mu_t, \widetilde\beta_t I)
xt−1∼N(μ
t,β
tI)
而
x
t
−
1
x_{t-1}
xt−1的分布可以通过贝叶斯公式计算(其中q表示概率分布):
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)
其中:
q ( x t − 1 ∣ x t , x 0 ) = N ( μ ~ t , β ~ t I ) q(x_{t-1}|x_t,x_0) = N(\widetilde\mu_t, \widetilde\beta_t I) q(xt−1∣xt,x0)=N(μ t,β tI)为加噪声的逆操作
q ( x t ∣ x t − 1 , x 0 ) = N ( x t ; 1 − β t x t − 1 , β t I ) q(x_t|x_{t-1},x_0)=N(x_t;\sqrt{1-\beta_t}x_{t-1}, \beta_t I) q(xt∣xt−1,x0)=N(xt;1−βtxt−1,βtI)为加噪声的分布
q ( x t ∣ x 0 ) = N ( x t ; α t ˉ x 0 , ( 1 − α ˉ t ) I ) q(x_t|x_0)=N(x_t;\sqrt{\bar{\alpha_t}}x_0, (1-\bar\alpha_t)I) q(xt∣x0)=N(xt;αtˉx0,(1−αˉt)I)
将全部式子带入右边并化简后:
μ
~
t
=
1
α
t
(
x
t
−
1
−
α
t
1
−
α
‾
t
ϵ
t
)
\widetilde\mu_t = \frac{1}{\sqrt\alpha_t}(x_t - \frac{1 - \alpha_t}{\sqrt{1 - \overline\alpha_t}}\epsilon_t)
μ
t=αt1(xt−1−αt1−αtϵt)
β ~ t = 1 − α ˉ t − 1 1 − α ˉ t ⋅ β t \widetilde\beta_t = \frac{1-\bar\alpha_{t-1}}{1-\bar\alpha_t} \cdot \beta_t β t=1−αˉt1−αˉt−1⋅βt
计算中 x t − 1 x_{t-1} xt−1为 μ ~ t \widetilde\mu_t μ t加上一个正态分布的随机变量 β ~ t ⋅ t o r c h . r a n d n \widetilde\beta_t\cdot torch.randn β t⋅torch.randn
由于
α
,
x
t
\alpha,x_t
α,xt全都已知,仅有噪声
ϵ
\epsilon
ϵ未知,因此只需要让网络预测噪声
ϵ
\epsilon
ϵ即可。损失函数为:
L
=
∣
∣
ϵ
t
−
ϵ
θ
(
x
t
,
t
)
∣
∣
L = ||\epsilon_t - \epsilon_\theta(x_t, t)||
L=∣∣ϵt−ϵθ(xt,t)∣∣
1.3.算法流程
1.3.1训练过程
从数据集中取一个数据
x
0
x_0
x0,随机从1,…,T中抽一个为t,随机一个噪声torch.randn
用来正向过程加噪
x
t
=
α
ˉ
t
x
0
+
1
−
α
t
ˉ
ϵ
x_t=\sqrt{\bar\alpha_t}x_0 + \sqrt{1-\bar{\alpha_t}}\epsilon
xt=αˉtx0+1−αtˉϵ。
第五步中包含几个计算过程:生成加噪后的图 x t x_t xt,把 x t x_t xt输入到网络中预测噪声图 ϵ θ \epsilon_{\theta} ϵθ,计算L2损失,回传梯度。注意 x t 和 ϵ θ x_t和\epsilon_\theta xt和ϵθ有相同形状
1.3.2.推理过程(采样过程)
随机生成一个正态分布的噪声图 x T x_T xT,计算样本分布的均值 1 α t ( x t − 1 − α t 1 − α ‾ t ϵ t ) \frac{1}{\sqrt\alpha_t}(x_t - \frac{1 - \alpha_t}{\sqrt{1 - \overline\alpha_t}}\epsilon_t) αt1(xt−1−αt1−αtϵt),注意此处 x t x_t xt和均值都是一张图,都是在 x t x_t xt图像的像素上做去噪操作。均值图加上正态随机变量 z z z(也是张图),就完成了这次采样。循环T次得到 x 0 x_0 x0