DDPM

DDPM:Denoising Diffusion Probabilistic Models,去噪扩散概率模型。它是现代扩散模型的经典形式之一,也是 Stable Diffusion、Imagen 等模型背后的核心思想之一。

DDPM 想解决什么问题?

生成模型的目标是学习真实数据分布:

x0∼q(x0)x_0 \sim q(x_0)

其中 x0x_0 可以是一张真实图片。

我们希望训练一个模型,能够从简单分布,比如标准高斯噪声:

xT∼N(0,I)x_T \sim \mathcal N(0, I)

逐步生成真实图片:

xT→xT−1→⋯→x1→x0x_T \rightarrow x_{T-1} \rightarrow \cdots \rightarrow x_1 \rightarrow x_0

DDPM 的核心思想是:

正向过程逐步给真实图片加噪声,直到变成纯高斯噪声; 反向过程学习如何一步步去噪,把高斯噪声还原成真实图片。

可以把它理解成:

image→slightly noisy image→⋯→pure noise\text{image} \rightarrow \text{slightly noisy image} \rightarrow \cdots \rightarrow \text{pure noise}

然后训练神经网络学会反过来:

pure noise→⋯→clean image\text{pure noise} \rightarrow \cdots \rightarrow \text{clean image}

前向扩散过程:逐步加噪声

DDPM 定义一个固定的前向马尔可夫过程:

q(xt∣xt−1)=N(xt;1−βtxt−1,βtI)q(x_t \mid x_{t-1}) = \mathcal N(x_t; \sqrt{1-\beta_t}x_{t-1}, \beta_t I)

其中:

  • x0x_0:真实数据,比如原图;
  • xtx_t:第 tt 步加噪后的数据;
  • βt\beta_t:第 tt 步加入的噪声强度;
  • TT:总扩散步数,常见如 1000;
  • βt\beta_t 通常是一个很小的正数,逐步增大。

这个公式的意思是:

xt=1−βtxt−1+βtϵtx_t = \sqrt{1-\beta_t}x_{t-1} + \sqrt{\beta_t}\epsilon_t

其中:

ϵt∼N(0,I)\epsilon_t \sim \mathcal N(0, I)

也就是说,每一步都做两件事:

  1. 把上一时刻的信号稍微缩小;
  2. 加入一点高斯噪声。

为了推导方便,定义:

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

于是前向过程可以写成:

q(xt∣xt−1)=N(xt;αtxt−1,(1−αt)I)q(x_t \mid x_{t-1}) = \mathcal N(x_t; \sqrt{\alpha_t}x_{t-1}, (1-\alpha_t)I)

也就是:

xt=αtxt−1+1−αtϵtx_t = \sqrt{\alpha_t}x_{t-1} + \sqrt{1-\alpha_t}\epsilon_t

继续定义:

αˉt=∏s=1tαs\bar{\alpha}_t = \prod_{s=1}^{t}\alpha_s

注意:

αˉt=α1α2⋯αt\bar{\alpha}_t = \alpha_1\alpha_2\cdots\alpha_t

它表示从第 0 步到第 tt 步,总共还保留下来的原始信号比例。

虽然前向过程是一步步定义的:

x0→x1→⋯→xtx_0 \rightarrow x_1 \rightarrow \cdots \rightarrow x_t

但 DDPM 有一个非常重要的性质:

q(xt∣x0)=N(xt;αˉtx0,(1−αˉt)I)q(x_t \mid x_0) = \mathcal N(x_t; \sqrt{\bar{\alpha}_t}x_0, (1-\bar{\alpha}_t)I)

也就是说,我们不需要真的一步步加噪,可以直接从 x0x_0 采样出任意时刻的 xtx_t:

xt=αˉtx0+1−αˉtϵx_t = \sqrt{\bar{\alpha}_t}x_0 + \sqrt{1-\bar{\alpha}_t}\epsilon

其中:

ϵ∼N(0,I)\epsilon \sim \mathcal N(0, I)

这个公式极其重要,训练 DDPM 基本就靠它。

上述公式的具体推导

先看第一步:

x1=α1x0+1−α1ϵ1x_1 = \sqrt{\alpha_1}x_0 + \sqrt{1-\alpha_1}\epsilon_1

因为:

αˉ1=α1\bar{\alpha}_1 = \alpha_1

所以:

x1=αˉ1x0+1−αˉ1ϵx_1 = \sqrt{\bar{\alpha}_1}x_0 + \sqrt{1-\bar{\alpha}_1}\epsilon

成立。

再看第二步:

x2=α2x1+1−α2ϵ2x_2 = \sqrt{\alpha_2}x_1 + \sqrt{1-\alpha_2}\epsilon_2

把 x1x_1 代进去:

