论文:Denoising Diffusion Probabilistic Models
代码:https://github.com/hojonathanho/diffusion
出处:伯克利
时间:2020.06
一、背景
DDPM 是很多扩散模型的基础,其通过前向扩散和逆向去噪来实现对噪声的估计,从而将受噪声污染的图像复原。
二、DDPM 主要过程
2.1 前向扩散过程
前向扩散,由 t − 1 t-1 t−1 时刻计算 t t t 时刻值:
x t = α t x t − 1 + 1 − α t ϵ t − 1 x_t=\sqrt{\alpha_t}\ x_{t-1} + \sqrt{1-\alpha_t} \ \epsilon_{t-1} xt=αt xt−1+1−αt ϵt−1
- x t − 1 x_{t-1} xt−1 是 t − 1 t-1 t−1 时刻的值
- ϵ t − 1 \epsilon_{t-1} ϵt−1 是添加的噪声, ϵ t − 1 ∼ N ( 0 , 1 ) \epsilon_{t-1} \sim N(0, 1) ϵt−1∼N(0,1) 是高斯噪声
- 前向扩散阶段是不需要学习的,每步添加的噪声的超参数都是提前设定好的
根据上面的公式可以得到下面的公式:
x t = α ‾ t x 0 + 1 − α ‾ t ϵ x_t=\sqrt{\overline{\alpha}_t}\ x_0 + \sqrt{1-\overline{\alpha}_t} \ \epsilon xt=αt x0+1−αt ϵ
- α ‾ t = Π i = 1 t α i \overline{\alpha}_t=\Pi_{i=1}^t\ \alpha_i αt=Πi=1t αi
- ϵ ∼ N ( 0 , 1 ) \epsilon \sim N(0, 1) ϵ∼N(0,1)
- 上面的公式可以直接由输入图像 x 0 x_0 x0 来生成最终的加噪结果
2.2 逆向去噪过程
逆向计算,由 t t t 时刻计算 t − 1 t-1 t−1 时刻值:
x t − 1 = 1 α t ( x t − 1 − α t 1 − α ‾ t ϵ θ ( x t , t ) ) + σ t z x_{t-1} = \frac{1}{\sqrt{\alpha_t}}(x_t-\frac{1-\alpha_t}{\sqrt{1-\overline{\alpha}}_t}\ \epsilon_{\theta}(x_t, t)) + \sigma_tz xt−1=αt1(xt−1−αt1−αt ϵθ(xt,t))+σtz
- ϵ θ \epsilon_{\theta} ϵθ 是噪声估计函数,用于估计真实噪声,就是使用 U-Net 网络,将 x t x_t xt 和 t t t 作为输入,来预测 t t t 时刻的噪声 ϵ θ \epsilon_{\theta} ϵθ,预测的 t t t 时刻的噪声要和前向过程的 t t t 时刻的噪声 ϵ \epsilon ϵ 做 loss
- θ \theta θ 是模型训练的参数
- ϵ θ ( x t , t ) \epsilon_{\theta}(x_t, t) ϵθ(xt,t) 是估计的 t t t 时刻估计的噪声,也是模型要学习的
- DDPM 模型的关键就是训练噪声估计函数 ϵ θ \epsilon_{\theta} ϵθ
2.3 训练和推理
模型学习的目标:
不断的逆向去掉噪声,学习的目标就是让每步逆向预测的噪声 ϵ θ ( x t , t ) \epsilon_{\theta}(x_t, t) ϵθ(xt,t) 和每步前向添加的噪声 ϵ \epsilon ϵ 尽可能的相近
损失函数:
训练的过程:最小化预测的噪声和添加的噪声的差距
- 第一步:输入原图 x 0 x_0 x0
- 第二步:生成随机噪声 ϵ \epsilon ϵ 和时间 t t t
- 第三步:对原图加噪, x t = α ‾ t x 0 + 1 − α ‾ t ϵ x_t=\sqrt{\overline{\alpha}_t}\ x_0 + \sqrt{1-\overline{\alpha}_t} \ \epsilon xt=αt x0+1−αt ϵ
- 第四步:将加噪的图像和时间向量 t 输入神经网络模型,预测噪声 ϵ θ \epsilon_{\theta} ϵθ
- 第五步:计算 loss 并更新模型
推理的过程:
- 从 N ( 0 , 1 ) N(0,1) N(0,1) 中随机生成一个噪声
- 循环 T 步逐步去噪,就从噪声恢复得到了原图