英文名称: Denoising Diffusion Probabilistic Models
中文名称: 去噪扩散概率模型
论文地址: http://arxiv.org/abs/2006.11239
代码地址1: https://github.com/hojonathanho/diffusion (论文对应代码 tensorflow)
代码地址2: https://github.com/AUTOMATIC1111/stable-diffusion-webui stable-diffusion-webui/modules/models/diffusion/ddpm_edit.py (推荐 pytorch)
时间: 2020-12-16
作者: Jonathan Ho, 加州大学伯克利分校
引用量: 3286
读后感
论文优化了扩散模型的具体实现,并证明了扩散模型可生成高质量的图像。具体方法是结合扩散概率模型和朗之万动力学去噪的加权变分训练模型。
学习路径
论文中公式很多,有些依赖DM论文,VAE论文,还有跳步,虽然方法部分不长,但是很难读明白。至今看到最好的解读是:
- The Annotated Diffusion Model(英文)
文章除了原理,还提供了核心代码分析。
方法
扩散模型
扩散模型由加噪 q 和去噪 p 两部分组成,如图-2所示,先从右往左看下边部分加噪q,x0是原始图像,经过T步逐渐加噪变为纯高斯噪声XT(时间步常设为 T=1000),其中每一步的图像xt根据上一步的xt-1通过加少量高斯噪声得到;再看上边部分去噪pθ,它是q的逆过程,每一步通过xt得到xt-1,最终还原图像x0,p由神经网络实现,θ 是神经网络参数,最后得到的深度学习模型就是可用噪声生成真实图像的网络。
每个时间步加噪力度不同,这里 用 β 控制加噪的力度:
0 < β 1 < β 2 < . . . < β T < 1 0<\beta_1<\beta_2<...<\beta_T<1 0<β1<β2<...<βT<1
也就是说加噪的力度越来越大,这也很容易理解,加噪过程中先从小的噪声加起,在恢复图像的逆过程中,去噪越来越精细。加噪到了第T步时,图像就变成了纯噪声。
加噪过程 q 的每一步依赖上一步的图片:
q ( x t ∣ x t − 1 ) = N ( x t ; 1 − β t x t − 1 , β t I ) q\left(\mathbf{x}_{t} \mid \mathbf{x}_{t-1}\right)=\mathcal{N}\left(\mathbf{x}_{t} ; \sqrt{1-\beta_{t}} \mathbf{x}_{t-1}, \beta_{t} \mathbf{I}\right) q(xt∣xt−1)=N(xt;1−βtxt−1,βtI)
加入高斯噪声N。它的两个参数分别是均值(根据前一时间步Xt-1的图像)和方差(小的噪声BtI)。
向后去噪的过程定义为p,理论上使用它可还原原始图像,但它相对难以实现。
p θ ( x t ∣ x t − 1 ) p_{\theta}(x_t|x_{t-1}) pθ(xt∣xt−1)
这里的 θ 是待学习的神经网络权重。假设这个反向过程也是高斯的,也需要均值和方差。
p θ ( x t − 1 ∣ x t ) = N ( x t − 1 ; μ θ ( x t , t ) , Σ θ ( x t , t ) ) p_\theta (\mathbf{x}_{t-1} | \mathbf{x}_t) = \mathcal{N}(\mathbf{x}_{t-1}; \mu_\theta(\mathbf{x}_{t},t), \Sigma_\theta (\mathbf{x}_{t},t)) pθ(xt−1∣xt)=N(xt−1;μθ(xt,t),Σθ(xt,t))
也就是说,这里需要对均值、方差建模,求取网络权重 θ,且模型是和时间步t相关的,具体操作时通过位置嵌入将 t 编码到输入数据中。DDPM论文中建议只对均值建模,将方差设为常数,这样更简单一些。
目标函数
损失函数定义为,所有时间步损失之和:
L = L 0 + L 1 + . . . + L T L=L_0+L_1+...+L_T L=L0+L1+...+LT
其中每个时间步(除了第0个时间步是原图)以外,计算的都是正向反向两个高斯分布的KL散度。
简化计算加噪过程
由于高斯分布的积累也是高斯分布,所以在加噪过程中,可以直接计算出第t步的数据,从而简化从0-t的多步计算,这里又引入了一个变量 α:
α t : = 1 − β t a n d α ˉ t : = Π s = 1 t α s \alpha_t := 1 - \beta_t\ and\ \bar{\alpha}_t := \Pi_{s=1}^{t} \alpha_s αt:=1−βt and αˉt:=Πs=1tαs
两个α可视为β的函数,可以提前计算出来。使得由x0直接计算出xt,而不用逐步迭代。
q ( x t ∣ x 0 ) = N ( x t ; α ˉ t x 0 , ( 1 − α ˉ t ) I ) q(\mathbf{x}_t | \mathbf{x}_0) = \cal{N}(\mathbf{x}_t; \sqrt{\bar{\alpha}_t} \mathbf{x}_0, (1- \bar{\alpha}_t) \mathbf{I}) q(xt∣x0)=N(xt;αˉtx0,(1−αˉt)I)
用预测噪声代替预测均值
另一个优化是:通过重新参数化高斯分布的均值,让神经网络从一个均值预测器变成了噪声预测器,即:让神经网络学习对图片的附加噪声建模(这里只考虑高斯分布的均值建模,先不考虑方差)。实验证明,该方法效果更好。经过数学推导,均值与噪声关系如下:
μ θ ( x t , t ) = 1 α t ( x t − β t 1 − α ˉ t ϵ θ ( x t , t ) ) \mu_{\theta}\left(\mathbf{x}_{t}, t\right)=\frac{1}{\sqrt{\alpha_{t}}}\left(\mathbf{x}_{t}-\frac{\beta_{t}}{\sqrt{1-\bar{\alpha}_{t}}} \epsilon_{\theta}\left(\mathbf{x}_{t}, t\right)\right) μθ(xt,t)=αt1(xt−1−αˉtβtϵθ(xt,t))
第t步损失函数Lt如下:
∥ ϵ − ϵ θ ( x t , t ) ∥ 2 = ∥ ϵ − ϵ θ ( α ˉ t x 0 + ( 1 − α ˉ t ) ϵ , t ) ∥ 2 . \| \mathbf{\epsilon} - \mathbf{\epsilon}_\theta(\mathbf{x}_t, t) \|^2 = \| \mathbf{\epsilon} - \mathbf{\epsilon}_\theta( \sqrt{\bar{\alpha}_t} \mathbf{x}_0 + \sqrt{(1- \bar{\alpha}_t) } \mathbf{\epsilon}, t) \|^2. ∥ϵ−ϵθ(xt,t)∥2=∥ϵ−ϵθ(αˉtx0+(1−αˉt)ϵ,t)∥2.
其中 ϵ 是在时间步 t 采样的噪声,εθ 是神经网络。
算法
最终求的是误差网络e的权重参数θ。
在训练过程中:
- 抽取样本图片x0
- 随机抽取时间步t
- 采样高斯噪声ϵ,使用该噪声和时间步t生成第t步的加噪图像
- 训练神经网络基于加噪图像xt和该步βt来预测噪声
在推理过程中:
- 取一个高斯噪声做为XT图片
- 通过T步对其进行去噪
- 随机取z作为高斯噪声的方差参数
- 代入上述公式,利用神经网络预测的 ϵ 为第t步图片去噪,从而得到第t-1步图片
- 最终还原原始图片