x2=α2(α1x0+1−α1ϵ1)+1−α2ϵ2x_2 = \sqrt{\alpha_2} \left( \sqrt{\alpha_1}x_0 + \sqrt{1-\alpha_1}\epsilon_1 \right) + \sqrt{1-\alpha_2}\epsilon_2

展开:

x2=α1α2x0+α2(1−α1)ϵ1+1−α2ϵ2x_2 = \sqrt{\alpha_1\alpha_2}x_0 + \sqrt{\alpha_2(1-\alpha_1)}\epsilon_1 + \sqrt{1-\alpha_2}\epsilon_2

前面第一项是信号:

α1α2x0=αˉ2x0\sqrt{\alpha_1\alpha_2}x_0 = \sqrt{\bar{\alpha}_2}x_0

后面两项都是高斯噪声的线性组合。高斯分布有一个性质:独立高斯变量的线性组合仍然是高斯。

其方差为:

α2(1−α1)+(1−α2)\alpha_2(1-\alpha_1) + (1-\alpha_2)

化简:

α2−α1α2+1−α2=1−α1α2=1−αˉ2\alpha_2 - \alpha_1\alpha_2 + 1 - \alpha_2 = 1 - \alpha_1\alpha_2 = 1 - \bar{\alpha}_2

所以:

x2=αˉ2x0+1−αˉ2ϵx_2 = \sqrt{\bar{\alpha}_2}x_0 + \sqrt{1-\bar{\alpha}_2}\epsilon

推广到任意 tt,得到:

xt=αˉtx0+1−αˉtϵx_t = \sqrt{\bar{\alpha}_t}x_0 + \sqrt{1-\bar{\alpha}_t}\epsilon

这就是 DDPM 前向扩散的核心公式。

当前向扩散足够久,xTx_T 接近纯噪声

因为:

αˉt=∏s=1tαs\bar{\alpha}_t = \prod_{s=1}^{t}\alpha_s

而每个:

0<αs<10 < \alpha_s < 1

所以随着 tt 增大:

αˉt→0\bar{\alpha}_t \rightarrow 0

于是:

xt=αˉtx0+1−αˉtϵx_t = \sqrt{\bar{\alpha}_t}x_0 + \sqrt{1-\bar{\alpha}_t}\epsilon

会变成:

xT≈ϵx_T \approx \epsilon

也就是:

xT∼N(0,I)x_T \sim \mathcal N(0, I)

这就完成了从真实图片到高斯噪声的过程。

反向过程:学习去噪

前向过程是已知的:

q(xt∣xt−1)q(x_t \mid x_{t-1})

但是生成时,我们需要反过来:

pθ(xt−1∣xt)p_\theta(x_{t-1} \mid x_t)

也就是从噪声状态 xtx_t 预测更干净一点的状态 xt−1x_{t-1}。

DDPM 假设反向过程也是高斯分布:

pθ(xt−1∣xt)=N(xt−1;μθ(xt,t),Σθ(xt,t))p_\theta(x_{t-1} \mid x_t) = \mathcal N(x_{t-1}; \mu_\theta(x_t, t), \Sigma_\theta(x_t, t))

通常简化为:

pθ(xt−1∣xt)=N(xt−1;μθ(xt,t),σt2I)p_\theta(x_{t-1} \mid x_t) = \mathcal N(x_{t-1}; \mu_\theta(x_t, t), \sigma_t^2 I)

也就是说,神经网络主要学习均值:

μθ(xt,t)\mu_\theta(x_t, t)

有些版本也学习方差,但经典 DDPM 中经常固定方差。

训练目标与理论推导

DDPM 是一个概率生成模型,所以理论上希望最大化数据似然:

pθ(x0)p_\theta(x_0)

但是直接最大化:

log⁡pθ(x0)\log p_\theta(x_0)

很难,因为生成过程包含很多隐变量:

x1,x2,…,xTx_1, x_2, \dots, x_T

完整的生成模型是:

pθ(x0:T)=p(xT)∏t=1Tpθ(xt−1∣xt)p_\theta(x_{0:T}) = p(x_T)\prod_{t=1}^{T}p_\theta(x_{t-1}\mid x_t)

其中:

p(xT)=N(0,I)p(x_T)=\mathcal N(0,I)

而数据似然是:

pθ(x0)=∫pθ(x0:T)dx1:Tp_\theta(x_0) = \int p_\theta(x_{0:T})dx_{1:T}

这个积分非常难算。

所以 DDPM 使用变分推断,优化一个下界,也就是 ELBO。


我们有真实的前向扩散分布:

q(x1:T∣x0)q(x_{1:T}\mid x_0)

希望最大化:

log⁡pθ(x0)\log p_\theta(x_0)

引入 q(x1:T∣x0)q(x_{1:T}\mid x_0):

log⁡pθ(x0)=log⁡∫pθ(x0:T)dx1:T\log p_\theta(x_0) = \log \int p_\theta(x_{0:T}) dx_{1:T}

