这篇文章主要记录DDPM和DDIM中的部分公式的推导,以及两者的简要对比。

Denoising Diffusion Implicit Models

主要分为加噪音和去噪音两个部分。

加噪音过程:

x0(元素图像)>x1>x2....>xt(加完噪音之后的图像)x_0(元素图像) -> x_1 -> x_2 .... ->x_t(加完噪音之后的图像)

每一步的更新公式: 其中βt{\beta_t} 通常是一个随时间 t单调递增、数值很小的噪声调度(noise schedule)

xt=1βtxt1+βtϵt,ϵtN(0,I)x_t = \sqrt{1 - \beta_t}\, x_{t-1} + \sqrt{\beta_t}\, \epsilon_t, \quad \epsilon_t \sim \mathcal{N}(0, I)

多步加噪音可以合成一步:

xt=αˉtx0+1αˉtϵ,ϵN(0,I)x_t = \sqrt{\bar{\alpha}_t}\, x_0 + \sqrt{1-\bar{\alpha}_t}\,\epsilon, \quad \epsilon \sim \mathcal N(0, I)

其中

αt=1βt\alpha_t = 1 - \beta_t

αˉt=i=1tαi\bar{\alpha}_t = \prod_{i=1}^{t} \alpha_i

也有的地方记作:

zt=αtz0+σtϵtz_{t} = \alpha_{t} z_0 + \sigma_{t}\,\epsilon_t

其中αt\alpha_{t}表示信号保留多少,σt\sigma_{t}表示噪音注入多少,并且通常满足:(这样是为了保持方差不会变大,假如输入的z0z_0的方差为1)

αt2+σt2=1\alpha_t^2 + \sigma_t^2 = 1

具体公式推导暂时不补充

去噪音过程

去噪音流程

1.还原干净样本估计 z^0\hat z^0

由加噪音的公式:

zt=αtz0+σtϵ,ϵN(0,I)z_t=\alpha_t z^0+\sigma_t\epsilon,\quad \epsilon\sim\mathcal N(0,I)

解得z^0\hat z^0:这个是由当前时间步ZtZ_t 估计完全去完噪音之后的结果,其中ϵ^t\hat\epsilon_t是去噪音网络的结果.

z^0=ztσtϵ^tαt\hat z^0=\frac{z_t-\sigma_t\hat\epsilon_t}{\alpha_t}

2.生成下一步 Zt1Z_{t-1},使用估计的完全去完噪音的z^0\hat z^0,重新使用加噪音的过程来预计去噪音的下一步结果,其中使用的去噪音网络和上一步是同一个

zt1=αt1z^0+σt1ϵ^tz_{t-1}=\alpha_{t-1}\hat z^0+\sigma_{t-1}\hat\epsilon_t

为什么不直接使用xt=1βtxt1+βtϵt,ϵtN(0,I)x_t = \sqrt{1 - \beta_t}\, x_{t-1} + \sqrt{\beta_t}\, \epsilon_t, \quad \epsilon_t \sim \mathcal{N}(0, I) 推得

x_t1=(xtβt ϵt)/1βtx\_{t-1}=(x_t-\sqrt{\beta_t}\ \epsilon_t)/\sqrt{1 - \beta_t}

这样直接推得下一步的去噪音效果呢?

每一个时间步的ZtZt都对应的一个分布,比如“清晰度 20% + 噪声 80%”,去噪音的过程就相当于要将每一步的降噪结果放到对应的分布中去,即要将下图中的小球放到指定的台阶中去。

如果使用直接前去噪声的方式,如右侧所示:每次直接减去噪音,可能会导致一次跳很多个台阶,并且这个错误会累积,经过多轮迭代,错误将会越来越大。

如果使用原始的方式,如左侧所示:先计算 z^0\hat z^0, 相当于将图像放到最底层,然后再往指定台阶上面放,这样就能较好的确保每一步的降噪结果符合分布。

从另一种角度解释:加噪音的时候是一次性加上的,实际并不知道每一步具体加的噪音值是多少

9153028a-2ce9-4f3d-a38f-16250bdb4801

那么去噪音网络生成的结果具体的含义是什么呢?

降噪是去噪音的逆过程,那么是不是去噪音网络生成的是每一个时间步需要减去的噪音呢?

有了上面的分析,可以知道肯定不是这样的。去噪网络生成的是对下面公式中ϵ\epsilon的模拟值

zt=αˉtz0+1αˉtϵ,ϵN(0,I)z_t = \sqrt{\bar{\alpha}_t}\, z^0 + \sqrt{1-\bar{\alpha}_t}\, \epsilon, \quad \epsilon \sim \mathcal{N}(0,I)

但是上面的ϵ\epsilon是一个随机取出来的值,并且每一步都不一样,这怎么具体拟合呢?

