DDIM,多样性与运行效率之间的trade off

本文探讨了DDPM(深度变分自编码器中的扩散模型)的反向扩散过程中的局限性,提出DDIM方法,通过跳过马尔可夫步骤来加速推理。DDIM利用高斯噪声和U-Net的不变性,即使在不改变正向扩散过程的情况下,也能提供高效且生成质量稳定的反向扩散。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

DDPM的重大缺陷在于其在反向扩散的过程中需要逐步从xtx_txt倒推到x0x_0x0,因此其推理速度非常缓慢。相反,DDPM的训练过程是很快的,可以直接根据x0x_0x0xtx_txt添加的高斯噪声ϵ\epsilonϵ完成一次训练。

为了解决这个问题,就有了DDIM,且包括Stable Diffusion在内的现今广泛使用的Diffusion模型都在使用DDIM。

在DDPM中,我们利用P(xt−1∣xt)P(x_{t-1}|x_{t})P(xt1xt)来逐步倒推至最开始的x0x_0x0,这一过程是遵守马尔可夫过程的,即每个时刻的状态只跟上一个时刻的状态有关,因此只能一步步的倒退回去。而实际上,我们最初就是简化了加噪过程,从x0x_0x0xtx_txt直接一步到位,并没有使用P(xt∣xt−1)P(x_t|x_{t-1})P(xtxt1)这样按部就班的马尔可夫过程。那么,能不能在倒推的时候也采用类似的思路进行“跳步”,从而达到加快推理的目的呢?

假设我们现在想直接从kkk时刻跳到sss时刻,且有s<k−1s<k-1s<k1,那么仿照DDPM我们可以写出下列式子
P(xs∣xk,x0)=P(xk∣xs,x0)P(xs∣x0)P(xk∣x0) P(x_s|x_k,x_0)=\frac{P(x_k|x_s,x_0)P(x_s|x_0)}{P(x_k|x_0)} P(xsxk,x0)=P(xkx0)P(xkxs,x0)P(xsx0)
其中P(xs∣x0)P(x_s|x_0)P(xsx0)P(xk∣x0)P(x_k|x_0)P(xkx0)满足的分布都好说,可以从正向扩散公式中得出。不知道怎么表示的这一项P(xk∣xs,x0)P(x_k|x_s,x_0)P(xkxs,x0)因为反正整个模型都没有用过,所以可以先不考虑。(这个解释确实很神奇,但是他有用啊)其实就是说DDIM打破了马尔可夫链从000开始逐个往前扩散的模型,而是直接采用从x0x_0x0xtx_txt的直接公式作为整个模型的backbone,因此从ssskkk的正向过程可以“按需定义”,而不必采用DDPM里的公式,所以在这里就直接被忽略了。

