昇思25天学习打卡营第25天|应用实践之Diffusion扩散模型

基本介绍

        今天的应用实践是Diffusion扩散模型,也是生成式模型的一种。官方文档结合原理和代码详细介绍了Diffusion扩散模型的结构,但是本文只会简单介绍Diffusion扩散模型的原理。此外就是展示一下自己的运行结果,并进行总结。

Diffusion扩散模型简介

该部分内容来自官方文档,非原创

        Diffusion是从纯噪声开始通过一个神经网络学习逐步去噪,最终得到一个实际图像。 Diffusion对于图像的处理包括以下两个过程:

  • 我们选择的固定(或预定义)正向扩散过程𝑞:它逐渐将高斯噪声添加到图像中,直到最终得到纯噪声

  • 一个学习的反向去噪的扩散过程𝑝𝜃:通过训练神经网络从纯噪声开始逐渐对图像去噪,直到最终得到一个实际的图像

由 𝑡 索引的正向和反向过程都发生在某些有限时间步长 𝑇(DDPM作者使用 𝑇=1000)内。从𝑡=0开始,在数据分布中采样真实图像 𝐱0(本文使用一张来自ImageNet的猫图像形象的展示了diffusion正向添加噪声的过程),正向过程在每个时间步长 𝑡 都从高斯分布中采样一些噪声,再添加到上一个时刻的图像中。假定给定一个足够大的 𝑇 和一个在每个时间步长添加噪声的良好时间表,您最终会在 𝑡=𝑇 通过渐进的过程得到所谓的各向同性的高斯分布

Diffusion扩散模型实现原理

        从上面可知,Diffusion扩散模型可分为两个过程,前向过程与逆向过程,下面进行详细的介绍

  • 前向过程

        所谓前向过程,即向图片上加噪声的过程。虽然这个步骤无法做到图片生成,但这是理解diffusion model以及构建训练样本至关重要的一步。 首先我们需要一个可控的损失函数,并运用神经网络对其进行优化。

        设 𝑞(𝑥0) 是真实数据分布,由于 𝑥0∼𝑞(𝑥0) ,所以我们可以从这个分布中采样以获得图像 𝑥0 。接下来我们定义前向扩散过程 𝑞(𝑥𝑡|𝑥𝑡−1) ,在前向过程中我们会根据已知的方差 0<𝛽1<𝛽2<...<𝛽𝑇<1 在每个时间步长 t 添加高斯噪声,由于前向过程的每个时刻 t 只与时刻 t-1 有关,所以也可以看做马尔科夫过程:

正态分布(也称为高斯分布)由两个参数定义:平均值 𝜇 和方差 𝜎2≥0 。基本上,在每个时间步长 𝑡 处的产生的每个新的(轻微噪声)图像都是从条件高斯分布中绘制的,其中

可以通过采样𝜖∼𝑁(0,𝐈))然后设置

请注意, 𝛽𝑡在每个时间步长 𝑡 (因此是下标)不是恒定的:事实上,我们定义了一个所谓的“动态方差”的方法,使得每个时间步长的 𝛽𝑡 可以是线性的、二次的、余弦的等(有点像动态学习率方法)。因此,如果我们适当设置时间表,从 𝐱0 开始,我们最终得到 𝐱1,...,𝐱𝑡,...,𝐱𝑇,即随着 𝑡� 的增大 𝐱𝑡 会越来越接近纯噪声,而 𝐱𝑇 就是纯高斯噪声。

        那么,如果我们知道条件概率分布 𝑝(𝐱𝑡−1|𝐱𝑡) ,我们就可以反向运行这个过程:通过采样一些随机高斯噪声 𝐱𝑇,然后逐渐去噪它,最终得到真实分布 𝐱0 中的样本。但是,我们不知道条件概率分布 𝑝(𝐱𝑡−1|𝐱𝑡) 。这很棘手,因为需要知道所有可能图像的分布,才能计算这个条件概率。

  • 逆向过程

        逆向过程(reverse)就是diffusion的去噪推断过程,而通过神经网络学习并表示 𝑝𝜃(𝐱𝑡−1|𝐱𝑡)的过程就是Diffusion 逆向去噪的核心。现在,我们知道了需要一个神经网络来学习逆向过程的(条件)概率分布。我们假设这个反向过程也是高斯的,任何高斯分布都由2个参数定义:由 𝜇𝜃 参数化的平均值和方差。综上,我们可以将逆向过程公式化为

其中平均值和方差也取决于噪声水平 𝑡,神经网络需要通过学习来表示这些均值和方差

        为了导出一个目标函数来学习反向过程的平均值,作者观察到 𝑞 和 𝑝𝜃 的组合可以被视为变分自动编码器(VAE)。因此,变分下界(也称为ELBO)可用于最小化真值数据样本 𝐱0 的似然负对数(有关ELBO的详细信息,请参阅VAE论文(Kingma等人,2013年)),该过程的ELBO是每个时间步长的损失之和 𝐿=𝐿0+𝐿1+...+𝐿𝑇 ,其中,每项的损失 𝐿𝑡 (除了 𝐿0 )实际上是2个高斯分布之间的KL发散,可以明确地写为相对于均值的L2-loss!如Sohl-Dickstein等人所示,构建Diffusion正向过程的直接结果是我们可以在条件是 𝐱0 (因为高斯和也是高斯)的情况下,在任意噪声水平上采样 𝐱𝑡 ,而不需要重复应用 𝑞 去采样 𝐱𝑡 ,这非常方便。使用

就有

这意味着我们可以采样高斯噪声并适当地缩放它,然后将其添加到 𝐱0 中,直接获得 𝐱𝑡。

正如Ho等人所展示的那样,这种性质的另一个优点是可以重新参数化平均值,使神经网络学习(预测)构成损失的KL项中噪声的附加噪声。这意味着我们的神经网络变成了噪声预测器,而不是(直接)均值预测器。其中,平均值可以按如下方式计算:

最终的目标函数 𝐿𝑡 如下 (随机步长 t 由 (𝜖∼𝑁(0,𝐈)) 给定)

Diffusion扩散模型代码实践

        官方给的代码实践是经典的深度学习流程。即数据集预处理,模型搭建,模型训练,模型评估,模型推理。此外官方文档还给出了Diffusion模型的各个结构和代码,以便更好的学习和理解Diffusion模型。详细的可直接参考官方的代码实践,这里给出我自己的运行结果和部分代码。

  • 模型数据集

        今日实践采用Fashion_MNIST数据集,该数据集由已经具有相同分辨率的图像组成,即28x28

  • 模型训练情况

  • 模型推理结果

总结

        Diffusion扩散模型的基本原理真的很难很难,虽然官方文档给出了介绍与解释,但是其中有很多数学概念和推导过程,这些东西需要深厚的概率论基础,在代码的帮助下,尽可能去理解,但是感觉还是一知半解。不过还算是完整运行一遍,对Diffusion扩散模型的思想有所了解。

Jupyter运行情况

  • 35
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值