精读diffusion论文系列(2)—— DDIM

1 Introduction

DDPM虽然能生成高质量的照片,但是由于他是依赖马尔科夫链来进行推理的,所以需要一步一步的进行采样,这样效率很低。在DDPM中,通过不断给图片增加噪声,最后得到一个高斯噪声的过程称为前向过程也叫扩散过程,这个过程中每一个 x T x_T xT 之和上一阶段的样本 x T − 1 x_{T-1} xT1 相关。DDIM希望我们可以绕开这个马尔科夫链的限制,从而不需要进行迭代的加噪采样,便可以直接得到最终的 x T x_T xT。后续的训练过程与DDPM保持一致,就可以解决DDPM训练速度较慢的缺陷。总的来说,作者的思路方向是减少迭代的步数来缩短推理时间。

术语:

  • x 0 x_0 x0:输入的图片样本
  • x T x_T xT:最终从标准高斯分布中采样得出的样本
  • 前向过程(扩散过程,加噪过程):用 q ( x t ∣ x t − 1 ) q(x_t|x_{t-1}) q(xtxt1) 代表每一步的概率分布,表示对照片样本进行加噪的过程
  • 后向过程(采样过程,去噪过程):用 p ( x t − 1 ∣ x t ) p(x_{t-1}|x_t) p(xt1xt) 代表每一步的概率分布,表示对高斯噪声不断去噪生成一张新照片的过程。

2 Background

DDPM这类模型是利用变分推断的方法来完成生成任务。假如说模型需要得到一个数据分布 q ( x 0 ) q(x_0) q(x0),变分推断的方法聚焦于找到另一个新的数据分布 p θ ( x 0 ) p_{\theta}(x_0) pθ(x0),让 q ( x 0 ) q(x_0) q(x0) p θ ( x 0 ) p_{\theta}(x_0) pθ(x0) 两个数据分布的相差越来越小,而不是求出具体的 q ( x 0 ) q(x_0) q(x0) 的值大小。这种想法本质上是想用一个粗糙的估计出的分布来代替真实的数据分布。{虽然 VAE 和 DDPM都是基于变分推断的方法,但DDPM是基于一个固定的推断过程来训练的,也就是前向过程是不变的,只有后向过程会随着训练的而参数更新,而VAE则是前向过程和后向过程都参与训练过程中,所以他的推断过程是会随着训练的迭代而发生变化。}

后面就是讲述了DDPM的推断过程和训练过程,但是DDIM论文中和DDPM原文中有些符号表示的不是一个意思。例如DDIM论文中的 α t \alpha_t αt 对应的是DDPM中连乘后的结果 α ˉ t \sqrt{\bar{\alpha}_{t}} αˉt 。所以基于 x 0 x_0 x0 的条件概率写成了:

DDPM论文中推断过程的概率表示

而在DDPM中是这样表示的,其中 α t = 1 − β t \alpha_t = 1 - \beta_t αt=1βt

DDIM中关于DDPM的推断过程表示

在DDPM中,推理过程是提前定义好的,也就是 q ( x t ∣ x t − 1 ) q(x_t|x_{t-1}) q(xtxt1),所以可以迭代的套入得到 q ( x t ∣ x 0 ) q(x_t|x_0) q(xtx0)的表达式:

在这里插入图片描述

将其采样,写成线性表达式的形式即为:

在这里插入图片描述

α t \alpha_t αt 趋近于0的时候,则 x t x_t xt 的概率分布趋近于标准正太分布,即均值为0,方差为1,这就可以接近最开始设定的 x t x_t xt 的概率分布。

最后是损失函数的表示,之前DDPM论文中,损失函数可以分为三项:

在这里插入图片描述

但训练的时候大部分的优化其实都落在了第二项,如果直接优化KL散度,有点难训练。查看公式可以看到这一项中需要求出 x t x_t xt 的值作为条件,去推测 x t − 1 x_{t-1} xt1 的值,而 x t x_t xt 又需要 x 0 x_0 x0 不断加噪来得到,所以我们可以去优化每一步加在 x 0 x_0 x0 上的噪声 ϵ θ ( t ) \epsilon_\theta^{(t)} ϵθ(t),它表示当前条件下的 x t x_t xt 和迭代步数 t t t 所对应的噪声值,所以损失函数可以简化成。DDIM论文中将损失函数所有的系数值简写成了一个 γ t \gamma_{t} γt

在这里插入图片描述

对于DDPM来说,迭代步数 T T T 是一个重要的取值。依据 x 0 x_0 x0推导得到 x t x_t xt的公式:

x T = α ˉ T x 0 + 1 − α ˉ T ϵ x_T=\sqrt{\bar{\alpha}_T}x_0+\sqrt{1-\bar{\alpha}_T}\epsilon xT=αˉT x0+1αˉT ϵ