虽然ϵ\epsilon是随机取值的,但是具体的取值已经在加噪音过程中被记录在ZtZ_t 中了,网络模型应该能够通过分析 ZtZ_t 和时间步 t 来分析出加噪音中使用的具体ϵ\epsilon

去噪音网络

通过加噪音部分得到了ztz_t,然后开始一步一步预测噪音,使用神经网络进行预测:

ϵ^t=ϵθ(zt,t)\hat\epsilon_t=\epsilon_\theta(z_t,t)

其中t是时间步,输出会对每个像素点的每个通道都预测一个μ,σ\mu , \sigma ,然后使用最终的预测的噪音为

ϵ^t=μθ(zt,t)+σθ(zt,t)η\hat\epsilon_t=\mu_\theta(z_t,t)+\sigma_\theta(z_t,t)\,\eta

ηN(0,I)\eta \sim \mathcal N(0,I)

这一步叫做重采样,如果直接从N(μ,σ)N(\mu,\sigma)中进行采样的话,无法进行梯度的传递。

具体的网络最常使用的是U-NET(stable duffion)

损失函数

L=Ex0,t,ϵ[ϵϵθ(xt,t)2]\mathcal L=\mathbb E_{x_0,t,\epsilon}\left[\|\epsilon-\epsilon_\theta(x_t,t)\|^2\right]

其中的ϵ\epsilonzt=αtz0+σtϵ,ϵN(0,I)z_t=\alpha_t z^0+\sigma_t\epsilon,\quad \epsilon\sim\mathcal N(0,I) 中的噪音,而不是具体每一步中添加的噪音。对于不同的时间步有不同的ϵ\epsilon

Denoising Diffusion Probabilistic Models

加噪音过程

加噪音过程和上面的DDIM一致。

去噪音过程

由前面的加噪音过程可以知道:

q(xtxt1)=N ⁣(αtxt1, βtI),αt=1βtq(x_t\mid x_{t-1})=\mathcal N\!\left(\sqrt{\alpha_t}\,x_{t-1},\ \beta_t I\right),\quad \alpha_t=1-\beta_t

q(xt1x0)=N ⁣(αˉt1x0, (1αˉt1)I),αˉt=i=1tαiq(x_{t-1}\mid x_0)=\mathcal N\!\left(\sqrt{\bar\alpha_{t-1}}\,x_0,\ (1-\bar\alpha_{t-1})I\right),\quad \bar\alpha_t=\prod_{i=1}^t\alpha_i

这两个等式分别从x0x_0 xtx_t的角度去描述xt1x_{t-1}的分布情况,那么怎么计算在x0xtx_0,x_t同时发生的时候计算Xt1X_{t-1}的分布情况呢。

可以使用贝叶斯全等式:

q(xt1xt,x0)=q(xtxt1,x0)q(xt1x0)q(xtx0)q(x_{t-1}\mid x_t,x_0)=\frac{q(x_t\mid x_{t-1},x_0)\,q(x_{t-1}\mid x_0)}{q(x_t\mid x_0)}

由于马尔可夫性(给定 xt1x_{t-1}后,xtx_tx0x_0 独立):

q(xtxt1,x0)=q(xtxt1)q(x_t\mid x_{t-1},x_0)=q(x_t\mid x_{t-1})

所以:

q(xt1xt,x0)=q(xtxt1)q(xt1x0)q(xtx0)q(x_{t-1}\mid x_t,x_0)=\frac{q(x_t\mid x_{t-1})\,q(x_{t-1}\mid x_0)}{q(x_t\mid x_0)}

上面式子的右边都能够得到,并且都是高斯分布,所以可知左边仍然是一个高斯分布,通过计算(此处省略具体计算步骤)可以知道左边的协方差为

β~t=1αˉt11αˉtβt\tilde\beta_t=\frac{1-\bar\alpha_{t-1}}{1-\bar\alpha_t}\,\beta_t

均值为:

μ~θ(xt,x0)=αˉt1βt1αˉtx0+αt(1αˉt1)1αˉtxt\tilde\mu_\theta(x_t,x_0)= \frac{\sqrt{\bar\alpha_{t-1}}\,\beta_t}{1-\bar\alpha_t}\,x_0 + \frac{\sqrt{\alpha_t}\,(1-\bar\alpha_{t-1})}{1-\bar\alpha_t}\,x_t

现在我们知道了xt1x_{t-1}的分布,直接从这个分布中进行采样就可以,整体的流程为:

1.和DDIP一样,需要先计算当前时间步对干净图像的估计:

x^0=xt1αˉtϵ^tαˉt\hat x_0=\frac{x_t-\sqrt{1-\bar\alpha_t}\,\hat\epsilon_t}{\sqrt{\bar\alpha_t}}

2.根据xt1x_{t-1}的分布采样数据,此处同样使用重采样

xt1=μθ(xt,t)+β~tη,ηN(0,I)x_{t-1}=\mu_\theta(x_t,t)+\sqrt{\tilde\beta_t}\,\eta,\quad \eta\sim\mathcal N(0,I)