言归正传,我们尝试求解一下上面的式子。参考DDPM,我们也可以假设P(xs∣xk,x0)P(x_s|x_k,x_0)P(xsxk,x0)是满足正态分布的,其均值为xkx_kxkx0x_0x0的加权和,记为
P(xs∣xk,x0)∼N(nx0+mxk,σ2) P(x_s|x_k,x_0)\sim\mathcal{N}(nx_0+mx_k, \sigma^2) P(xsxk,x0)N(nx0+mxk,σ2)写出xsx_sxs的表达式
xs=(nx0+mxk)+σϵ,ϵ∈N(0,1) x_s=(nx_0+mx_k)+\sigma\epsilon,\epsilon\in\mathcal{N}(0,1) xs=(nx0+mxk)+σϵ,ϵN(0,1)xk=α‾kx0+1−a‾kϵ′x_k=\sqrt{\overline{\alpha}_k}x_0+\sqrt{1-\overline{a}_k}\epsilon'xk=αkx0+1akϵ代入,可得
xs=(nx0+mxk)+σϵ=(n+ma‾k)x0+(m1−a‾kϵ′+σϵ)=(n+ma‾k)x0+m2(1−a‾k)+σ2ϵ′′ \begin{aligned} x_s&=(nx_0+mx_k)+\sigma\epsilon\\ &=(n+m\sqrt{\overline{a}_k})x_0+(m\sqrt{1-\overline{a}_k}\epsilon'+\sigma\epsilon)\\ &=(n+m\sqrt{\overline{a}_k})x_0+\sqrt{m^2(1-\overline{a}_k)+\sigma^2}\epsilon'' \end{aligned} xs=(nx0+mxk)+σϵ=(n+mak)x0+(m1akϵ+σϵ)=(n+mak)x0+m2(1ak)+σ2ϵ′′注意到这个的形式与从x0x_0x0直接到xsx_sxs的公式很像,即xs=α‾sx0+1−a‾sϵx_s=\sqrt{\overline{\alpha}_s}x_0+\sqrt{1-\overline{a}_s}\epsilonxs=αsx0+1asϵ,所以我们可以将这两个系数对应起来求解,得
m=1−α‾s−σ21−α‾k,n=α‾s−1−α‾s−σ21−α‾kα‾k m=\frac{\sqrt{1-\overline{\alpha}_s-\sigma^2}}{\sqrt{1-\overline{\alpha}_k}},n=\sqrt{\overline{\alpha}_s}-\frac{\sqrt{1-\overline{\alpha}_s-\sigma^2}}{\sqrt{1-\overline{\alpha}_k}}\sqrt{\overline{\alpha}_k} m=1αk1αsσ2,n=αs1αk1αsσ2αk将上面的结果带入xsx_sxs的均值nx0+mxknx_0+mx_knx0+mxk,可得
μ=α‾sx0+1−α‾s−σ21−α‾k(xk−α‾kx0) \begin{aligned} \mu=\sqrt{\overline{\alpha}_s}x_0+\frac{\sqrt{1-\overline{\alpha}_s-\sigma^2}}{\sqrt{1-\overline{\alpha}_k}}(x_k-\sqrt{\overline{\alpha}_k}x_0) \end{aligned} μ=αsx0+1αk1αsσ2(xkαkx0)这样我们就求得了P(xs∣xk,x0)P(x_s|x_k,x_0)P(xsxk,x0)满足的正态分布N(μ,σ2)\mathcal{N}(\mu,\sigma^2)N(μ,σ2),其中只剩σ\sigmaσ为变量,x0x_0x0可以像DDPM一样反解为 xkx_kxk的表达式代入,通过预测加噪的噪声来得到一个确定的μ\muμ

至于方差σ\sigmaσ,一般有两种取值,取000时方差为000,这个反向扩散就成了一个确定过程,对应标题中所说的“多样性换运行效率”,此时σ=0\sigma=0σ=0的状态就是我们通常所说的DDIM。而σ=1−at1−a‾t−11−a‾t\sigma=\frac{\sqrt{1-a_t}\sqrt{1-\overline{a}_{t-1}}}{\sqrt{1-\overline{a}_t}}σ=1at1at1at1,即在DDPM中推出来的方差时,整个过程会退化为DDPM的倒推过程。

需要注意的是,这里的σ\sigmaσ可以自由取值是因为我们假设P(xs∣xk,x0)P(x_s|x_k,x_0)P(xsxk,x0)是一个均值μ\muμ未知,方差为σ2\sigma^2σ2的高斯分布,通过求解μ\muμ得到了一个只有σ\sigmaσ为自由变量的xsx_sxs的表达式。可以把σ\sigmaσ视作一个超参数,只是通过实验发现在σ=0\sigma=0σ=0时效果最好。而DDPM中的方差是通过三个已知的正态分布计算来的,本身就是靠计算得来的确定的方差,所以不能随便更改,如果在DDPM的过程中使σ=0\sigma=0σ=0,效果会非常差。

而从实验结果来看,σ=0\sigma=0σ=0的时候还是效果最好的,FID最低。在SSS505050100100100,即加速10−2010-201020倍时保持相近的生成质量。
在这里插入图片描述
更妙的是,因为DDPM中的U-Net预测的是加在xtx_txt上的噪声ϵ\epsilonϵ,这个是基于正向扩散的公式来的。而DDIM并没有改变这一过程,因此一个训练好的DDPM中的U-Net也可以直接拿到DDIM里面,甚至不需要额外训练。DDIM只是更改了DDPM反向扩散的过程,通过跳步加速推理。

### DDPM 和 DDIM 的代码实现差异 DDPM (Denoising Diffusion Probabilistic Model) 和 DDIM (Denoising Diffusion Implicit Model) 是两种基于扩散模型的方法,它们的核心区别在于采样过程的不同设计。以下是两者在代码实现上的主要差异: #### 1. **随机性和确定性** - DDPM 使用的是随机采样方法,在每一步都引入噪声来生成样本[^4]。这种随机性使得 DDPM 的采样路径具有较高的多样性。 - 而 DDIM 则采用了一种去噪过程中更少的步数以及完全确定性的转换方式[^5]。这意味着 DDIM 不依赖于额外的噪声输入。 ```python # DDPM Sampling Code Example def ddpm_sample(model, x_T, timesteps): for t in reversed(range(timesteps)): noise = torch.randn_like(x_T) if t > 0 else 0 predicted_noise = model(x_T, t) alpha_t = extract(alpha, t, x_T.shape) beta_t = extract(beta, t, x_T.shape) x_T = 1 / sqrt(alpha_t) * (x_T - (1-alpha_t)/sqrt(1-beta_t)*predicted_noise) + sqrt(beta_t) * noise return x_T # DDIM Sampling Code Example def ddim_sample(model, x_T, timesteps, eta=0): steps = np.linspace(len(timesteps)-1, 0, num=len(timesteps)).astype(int).tolist() for i, step in enumerate(steps[:-1]): t = step next_t = steps[i+1] predicted_noise = model(x_T, t) c1 = eta * ((1 - alphas_cumprod_prev[next_t])/(1 - alphas_cumprod[t]))*sqrt((1-alphas_cumprod[t])/(alphas_cumprod_next[next_t])) c2 = ((1 - alphas_cumprod_prev[next_t])-c1**2).sqrt() pred_x0 = predict_start_from_noise(x_T, t=t, noise=predicted_noise) dir_xt = sqrt(alphas_cumprod_prev[next_t])*extract(c2, t, x_T.shape)*predicted_noise mean_pred = extract(sqrt_alphas_cumprod_prev[next_t], t, x_T.shape)*pred_x0 + dir_xt posterior_variance_term = c1 * torch.randn_like(x_T) if t != 0 else 0 x_T = mean_pred + posterior_variance_term return x_T ``` #### 2. **时间复杂度和效率** - 在实际应用中,由于 DDIM 可以通过减少迭代次数并保持高质量的结果而显著提高推理速度[^6]。因此其计算成本通常低于标准版 DDPM 实现方案。 - 对比之下,尽管 DDPM 提供了更高的灵活性因为它的多条可能轨迹增加了探索空间的可能性;但是这也意味着它往往需要更多的时间步骤才能达到相同水平的质量输出效果[^7]。 #### 3. **参数调整** - DDIM 引入了一个新的超参 `eta` 来控制方差大小从而影响最终图像质量多样性的平衡关系[^8]。当设置为零时即成为纯决定型版本,此时仅依靠均值预测完成整个重构流程而不加入任何额外扰动成分。 - 相较而言,传统意义上的 DDPM 并不存在类似的调节机制可以直接作用于此方面特性之上——所有的变化皆来源于不同种子所引发的新鲜随机事件序列本身。 #### 总结说明 综上所述可以看出虽然二者同属一类技术范畴之内但各自侧重点却存在明显差别:一方面体现在具体算法逻辑结构安排上面有所创新改变之处;另一方面则反映到性能指标衡量维度考量因素方面的取舍权衡决策方向等方面亦呈现出截然不同的风格特征表现形式出来。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ShadyPi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值