由于 α t \alpha_t αt取值为(0, 1),所以当T的值很大时, α ˉ T \bar{\alpha}_T αˉT取值就趋近于0, 1 − α ˉ T 1-\bar{\alpha}_T 1αˉT取值趋近于1,这样得到的 x T x_T xT 就接近于服从标准高斯分布,而他的逆向生成过程是基于 x t x_t xt满足标准高斯分布假设的,所以它的结果就会较好。如果分析 x t x_t xt x t − 1 x_{t-1} xt1 之间的关系式,可以得出 α t \alpha_t αt 的取值倾向:

x t = α t x t − 1 + 1 − α t ϵ x_t=\sqrt{\alpha_t}x_{t-1}+\sqrt{1-\alpha_t}\epsilon xt=αt xt1+1αt ϵ

可以看出希望每一个 α t \alpha_t αt 在取值上都接近于1, 1 − α t 1-\alpha_t 1αt 接近于0,这样 x t − 1 x_{t-1} xt1 就可以最大程度的保留 x t x_t xt 的信息,而噪声信息 ϵ \epsilon ϵ 会较小,这样就可以保持DDPM中前后都是正态分布的假设。但是迭代步数增加的时候,逻辑上每一步的操作是无法并行计算的。因为每一步需要拟合的概率是通过一个贝叶斯公式表示的:

q ( x t − 1 ∣ x t , x 0 ) = q ( x t ∣ x t − 1 ) q ( x t − 1 ∣ x 0 ) q ( x t ∣ x 0 ) q(x_{t-1}|x_t,x_0)=\frac{q(x_t|x_{t-1})q(x_{t-1}|x_0)}{q(x_t|x_0)} q(x

### DDIM采样方法简介 DDIM (Denoising Diffusion Implicit Models) 是一种改进型的扩散模型变体,旨在减少传统扩散模型所需的迭代次数并提高样本质量。与标准扩散模型相比,DDIM采用了一种隐式的去噪过程,在前向过程中引入更少的噪声,并允许在反向生成阶段灵活调整步数。 #### 前向过程中的噪声注入 在DDIM中,前向过程同样遵循逐步增加图像噪声的原则,但是该过程可以被参数化以控制每一步加入多少新噪声[^1]: ```python def forward_process(x_0, t, beta_t): """ 定义DDIM的前向传播函数 参数: x_0 : 初始干净图片 t : 时间步长 beta_t : 方差调度参数 返回: 加入特定量级噪音后的状态 """ noise = torch.randn_like(x_0) alpha_bar_sqrt = np.sqrt(1 - np.prod(beta_t[:t])) sqrt_one_minus_alpha_bar = np.sqrt(np.prod(beta_t[:t])) xt = alpha_bar_sqrt * x_0 + sqrt_one_minus_alpha_bar * noise return xt ``` 此代码片段展示了如何基于初始输入`x_0`以及时间索引`t`来计算带有一定比例随机扰动的结果`xt`。这里的关键在于可以通过调节`beta_t`序列来改变加权方式,从而影响最终输出的质量和多样性。 #### 反向生成流程 对于逆向生成部分,DDIM提供了一个更加简洁高效的机制。不同于传统的多步骤预测修正方案,DDIM能够在较少的时间间隔内完成高质量图像重建的任务。具体来说,就是利用预训练好的网络直接估计中间时刻的状态分布而不是每次都重新学习整个转换路径[^2]: ```python def reverse_process(model, x_T, T, eta=0., shape=(1, 3, 32, 32)): """ 实现DDIM的反向生成算法 参数: model : 已经训练完毕用于指导生成过程的神经网络模型 x_T : 经过充分打乱后的全白噪声作为起点 T : 总共使用的离散时间片数量 eta : 控制探索程度超参,默认设为零表示完全决定论模式 shape : 输出张量形状 返回: 使用给定配置下由纯噪声恢复得到的目标数据集成员之一 """ img = x_T for i in reversed(range(T)): t = torch.full((shape[0],), i, device=device, dtype=torch.long) pred_noise = model(img, t).detach() # 计算均值 mu_theta 和方差 sigma_theta mean_pred = ... std_dev_term = ... if i > 0: noise = torch.randn_like(img) img = mean_pred + eta * std_dev_term * noise else: img = mean_pred return img ``` 上述伪代码描述了从完全无序的高斯噪声出发,经过一系列精心设计的操作后逐渐逼近目标域内的真实实例的过程。值得注意的是,当设置`eta=0`时,意味着每次更新都严格按照最大似然方向前进;而适当增大这个数值则可以在一定程度上增强创造性表达力的同时保持较好的视觉效果一致性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值