乘除同一个分布:

log⁡∫q(x1:T∣x0)pθ(x0:T)q(x1:T∣x0)dx1:T\log \int q(x_{1:T}\mid x_0) \frac{p_\theta(x_{0:T})}{q(x_{1:T}\mid x_0)} dx_{1:T}

写成期望:

log⁡Eq(x1:T∣x0)[pθ(x0:T)q(x1:T∣x0)]\log \mathbb E_{q(x_{1:T}\mid x_0)} \left[ \frac{p_\theta(x_{0:T})}{q(x_{1:T}\mid x_0)} \right]

利用 Jensen 不等式:

log⁡E[X]≥E[log⁡X]\log \mathbb E[X] \geq \mathbb E[\log X]

得到:

log⁡pθ(x0)≥Eq[log⁡pθ(x0:T)q(x1:T∣x0)]\log p_\theta(x_0) \geq \mathbb E_q \left[ \log \frac{p_\theta(x_{0:T})}{q(x_{1:T}\mid x_0)} \right]

这个下界就是 ELBO:

LELBO=Eq[log⁡pθ(x0:T)q(x1:T∣x0)]\mathcal L_{\text{ELBO}} = \mathbb E_q \left[ \log \frac{p_\theta(x_{0:T})}{q(x_{1:T}\mid x_0)} \right]

所以 DDPM 训练目标中,想要最大化数据似然,可以使用最大化 ELBO 来替代。

最大化 ELBO 等价于最小化负 ELBO:

−LELBO-\mathcal L_{\text{ELBO}}

把 ELBO 展开,进一步得到训练所需要的 loss 形式

生成过程:

pθ(x0:T)=p(xT)∏t=1Tpθ(xt−1∣xt)p_\theta(x_{0:T}) = p(x_T)\prod_{t=1}^{T}p_\theta(x_{t-1}\mid x_t)

前向过程:

q(x1:T∣x0)=∏t=1Tq(xt∣xt−1)q(x_{1:T}\mid x_0) = \prod_{t=1}^{T}q(x_t\mid x_{t-1})

所以:

LELBO=Eq[log⁡p(xT)+∑t=1Tlog⁡pθ(xt−1∣xt)−∑t=1Tlog⁡q(xt∣xt−1)]\mathcal L_{\text{ELBO}} = \mathbb E_q \left[ \log p(x_T) + \sum_{t=1}^{T}\log p_\theta(x_{t-1}\mid x_t) - \sum_{t=1}^{T}\log q(x_t\mid x_{t-1}) \right]

这个式子还不够方便。因为我们想要学习的是反向过程,但是式子中依旧存在前向项 q(xt∣xt−1)q(x_t|x_{t-1}) 。因此需要转换成后向项,并且进一步改写成 KL 散度形式。

最终负 ELBO 可以分解为:

L=LT+∑t=2TLt−1+L0L = L_T + \sum_{t=2}^{T}L_{t-1} + L_0

其中:

LT=DKL(q(xT∣x0)∥p(xT))L_T = D_{\text{KL}}(q(x_T\mid x_0)\|p(x_T)) Lt−1=DKL(q(xt−1∣xt,x0)∥pθ(xt−1∣xt))L_{t-1} = D_{\text{KL}}(q(x_{t-1}\mid x_t,x_0)\|p_\theta(x_{t-1}\mid x_t)) L0=−log⁡pθ(x0∣x1)L_0 = -\log p_\theta(x_0\mid x_1)

最核心的是中间这一项:

DKL(q(xt−1∣xt,x0)∥pθ(xt−1∣xt))D_{\text{KL}}(q(x_{t-1}\mid x_t,x_0)\|p_\theta(x_{t-1}\mid x_t))

它的含义是:

让模型学习的反向分布 pθ(xt−1∣xt)p_\theta(x_{t-1}\mid x_t),尽量接近真实的反向后验分布 q(xt−1∣xt,x0)q(x_{t-1}\mid x_t,x_0)。

注意这里的真实反向后验不是:

q(xt−1∣xt)q(x_{t-1}\mid x_t)

而是:

q(xt−1∣xt,x0)q(x_{t-1}\mid x_t,x_0)

因为训练时我们知道原始图像 x0x_0,所以可以构造这个后验。

  • LELBO\mathcal L_{ELBO} 推导到 KL 散度形式的过程
LELBO=Eq[log⁡p(xT)+∑t=1Tlog⁡pθ(xt−1∣xt)−∑t=1Tlog⁡q(xt∣xt−1)]\mathcal L_{\text{ELBO}} = \mathbb E_q \left[ \log p(x_T) + \sum_{t=1}^{T}\log p_\theta(x_{t-1}\mid x_t) - \sum_{t=1}^{T}\log q(x_t\mid x_{t-1}) \right]

训练时通常最小化负 ELBO,记作:

L=−LELBOL = -\mathcal{L}_{\text{ELBO}}

所以:

L=Eq[−log⁡p(xT)−∑t=1Tlog⁡pθ(xt−1∣xt)+∑t=1Tlog⁡q(xt∣xt−1)]L = \mathbb{E}_q \left[ -\log p(x_T) - \sum_{t=1}^T \log p_\theta(x_{t-1} | x_t) + \sum_{t=1}^T \log q(x_t | x_{t-1}) \right]

因为前向过程是一个马尔可夫链,状态 xtx_t 只依赖于 xt−1x_{t-1}。所以:

q(xt∣xt−1)=q(xt∣xt−1,x0)q(x_t|x_{t-1}) = q(x_t|x_{t-1}, x_0)

此时,我们对等式右边套用贝叶斯公式:

q(xt∣xt−1,x0)=q(xt−1∣xt,x0)q(xt∣x0)q(xt−1∣x0)q(x_t|x_{t-1}, x_0) = \frac{q(x_{t-1}|x_t, x_0)q(x_t|x_0)}{q(x_{t-1}|x_0)} ∑t=1Tlog⁡(q(xt−1∣xt,x0)q(xt∣x0)q(xt−1∣x0))\sum_{t=1}^T \log \left( \frac{q(x_{t-1}|x_t, x_0)q(x_t|x_0)}{q(x_{t-1}|x_0)} \right) =∑t=1Tlog⁡q(xt−1∣xt,x0)+∑t=1Tlog⁡q(xt∣x0)−∑t=1Tlog⁡q(xt−1∣x0)= \sum_{t=1}^T \log q(x_{t-1}|x_t, x_0) + \sum_{t=1}^T \log q(x_t|x_0) - \sum_{t=1}^T \log q(x_{t-1}|x_0) =∑t=1Tlog⁡q(xt−1∣xt,x0)+log⁡q(xT∣x0)−log⁡q(x0∣x0)= \sum_{t=1}^T \log q(x_{t-1}|x_t, x_0) + \log q(x_T|x_0) - \log q(x_0|x_0)

由于给定 x0x_0 时 x0x_0 的概率是 1,所以 log⁡q(x0∣x0)=log⁡q(x0∣x1,x0)=0\log q(x_0|x_0) = \log q(x_{0}|x_1, x_0) = 0。

带入得到

L=Eq[log⁡q(xT∣x0)p(xT)+∑t=2Tlog⁡q(xt−1∣xt,x0)pθ(xt−1∣xt)−log⁡pθ(x0∣x1)]L = \mathbb{E}_q \left[ \log \frac{q(x_T | x_0)}{p(x_T)} + \sum_{t=2}^T \log \frac{q(x_{t-1} | x_t, x_0)}{p_\theta(x_{t-1} | x_t)} - \log p_\theta(x_0 | x_1) \right]

所以最终化简为:

L=LT+∑t=2TLt−1+L0L = L_T + \sum_{t=2}^{T}L_{t-1} + L_0

其中:

LT=DKL(q(xT∣x0)∥p(xT))L_T = D_{\text{KL}}(q(x_T\mid x_0)\|p(x_T))

这表示:

前向加噪到最后得到的 q(xT∣x0)q(x_T | x_0),应该接近标准高斯先验 p(xT)p(x_T)。

实际中如果 TT 足够大,q(xT∣x0)q(x_T | x_0) 已经很接近 N(0,I)\mathcal{N}(0, I),所以这一项通常不是训练重点。

Lt−1=DKL(q(xt−1∣xt,x0)∥pθ(xt−1∣xt))L_{t-1} = D_{\text{KL}}(q(x_{t-1}\mid x_t,x_0)\|p_\theta(x_{t-1}\mid x_t)) L0=−log⁡pθ(x0∣x1)L_0 = -\log p_\theta(x_0\mid x_1)

至此我们得到了实际的训练目标的 Loss 表达式,其中模型主要需要学习的是 pθ(xt−1∣xt)p_\theta(x_{t-1}\mid x_t),而其学习的目标就是 真实反向后验 q(xt−1∣xt,x0)q(x_{t-1}\mid x_t,x_0)

  • 真实反向后验 q(xt−1∣xt,x0)q(x_{t-1}\mid x_t,x_0) 推导

我们需要求:

q(xt−1∣xt,x0)q(x_{t-1}\mid x_t,x_0)

根据贝叶斯公式:

q(xt−1∣xt,x0)=q(xt∣xt−1,x0)q(xt−1∣x0)q(xt∣x0)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) }

由于前向过程是马尔可夫的:

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

所以:

q(xt−1∣xt,x0)=q(xt∣xt−1)q(xt−1∣x0)q(xt∣x0)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) }

这三个分布都是高斯:

q(xt∣xt−1)=N(xt;αtxt−1,βtI)q(x_t\mid x_{t-1}) = \mathcal N(x_t;\sqrt{\alpha_t}x_{t-1},\beta_t I) q(xt−1∣x0)=N(xt−1;αˉt−1x0,(1−αˉt−1)I)q(x_{t-1}\mid x_0) = \mathcal N(x_{t-1};\sqrt{\bar{\alpha}_{t-1}}x_0,(1-\bar{\alpha}_{t-1})I) q(xt∣x0)=N(xt;αˉtx0,(1−αˉt)I)q(x_t\mid x_0) = \mathcal N(x_t;\sqrt{\bar{\alpha}_t}x_0,(1-\bar{\alpha}_t)I)

因为高斯分布相乘后仍然是高斯,所以:

q(xt−1∣xt,x0)=N(xt−1;μ~t(xt,x0),β~tI)q(x_{t-1}\mid x_t,x_0) = \mathcal N(x_{t-1};\tilde{\mu}_t(x_t,x_0),\tilde{\beta}_t I)

其中真实后验方差为:

β~t=1−αˉt−11−αˉtβt\tilde{\beta}_t = \frac{1-\bar{\alpha}_{t-1}}{1-\bar{\alpha}_t}\beta_t

真实后验均值为:

μ~t(xt,x0)=αˉt−1βt1−αˉtx0+αt(1−αˉt−1)1−αˉtxt\tilde{\mu}_t(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

这个公式很关键,DDPM 的训练就是让模型预测的反向高斯分布接近这个真实后验。

推导细节:

q(xt−1∣xt,x0)∝q(xt∣xt−1)q(xt−1∣x0)q(x_{t-1}\mid x_t,x_0) \propto q(x_t\mid x_{t-1})q(x_{t-1}\mid x_0)

把 xt−1x_{t-1} 当成变量,记:

z=xt−1z=x_{t-1}

第一项:

q(xt∣z)=N(xt;αtz,βtI)q(x_t\mid z) = \mathcal N(x_t;\sqrt{\alpha_t}z,\beta_t I)

它的指数部分是:

−12βt∣xt−αtz∣2-\frac{1}{2\beta_t} |x_t-\sqrt{\alpha_t}z|^2

第二项:

q(z∣x0)=N(z;αˉt−1x0,(1−αˉt−1)I)q(z\mid x_0) = \mathcal N(z;\sqrt{\bar{\alpha}_{t-1}}x_0,(1-\bar{\alpha}_{t-1})I)

指数部分是:

−12(1−αˉt−1)∣z−αˉt−1x0∣2-\frac{1}{2(1-\bar{\alpha}_{t-1})} |z-\sqrt{\bar{\alpha}_{t-1}}x_0|^2

两项相乘,指数相加:

−12[1βt∣xt−αtz∣2+11−αˉt−1∣z−αˉt−1x0∣2]-\frac{1}{2} \left[ \frac{1}{\beta_t} |x_t-\sqrt{\alpha_t}z|^2 + \frac{1}{1-\bar{\alpha}_{t-1}} |z-\sqrt{\bar{\alpha}_{t-1}}x_0|^2 \right]

只保留和 zz 有关的项。

第一部分展开:

1βt∣xt−αtz∣2=1βt(xt2−2αtxtz+αtz2)\frac{1}{\beta_t} |x_t-\sqrt{\alpha_t}z|^2 = \frac{1}{\beta_t} \left( x_t^2 - 2\sqrt{\alpha_t}x_tz + \alpha_t z^2 \right)

第二部分展开:

11−αˉt−1∣z−αˉt−1x0∣2=11−αˉt−1(z2−2αˉt−1x0z+αˉt−1x02)\frac{1}{1-\bar{\alpha}_{t-1}} |z-\sqrt{\bar{\alpha}_{t-1}}x_0|^2 = \frac{1}{1-\bar{\alpha}_{t-1}} \left( z^2 - 2\sqrt{\bar{\alpha}_{t-1}}x_0z + \bar{\alpha}_{t-1}x_0^2 \right)

合并 z2z^2 项:

(αtβt+11−αˉt−1)z2\left( \frac{\alpha_t}{\beta_t} + \frac{1}{1-\bar{\alpha}_{t-1}} \right)z^2

合并 zz 项:

−2(αtβtxt+αˉt−11−αˉt−1x0)z-2 \left( \frac{\sqrt{\alpha_t}}{\beta_t}x_t + \frac{\sqrt{\bar{\alpha}_{t-1}}}{1-\bar{\alpha}_{t-1}}x_0 \right)z

因此后验分布的精度,也就是方差的倒数,为:

1β~t=αtβt+11−αˉt−1\frac{1}{\tilde{\beta}_t} = \frac{\alpha_t}{\beta_t} + \frac{1}{1-\bar{\alpha}_{t-1}}

化简:

1β~t=αt(1−αˉt−1)+βtβt(1−αˉt−1)\frac{1}{\tilde{\beta}_t} = \frac{ \alpha_t(1-\bar{\alpha}_{t-1})+\beta_t }{ \beta_t(1-\bar{\alpha}_{t-1}) }

因为:

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

所以分子:

αt(1−αˉt−1)+βt=αt−αtαˉt−1+1−αt=1−αtαˉt−1\alpha_t(1-\bar{\alpha}_{t-1})+\beta_t = \alpha_t-\alpha_t\bar{\alpha}_{t-1}+1-\alpha_t = 1-\alpha_t\bar{\alpha}_{t-1}

又因为:

αˉt=αtαˉt−1\bar{\alpha}_t = \alpha_t\bar{\alpha}_{t-1}

所以:

1−αtαˉt−1=1−αˉt1-\alpha_t\bar{\alpha}_{t-1} = 1-\bar{\alpha}_t

因此:

1β~t=1−αˉtβt(1−αˉt−1)\frac{1}{\tilde{\beta}_t} = \frac{1-\bar{\alpha}_t}{\beta_t(1-\bar{\alpha}_{t-1})}

所以:

β~t=1−αˉt−11−αˉtβt\tilde{\beta}_t = \frac{1-\bar{\alpha}_{t-1}}{1-\bar{\alpha}_t}\beta_t

均值为:

μ~t=β~t(αtβtxt+αˉt−11−αˉt−1x0)\tilde{\mu}_t = \tilde{\beta}_t \left( \frac{\sqrt{\alpha_t}}{\beta_t}x_t + \frac{\sqrt{\bar{\alpha}_{t-1}}}{1-\bar{\alpha}_{t-1}}x_0 \right)

代入 β~t\tilde{\beta}_t:

μ~t=1−αˉt−11−αˉtβt(αtβtxt+αˉt−11−αˉt−1x0)\tilde{\mu}_t = \frac{1-\bar{\alpha}_{t-1}}{1-\bar{\alpha}_t}\beta_t \left( \frac{\sqrt{\alpha_t}}{\beta_t}x_t + \frac{\sqrt{\bar{\alpha}_{t-1}}}{1-\bar{\alpha}_{t-1}}x_0 \right)

展开:

μ~t=αt(1−αˉt−1)1−αˉtxt+αˉt−1βt1−αˉtx0\tilde{\mu}_t = \frac{ \sqrt{\alpha_t}(1-\bar{\alpha}_{t-1}) }{ 1-\bar{\alpha}_t } x_t + \frac{ \sqrt{\bar{\alpha}_{t-1}}\beta_t }{ 1-\bar{\alpha}_t } x_0

这就得到了刚才的结果:

μ~t(xt,x0)=αˉt−1βt1−αˉtx0+αt(1−αˉt−1)1−αˉtxt\tilde{\mu}_t(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
  • 为什么在 “反向过程”章节中说模型主要是学习均值而不是方差

学习均值实际上就是在学习噪声估计

模型的训练目标是让反向过程的 pθ(xt−1∣xt)p_\theta(x_{t-1} \mid x_t) 尽可能接近真实反向后验 q(xt−1∣xt,x0)q(x_{t-1}\mid x_t,x_0)

已知真实后验方差为:

β~t=1−αˉt−11−αˉtβt\tilde{\beta}_t = \frac{1-\bar{\alpha}_{t-1}}{1-\bar{\alpha}_t}\beta_t

真实后验均值为:

μ~t(xt,x0)=αˉt−1βt1−αˉtx0+αt(1−αˉt−1)1−αˉtxt\tilde{\mu}_t(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

即训练过程中或者推理过程中,模型需要做的可以等价转换为预测 x0x_0。此时可以理解为模型的训练目标就是让预测值 x^0\hat{x}_0 尽可能接近实际 x0x_0

因为我们知道:

xt=αˉtx0+1−αˉtϵx_t = \sqrt{\bar{\alpha}_t}x_0 + \sqrt{1-\bar{\alpha}_t}\epsilon

从这个式子可以解出 x0x_0:

x0=xt−1−αˉtϵαˉtx_0 = \frac{ x_t-\sqrt{1-\bar{\alpha}_t}\epsilon }{ \sqrt{\bar{\alpha}_t} }

所以进一步的,模型的目标本质上就是在预测噪声 ϵθ(xt,t)\epsilon_\theta(x_t,t)

x^0=xt−1−αˉtϵθ(xt,t)αˉt\hat{x}_0 = \frac{ x_t-\sqrt{1-\bar{\alpha}_t}\epsilon_\theta(x_t,t) }{ \sqrt{\bar{\alpha}_t} }

代回原来的均值估计,可以得到:

μ~t(xt,ϵ)=1αt(xt−βt1−αˉtϵ)\tilde{\mu}_t(x_t,\epsilon) = \frac{1}{\sqrt{\alpha_t}} \left( x_t - \frac{\beta_t}{\sqrt{1-\bar{\alpha}_t}}\epsilon \right)

因此模型预测均值可以写成:

μθ(xt,t)=1αt(xt−βt1−αˉtϵθ(xt,t))\mu_\theta(x_t,t) = \frac{1}{\sqrt{\alpha_t}} \left( x_t - \frac{\beta_t}{\sqrt{1-\bar{\alpha}_t}} \epsilon_\theta(x_t,t) \right)

那么为什么经典 DDPM 为简化训练通常固定方差呢?

在 DDPM 中,反向过程被定义为 pθ(xt−1∣xt)=N(xt−1;μθ(xt,t),Σθ(xt,t))p_\theta(x_{t-1}|x_t) = \mathcal{N}(x_{t-1}; \mu_\theta(x_t, t), \Sigma_\theta(x_t, t))。作者提出,方差 Σθ\Sigma_\theta 其实不需要学习,因为它被“夹”在两个极端假设之间。

这两个界限分别代表了我们对真实图像 x0x_0 的认知极端:

1. 下界 (Lower Bound): β~t\tilde{\beta}_t —— 假设我们完全知道 x0x_0

在上文推导 q(xt−1∣xt,x0)q(x_{t-1}|x_t, x_0) 时,配方后不仅得到了均值,也得到了方差 β~t\tilde{\beta}_t:

β~t=1−αˉt−11−αˉtβt\tilde{\beta}_t = \frac{1 - \bar{\alpha}_{t-1}}{1 - \bar{\alpha}_t} \beta_t

这代表什么意义?这是在“给定起点 x0x_0 和终点 xtx_t”的条件下,倒推中间状态 xt−1x_{t-1} 的不确定性。因为你连最终的清晰图都看到了,所以此时预测上一步状态的“不确定性”(方差) 是最小的。这就是理论上的最小方差(下界)。

2. 上界 (Upper Bound): βt\beta_t —— 假设我们对 x0x_0 一无所知

如果我们对生成的最终图像 x0x_0 没有任何先验知识,我们可以假设 x0x_0 也是一个标准正态分布 N(0,I)\mathcal{N}(0, I) (完全的噪声)。

在作者的推导论述中提到,如果假设 x0∼N(0,I)x_0 \sim \mathcal{N}(0, I),那么前向过程和反向过程的方差近似是对称的。此时反向跳一步的方差 q(xt−1∣xt)q(x_{t-1}|x_t) 就约等于前向加噪一步的方差:

Σ≈βt\Sigma \approx \beta_t

这是在没有任何 x0x_0 信息指导下,我们瞎猜上一步状态时的最大不确定性。这就是理论上的最大方差(上界)。

在 DDPM 的设定中,总步数 T=1000T=1000。

  • 在生成过程的早期 (tt 很大,接近纯噪声时): αˉt\bar{\alpha}_t 趋近于 0。此时看下界公式: β~t=1−01−0βt=βt\tilde{\beta}_t = \frac{1-0}{1-0}\beta_t = \beta_t。上下界完全重合!
  • 在生成过程的末期 (tt 很小,接近清晰图时): 虽然 β~t\tilde{\beta}_t 和 βt\beta_t 开始有差异,但在经典 DDPM 的参数设定中,βt\beta_t 被设定为一个非常小的常数(如从 0.0001 到 0.02 线性递增)。因为基数极小,所以它们绝对数值上的差异微乎其微。

正因为在这个极小的区间内,取上限还是取下界对最终生成图像的质量影响不大,Ho et al. 在实验后决定:干脆不让神经网络学了,直接在 βt\beta_t 或 β~t\tilde{\beta}_t 里面挑一个当常数固定下来(论文中最终主要使用了上限 βt\beta_t)。这样直接大幅简化了计算。

最终训练流程

之前我们说,中间的 KL 项是:

Lt−1=DKL(q(xt−1∣xt,x0)∥pθ(xt−1∣xt))L_{t-1} = D_{\text{KL}} \left( q(x_{t-1}\mid x_t,x_0) \| p_\theta(x_{t-1}\mid x_t) \right)

二者都是高斯分布:

q(xt−1∣xt,x0)=N(xt−1;μ~t,β~tI)q(x_{t-1}\mid x_t,x_0) = \mathcal N(x_{t-1};\tilde{\mu}_t,\tilde{\beta}_t I) pθ(xt−1∣xt)=N(xt−1;μθ,σt2I)p_\theta(x_{t-1}\mid x_t) = \mathcal N(x_{t-1};\mu_\theta,\sigma_t^2 I)

如果方差固定,那么两个高斯分布的 KL 散度主要就变成两个均值之间的平方误差:

DKL∝∣μ~t−μθ(xt,t)∣2D_{\text{KL}} \propto |\tilde{\mu}_t - \mu_\theta(x_t,t)|^2

由于 μ~t\tilde{\mu}_t 可以用真实噪声 ϵ\epsilon 表示,而 μθ\mu_\theta 可以用预测噪声 ϵθ\epsilon_\theta 表示,所以这个误差可以进一步转化为:

∣ϵ−ϵθ(xt,t)∣2|\epsilon - \epsilon_\theta(x_t,t)|^2

于是 DDPM 最常用的简化训练目标是:

Lsimple=Et,x0,ϵ[∣ϵ−ϵθ(αˉtx0+1−αˉtϵ,t)∣2]L_{\text{simple}} = \mathbb E_{t,x_0,\epsilon} \left[ | \epsilon - \epsilon_\theta( \sqrt{\bar{\alpha}_t}x_0 + \sqrt{1-\bar{\alpha}_t}\epsilon, t ) |^2 \right]

这就是 DDPM 的经典训练损失。

因此最终的训练流程简化如下:

  1. 从数据集中采样真实图片 x0x_0;
  2. 随机采样时间步 t∼Uniform(1,T)t\sim \text{Uniform}(1,T);
  3. 采样噪声 ϵ∼N(0,I)\epsilon\sim\mathcal N(0,I);
  4. 构造带噪图片:
xt=αˉtx0+1−αˉtϵx_t = \sqrt{\bar{\alpha}_t}x_0 + \sqrt{1-\bar{\alpha}_t}\epsilon
  1. 用神经网络预测噪声:
ϵθ(xt,t)\epsilon_\theta(x_t,t)
  1. 最小化:
∣ϵ−ϵθ(xt,t)∣2|\epsilon-\epsilon_\theta(x_t,t)|^2

这就是整个训练。

采样过程

训练完成后,从纯噪声开始:

xT∼N(0,I)x_T \sim \mathcal N(0,I)

然后对:

t=T,T−1,…,1t=T,T-1,\dots,1

重复:

xt−1=μθ(xt,t)+σtzx_{t-1} = \mu_\theta(x_t,t) + \sigma_t z

其中:

z∼N(0,I)z\sim\mathcal N(0,I)

而:

μθ(xt,t)=1αt(xt−βt1−αˉtϵθ(xt,t))\mu_\theta(x_t,t) = \frac{1}{\sqrt{\alpha_t}} \left( x_t - \frac{\beta_t}{\sqrt{1-\bar{\alpha}_t}} \epsilon_\theta(x_t,t) \right)

所以采样公式是:

xt−1=1αt(xt−βt1−αˉtϵθ(xt,t))+σtzx_{t-1} = \frac{1}{\sqrt{\alpha_t}} \left( x_t - \frac{\beta_t}{\sqrt{1-\bar{\alpha}_t}} \epsilon_\theta(x_t,t) \right) + \sigma_t z

当 t>1t>1 时加入噪声 zz;当 t=1t=1 时通常不再加噪声。

  • 一个非常重要的直觉:不同时间步学到不同任务

当 tt 很小时:

xtx_t

接近真实图片,只带一点点噪声。模型主要学习局部细节修复。

当 tt 很大时:

xtx_t

接近纯噪声,几乎看不出原图。模型需要学习数据分布的整体结构,比如:

  • 图片里大概有什么物体;
  • 物体布局是什么;
  • 语义结构是什么;
  • 图像整体风格是什么。

所以扩散模型不是一步生成图片,而是从粗到细逐步恢复:

global structure→object shape→texture details\text{global structure} \rightarrow \text{object shape} \rightarrow \text{texture details}

这也是扩散模型生成质量很高的重要原因。

DDPM 的整体算法总结

训练算法

重复以下步骤:

x0∼q(x0)x_0 \sim q(x_0) t∼Uniform(1,…,T)t \sim \text{Uniform}({1,\dots,T}) ϵ∼N(0,I)\epsilon \sim \mathcal N(0,I)

构造:

xt=αˉtx0+1−αˉtϵx_t = \sqrt{\bar{\alpha}_t}x_0 + \sqrt{1-\bar{\alpha}_t}\epsilon

优化:

min⁡θ∣ϵ−ϵθ(xt,t)∣2\min_\theta \left| \epsilon - \epsilon_\theta(x_t,t) \right|^2

采样算法

先采样:

xT∼N(0,I)x_T\sim\mathcal N(0,I)

然后对于:

t=T,T−1,…,1t=T,T-1,\dots,1

执行:

xt−1=1αt(xt−βt1−αˉtϵθ(xt,t))+σtzx_{t-1} = \frac{1}{\sqrt{\alpha_t}} \left( x_t - \frac{\beta_t}{\sqrt{1-\bar{\alpha}_t}} \epsilon_\theta(x_t,t) \right) + \sigma_t z

其中:

z∼N(0,I)z\sim\mathcal N(0,I)

最终得到:

x0x_0
Categories