Denoising Diffusion Probabilistic Models
NeurlPS2020
Background
Markov Chain
- 离散时间
- X n X_n Xn表示马尔可夫链在此时的状态
- 状态空间
- 马尔科夫链所有的状态会构成一个集合 S = { 1 , . . . , m } S=\{1,...,m\} S={1,...,m}
- 转移概率
-
p
i
j
=
P
(
X
n
+
1
=
j
∣
X
n
=
i
)
p_{ij}= P(X_{n+1}=j|X_n=i)
pij=P(Xn+1=j∣Xn=i) ——条件概率
P { X n + 1 = j ∣ X n = i , X n − 1 , . . . , X 0 = i 0 } = P ( X n + 1 = j ∣ X n = i ) = p i j P\{X_{n+1}=j|X_n=i,X_{n-1},...,X_0=i_0\}= P(X_{n+1}=j|X_n=i)=p_{ij} P{Xn+1=j∣Xn=i,Xn−1,...,X0=i0}=P(Xn+1=j∣Xn=i)=pij
-
p
i
j
=
P
(
X
n
+
1
=
j
∣
X
n
=
i
)
p_{ij}= P(X_{n+1}=j|X_n=i)
pij=P(Xn+1=j∣Xn=i) ——条件概率
- 下一个状态的概率分布只依赖于前一个状态
[ 0.2 0.2 0.6 0.2 0.1 0.7 0.1 0.3 0.6 ] \begin{bmatrix} 0.2&0.2&0.6\\ 0.2&0.1&0.7\\ 0.1&0.3&0.6\\ \end{bmatrix} 0.20.20.10.20.10.30.60.70.6 - 阶级流动的例子:状态1是处于贫困水平,状态2是中产阶级,状态3是财富自由
[ 0.7 0.2 0.1 0.3 0.5 0.2 0.2 0.4 0.4 ] \begin{bmatrix} 0.7&0.2&0.1\\ 0.3&0.5&0.2\\ 0.2&0.4&0.4\\ \end{bmatrix} 0.70.30.20.20.50.40.10.20.4 - 假设爷爷处于贫困水平(状态1),那么父亲处于中产阶级(状态2),而你处于财富自由水平(状态3)的概率有多大?
P ( A ∣ B ) = P ( A B ) P ( B ) P(A|B)=\frac{P(AB)}{P(B)} P(A∣B)=P(B)P(AB) - 这是一个马尔科夫链,因此满足:
- 因此
p 12 p 23 = 0.2 ∗ 0.2 = 0.04 p_{12}p_{23}=0.2*0.2=0.04 p12p23=0.2∗0.2=0.04
- 假设爷爷处于贫困水平(状态1),那么父亲处于中产阶级(状态2),而你处于财富自由水平(状态3)的概率有多大?
Diffusion Model
- 白噪音经过逐步去噪变为清晰图片
- Diffusion model就是引用马尔可夫链,用于在扩散中缓慢加入随机噪声,然后通过学习逆扩散过程从噪声中构建所需的数据样本,引入噪声导致信息衰减,再通过去噪尝试还原原始数据,通过多次迭代,使模型在给定噪声输入的情况下学习生成新的图像
- 就像米开朗基罗的石头,图片已经在噪声之中,要做的是讲其分解掉
- Denoise内部通过输入噪音图片和步骤step,产生一张噪音图,即预测这张照片中噪音应该的样子,再用输入图片减去噪音图片,生成输出图
- 一句话概括diffusion model,即存在一系列高斯噪声(T轮),将输入图片
x
0
x_0
x0 变为纯高斯噪声
x
T
x_T
xT,而我们的模型则负责将
x T x_T xT复原回图片 x 0 x_0 x0。
Text-to-image
- 通常整个框架包含三个部分:
- Text Encoder
- Generation Model:输入噪音和文字生成产物喂进,生成中间产物
- Decoder:将图片压缩版本还原成照片
Forward Process
- 前向过程为向图片加噪声,使得最后图片变为一个白噪音。
- 反向过程为对高斯噪声进行去噪过程,通过去噪生成图片。
- 对图片进行逐步加噪声,从 x 0 x_0 x0逐渐变为 x T x_T xT
- 公式表示:
x t = a t x t − 1 + 1 − a t ϵ t − 1 x_t =\sqrt[]{a_t}x_{t-1}+\sqrt[]{1-a_t}\epsilon_{t-1} xt=atxt−1+1−atϵt−1- { a t } \{a_t\} {at}为很小的超参数,称为Noise schedule,逐渐减小
- ϵ t − 1 ∼ N ( 0 , 1 ) \epsilon_{t-1}\sim N(0,1) ϵt−1∼N(0,1)
- 逐步进行迭代
Reverse Process
- 反向过程就是通过估测噪声,多次迭代逐渐将被破坏的
x
t
x_t
xt恢复成
x
0
x_0
x0
x t − 1 = 1 a t − 1 − a t a t ϵ θ ( x t , t ) + σ t x_{t-1}=\frac{1}{\sqrt[]{a_t}}-\frac{\sqrt[]{1-a_t}}{\sqrt[]{a_t}}\epsilon_\theta(x_t,t)+\sigma_t xt−1=at1−at1−atϵθ(xt,t)+σt
- 去噪
Training(获得噪声估计模型)
- Training:
1:循环执行2-5
2:sample一张干净的图片(一般用 x 0 x_0 x0表示一张干净的图,就是资料库里的图)
3:从1到T中取一个整数作为t
4:从平均值(mean)=0,方差(variance)=1的normal distribution中sample出ε,大小与image一致,是一张全是噪音的图片
5: 红框内为干净图片和噪音图片混合生成的噪音,结合t,进行逼近 ϵ \epsilon ϵ,作为损失,进行梯度下降使其最小,以求得 a t ⃗ \vec{a_t} at
DDPM的关键就是训练噪声估计模型 ϵ θ ( x t , t ) \epsilon_\theta(x_t,t ) ϵθ(xt,t) ,用于估计真实的噪声 ϵ \epsilon ϵ
Sampling(生成图片)
- Sampling:
1:先从normal distribution中sample一张全是噪音的图像 x T x_T xT
2:循环T次,Denoise
3:从normal distribution中sample一张噪音图像z
4:带入计算得到下一次循环的图像 x t − 1 x_{t-1} xt−1; ε θ ε_θ εθ(…):预测生成的噪音图片; x t x_t xt:上一张图像
5: 最后还要加入一个z