补充一张DDPM论文中的算法流程:

image-20260129200714735

DDIM VS DDPM

维度 DDPM DDIM
全称 Denoising Diffusion Probabilistic Models Denoising Diffusion Implicit Models
核心思想 学习并采样反向概率分布 沿一条隐式确定性轨迹生成
正向加噪(forward) 与 DDIM 相同:高斯马尔可夫链 与 DDPM 相同(常用设定)
前向单步 (xt=1βtxt1+βtϵt)(x_t=\sqrt{1-\beta_t}x_{t-1}+\sqrt{\beta_t}\epsilon_t) 同 DDPM
前向闭式 (xt=αˉtx0+1αˉtϵ)(x_t=\sqrt{\bar\alpha_t}x_0+\sqrt{1-\bar\alpha_t}\epsilon) 同 DDPM
网络输出 (ϵ^t=ϵθ(xt,t))(\hat\epsilon_t=\epsilon_\theta(x_t,t))(最常见) 同一个网络,输出相同
是否多一个网络 没有 没有
是否显式建模概率分布 是(反向是高斯) 否(隐式映射)
反向一步形式 采样 (pθ(xt1xt))(p_\theta(x_{t-1}\mid x_t)) 确定性计算 (xt1)(x_{t-1})
反向更新公式(核心) (xt1=μθ+β~tη)(x_{t-1}=\mu_\theta+\sqrt{\tilde\beta_t}\eta) (xt1=αˉt1x^0+1αˉt1ϵ^t)(x_{t-1}=\sqrt{\bar\alpha_{t-1}}\hat x_0+\sqrt{1-\bar\alpha_{t-1}}\hat\epsilon_t)
损失函数 L=Ex0,ϵ,t[ϵϵθ(xt,t)2]\mathcal{L}=\mathbb{E}_{x_0,\epsilon,t}\left[\lVert \epsilon-\epsilon_\theta(x_t,t)\rVert^2\right] 与 DDPM 一致
$(\tilde\beta_t) $的作用 真实后验方差,来自高斯融合 不需要(确定性版本)
去噪稳定性 高(概率一致) 高(轨迹一致)
是否可跳步 不自然(需额外求解器) 天然支持
常用采样步数 500–1000 10–100
采样速度
可复现性 较弱(有随机采样) 强(同初始噪声必同结果)
多样性 较低(可通过 (\eta>0) 增强)
理论视角 近似真实后验的随机采样 同一边缘分布下的隐式轨迹
典型用途 理论严谨、早期基线 实际生成、加速采样

LDDPM=Ex0,t,ϵ[ϵϵθ(xt,t)2]\mathcal L_{\text{DDPM}}=\mathbb E_{x_0,t,\epsilon}\big[\|\epsilon-\epsilon_\theta(x_t,t)\|^2\big]

βt{\beta_t} 的选择设定

线性(Linear)βt\beta_t(DDPM 原始版本)

βt=βstart+t1T1(βendβstart)\beta_t = \beta_{\text{start}} + \frac{t-1}{T-1} \left( \beta_{\text{end}} - \beta_{\text{start}} \right)

常用取值(经验值)

βstart=104,βend=0.02,T=1000\beta_{\text{start}} = 10^{-4}, \quad \beta_{\text{end}} = 0.02, \quad T = 1000

图像如下:

ad25a97d-6997-4ec4-b4cb-006e0e1b786b

特点是:简单,稳定,但是早期时间步增长过快

Cosine Schedule βt\beta_t

来自论文Improved Denoising Diffusion Probabilistic Models中

αˉt=cos2(t/T+s1+sπ2)cos2(s1+sπ2),s=0.008\bar{\alpha}_t = \frac{ \cos^2 \left( \frac{t/T + s}{1 + s} \cdot \frac{\pi}{2} \right) }{ \cos^2 \left( \frac{s}{1 + s} \cdot \frac{\pi}{2} \right) }, \quad s = 0.008

不是直接定义βt\beta_t,而是先定义累计量

然后再推出

βt=1αˉtαˉt1\beta_t = 1 - \frac{\bar{\alpha}_t}{\bar{\alpha}_{t-1}}

优点:前期噪音增长跟俺,后期平滑,生成质量更好

取T=1000,s=0.008,βt\beta_t关于t的图像如下:

image-20260129134003160

二次(Quadratic)

βt(tT)2\beta_t \propto \left(\frac{t}{T}\right)^2

指数(Exponential)

βt=β0λt\beta_t = \beta_0 \cdot \lambda^t

Sigmoid(平滑过渡)

βt=βmin+(βmaxβmin)sigmoid(k(tT/2))\beta_t = \beta_{\min} + (\beta_{\max} - \beta_{\min}) \cdot \text{sigmoid}(k(t - T/2))