1
2
3
4
5
6
7
8
英文名称: 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

论文阅读_生成模型_VAE

读后感

论文优化了扩散模型的具体实现,并证明了扩散模型可生成高质量的图像。具体方法是结合扩散概率模型和朗之万动力学去噪的加权变分训练模型。

学习路径

论文中公式很多,有些依赖 DM 论文,VAE 论文,还有跳步,虽然方法部分不长,但是很难读明白。至今看到最好的解读是:

文章除了原理,还提供了核心代码分析。

方法

扩散模型

扩散模型由加噪 q 和去噪 p 两部分组成,如图 -2 所示,先从右往左看下边部分加噪 q,x0 是原始图像,经过 T 步逐渐加噪变为纯高斯噪声 XT(时间步常设为 T=1000),其中每一步的图像 xt 根据上一步的 xt-1 通过加少量高斯噪声得到;再看上边部分去噪 pθ,它是 q 的逆过程,每一步通过 xt 得到 xt-1,最终还原图像 x0,p 由神经网络实现,θ 是神经网络参数,最后得到的深度学习模型就是可用噪声生成真实图像的网络。

每个时间步加噪力度不同,这里 用 β 控制加噪的力度:

也就是说加噪的力度越来越大,这也很容易理解,加噪过程中先从小的噪声加起,在恢复图像的逆过程中,去噪越来越精细。加噪到了第 T 步时,图像就变成了纯噪声。

加噪过程 q 的每一步依赖上一步的图片:

加入高斯噪声 N。它的两个参数分别是均值(根据前一时间步 Xt-1 的图像)和方差(小的噪声 BtI)。

向后去噪的过程定义为 p,理论上使用它可还原原始图像,但它相对难以实现。

这里的 θ 是待学习的神经网络权重。假设这个反向过程也是高斯的,也需要均值和方差。

也就是说,这里需要对均值、方差建模,求取网络权重 θ,且模型是和时间步 t 相关的,具体操作时通过位置嵌入将 t 编码到输入数据中。DDPM 论文中建议只对均值建模,将方差设为常数,这样更简单一些。

目标函数

损失函数定义为,所有时间步损失之和:

其中每个时间步(除了第 0 个时间步是原图)以外,计算的都是正向反向两个高斯分布的 KL 散度。

简化计算加噪过程

由于高斯分布的积累也是高斯分布,所以在加噪过程中,可以直接计算出第 t 步的数据,从而简化从 0-t 的多步计算,这里又引入了一个变量 α:

and

两个α可视为β的函数,可以提前计算出来。使得由 x0 直接计算出 xt,而不用逐步迭代。

用预测噪声代替预测均值

另一个优化是:通过重新参数化高斯分布的均值,让神经网络从一个均值预测器变成了噪声预测器,即:让神经网络学习对图片的附加噪声建模(这里只考虑高斯分布的均值建模,先不考虑方差)。实验证明,该方法效果更好。经过数学推导,均值与噪声关系如下:

第 t 步损失函数 Lt 如下:

其中 ϵ 是在时间步 t 采样的噪声,εθ 是神经网络。

算法

最终求的是误差网络 e 的权重参数θ。

在训练过程中:

  • 抽取样本图片 x0
  • 随机抽取时间步 t
  • 采样高斯噪声ϵ,使用该噪声和时间步 t 生成第 t 步的加噪图像
  • 训练神经网络基于加噪图像 xt 和该步βt 来预测噪声

在推理过程中:

  • 取一个高斯噪声做为 XT 图片
  • 通过 T 步对其进行去噪
  • 随机取 z 作为高斯噪声的方差参数
  • 代入上述公式,利用神经网络预测的 ϵ 为第 t 步图片去噪,从而得到第 t-1 步图片
  • 最终还原原始图片