扩散模型原理

11 阅读9分钟

扩散模型原理:从噪声到图像的数学之旅

想象一下修复照片的过程:起点是一张满是噪点的图片(高斯噪声),终点是一张清晰的照片。你需要找到一条路径,从无意义的噪声一步步变成有意义的图像。

这个故事要从头说起——我们如何让计算机学会这个魔法?


符号说明(查表用)

下面这些符号会在文章中反复出现。不需要记住,遇到不懂的符号时回来查这个表就行了。

图像符号

  • x0x_0:原始清晰图片(下标 0 表示第 0 步,也就是没有加过噪声)
  • xtx_t:第 tt 步的带噪声图片(tt 越大,图越模糊)
  • xt1x_{t-1}:第 t1t-1 步的图片,比 xtx_t 稍微清晰一点
  • xTx_T:最终第 TT 步的图片,全是噪声

概率符号

  • q()q(\text{后} | \text{前}):真实的前向或逆向分布(上帝视角,理论上存在但可能算不出来)
    • q(xtxt1)q(x_t | x_{t-1}):前向加噪分布,从 xt1x_{t-1}xtx_t(已知,很好算)
    • q(xt1xt)q(x_{t-1} | x_t):逆向去噪分布,从 xtx_txt1x_{t-1}(未知,很难算)
  • pθ()p_\theta(\text{后} | \text{前}):神经网络预测的分布(替身,用来近似真实分布)
    • θ\theta:神经网络的参数
    • pθ(xt1xt)p_\theta(x_{t-1} | x_t):神经网络预测的逆向分布

噪声符号

  • ϵ\epsilon:标准高斯噪声,ϵN(0,1)\epsilon \sim N(0,1)
  • βt\beta_t:第 tt 步加的噪声强度(人为设定的小常数)
  • αt\alpha_t:信号保留比例,定义为 1βt1 - \beta_t
  • αˉt\bar{\alpha}_t:累积保留比例,定义为 α1×α2××αt\alpha_1 \times \alpha_2 \times \cdots \times \alpha_t

直观理解

前向过程(加噪):x0qx1qx2qqxTx_0 \xrightarrow{q} x_1 \xrightarrow{q} x_2 \xrightarrow{q} \cdots \xrightarrow{q} x_T

逆向过程(去噪):xTpθxT1pθpθx0x_T \xrightarrow{p_\theta} x_{T-1} \xrightarrow{p_\theta} \cdots \xrightarrow{p_\theta} x_0


现在开始我们的故事。

第一章:直觉的陷阱

最直观的想法

假设你想把一张清晰的图片变成噪声。最直观的做法就像撒盐一样,一步步往上叠加噪声。

x0x_0 是原图。在每一时刻 tt,在上一时刻 xt1x_{t-1} 的基础上加一点噪声 ϵ\epsilon

xt=xt1+βϵx_t = x_{t-1} + \beta \cdot \epsilon

其中 ϵN(0,1)\epsilon \sim N(0,1)β\beta 表示噪声强度。

这个公式描述的是前向过程:从清晰图 xt1x_{t-1} 加噪得到 xtx_t。用概率论的语言,我们把这个加噪过程记作 q(xtxt1)q(x_t | x_{t-1}) —— 也就是在给定 xt1x_{t-1} 的条件下,xtx_t 的分布。

现在不用纠结这个符号,你只需要知道:q(xtxt1)q(x_t | x_{t-1}) 就是我们前面写的那个加噪公式。

展开 tt 步后:

xt=x0+tβϵˉx_t = x_0 + t\beta \cdot \bar{\epsilon}

其中 ϵˉ\bar{\epsilon} 是合并后的噪声。

直觉的崩溃

这个公式有两个致命缺陷。

问题 1:均值漂移

  • 均值:E[xt]=x0E[x_t] = x_0
  • 无论加多少步噪声,图像的均值永远是原图
  • 这意味着原图的底色永远消不掉

问题 2:方差爆炸

  • 方差:Var(xt)=tβVar(x_t) = t\beta
  • 随着时间 tt 增加,方差会趋向于无穷大
  • 标准正态分布的方差必须固定为 1

结论:这个模型无法收敛到标准正态分布 N(0,1)N(0,1),它只是造出了一个无限模糊且数值巨大的废图。


第二章:能量守恒的启示

引入衰减系数

为了防止方差爆炸,我们需要引入能量守恒的概念:既然要注入噪声能量(方差),就必须按比例拿走一部分图像能量。

xt1x_{t-1} 前面加一个衰减系数。为了保证总方差维持在 1,系数必须满足勾股定理的形式:

xt=1βtxt1+βtϵx_t = \sqrt{1 - \beta_t} \cdot x_{t-1} + \sqrt{\beta_t} \cdot \epsilon

其中 βt(0,1)\beta_t \in (0, 1) 是一个小的常数,表示每步添加的噪声比例。

为什么这样就对了?

通过这种缩放操作,可以保证 Var(xt)=1Var(x_t) = 1(假设 Var(xt1)=1Var(x_{t-1}) = 1),无论迭代多少次,数据的方差始终被控制在 1 左右。

这就构成了 Variance Preserving(保方差)的扩散过程。

这个改进后的公式就是我们前向加噪分布 q(xtxt1)q(x_t | x_{t-1}) 的核心形式。


第三章:寻找直达公式

工程需求

训练神经网络时,我们需要在任意时刻 tt 采样带噪图,然后告诉网络:这幅图里加的噪声是什么。这需要一个关键能力:给定原图 x0x_0 和任意时刻 tt,直接算出对应的噪声 xtx_t 和噪声 ϵ\epsilon

如果只能一步步递推算,我们就不知道当前这幅 xtx_t 里到底加了多少噪声——因为噪声累积了 tt 步,每一步的噪声都不同。

所以我们需要一个"直达公式":从 x0x_0tt 一步到位算出 xtx_t,这样就能清楚地知道这幅图里包含的噪声 ϵ\epsilon 是什么。

变量定义

为了书写简洁,定义两个变量:

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

αˉt=i=1tαi=α1×α2××αt\bar{\alpha}_t = \prod_{i=1}^{t} \alpha_i = \alpha_1 \times \alpha_2 \times \cdots \times \alpha_t

  • αt\alpha_t:第 tt 步的信号保留比例
  • αˉt\bar{\alpha}_t:累积保留比例(从第 1 步到第 tt 步所有 α\alpha 的连乘积,读作 Alpha Bar t)

递归推导

通过数学归纳法,推导规律:

  • t=1t = 1x0x_0 的系数是 α1\sqrt{\alpha_1}
  • t=2t = 2x0x_0 的系数是 α1α2\sqrt{\alpha_1 \alpha_2}
  • t=3t = 3:系数变成 α1α2α3\sqrt{\alpha_1 \alpha_2 \alpha_3}

规律已经很清晰了,但还需要处理噪声项的合并。

高斯分布的魔力

两个独立高斯分布 N(0,σ12)N(0, \sigma_1^2)N(0,σ22)N(0, \sigma_2^2) 相加,等于一个新的高斯分布 N(0,σ12+σ22)N(0, \sigma_1^2 + \sigma_2^2)

利用这个性质,推导出噪声项可以合并为 1αˉtϵˉ\sqrt{1 - \bar{\alpha}_t} \cdot \bar{\epsilon} 的形式。

DDPM 核心公式

通过数学归纳法,推广到任意时刻 tt

xt=αˉtx0+1αˉtϵ=q(xtx0)x_t = \sqrt{\bar{\alpha}_t} \cdot x_0 + \sqrt{1 - \bar{\alpha}_t} \cdot \epsilon \quad = \quad q(x_t | x_0)

左边是具体的计算公式,右边是符号表示(在给定原图 x0x_0 的条件下,第 tt 步的带噪图 xtx_t 的分布)。

验证收敛

来看看当 tt \to \infty(扩散到最后)时,这个公式会发生什么。

由于 αt<1\alpha_t < 1,连乘积 αˉt\bar{\alpha}_t 会趋近于 0,因此 xTϵx_T \approx \epsilon(纯标准正态分布)。

结论:前向过程完美收敛到标准正态分布 N(0,1)N(0,1)

训练数据准备

现在我们有了直达公式,就可以准备训练数据了!

给定一张清晰图片 x0x_0,训练样本是这样准备的:

  1. 随机选时刻 t{1,2,...,T}t \in \{1, 2, ..., T\}
  2. 生成噪声 ϵN(0,1)\epsilon \sim N(0,1)
  3. 计算带噪图 xt=αˉtx0+1αˉtϵx_t = \sqrt{\bar{\alpha}_t} \cdot x_0 + \sqrt{1 - \bar{\alpha}_t} \cdot \epsilon

每个训练样本包含:

  • 输入:(xt,t)(x_t, t) —— 带噪图和时间步
  • 标签:ϵ\epsilon —— 真实噪声

神经网络的任务:看带噪图 xtx_t 和时间 tt,预测这幅图里的噪声 ϵ\epsilon

这就为后面的训练做好了准备。


第四章:逆向的困境

问题:能走回去吗?

前三章我们一直在讲前向过程:从清晰图逐步加噪,最后得到 q(xtx0)q(x_t | x_0) —— 可以直接从原图生成任意时刻的带噪图。

现在的问题是:能不能走回去?

给定一张满是噪点的图 xtx_t,怎么推算出它上一秒稍微清晰一点的样子 xt1x_{t-1}

用概率论的语言,我们想求的是逆向过程 q(xt1xt)q(x_{t-1} | x_t) —— 注意,条件反过来了!不再是从 xt1x_{t-1}xtx_t,而是要从 xtx_t 推回 xt1x_{t-1}

根据贝叶斯公式:

q(xt1xt)=q(xtxt1)q(xt1)q(xt)q(x_{t-1} | x_t) = \frac{q(x_t | x_{t-1}) \cdot q(x_{t-1})}{q(x_t)}

  • q(xtxt1)q(x_t | x_{t-1}):已知(我们前三章推导的单步加噪公式)
  • q(xt1)q(x_{t-1})q(xt)q(x_t):未知!这需要知道全世界所有图片的边缘分布,在数学上是不可计算的

困境:逆向过程算不出来!

解决方案:找个替身

既然算不出真实的 q(xt1xt)q(x_{t-1} | x_t),我们就训练一个神经网络(参数为 θ\theta)来近似它。我们把这个替身记作 pθ(xt1xt)p_\theta(x_{t-1} | x_t)

为什么要预测高斯分布?

这里有个关键的直觉:前向过程每次加的噪声极小(βt\beta_t 很小),就像画画时每一笔只涂抹一点点。那么撤销这一笔的操作,大概率也只是在一个很小的范围内微调。

数学上这叫做 Feller 理论:当扩散步数 TT \to \infty 且每一步加噪幅度 βt0\beta_t \to 0 时,前向过程变成了连续的布朗运动。如果前向过程是高斯扩散,逆向过程在数学形式上也必然是一个高斯过程。

所以,神经网络不需要预测整张图 xt1x_{t-1},只需要预测一个高斯分布。

高斯分布需要什么参数?

一个高斯分布 N(μ,σ2)N(\mu, \sigma^2) 由两个参数决定:

  1. 均值 μ\mu:分布的中心位置
  2. 方差 σ2\sigma^2:分布的分散程度

理论上,神经网络需要预测这两个值。

DDPM 的简化

但是 DDPM 论文发现了一个事实:方差不需要训练,直接固定成常数(和前向过程的 βt\beta_t 相关)效果就很好。

因此,神经网络的任务被简化了:

  • 不需要预测:方差 Σθ\Sigma_\theta(固定为常数)
  • 只需要预测:均值 μθ(xt,t)\mu_\theta(x_t, t)

这个均值 μθ(xt,t)\mu_\theta(x_t, t) 代表什么?直觉上理解,它就是神经网络对"上一张图 xt1x_{t-1} 应该长什么样"的猜想的中心点。给定当前噪点图 xtx_t 和时间 tt,神经网络告诉我们:往这个方向走,应该能找到更清晰的图。


第五章:ELBO 的登场

目标:让神经网络生成真图

为了让这个神经网络 pθp_\theta 能够生成像 x0x_0 这样的真图,我们需要最大化对数似然:logpθ(x0)\log p_\theta(x_0)

但正如之前所说,直接算这个太难。于是我们引入 ELBO(Evidence Lower Bound,证据下界)。

什么是下界?

这里要用到一个经典的变分推断技巧:引入一个辅助分布 qq,在 log 里面玩点数学游戏。

你可能注意到公式里出现了 x1:Tx_{1:T}x0:Tx_{0:T} 这种写法,这是一种简写符号:

  • x1:Tx_{1:T} 表示从第 1 步到第 T 步的所有带噪图:x1,x2,...,xTx_1, x_2, ..., x_T
  • x0:Tx_{0:T} 表示 x0,x1,...,xTx_0, x_1, ..., x_T

从我们的目标开始:

logpθ(x0)=logx1:Tpθ(x0:T)\log p_\theta(x_0) = \log \sum_{x_{1:T}} p_\theta(x_{0:T})

这个公式的逻辑是:模型生成一张清晰图 x0x_0 的概率,等于它沿着所有可能的去噪路径(从纯噪声 xTx_Tx0x_0)推导回来的概率总和。

按照从左到右的顺序:

  • log\log:对概率取对数,将连乘转化为加法,便于优化
  • x1:T\sum_{x_{1:T}}:对所有可能的中间路径进行边缘化——把所有能产生同一张 x0x_0 的不同路径(x1,x2,...,xTx_1, x_2, ..., x_T 的各种组合)的概率全部累加
  • pθ(x0:T)p_\theta(x_{0:T}):模型参数为 θ\theta 的联合概率,描述一条完整去噪链路 {xT,xT1,...,x1,x0}\{x_T, x_{T-1}, ..., x_1, x_0\} 的发生概率

好比计算"到达山顶的总人数":把从北坡、南坡、西坡等所有路径上山的人数加起来。

现在我们在分数里乘以 q(x1:Tx0)/q(x1:Tx0)=1q(x_{1:T}|x_0) / q(x_{1:T}|x_0) = 1

logpθ(x0)=logx1:Tq(x1:Tx0)pθ(x0:T)q(x1:Tx0)\log p_\theta(x_0) = \log \sum_{x_{1:T}} q(x_{1:T}|x_0) \cdot \frac{p_\theta(x_{0:T})}{q(x_{1:T}|x_0)}

这可以写成期望的形式:

logpθ(x0)=logEq[pθ(x0:T)q(x1:Tx0)]\log p_\theta(x_0) = \log E_q \left[ \frac{p_\theta(x_{0:T})}{q(x_{1:T}|x_0)} \right]

关键步骤:利用 Jensen 不等式(log\log 是凹函数,所以 logE[X]E[logX]\log E[X] \geq E[\log X]):

logpθ(x0)Eq[logpθ(x0:T)q(x1:Tx0)]\log p_\theta(x_0) \geq E_q \left[ \log \frac{p_\theta(x_{0:T})}{q(x_{1:T}|x_0)} \right]

或者写成更熟悉的形式:

logpθ(x0)Eq[logq(x1:Tx0)pθ(x0:T)]\log p_\theta(x_0) \geq E_q \left[ \log \frac{q(x_{1:T} | x_0)}{p_\theta(x_{0:T})} \right]

  • 左边是我想最大化的目标(很难算)
  • 右边是一个下界(Lower Bound)(相对好算)

策略:如果我们拼命把右边的下界抬高,左边的目标自然也就被顶上去了。

在深度学习里,我们要 minimize Loss,所以我们取负号,变成 Minimize Negative ELBO。

拆解 Loss

把上面那个复杂的式子展开(利用 Markov 链性质),Loss 可以被拆解成三项:

L=LT+Lt1+L0L = L_T + L_{t-1} + L_0

LTL_T(正则项)

DKL(q(xTx0)p(xT))D_{KL}(q(x_T | x_0) || p(x_T))

这里的 q(xTx0)q(x_T | x_0) 是第三章推导的那个直达分布:从原图 x0x_0 出发,经过 T 步前向加噪后得到最终噪声图 xTx_T 的概率分布。

根据第三章的核心公式,这实际上是一个高斯分布:

q(xTx0)=N(αˉTx0,1αˉT)q(x_T | x_0) = N(\sqrt{\bar{\alpha}_T} \cdot x_0, 1 - \bar{\alpha}_T)

p(xT)p(x_T) 是标准高斯分布 N(0,1)N(0,1)。这一项比较的是:模型最终生成的噪声分布(qq)和标准高斯噪声(pp)有多接近。

因为前向过程是锁死的,当 TT 足够大时,αˉT0\bar{\alpha}_T \to 0,所以 q(xTx0)q(x_T | x_0) 本来就非常接近标准高斯。这一项近似为 0,不用训练。

L0L_0(重构项)

logpθ(x0x1)-\log p_\theta(x_0 | x_1)

最后一步的解码。

Lt1L_{t-1}(去噪核心项):这就是我们要关注的重点!

t>1DKL(q(xt1xt,x0)pθ(xt1xt))\sum_{t>1} D_{KL}(q(x_{t-1} | x_t, x_0) || p_\theta(x_{t-1} | x_t))

这个 KL 散度在衡量两个分布的距离。


左边:上帝视角的真实分布 q(xt1xt,x0)q(x_{t-1} | x_t, x_0)

这是"给定原图 x0x_0 和当前带噪图 xtx_t 的条件下,上一张稍微清晰点的图 xt1x_{t-1} 的概率分布"。

关键点:多了 x0x_0 这个条件!

为什么这很重要?回顾第四章,q(xt1xt)q(x_{t-1} | x_t) 算不出来——因为只知道当前带噪图 xtx_t,但不知道它原本是什么样,有无数种可能的 xt1x_{t-1} 都能产生这个 xtx_t。就像只知道终点,不知道起点,无法确定路径。

但加了 x0x_0 之后情况就完全不同了:如果我们知道原图 x0x_0(训练时当然知道,因为 xtx_t 就是从它算出来的),就能锁定唯一的"去噪路径"。此时逆向概率 q(xt1xt,x0)q(x_{t-1} | x_t, x_0) 变得可计算。

**具体怎么算?**利用贝叶斯公式:

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

看公式右边的三项:

  1. q(xtxt1,x0)q(x_t | x_{t-1}, x_0):因为马尔可夫性,给定 xt1x_{t-1} 后,xtx_t 不再依赖 x0x_0,所以等于 q(xtxt1)q(x_t | x_{t-1})。这是单步高斯加噪分布:xt=1βtxt1+βtϵx_t = \sqrt{1 - \beta_t} \cdot x_{t-1} + \sqrt{\beta_t} \cdot \epsilon

  2. q(xt1x0)q(x_{t-1} | x_0):从原图 x0x_0 一步到位到 xt1x_{t-1} 的分布。用直达公式:xt1=αˉt1x0+1αˉt1ϵx_{t-1} = \sqrt{\bar{\alpha}_{t-1}} \cdot x_0 + \sqrt{1 - \bar{\alpha}_{t-1}} \cdot \epsilon,这是高斯分布

  3. q(xtx0)q(x_t | x_0):从原图 x0x_0 一步到位到 xtx_t 的分布。同样用直达公式:xt=αˉtx0+1αˉtϵx_t = \sqrt{\bar{\alpha}_t} \cdot x_0 + \sqrt{1 - \bar{\alpha}_t} \cdot \epsilon,这也是高斯分布

核心差别:第 2 和第 3 项都是从原图 x0x_0 出发的"前向"分布,我们有直达公式可以一步到位计算;而第 1 项是单步加噪,公式也很简单。

这三项都能算,这就是为什么加了 x0x_0 之后整个贝叶斯公式变得可计算——每一项都是已知的高斯分布。

既然三项都是高斯分布,它们的贝叶斯组合仍然是高斯分布。通过代数推导可以得到:

q(xt1xt,x0)=N(μ~t,σ~t2)q(x_{t-1} | x_t, x_0) = N(\tilde{\mu}_t, \tilde{\sigma}_t^2)

其中均值的具体形式是:

μ~t=1αt(xt1αt1αˉtϵ)\tilde{\mu}_t = \frac{1}{\sqrt{\alpha_t}} (x_t - \frac{1 - \alpha_t}{\sqrt{1 - \bar{\alpha}_t}} \cdot \epsilon)

这个公式不需要背,但需要理解每个参数是怎么来的:

公式里的参数

  • xtx_t:当前带噪图(已知,这就是我们要处理的图)
  • x0x_0:原图(已知,训练时当然知道,因为 xtx_t 就是从它算出来的)
  • αt\alpha_t:第 tt 步的信号保留比例(预设常数,训练前就设定好了)
  • αˉt\bar{\alpha}_t:累积保留比例(可以预先计算,就是 α1×α2××αt\alpha_1 \times \alpha_2 \times \cdots \times \alpha_t
  • ϵ\epsilon:关键!这是从 x0x_0 生成 xtx_t 时加的噪声(可以从第三章的直达公式反算出来:ϵ=xtαˉtx01αˉt\epsilon = \frac{x_t - \sqrt{\bar{\alpha}_t} \cdot x_0}{\sqrt{1 - \bar{\alpha}_t}}

核心洞察:公式中只有 ϵ\epsilon 是"隐藏"的,但它可以通过 xtx_tx0x_0 算出来。

这就是为什么说"要想算出均值,本质上只需要知道噪声 ϵ\epsilon 是多少"——因为其他所有参数都是公开的预设值,只有噪声是需要推导的。


右边:神经网络预测的分布 pθ(xt1xt)p_\theta(x_{t-1} | x_t)

这是神经网络预测的分布——看着带噪图 xtx_t,猜上一张图 xt1x_{t-1} 长什么样。

网络不知道原图 x0x_0,只能通过观察 xtx_t 来推测。它需要预测一个高斯分布 N(μθ,Σθ)N(\mu_\theta, \Sigma_\theta),但由于 DDPM 的简化(方差固定),实际上只需要预测均值 μθ\mu_\theta

神经网络的输入输出

  • 输入:(xt,t)(x_t, t) —— 带噪图和时间步
  • 输出:预测的均值 μθ(xt,t)\mu_\theta(x_t, t)

小结

KL 散度在衡量:神经网络的预测(pθp_\theta)和上帝视角的真实答案(qq)有多接近。

训练的目标就是让 μθ\mu_\theta 尽可能逼近 μ~t\tilde{\mu}_t


第六章:从均值到噪声的蜕变

现在我们的任务很明确了:让神经网络预测的均值 μθ\mu_\theta,去逼近第五章那个上帝视角的真实均值 μ~t\tilde{\mu}_t

第五章末尾我们注意到一个关键洞察:均值公式的形式揭示了与噪声 ϵ\epsilon 的直接关系——要想算出均值,本质上只需要知道噪声 ϵ\epsilon 是多少。

现在深入理解这个洞察:为什么"求均值"等于"减去噪声"?

搞懂符号

先让我们把公式里的零件一个个拆下来。

μθ(xt,t)\mu_\theta(x_t, t) 是什么?

这是神经网络根据当前满是噪点的图 xtx_t,猜测出来的"上一张稍微清晰点的图 xt1x_{t-1}"的中心位置。

  • 为什么要输入 xtx_t?你需要看着当前的图,才能猜上一张图
  • 为什么要输入 tt?你需要知道现在是第几步。第 1000 步全是噪点很难猜,第 5 步基本看清了只需微调。时间 tt 告诉网络噪声的浓度

Σθ\Sigma_\theta 呢?

DDPM 论文发现了一个巧妙的事实:方差其实不用训练!前向加噪时每一步的噪声大小 βt\beta_t 是人为设定的,逆向的不确定性跟它高度相关。

所以作者直接把方差固定成常数,神经网络只需要管好均值就行了。

关键洞察

现在到了最关键的地方:为什么"求均值"等于"减去噪声"?

请盯着第五章那个上帝视角的均值公式看三秒钟:

μ~t=1αt(xt1αt1αˉtϵ)\tilde{\mu}_t = \frac{1}{\sqrt{\alpha_t}} (x_t - \frac{1 - \alpha_t}{\sqrt{1 - \bar{\alpha}_t}} \cdot \epsilon)

  • xtx_t:当前的图(已知)
  • αt,βt\alpha_t, \beta_t:预设的常数(已知)
  • ϵ\epsilon:这幅图里包含的噪声(未知!)

发现了吗?要想算出均值,本质上只需要知道这幅图里的噪声 ϵ\epsilon 是多少!

这是一个惊人的发现:神经网络预测均值 μθ\mu_\theta,在数学上等价于预测噪声 ϵθ\epsilon_\theta

于是,神经网络的工作变得很简单:

  1. 输入:xtx_t(带噪图)
  2. 任务:告诉我这图里加的噪声 ϵ\epsilon 长什么样
  3. 计算:把预测出来的噪声套进公式,算出 xt1x_{t-1} 的均值
  4. 采样:在均值旁边随机抖一下,就得到了 xt1x_{t-1}

MSE 的诞生

现在你应该理解了:虽然理论上我们在拟合一个高斯分布:

pθ=N(μ,Σ)p_\theta = N(\mu, \Sigma)

但在实际代码里,神经网络直接预测噪声 ϵθ\epsilon_\theta,然后用 xtx_t 减去噪声的部分,就得到了去噪后的结果。

复杂的 KL 散度 Loss,最终被简化成了两个噪声向量的均方误差:

Lsimple=ϵϵθ(αˉtx0+1αˉtϵ,t)2L_{simple} = \|\epsilon - \epsilon_\theta(\sqrt{\bar{\alpha}_t} x_0 + \sqrt{1 - \bar{\alpha}_t} \epsilon, t)\|^2

  • ϵ\epsilon:训练时生成的真噪声
  • ϵθ\epsilon_\theta:神经网络预测的噪声

这个简化太重要了。让我们回顾一下它是怎么来的:

  1. Feller 理论告诉我们:逆向过程是高斯分布
  2. DDPM 简化告诉我们:方差可以固定,只需求均值
  3. 贝叶斯推导告诉我们:求均值等价于求噪声
  4. 最终实现:神经网络看图预测噪声

每一步都自然流畅,每一步都环环相扣。


第七章:生成图片

神经网络训练好后(训练过程前面已经讲过),怎么用它生成新图片?

初始状态:从纯噪声开始,xTN(0,1)x_T \sim N(0,1)

去噪循环:从 t=Tt = T 倒推到 t=1t = 1

每一步的更新公式:

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

其中 zN(0,1)z \sim N(0,1) 是随机噪声(σt\sigma_t 是预设的方差系数)。

完整生成流程

  1. 初始化:从标准正态分布采样 xTN(0,1)x_T \sim N(0,1) 作为起点(纯噪声)

  2. 逐步去噪:对于 t=T,T1,...,2,1t = T, T-1, ..., 2, 1,每次迭代:

    • 把当前带噪图 xtx_t 和时间步 tt 输入神经网络
    • 网络预测噪声 ϵθ(xt,t)\epsilon_\theta(x_t, t)
    • 用上面的去噪公式计算 xt1x_{t-1}
    • 得到稍微清晰一点的图
  3. 得到结果:重复 T 次后,最终得到清晰图 x0x_0

直觉理解

  • 网络看当前带噪图 xtx_t,预测里面的噪声 ϵθ\epsilon_\theta
  • xtx_t 中减去预测的噪声,得到上一时刻的图 xt1x_{t-1}
  • 加一点随机噪声 zz(保持生成的多样性)
  • 重复 T 次(比如 1000 次),逐步去噪,最终得到清晰图 x0x_0

核心洞察

训练和推理的对称性

  • 训练时(第三章):我们知道 x0x_0,用直达公式生成带噪图 xtx_t,让网络学习预测噪声 ϵ\epsilon
  • 推理时(本章):我们从纯噪声开始,用训练好的网络预测噪声,逐步去除噪声得到清晰图 x0x_0

训练时教网络"加噪是什么样",推理时让网络"把噪声去掉"——这就是扩散模型的优雅之处。


终章:全流程闭环

按照 DDPM 论文的逻辑,你现在应该彻底通透了。让我们回顾一下这个完整的故事。

故事脉络

  1. 起点:想算逆向过程 q(xt1xt)q(x_{t-1} | x_t),但算不出来
  2. 方法:用神经网络 pθp_\theta 去拟合它
  3. 手段:最大化 ELBO(变分下界)来训练
  4. 技巧:引入 x0x_0 作为条件,使得 KL 散度的目标分布 q(xt1xt,x0)q(x_{t-1} | x_t, x_0) 变得可计算
  5. 化简:把直达公式代入进去,发现拟合分布的均值,本质上就是在拟合噪声
  6. 结果:Loss 就是预测噪声和真实噪声的 MSE

核心优势

这种方法的关键优势在于利用了高斯噪声良好的数学性质,使整个过程的可建模性和可控性大大提高:

  • 数学优雅:前向过程有闭式解,可以快速生成训练数据
  • 训练稳定:通过能量守恒保持方差稳定
  • 推导清晰:从 ELBO 到 MSE 的每一步都有严格的数学推导
  • 工程可行:最终简化的 Loss 就是普通的 MSE,易于实现

这就是扩散模型背后的完整故事——从最直观的叠加噪声想法,到引入能量守恒,再到用神经网络拟合逆向过程,最终简化为预测噪声的 MSE Loss,最后落地到训练和推理的具体实现。

每一步都自然流畅,每一步都环环相扣。

现在,你应该真正理解了扩散模型的数学之美。

title: 扩散模型原理:从噪声到图像的数学之旅 category: 深度学习 tags:

  • 扩散模型
  • DDPM
  • 机器学习
  • 数学推导 status: 已完成 difficulty: 进阶 created: 2024-01-21T00:00:00.000Z aliases:
  • DDPM 原理
  • Denoising Diffusion Probabilistic Models cssclasses:
  • math-document theme: nico

扩散模型原理:从噪声到图像的数学之旅

想象一下修复照片的过程:起点是一张满是噪点的图片(高斯噪声),终点是一张清晰的照片。你需要找到一条路径,从无意义的噪声一步步变成有意义的图像。

这个故事要从头说起——我们如何让计算机学会这个魔法?


符号说明(查表用) ^symbol-table

下面这些符号会在文章中反复出现。不需要记住,遇到不懂的符号时回来查这个表就行了。

[!info] 图像符号

  • x0x_0:原始清晰图片(下标 0 表示第 0 步,也就是没有加过噪声)
  • xtx_t:第 tt 步的带噪声图片(tt 越大,图越模糊)
  • xt1x_{t-1}:第 t1t-1 步的图片,比 xtx_t 稍微清晰一点
  • xTx_T:最终第 TT 步的图片,全是噪声

[!info] 概率符号

  • q()q(\text{后} | \text{前}):真实的前向或逆向分布(上帝视角,理论上存在但可能算不出来)
    • q(xtxt1)q(x_t | x_{t-1}):前向加噪分布,从 xt1x_{t-1}xtx_t(已知,很好算)
    • q(xt1xt)q(x_{t-1} | x_t):逆向去噪分布,从 xtx_txt1x_{t-1}(未知,很难算)
  • pθ()p_\theta(\text{后} | \text{前}):神经网络预测的分布(替身,用来近似真实分布)
    • θ\theta:神经网络的参数
    • pθ(xt1xt)p_\theta(x_{t-1} | x_t):神经网络预测的逆向分布

[!info] 噪声符号

  • ϵ\epsilon:标准高斯噪声,ϵN(0,1)\epsilon \sim N(0,1)
  • βt\beta_t:第 tt 步加的噪声强度(人为设定的小常数)
  • αt\alpha_t:信号保留比例,定义为 1βt1 - \beta_t
  • αˉt\bar{\alpha}_t:累积保留比例,定义为 α1×α2××αt\alpha_1 \times \alpha_2 \times \cdots \times \alpha_t

直观理解

前向过程(加噪):x0qx1qx2qqxTx_0 \xrightarrow{q} x_1 \xrightarrow{q} x_2 \xrightarrow{q} \cdots \xrightarrow{q} x_T

逆向过程(去噪):xTpθxT1pθpθx0x_T \xrightarrow{p_\theta} x_{T-1} \xrightarrow{p_\theta} \cdots \xrightarrow{p_\theta} x_0


现在开始我们的故事。

第一章:直觉的陷阱 ^chapter-1

最直观的想法

假设你想把一张清晰的图片变成噪声。最直观的做法就像撒盐一样,一步步往上叠加噪声。

x0x_0 是原图。在每一时刻 tt,在上一时刻 xt1x_{t-1} 的基础上加一点噪声 ϵ\epsilon

xt=xt1+βϵx_t = x_{t-1} + \beta \cdot \epsilon

其中 ϵN(0,1)\epsilon \sim N(0,1)β\beta 表示噪声强度。

这个公式描述的是前向过程:从清晰图 xt1x_{t-1} 加噪得到 xtx_t。用概率论的语言,我们把这个加噪过程记作 q(xtxt1)q(x_t | x_{t-1}) —— 也就是在给定 xt1x_{t-1} 的条件下,xtx_t 的分布。

现在不用纠结这个符号,你只需要知道:q(xtxt1)q(x_t | x_{t-1}) 就是我们前面写的那个加噪公式。

展开 tt 步后:

xt=x0+tβϵˉx_t = x_0 + t\beta \cdot \bar{\epsilon}

其中 ϵˉ\bar{\epsilon} 是合并后的噪声。

直觉的崩溃

这个公式有两个致命缺陷。

[!warning]- 问题 1:均值漂移

  • 均值:E[xt]=x0E[x_t] = x_0
  • 无论加多少步噪声,图像的均值永远是原图
  • 这意味着原图的底色永远消不掉

[!warning]- 问题 2:方差爆炸

  • 方差:Var(xt)=tβVar(x_t) = t\beta
  • 随着时间 tt 增加,方差会趋向于无穷大
  • 标准正态分布的方差必须固定为 1

[!failure]- 结论 这个模型无法收敛到标准正态分布 N(0,1)N(0,1),它只是造出了一个无限模糊且数值巨大的废图。


第二章:能量守恒的启示 ^chapter-2

引入衰减系数

为了防止方差爆炸,我们需要引入能量守恒的概念:既然要注入噪声能量(方差),就必须按比例拿走一部分图像能量。

xt1x_{t-1} 前面加一个衰减系数。为了保证总方差维持在 1,系数必须满足勾股定理的形式:

xt=1βtxt1+βtϵx_t = \sqrt{1 - \beta_t} \cdot x_{t-1} + \sqrt{\beta_t} \cdot \epsilon

其中 βt(0,1)\beta_t \in (0, 1) 是一个小的常数,表示每步添加的噪声比例。

为什么这样就对了?

通过这种缩放操作,可以保证 Var(xt)=1Var(x_t) = 1(假设 Var(xt1)=1Var(x_{t-1}) = 1),无论迭代多少次,数据的方差始终被控制在 1 左右。

这就构成了 Variance Preserving(保方差)的扩散过程。

这个改进后的公式就是我们前向加噪分布 q(xtxt1)q(x_t | x_{t-1}) 的核心形式。


第三章:寻找直达公式 ^chapter-3

工程需求

训练神经网络时,我们需要在任意时刻 tt 采样带噪图,然后告诉网络:这幅图里加的噪声是什么。这需要一个关键能力:给定原图 x0x_0 和任意时刻 tt,直接算出对应的噪声 xtx_t 和噪声 ϵ\epsilon

如果只能一步步递推算,我们就不知道当前这幅 xtx_t 里到底加了多少噪声——因为噪声累积了 tt 步,每一步的噪声都不同。

所以我们需要一个"直达公式":从 x0x_0tt 一步到位算出 xtx_t,这样就能清楚地知道这幅图里包含的噪声 ϵ\epsilon 是什么。

变量定义

为了书写简洁,定义两个变量:

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

αˉt=i=1tαi=α1×α2××αt\bar{\alpha}_t = \prod_{i=1}^{t} \alpha_i = \alpha_1 \times \alpha_2 \times \cdots \times \alpha_t

  • αt\alpha_t:第 tt 步的信号保留比例
  • αˉt\bar{\alpha}_t:累积保留比例(从第 1 步到第 tt 步所有 α\alpha 的连乘积,读作 Alpha Bar t)

递归推导

通过数学归纳法,推导规律:

  • t=1t = 1x0x_0 的系数是 α1\sqrt{\alpha_1}
  • t=2t = 2x0x_0 的系数是 α1α2\sqrt{\alpha_1 \alpha_2}
  • t=3t = 3:系数变成 α1α2α3\sqrt{\alpha_1 \alpha_2 \alpha_3}

规律已经很清晰了,但还需要处理噪声项的合并。

高斯分布的魔力

两个独立高斯分布 N(0,σ12)N(0, \sigma_1^2)N(0,σ22)N(0, \sigma_2^2) 相加,等于一个新的高斯分布 N(0,σ12+σ22)N(0, \sigma_1^2 + \sigma_2^2)

利用这个性质,推导出噪声项可以合并为 1αˉtϵˉ\sqrt{1 - \bar{\alpha}_t} \cdot \bar{\epsilon} 的形式。

DDPM 核心公式 ^ddpm-core-formula

通过数学归纳法,推广到任意时刻 tt

xt=αˉtx0+1αˉtϵ=q(xtx0)x_t = \sqrt{\bar{\alpha}_t} \cdot x_0 + \sqrt{1 - \bar{\alpha}_t} \cdot \epsilon \quad = \quad q(x_t | x_0)

左边是具体的计算公式,右边是符号表示(在给定原图 x0x_0 的条件下,第 tt 步的带噪图 xtx_t 的分布)。

验证收敛

来看看当 tt \to \infty(扩散到最后)时,这个公式会发生什么。

由于 αt<1\alpha_t < 1,连乘积 αˉt\bar{\alpha}_t 会趋近于 0,因此 xTϵx_T \approx \epsilon(纯标准正态分布)。

[!success]- 结论 前向过程完美收敛到标准正态分布 N(0,1)N(0,1)

训练数据准备 ^training-data

现在我们有了直达公式,就可以准备训练数据了!

给定一张清晰图片 x0x_0,训练样本是这样准备的:

  1. 随机选时刻 t{1,2,...,T}t \in \{1, 2, ..., T\}
  2. 生成噪声 ϵN(0,1)\epsilon \sim N(0,1)
  3. 计算带噪图 xt=αˉtx0+1αˉtϵx_t = \sqrt{\bar{\alpha}_t} \cdot x_0 + \sqrt{1 - \bar{\alpha}_t} \cdot \epsilon

每个训练样本包含:

  • 输入:(xt,t)(x_t, t) —— 带噪图和时间步
  • 标签:ϵ\epsilon —— 真实噪声

神经网络的任务:看带噪图 xtx_t 和时间 tt,预测这幅图里的噪声 ϵ\epsilon

这就为后面的训练做好了准备。


第四章:逆向的困境 ^chapter-4

问题:能走回去吗?

前三章我们一直在讲前向过程:从清晰图逐步加噪,最后得到 q(xtx0)q(x_t | x_0) —— 可以直接从原图生成任意时刻的带噪图。

现在的问题是:能不能走回去?

给定一张满是噪点的图 xtx_t,怎么推算出它上一秒稍微清晰一点的样子 xt1x_{t-1}

用概率论的语言,我们想求的是逆向过程 q(xt1xt)q(x_{t-1} | x_t) —— 注意,条件反过来了!不再是从 xt1x_{t-1}xtx_t,而是要从 xtx_t 推回 xt1x_{t-1}

根据贝叶斯公式:

q(xt1xt)=q(xtxt1)q(xt1)q(xt)q(x_{t-1} | x_t) = \frac{q(x_t | x_{t-1}) \cdot q(x_{t-1})}{q(x_t)}

  • q(xtxt1)q(x_t | x_{t-1}):已知(我们前三章推导的单步加噪公式)
  • q(xt1)q(x_{t-1})q(xt)q(x_t):未知!这需要知道全世界所有图片的边缘分布,在数学上是不可计算的

[!failure]- 困境 逆向过程算不出来!

解决方案:找个替身

既然算不出真实的 q(xt1xt)q(x_{t-1} | x_t),我们就训练一个神经网络(参数为 θ\theta)来近似它。我们把这个替身记作 pθ(xt1xt)p_\theta(x_{t-1} | x_t)

[!faq]- 为什么要预测高斯分布? 这里有个关键的直觉:前向过程每次加的噪声极小(βt\beta_t 很小),就像画画时每一笔只涂抹一点点。那么撤销这一笔的操作,大概率也只是在一个很小的范围内微调。

数学上这叫做 Feller 理论:当扩散步数 TT \to \infty 且每一步加噪幅度 βt0\beta_t \to 0 时,前向过程变成了连续的布朗运动。如果前向过程是高斯扩散,逆向过程在数学形式上也必然是一个高斯过程。

所以,神经网络不需要预测整张图 xt1x_{t-1},只需要预测一个高斯分布。

[!info]- 高斯分布需要什么参数? 一个高斯分布 N(μ,σ2)N(\mu, \sigma^2) 由两个参数决定:

  1. 均值 μ\mu:分布的中心位置
  2. 方差 σ2\sigma^2:分布的分散程度

理论上,神经网络需要预测这两个值。

[!tip]- DDPM 的简化 但是 DDPM 论文发现了一个事实:方差不需要训练,直接固定成常数(和前向过程的 βt\beta_t 相关)效果就很好。

因此,神经网络的任务被简化了:

  • 不需要预测:方差 Σθ\Sigma_\theta(固定为常数)
  • 只需要预测:均值 μθ(xt,t)\mu_\theta(x_t, t)

这个均值 μθ(xt,t)\mu_\theta(x_t, t) 代表什么?直觉上理解,它就是神经网络对"上一张图 xt1x_{t-1} 应该长什么样"的猜想的中心点。给定当前噪点图 xtx_t 和时间 tt,神经网络告诉我们:往这个方向走,应该能找到更清晰的图。


第五章:ELBO 的登场 ^chapter-5

目标:让神经网络生成真图

为了让这个神经网络 pθp_\theta 能够生成像 x0x_0 这样的真图,我们需要最大化对数似然:logpθ(x0)\log p_\theta(x_0)

但正如之前所说,直接算这个太难。于是我们引入 ELBO(Evidence Lower Bound,证据下界)。

什么是下界?

这里要用到一个经典的变分推断技巧:引入一个辅助分布 qq,在 log 里面玩点数学游戏。

你可能注意到公式里出现了 x1:Tx_{1:T}x0:Tx_{0:T} 这种写法,这是一种简写符号:

  • x1:Tx_{1:T} 表示从第 1 步到第 T 步的所有带噪图:x1,x2,...,xTx_1, x_2, ..., x_T
  • x0:Tx_{0:T} 表示 x0,x1,...,xTx_0, x_1, ..., x_T

从我们的目标开始:

logpθ(x0)=logx1:Tpθ(x0:T)\log p_\theta(x_0) = \log \sum_{x_{1:T}} p_\theta(x_{0:T})

这个公式的逻辑是:模型生成一张清晰图 x0x_0 的概率,等于它沿着所有可能的去噪路径(从纯噪声 xTx_Tx0x_0)推导回来的概率总和。

按照从左到右的顺序:

  • log\log:对概率取对数,将连乘转化为加法,便于优化
  • x1:T\sum_{x_{1:T}}:对所有可能的中间路径进行边缘化——把所有能产生同一张 x0x_0 的不同路径(x1,x2,...,xTx_1, x_2, ..., x_T 的各种组合)的概率全部累加
  • pθ(x0:T)p_\theta(x_{0:T}):模型参数为 θ\theta 的联合概率,描述一条完整去噪链路 {xT,xT1,...,x1,x0}\{x_T, x_{T-1}, ..., x_1, x_0\} 的发生概率

好比计算"到达山顶的总人数":把从北坡、南坡、西坡等所有路径上山的人数加起来。

现在我们在分数里乘以 q(x1:Tx0)/q(x1:Tx0)=1q(x_{1:T}|x_0) / q(x_{1:T}|x_0) = 1

logpθ(x0)=logx1:Tq(x1:Tx0)pθ(x0:T)q(x1:Tx0)\log p_\theta(x_0) = \log \sum_{x_{1:T}} q(x_{1:T}|x_0) \cdot \frac{p_\theta(x_{0:T})}{q(x_{1:T}|x_0)}

这可以写成期望的形式:

logpθ(x0)=logEq[pθ(x0:T)q(x1:Tx0)]\log p_\theta(x_0) = \log E_q \left[ \frac{p_\theta(x_{0:T})}{q(x_{1:T}|x_0)} \right]

关键步骤:利用 Jensen 不等式(log\log 是凹函数,所以 logE[X]E[logX]\log E[X] \geq E[\log X]):

logpθ(x0)Eq[logpθ(x0:T)q(x1:Tx0)]\log p_\theta(x_0) \geq E_q \left[ \log \frac{p_\theta(x_{0:T})}{q(x_{1:T}|x_0)} \right]

或者写成更熟悉的形式:

logpθ(x0)Eq[logq(x1:Tx0)pθ(x0:T)]\log p_\theta(x_0) \geq E_q \left[ \log \frac{q(x_{1:T} | x_0)}{p_\theta(x_{0:T})} \right]

  • 左边是我想最大化的目标(很难算)
  • 右边是一个下界(Lower Bound)(相对好算)

策略:如果我们拼命把右边的下界抬高,左边的目标自然也就被顶上去了。

在深度学习里,我们要 minimize Loss,所以我们取负号,变成 Minimize Negative ELBO。

拆解 Loss ^loss-decomposition

把上面那个复杂的式子展开(利用 Markov 链性质),Loss 可以被拆解成三项:

L=LT+Lt1+L0L = L_T + L_{t-1} + L_0

[!info]- LTL_T(正则项) DKL(q(xTx0)p(xT))D_{KL}(q(x_T | x_0) || p(x_T))

这里的 q(xTx0)q(x_T | x_0) 是[[第三章:寻找直达公式#^ddpm-core-formula|第三章推导的那个直达分布]]:从原图 x0x_0 出发,经过 T 步前向加噪后得到最终噪声图 xTx_T 的概率分布。

根据第三章的核心公式,这实际上是一个高斯分布:

q(xTx0)=N(αˉTx0,1αˉT)q(x_T | x_0) = N(\sqrt{\bar{\alpha}_T} \cdot x_0, 1 - \bar{\alpha}_T)

p(xT)p(x_T) 是标准高斯分布 N(0,1)N(0,1)。这一项比较的是:模型最终生成的噪声分布(qq)和标准高斯噪声(pp)有多接近。

因为前向过程是锁死的,当 TT 足够大时,αˉT0\bar{\alpha}_T \to 0,所以 q(xTx0)q(x_T | x_0) 本来就非常接近标准高斯。这一项近似为 0,不用训练。

[!info]- L0L_0(重构项) logpθ(x0x1)-\log p_\theta(x_0 | x_1)

最后一步的解码。

[!important]- Lt1L_{t-1}(去噪核心项) t>1DKL(q(xt1xt,x0)pθ(xt1xt))\sum_{t>1} D_{KL}(q(x_{t-1} | x_t, x_0) || p_\theta(x_{t-1} | x_t))

这个 KL 散度在衡量两个分布的距离。


左边:上帝视角的真实分布 q(xt1xt,x0)q(x_{t-1} | x_t, x_0) ^god-view-distribution

这是"给定原图 x0x_0 和当前带噪图 xtx_t 的条件下,上一张稍微清晰点的图 xt1x_{t-1} 的概率分布"。

[!tip]- 关键点 多了 x0x_0 这个条件!

为什么这很重要?回顾[[第四章:逆向的困境#^chapter-4|第四章]],q(xt1xt)q(x_{t-1} | x_t) 算不出来——因为只知道当前带噪图 xtx_t,但不知道它原本是什么样,有无数种可能的 xt1x_{t-1} 都能产生这个 xtx_t。就像只知道终点,不知道起点,无法确定路径。

但加了 x0x_0 之后情况就完全不同了:如果我们知道原图 x0x_0(训练时当然知道,因为 xtx_t 就是从它算出来的),就能锁定唯一的"去噪路径"。此时逆向概率 q(xt1xt,x0)q(x_{t-1} | x_t, x_0) 变得可计算。

具体怎么算?

利用贝叶斯公式:

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

看公式右边的三项:

  1. q(xtxt1,x0)q(x_t | x_{t-1}, x_0):因为马尔可夫性,给定 xt1x_{t-1} 后,xtx_t 不再依赖 x0x_0,所以等于 q(xtxt1)q(x_t | x_{t-1})。这是单步高斯加噪分布:xt=1βtxt1+βtϵx_t = \sqrt{1 - \beta_t} \cdot x_{t-1} + \sqrt{\beta_t} \cdot \epsilon

  2. q(xt1x0)q(x_{t-1} | x_0):从原图 x0x_0 一步到位到 xt1x_{t-1} 的分布。用直达公式:xt1=αˉt1x0+1αˉt1ϵx_{t-1} = \sqrt{\bar{\alpha}_{t-1}} \cdot x_0 + \sqrt{1 - \bar{\alpha}_{t-1}} \cdot \epsilon,这是高斯分布

  3. q(xtx0)q(x_t | x_0):从原图 x0x_0 一步到位到 xtx_t 的分布。同样用直达公式:xt=αˉtx0+1αˉtϵx_t = \sqrt{\bar{\alpha}_t} \cdot x_0 + \sqrt{1 - \bar{\alpha}_t} \cdot \epsilon,这也是高斯分布

[!summary]- 核心差别 第 2 和第 3 项都是从原图 x0x_0 出发的"前向"分布,我们有直达公式可以一步到位计算;而第 1 项是单步加噪,公式也很简单。

这三项都能算,这就是为什么加了 x0x_0 之后整个贝叶斯公式变得可计算——每一项都是已知的高斯分布。

既然三项都是高斯分布,它们的贝叶斯组合仍然是高斯分布。通过代数推导可以得到:

q(xt1xt,x0)=N(μ~t,σ~t2)q(x_{t-1} | x_t, x_0) = N(\tilde{\mu}_t, \tilde{\sigma}_t^2)

其中均值的具体形式是:

μ~t=1αt(xt1αt1αˉtϵ)\tilde{\mu}_t = \frac{1}{\sqrt{\alpha_t}} (x_t - \frac{1 - \alpha_t}{\sqrt{1 - \bar{\alpha}_t}} \cdot \epsilon)

这个公式不需要背,但需要理解每个参数是怎么来的:

[!info]- 公式里的参数

  • xtx_t:当前带噪图(已知,这就是我们要处理的图)
  • x0x_0:原图(已知,训练时当然知道,因为 xtx_t 就是从它算出来的)
  • αt\alpha_t:第 tt 步的信号保留比例(预设常数,训练前就设定好了)
  • αˉt\bar{\alpha}_t:累积保留比例(可以预先计算,就是 α1×α2××αt\alpha_1 \times \alpha_2 \times \cdots \times \alpha_t
  • ϵ\epsilon:关键!这是从 x0x_0 生成 xtx_t 时加的噪声(可以从第三章的直达公式反算出来:ϵ=xtαˉtx01αˉt\epsilon = \frac{x_t - \sqrt{\bar{\alpha}_t} \cdot x_0}{\sqrt{1 - \bar{\alpha}_t}}

[!tip]- 核心洞察 公式中只有 ϵ\epsilon 是"隐藏"的,但它可以通过 xtx_tx0x_0 算出来。

这就是为什么说"要想算出均值,本质上只需要知道噪声 ϵ\epsilon 是多少"——因为其他所有参数都是公开的预设值,只有噪声是需要推导的。


右边:神经网络预测的分布 pθ(xt1xt)p_\theta(x_{t-1} | x_t) ^neural-prediction

这是神经网络预测的分布——看着带噪图 xtx_t,猜上一张图 xt1x_{t-1} 长什么样。

网络不知道原图 x0x_0,只能通过观察 xtx_t 来推测。它需要预测一个高斯分布 N(μθ,Σθ)N(\mu_\theta, \Sigma_\theta),但由于 DDPM 的简化(方差固定),实际上只需要预测均值 μθ\mu_\theta

[!info]- 神经网络的输入输出

  • 输入:(xt,t)(x_t, t) —— 带噪图和时间步
  • 输出:预测的均值 μθ(xt,t)\mu_\theta(x_t, t)

小结 ^chapter-5-summary

KL 散度在衡量:神经网络的预测(pθp_\theta)和上帝视角的真实答案(qq)有多接近。

训练的目标就是让 μθ\mu_\theta 尽可能逼近 μ~t\tilde{\mu}_t


第六章:从均值到噪声的蜕变 ^chapter-6

现在我们的任务很明确了:让神经网络预测的均值 μθ\mu_\theta,去逼近[[第五章:ELBO 的登场#^god-view-distribution|第五章那个上帝视角的真实均值]] μ~t\tilde{\mu}_t

第五章末尾我们注意到一个关键洞察:均值公式的形式揭示了与噪声 ϵ\epsilon 的直接关系——要想算出均值,本质上只需要知道噪声 ϵ\epsilon 是多少。

现在深入理解这个洞察:为什么"求均值"等于"减去噪声"?

搞懂符号

先让我们把公式里的零件一个个拆下来。

μθ(xt,t)\mu_\theta(x_t, t) 是什么?

这是神经网络根据当前满是噪点的图 xtx_t,猜测出来的"上一张稍微清晰点的图 xt1x_{t-1}"的中心位置。

  • 为什么要输入 xtx_t?你需要看着当前的图,才能猜上一张图
  • 为什么要输入 tt?你需要知道现在是第几步。第 1000 步全是噪点很难猜,第 5 步基本看清了只需微调。时间 tt 告诉网络噪声的浓度

Σθ\Sigma_\theta 呢?

DDPM 论文发现了一个巧妙的事实:方差其实不用训练!前向加噪时每一步的噪声大小 βt\beta_t 是人为设定的,逆向的不确定性跟它高度相关。

所以作者直接把方差固定成常数,神经网络只需要管好均值就行了。

关键洞察 ^key-insight

现在到了最关键的地方:为什么"求均值"等于"减去噪声"?

请盯着[[第五章:ELBO 的登场#^god-view-distribution|第五章那个上帝视角的均值公式]]看三秒钟:

μ~t=1αt(xt1αt1αˉtϵ)\tilde{\mu}_t = \frac{1}{\sqrt{\alpha_t}} (x_t - \frac{1 - \alpha_t}{\sqrt{1 - \bar{\alpha}_t}} \cdot \epsilon)

  • xtx_t:当前的图(已知)
  • αt,βt\alpha_t, \beta_t:预设的常数(已知)
  • ϵ\epsilon:这幅图里包含的噪声(未知!)

发现了吗?要想算出均值,本质上只需要知道这幅图里的噪声 ϵ\epsilon 是多少!

这是一个惊人的发现:神经网络预测均值 μθ\mu_\theta,在数学上等价于预测噪声 ϵθ\epsilon_\theta

于是,神经网络的工作变得很简单:

  1. 输入:xtx_t(带噪图)
  2. 任务:告诉我这图里加的噪声 ϵ\epsilon 长什么样
  3. 计算:把预测出来的噪声套进公式,算出 xt1x_{t-1} 的均值
  4. 采样:在均值旁边随机抖一下,就得到了 xt1x_{t-1}

MSE 的诞生 ^mse-birth

现在你应该理解了:虽然理论上我们在拟合一个高斯分布:

pθ=N(μ,Σ)p_\theta = N(\mu, \Sigma)

但在实际代码里,神经网络直接预测噪声 ϵθ\epsilon_\theta,然后用 xtx_t 减去噪声的部分,就得到了去噪后的结果。

复杂的 KL 散度 Loss,最终被简化成了两个噪声向量的均方误差:

Lsimple=ϵϵθ(αˉtx0+1αˉtϵ,t)2L_{simple} = \|\epsilon - \epsilon_\theta(\sqrt{\bar{\alpha}_t} x_0 + \sqrt{1 - \bar{\alpha}_t} \epsilon, t)\|^2

  • ϵ\epsilon:训练时生成的真噪声
  • ϵθ\epsilon_\theta:神经网络预测的噪声

这个简化太重要了。让我们回顾一下它是怎么来的:

[!summary]- MSE 的诞生过程

  1. Feller 理论告诉我们:逆向过程是高斯分布
  2. DDPM 简化告诉我们:方差可以固定,只需求均值
  3. 贝叶斯推导告诉我们:求均值等价于求噪声
  4. 最终实现:神经网络看图预测噪声

每一步都自然流畅,每一步都环环相扣。


第七章:生成图片 ^chapter-7

神经网络训练好后(训练过程前面已经讲过),怎么用它生成新图片?

初始状态:从纯噪声开始,xTN(0,1)x_T \sim N(0,1)

去噪循环:从 t=Tt = T 倒推到 t=1t = 1

每一步的更新公式:

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

其中 zN(0,1)z \sim N(0,1) 是随机噪声(σt\sigma_t 是预设的方差系数)。

[!info]- 完整生成流程

  1. 初始化:从标准正态分布采样 xTN(0,1)x_T \sim N(0,1) 作为起点(纯噪声)
  2. 逐步去噪:对于 t=T,T1,...,2,1t = T, T-1, ..., 2, 1,每次迭代:
    • 把当前带噪图 xtx_t 和时间步 tt 输入神经网络
    • 网络预测噪声 ϵθ(xt,t)\epsilon_\theta(x_t, t)
    • 用上面的去噪公式计算 xt1x_{t-1}
    • 得到稍微清晰一点的图
  3. 得到结果:重复 T 次后,最终得到清晰图 x0x_0

直觉理解

  • 网络看当前带噪图 xtx_t,预测里面的噪声 ϵθ\epsilon_\theta
  • xtx_t 中减去预测的噪声,得到上一时刻的图 xt1x_{t-1}
  • 加一点随机噪声 zz(保持生成的多样性)
  • 重复 T 次(比如 1000 次),逐步去噪,最终得到清晰图 x0x_0

核心洞察 ^core-insight

[!tip]- 训练和推理的对称性

  • 训练时([[第三章:寻找直达公式#^training-data|第三章]]):我们知道 x0x_0,用直达公式生成带噪图 xtx_t,让网络学习预测噪声 ϵ\epsilon
  • 推理时(本章):我们从纯噪声开始,用训练好的网络预测噪声,逐步去除噪声得到清晰图 x0x_0

训练时教网络"加噪是什么样",推理时让网络"把噪声去掉"——这就是扩散模型的优雅之处。


终章:全流程闭环 ^finale

按照 DDPM 论文的逻辑,你现在应该彻底通透了。让我们回顾一下这个完整的故事。

故事脉络

  1. 起点:想算逆向过程 q(xt1xt)q(x_{t-1} | x_t),但算不出来
  2. 方法:用神经网络 pθp_\theta 去拟合它
  3. 手段:最大化 ELBO(变分下界)来训练
  4. 技巧:引入 x0x_0 作为条件,使得 KL 散度的目标分布 q(xt1xt,x0)q(x_{t-1} | x_t, x_0) 变得可计算
  5. 化简:把直达公式代入进去,发现拟合分布的均值,本质上就是在拟合噪声
  6. 结果:Loss 就是预测噪声和真实噪声的 MSE

核心优势 ^core-advantages

这种方法的关键优势在于利用了高斯噪声良好的数学性质,使整个过程的可建模性和可控性大大提高:

  • 数学优雅:前向过程有闭式解,可以快速生成训练数据
  • 训练稳定:通过能量守恒保持方差稳定
  • 推导清晰:从 ELBO 到 MSE 的每一步都有严格的数学推导
  • 工程可行:最终简化的 Loss 就是普通的 MSE,易于实现

这就是扩散模型背后的完整故事——从最直观的叠加噪声想法,到引入能量守恒,再到用神经网络拟合逆向过程,最终简化为预测噪声的 MSE Loss,最后落地到训练和推理的具体实现。

每一步都自然流畅,每一步都环环相扣。

[!success]- 最终结论 现在,你应该真正理解了扩散模型的数学之美。


%%hidden 内部备注:

  • 可以考虑添加相关笔记链接,如 [[VAE 原理]]、[[GAN 原理]] 等
  • 可以添加练习题或思考题
  • 可以添加代码实现示例 %%

theme: nico

扩散模型原理:从噪声到图像的数学之旅

想象一下修复照片的过程:起点是一张满是噪点的图片(高斯噪声),终点是一张清晰的照片。你需要找到一条路径,从无意义的噪声一步步变成有意义的图像。

这个故事要从头说起——我们如何让计算机学会这个魔法?


符号说明(查表用)

下面这些符号会在文章中反复出现。不需要记住,遇到不懂的符号时回来查这个表就行了。

图像符号

  • x0x_0:原始清晰图片(下标 0 表示第 0 步,也就是没有加过噪声)
  • xtx_t:第 tt 步的带噪声图片(tt 越大,图越模糊)
  • xt1x_{t-1}:第 t1t-1 步的图片,比 xtx_t 稍微清晰一点
  • xTx_T:最终第 TT 步的图片,全是噪声

概率符号

  • q()q(\text{后} | \text{前}):真实的前向或逆向分布(上帝视角,理论上存在但可能算不出来)
    • q(xtxt1)q(x_t | x_{t-1}):前向加噪分布,从 xt1x_{t-1}xtx_t(已知,很好算)
    • q(xt1xt)q(x_{t-1} | x_t):逆向去噪分布,从 xtx_txt1x_{t-1}(未知,很难算)
  • pθ()p_\theta(\text{后} | \text{前}):神经网络预测的分布(替身,用来近似真实分布)
    • θ\theta:神经网络的参数
    • pθ(xt1xt)p_\theta(x_{t-1} | x_t):神经网络预测的逆向分布

噪声符号

  • ϵ\epsilon:标准高斯噪声,ϵN(0,1)\epsilon \sim N(0,1)
  • βt\beta_t:第 tt 步加的噪声强度(人为设定的小常数)
  • αt\alpha_t:信号保留比例,定义为 1βt1 - \beta_t
  • αˉt\bar{\alpha}_t:累积保留比例,定义为 α1×α2××αt\alpha_1 \times \alpha_2 \times \cdots \times \alpha_t

直观理解

前向过程(加噪):x0qx1qx2qqxTx_0 \xrightarrow{q} x_1 \xrightarrow{q} x_2 \xrightarrow{q} \cdots \xrightarrow{q} x_T

逆向过程(去噪):xTpθxT1pθpθx0x_T \xrightarrow{p_\theta} x_{T-1} \xrightarrow{p_\theta} \cdots \xrightarrow{p_\theta} x_0


现在开始我们的故事。

第一章:直觉的陷阱

最直观的想法

假设你想把一张清晰的图片变成噪声。最直观的做法就像撒盐一样,一步步往上叠加噪声。

x0x_0 是原图。在每一时刻 tt,在上一时刻 xt1x_{t-1} 的基础上加一点噪声 ϵ\epsilon

xt=xt1+βϵx_t = x_{t-1} + \beta \cdot \epsilon

其中 ϵN(0,1)\epsilon \sim N(0,1)β\beta 表示噪声强度。

这个公式描述的是前向过程:从清晰图 xt1x_{t-1} 加噪得到 xtx_t。用概率论的语言,我们把这个加噪过程记作 q(xtxt1)q(x_t | x_{t-1}) —— 也就是在给定 xt1x_{t-1} 的条件下,xtx_t 的分布。

现在不用纠结这个符号,你只需要知道:q(xtxt1)q(x_t | x_{t-1}) 就是我们前面写的那个加噪公式。

展开 tt 步后:

xt=x0+tβϵˉx_t = x_0 + t\beta \cdot \bar{\epsilon}

其中 ϵˉ\bar{\epsilon} 是合并后的噪声。

直觉的崩溃

这个公式有两个致命缺陷。

问题 1:均值漂移

  • 均值:E[xt]=x0E[x_t] = x_0
  • 无论加多少步噪声,图像的均值永远是原图
  • 这意味着原图的底色永远消不掉

问题 2:方差爆炸

  • 方差:Var(xt)=tβVar(x_t) = t\beta
  • 随着时间 tt 增加,方差会趋向于无穷大
  • 标准正态分布的方差必须固定为 1

结论:这个模型无法收敛到标准正态分布 N(0,1)N(0,1),它只是造出了一个无限模糊且数值巨大的废图。


第二章:能量守恒的启示

引入衰减系数

为了防止方差爆炸,我们需要引入能量守恒的概念:既然要注入噪声能量(方差),就必须按比例拿走一部分图像能量。

xt1x_{t-1} 前面加一个衰减系数。为了保证总方差维持在 1,系数必须满足勾股定理的形式:

xt=1βtxt1+βtϵx_t = \sqrt{1 - \beta_t} \cdot x_{t-1} + \sqrt{\beta_t} \cdot \epsilon

其中 βt(0,1)\beta_t \in (0, 1) 是一个小的常数,表示每步添加的噪声比例。

为什么这样就对了?

通过这种缩放操作,可以保证 Var(xt)=1Var(x_t) = 1(假设 Var(xt1)=1Var(x_{t-1}) = 1),无论迭代多少次,数据的方差始终被控制在 1 左右。

这就构成了 Variance Preserving(保方差)的扩散过程。

这个改进后的公式就是我们前向加噪分布 q(xtxt1)q(x_t | x_{t-1}) 的核心形式。


第三章:寻找直达公式

工程需求

训练神经网络时,我们需要在任意时刻 tt 采样带噪图,然后告诉网络:这幅图里加的噪声是什么。这需要一个关键能力:给定原图 x0x_0 和任意时刻 tt,直接算出对应的噪声 xtx_t 和噪声 ϵ\epsilon

如果只能一步步递推算,我们就不知道当前这幅 xtx_t 里到底加了多少噪声——因为噪声累积了 tt 步,每一步的噪声都不同。

所以我们需要一个"直达公式":从 x0x_0tt 一步到位算出 xtx_t,这样就能清楚地知道这幅图里包含的噪声 ϵ\epsilon 是什么。

变量定义

为了书写简洁,定义两个变量:

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

αˉt=i=1tαi=α1×α2××αt\bar{\alpha}_t = \prod_{i=1}^{t} \alpha_i = \alpha_1 \times \alpha_2 \times \cdots \times \alpha_t

  • αt\alpha_t:第 tt 步的信号保留比例
  • αˉt\bar{\alpha}_t:累积保留比例(从第 1 步到第 tt 步所有 α\alpha 的连乘积,读作 Alpha Bar t)

递归推导

通过数学归纳法,推导规律:

  • t=1t = 1x0x_0 的系数是 α1\sqrt{\alpha_1}
  • t=2t = 2x0x_0 的系数是 α1α2\sqrt{\alpha_1 \alpha_2}
  • t=3t = 3:系数变成 α1α2α3\sqrt{\alpha_1 \alpha_2 \alpha_3}

规律已经很清晰了,但还需要处理噪声项的合并。

高斯分布的魔力

两个独立高斯分布 N(0,σ12)N(0, \sigma_1^2)N(0,σ22)N(0, \sigma_2^2) 相加,等于一个新的高斯分布 N(0,σ12+σ22)N(0, \sigma_1^2 + \sigma_2^2)

利用这个性质,推导出噪声项可以合并为 1αˉtϵˉ\sqrt{1 - \bar{\alpha}_t} \cdot \bar{\epsilon} 的形式。

DDPM 核心公式

通过数学归纳法,推广到任意时刻 tt

xt=αˉtx0+1αˉtϵ=q(xtx0)x_t = \sqrt{\bar{\alpha}_t} \cdot x_0 + \sqrt{1 - \bar{\alpha}_t} \cdot \epsilon \quad = \quad q(x_t | x_0)

左边是具体的计算公式,右边是符号表示(在给定原图 x0x_0 的条件下,第 tt 步的带噪图 xtx_t 的分布)。

验证收敛

来看看当 tt \to \infty(扩散到最后)时,这个公式会发生什么。

由于 αt<1\alpha_t < 1,连乘积 αˉt\bar{\alpha}_t 会趋近于 0,因此 xTϵx_T \approx \epsilon(纯标准正态分布)。

结论:前向过程完美收敛到标准正态分布 N(0,1)N(0,1)

训练数据准备

现在我们有了直达公式,就可以准备训练数据了!

给定一张清晰图片 x0x_0,训练样本是这样准备的:

  1. 随机选时刻 t{1,2,...,T}t \in \{1, 2, ..., T\}
  2. 生成噪声 ϵN(0,1)\epsilon \sim N(0,1)
  3. 计算带噪图 xt=αˉtx0+1αˉtϵx_t = \sqrt{\bar{\alpha}_t} \cdot x_0 + \sqrt{1 - \bar{\alpha}_t} \cdot \epsilon

每个训练样本包含:

  • 输入:(xt,t)(x_t, t) —— 带噪图和时间步
  • 标签:ϵ\epsilon —— 真实噪声

神经网络的任务:看带噪图 xtx_t 和时间 tt,预测这幅图里的噪声 ϵ\epsilon

这就为后面的训练做好了准备。


第四章:逆向的困境

问题:能走回去吗?

前三章我们一直在讲前向过程:从清晰图逐步加噪,最后得到 q(xtx0)q(x_t | x_0) —— 可以直接从原图生成任意时刻的带噪图。

现在的问题是:能不能走回去?

给定一张满是噪点的图 xtx_t,怎么推算出它上一秒稍微清晰一点的样子 xt1x_{t-1}

用概率论的语言,我们想求的是逆向过程 q(xt1xt)q(x_{t-1} | x_t) —— 注意,条件反过来了!不再是从 xt1x_{t-1}xtx_t,而是要从 xtx_t 推回 xt1x_{t-1}

根据贝叶斯公式:

q(xt1xt)=q(xtxt1)q(xt1)q(xt)q(x_{t-1} | x_t) = \frac{q(x_t | x_{t-1}) \cdot q(x_{t-1})}{q(x_t)}

  • q(xtxt1)q(x_t | x_{t-1}):已知(我们前三章推导的单步加噪公式)
  • q(xt1)q(x_{t-1})q(xt)q(x_t):未知!这需要知道全世界所有图片的边缘分布,在数学上是不可计算的

困境:逆向过程算不出来!

解决方案:找个替身

既然算不出真实的 q(xt1xt)q(x_{t-1} | x_t),我们就训练一个神经网络(参数为 θ\theta)来近似它。我们把这个替身记作 pθ(xt1xt)p_\theta(x_{t-1} | x_t)

为什么要预测高斯分布?

这里有个关键的直觉:前向过程每次加的噪声极小(βt\beta_t 很小),就像画画时每一笔只涂抹一点点。那么撤销这一笔的操作,大概率也只是在一个很小的范围内微调。

数学上这叫做 Feller 理论:当扩散步数 TT \to \infty 且每一步加噪幅度 βt0\beta_t \to 0 时,前向过程变成了连续的布朗运动。如果前向过程是高斯扩散,逆向过程在数学形式上也必然是一个高斯过程。

所以,神经网络不需要预测整张图 xt1x_{t-1},只需要预测一个高斯分布。

高斯分布需要什么参数?

一个高斯分布 N(μ,σ2)N(\mu, \sigma^2) 由两个参数决定:

  1. 均值 μ\mu:分布的中心位置
  2. 方差 σ2\sigma^2:分布的分散程度

理论上,神经网络需要预测这两个值。

DDPM 的简化

但是 DDPM 论文发现了一个事实:方差不需要训练,直接固定成常数(和前向过程的 βt\beta_t 相关)效果就很好。

因此,神经网络的任务被简化了:

  • 不需要预测:方差 Σθ\Sigma_\theta(固定为常数)
  • 只需要预测:均值 μθ(xt,t)\mu_\theta(x_t, t)

这个均值 μθ(xt,t)\mu_\theta(x_t, t) 代表什么?直觉上理解,它就是神经网络对"上一张图 xt1x_{t-1} 应该长什么样"的猜想的中心点。给定当前噪点图 xtx_t 和时间 tt,神经网络告诉我们:往这个方向走,应该能找到更清晰的图。


第五章:ELBO 的登场

目标:让神经网络生成真图

为了让这个神经网络 pθp_\theta 能够生成像 x0x_0 这样的真图,我们需要最大化对数似然:logpθ(x0)\log p_\theta(x_0)

但正如之前所说,直接算这个太难。于是我们引入 ELBO(Evidence Lower Bound,证据下界)。

什么是下界?

这里要用到一个经典的变分推断技巧:引入一个辅助分布 qq,在 log 里面玩点数学游戏。

你可能注意到公式里出现了 x1:Tx_{1:T}x0:Tx_{0:T} 这种写法,这是一种简写符号:

  • x1:Tx_{1:T} 表示从第 1 步到第 T 步的所有带噪图:x1,x2,...,xTx_1, x_2, ..., x_T
  • x0:Tx_{0:T} 表示 x0,x1,...,xTx_0, x_1, ..., x_T

从我们的目标开始:

logpθ(x0)=logx1:Tpθ(x0:T)\log p_\theta(x_0) = \log \sum_{x_{1:T}} p_\theta(x_{0:T})

这个公式的逻辑是:模型生成一张清晰图 x0x_0 的概率,等于它沿着所有可能的去噪路径(从纯噪声 xTx_Tx0x_0)推导回来的概率总和。

按照从左到右的顺序:

  • log\log:对概率取对数,将连乘转化为加法,便于优化
  • x1:T\sum_{x_{1:T}}:对所有可能的中间路径进行边缘化——把所有能产生同一张 x0x_0 的不同路径(x1,x2,...,xTx_1, x_2, ..., x_T 的各种组合)的概率全部累加
  • pθ(x0:T)p_\theta(x_{0:T}):模型参数为 θ\theta 的联合概率,描述一条完整去噪链路 {xT,xT1,...,x1,x0}\{x_T, x_{T-1}, ..., x_1, x_0\} 的发生概率

好比计算"到达山顶的总人数":把从北坡、南坡、西坡等所有路径上山的人数加起来。

现在我们在分数里乘以 q(x1:Tx0)/q(x1:Tx0)=1q(x_{1:T}|x_0) / q(x_{1:T}|x_0) = 1

logpθ(x0)=logx1:Tq(x1:Tx0)pθ(x0:T)q(x1:Tx0)\log p_\theta(x_0) = \log \sum_{x_{1:T}} q(x_{1:T}|x_0) \cdot \frac{p_\theta(x_{0:T})}{q(x_{1:T}|x_0)}

这可以写成期望的形式:

logpθ(x0)=logEq[pθ(x0:T)q(x1:Tx0)]\log p_\theta(x_0) = \log E_q \left[ \frac{p_\theta(x_{0:T})}{q(x_{1:T}|x_0)} \right]

关键步骤:利用 Jensen 不等式(log\log 是凹函数,所以 logE[X]E[logX]\log E[X] \geq E[\log X]):

logpθ(x0)Eq[logpθ(x0:T)q(x1:Tx0)]\log p_\theta(x_0) \geq E_q \left[ \log \frac{p_\theta(x_{0:T})}{q(x_{1:T}|x_0)} \right]

或者写成更熟悉的形式:

logpθ(x0)Eq[logq(x1:Tx0)pθ(x0:T)]\log p_\theta(x_0) \geq E_q \left[ \log \frac{q(x_{1:T} | x_0)}{p_\theta(x_{0:T})} \right]

  • 左边是我想最大化的目标(很难算)
  • 右边是一个下界(Lower Bound)(相对好算)

策略:如果我们拼命把右边的下界抬高,左边的目标自然也就被顶上去了。

在深度学习里,我们要 minimize Loss,所以我们取负号,变成 Minimize Negative ELBO。

拆解 Loss

把上面那个复杂的式子展开(利用 Markov 链性质),Loss 可以被拆解成三项:

L=LT+Lt1+L0L = L_T + L_{t-1} + L_0

LTL_T(正则项)

DKL(q(xTx0)p(xT))D_{KL}(q(x_T | x_0) || p(x_T))

这里的 q(xTx0)q(x_T | x_0) 是第三章推导的那个直达分布:从原图 x0x_0 出发,经过 T 步前向加噪后得到最终噪声图 xTx_T 的概率分布。

根据第三章的核心公式,这实际上是一个高斯分布:

q(xTx0)=N(αˉTx0,1αˉT)q(x_T | x_0) = N(\sqrt{\bar{\alpha}_T} \cdot x_0, 1 - \bar{\alpha}_T)

p(xT)p(x_T) 是标准高斯分布 N(0,1)N(0,1)。这一项比较的是:模型最终生成的噪声分布(qq)和标准高斯噪声(pp)有多接近。

因为前向过程是锁死的,当 TT 足够大时,αˉT0\bar{\alpha}_T \to 0,所以 q(xTx0)q(x_T | x_0) 本来就非常接近标准高斯。这一项近似为 0,不用训练。

L0L_0(重构项)

logpθ(x0x1)-\log p_\theta(x_0 | x_1)

最后一步的解码。

Lt1L_{t-1}(去噪核心项):这就是我们要关注的重点!

t>1DKL(q(xt1xt,x0)pθ(xt1xt))\sum_{t>1} D_{KL}(q(x_{t-1} | x_t, x_0) || p_\theta(x_{t-1} | x_t))

这个 KL 散度在衡量两个分布的距离。


左边:上帝视角的真实分布 q(xt1xt,x0)q(x_{t-1} | x_t, x_0)

这是"给定原图 x0x_0 和当前带噪图 xtx_t 的条件下,上一张稍微清晰点的图 xt1x_{t-1} 的概率分布"。

关键点:多了 x0x_0 这个条件!

为什么这很重要?回顾第四章,q(xt1xt)q(x_{t-1} | x_t) 算不出来——因为只知道当前带噪图 xtx_t,但不知道它原本是什么样,有无数种可能的 xt1x_{t-1} 都能产生这个 xtx_t。就像只知道终点,不知道起点,无法确定路径。

但加了 x0x_0 之后情况就完全不同了:如果我们知道原图 x0x_0(训练时当然知道,因为 xtx_t 就是从它算出来的),就能锁定唯一的"去噪路径"。此时逆向概率 q(xt1xt,x0)q(x_{t-1} | x_t, x_0) 变得可计算。

**具体怎么算?**利用贝叶斯公式:

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

看公式右边的三项:

  1. q(xtxt1,x0)q(x_t | x_{t-1}, x_0):因为马尔可夫性,给定 xt1x_{t-1} 后,xtx_t 不再依赖 x0x_0,所以等于 q(xtxt1)q(x_t | x_{t-1})。这是单步高斯加噪分布:xt=1βtxt1+βtϵx_t = \sqrt{1 - \beta_t} \cdot x_{t-1} + \sqrt{\beta_t} \cdot \epsilon

  2. q(xt1x0)q(x_{t-1} | x_0):从原图 x0x_0 一步到位到 xt1x_{t-1} 的分布。用直达公式:xt1=αˉt1x0+1αˉt1ϵx_{t-1} = \sqrt{\bar{\alpha}_{t-1}} \cdot x_0 + \sqrt{1 - \bar{\alpha}_{t-1}} \cdot \epsilon,这是高斯分布

  3. q(xtx0)q(x_t | x_0):从原图 x0x_0 一步到位到 xtx_t 的分布。同样用直达公式:xt=αˉtx0+1αˉtϵx_t = \sqrt{\bar{\alpha}_t} \cdot x_0 + \sqrt{1 - \bar{\alpha}_t} \cdot \epsilon,这也是高斯分布

核心差别:第 2 和第 3 项都是从原图 x0x_0 出发的"前向"分布,我们有直达公式可以一步到位计算;而第 1 项是单步加噪,公式也很简单。

这三项都能算,这就是为什么加了 x0x_0 之后整个贝叶斯公式变得可计算——每一项都是已知的高斯分布。

既然三项都是高斯分布,它们的贝叶斯组合仍然是高斯分布。通过代数推导可以得到:

q(xt1xt,x0)=N(μ~t,σ~t2)q(x_{t-1} | x_t, x_0) = N(\tilde{\mu}_t, \tilde{\sigma}_t^2)

其中均值的具体形式是:

μ~t=1αt(xt1αt1αˉtϵ)\tilde{\mu}_t = \frac{1}{\sqrt{\alpha_t}} (x_t - \frac{1 - \alpha_t}{\sqrt{1 - \bar{\alpha}_t}} \cdot \epsilon)

这个公式不需要背,但需要理解每个参数是怎么来的:

公式里的参数

  • xtx_t:当前带噪图(已知,这就是我们要处理的图)
  • x0x_0:原图(已知,训练时当然知道,因为 xtx_t 就是从它算出来的)
  • αt\alpha_t:第 tt 步的信号保留比例(预设常数,训练前就设定好了)
  • αˉt\bar{\alpha}_t:累积保留比例(可以预先计算,就是 α1×α2××αt\alpha_1 \times \alpha_2 \times \cdots \times \alpha_t
  • ϵ\epsilon:关键!这是从 x0x_0 生成 xtx_t 时加的噪声(可以从第三章的直达公式反算出来:ϵ=xtαˉtx01αˉt\epsilon = \frac{x_t - \sqrt{\bar{\alpha}_t} \cdot x_0}{\sqrt{1 - \bar{\alpha}_t}}

核心洞察:公式中只有 ϵ\epsilon 是"隐藏"的,但它可以通过 xtx_tx0x_0 算出来。

这就是为什么说"要想算出均值,本质上只需要知道噪声 ϵ\epsilon 是多少"——因为其他所有参数都是公开的预设值,只有噪声是需要推导的。


右边:神经网络预测的分布 pθ(xt1xt)p_\theta(x_{t-1} | x_t)

这是神经网络预测的分布——看着带噪图 xtx_t,猜上一张图 xt1x_{t-1} 长什么样。

网络不知道原图 x0x_0,只能通过观察 xtx_t 来推测。它需要预测一个高斯分布 N(μθ,Σθ)N(\mu_\theta, \Sigma_\theta),但由于 DDPM 的简化(方差固定),实际上只需要预测均值 μθ\mu_\theta

神经网络的输入输出

  • 输入:(xt,t)(x_t, t) —— 带噪图和时间步
  • 输出:预测的均值 μθ(xt,t)\mu_\theta(x_t, t)

小结

KL 散度在衡量:神经网络的预测(pθp_\theta)和上帝视角的真实答案(qq)有多接近。

训练的目标就是让 μθ\mu_\theta 尽可能逼近 μ~t\tilde{\mu}_t


第六章:从均值到噪声的蜕变

现在我们的任务很明确了:让神经网络预测的均值 μθ\mu_\theta,去逼近第五章那个上帝视角的真实均值 μ~t\tilde{\mu}_t

第五章末尾我们注意到一个关键洞察:均值公式的形式揭示了与噪声 ϵ\epsilon 的直接关系——要想算出均值,本质上只需要知道噪声 ϵ\epsilon 是多少。

现在深入理解这个洞察:为什么"求均值"等于"减去噪声"?

搞懂符号

先让我们把公式里的零件一个个拆下来。

μθ(xt,t)\mu_\theta(x_t, t) 是什么?

这是神经网络根据当前满是噪点的图 xtx_t,猜测出来的"上一张稍微清晰点的图 xt1x_{t-1}"的中心位置。

  • 为什么要输入 xtx_t?你需要看着当前的图,才能猜上一张图
  • 为什么要输入 tt?你需要知道现在是第几步。第 1000 步全是噪点很难猜,第 5 步基本看清了只需微调。时间 tt 告诉网络噪声的浓度

Σθ\Sigma_\theta 呢?

DDPM 论文发现了一个巧妙的事实:方差其实不用训练!前向加噪时每一步的噪声大小 βt\beta_t 是人为设定的,逆向的不确定性跟它高度相关。

所以作者直接把方差固定成常数,神经网络只需要管好均值就行了。

关键洞察

现在到了最关键的地方:为什么"求均值"等于"减去噪声"?

请盯着第五章那个上帝视角的均值公式看三秒钟:

μ~t=1αt(xt1αt1αˉtϵ)\tilde{\mu}_t = \frac{1}{\sqrt{\alpha_t}} (x_t - \frac{1 - \alpha_t}{\sqrt{1 - \bar{\alpha}_t}} \cdot \epsilon)

  • xtx_t:当前的图(已知)
  • αt,βt\alpha_t, \beta_t:预设的常数(已知)
  • ϵ\epsilon:这幅图里包含的噪声(未知!)

发现了吗?要想算出均值,本质上只需要知道这幅图里的噪声 ϵ\epsilon 是多少!

这是一个惊人的发现:神经网络预测均值 μθ\mu_\theta,在数学上等价于预测噪声 ϵθ\epsilon_\theta

于是,神经网络的工作变得很简单:

  1. 输入:xtx_t(带噪图)
  2. 任务:告诉我这图里加的噪声 ϵ\epsilon 长什么样
  3. 计算:把预测出来的噪声套进公式,算出 xt1x_{t-1} 的均值
  4. 采样:在均值旁边随机抖一下,就得到了 xt1x_{t-1}

MSE 的诞生

现在你应该理解了:虽然理论上我们在拟合一个高斯分布:

pθ=N(μ,Σ)p_\theta = N(\mu, \Sigma)

但在实际代码里,神经网络直接预测噪声 ϵθ\epsilon_\theta,然后用 xtx_t 减去噪声的部分,就得到了去噪后的结果。

复杂的 KL 散度 Loss,最终被简化成了两个噪声向量的均方误差:

Lsimple=ϵϵθ(αˉtx0+1αˉtϵ,t)2L_{simple} = \|\epsilon - \epsilon_\theta(\sqrt{\bar{\alpha}_t} x_0 + \sqrt{1 - \bar{\alpha}_t} \epsilon, t)\|^2

  • ϵ\epsilon:训练时生成的真噪声
  • ϵθ\epsilon_\theta:神经网络预测的噪声

这个简化太重要了。让我们回顾一下它是怎么来的:

  1. Feller 理论告诉我们:逆向过程是高斯分布
  2. DDPM 简化告诉我们:方差可以固定,只需求均值
  3. 贝叶斯推导告诉我们:求均值等价于求噪声
  4. 最终实现:神经网络看图预测噪声

每一步都自然流畅,每一步都环环相扣。


第七章:生成图片

神经网络训练好后(训练过程前面已经讲过),怎么用它生成新图片?

初始状态:从纯噪声开始,xTN(0,1)x_T \sim N(0,1)

去噪循环:从 t=Tt = T 倒推到 t=1t = 1

每一步的更新公式:

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

其中 zN(0,1)z \sim N(0,1) 是随机噪声(σt\sigma_t 是预设的方差系数)。

完整生成流程

  1. 初始化:从标准正态分布采样 xTN(0,1)x_T \sim N(0,1) 作为起点(纯噪声)

  2. 逐步去噪:对于 t=T,T1,...,2,1t = T, T-1, ..., 2, 1,每次迭代:

    • 把当前带噪图 xtx_t 和时间步 tt 输入神经网络
    • 网络预测噪声 ϵθ(xt,t)\epsilon_\theta(x_t, t)
    • 用上面的去噪公式计算 xt1x_{t-1}
    • 得到稍微清晰一点的图
  3. 得到结果:重复 T 次后,最终得到清晰图 x0x_0

直觉理解

  • 网络看当前带噪图 xtx_t,预测里面的噪声 ϵθ\epsilon_\theta
  • xtx_t 中减去预测的噪声,得到上一时刻的图 xt1x_{t-1}
  • 加一点随机噪声 zz(保持生成的多样性)
  • 重复 T 次(比如 1000 次),逐步去噪,最终得到清晰图 x0x_0

核心洞察

训练和推理的对称性

  • 训练时(第三章):我们知道 x0x_0,用直达公式生成带噪图 xtx_t,让网络学习预测噪声 ϵ\epsilon
  • 推理时(本章):我们从纯噪声开始,用训练好的网络预测噪声,逐步去除噪声得到清晰图 x0x_0

训练时教网络"加噪是什么样",推理时让网络"把噪声去掉"——这就是扩散模型的优雅之处。


终章:全流程闭环

按照 DDPM 论文的逻辑,你现在应该彻底通透了。让我们回顾一下这个完整的故事。

故事脉络

  1. 起点:想算逆向过程 q(xt1xt)q(x_{t-1} | x_t),但算不出来
  2. 方法:用神经网络 pθp_\theta 去拟合它
  3. 手段:最大化 ELBO(变分下界)来训练
  4. 技巧:引入 x0x_0 作为条件,使得 KL 散度的目标分布 q(xt1xt,x0)q(x_{t-1} | x_t, x_0) 变得可计算
  5. 化简:把直达公式代入进去,发现拟合分布的均值,本质上就是在拟合噪声
  6. 结果:Loss 就是预测噪声和真实噪声的 MSE

核心优势

这种方法的关键优势在于利用了高斯噪声良好的数学性质,使整个过程的可建模性和可控性大大提高:

  • 数学优雅:前向过程有闭式解,可以快速生成训练数据
  • 训练稳定:通过能量守恒保持方差稳定
  • 推导清晰:从 ELBO 到 MSE 的每一步都有严格的数学推导
  • 工程可行:最终简化的 Loss 就是普通的 MSE,易于实现

这就是扩散模型背后的完整故事——从最直观的叠加噪声想法,到引入能量守恒,再到用神经网络拟合逆向过程,最终简化为预测噪声的 MSE Loss,最后落地到训练和推理的具体实现。

每一步都自然流畅,每一步都环环相扣。

现在,你应该真正理解了扩散模型的数学之美。

title: 扩散模型原理:从噪声到图像的数学之旅 category: 深度学习 tags:

  • 扩散模型
  • DDPM
  • 机器学习
  • 数学推导 status: 已完成 difficulty: 进阶 created: 2024-01-21T00:00:00.000Z aliases:
  • DDPM 原理
  • Denoising Diffusion Probabilistic Models cssclasses:
  • math-document theme: healer-readable

扩散模型原理:从噪声到图像的数学之旅

想象一下修复照片的过程:起点是一张满是噪点的图片(高斯噪声),终点是一张清晰的照片。你需要找到一条路径,从无意义的噪声一步步变成有意义的图像。

这个故事要从头说起——我们如何让计算机学会这个魔法?


符号说明(查表用) ^symbol-table

下面这些符号会在文章中反复出现。不需要记住,遇到不懂的符号时回来查这个表就行了。

[!info] 图像符号

  • x0x_0:原始清晰图片(下标 0 表示第 0 步,也就是没有加过噪声)
  • xtx_t:第 tt 步的带噪声图片(tt 越大,图越模糊)
  • xt1x_{t-1}:第 t1t-1 步的图片,比 xtx_t 稍微清晰一点
  • xTx_T:最终第 TT 步的图片,全是噪声

[!info] 概率符号

  • q()q(\text{后} | \text{前}):真实的前向或逆向分布(上帝视角,理论上存在但可能算不出来)
    • q(xtxt1)q(x_t | x_{t-1}):前向加噪分布,从 xt1x_{t-1}xtx_t(已知,很好算)
    • q(xt1xt)q(x_{t-1} | x_t):逆向去噪分布,从 xtx_txt1x_{t-1}(未知,很难算)
  • pθ()p_\theta(\text{后} | \text{前}):神经网络预测的分布(替身,用来近似真实分布)
    • θ\theta:神经网络的参数
    • pθ(xt1xt)p_\theta(x_{t-1} | x_t):神经网络预测的逆向分布

[!info] 噪声符号

  • ϵ\epsilon:标准高斯噪声,ϵN(0,1)\epsilon \sim N(0,1)
  • βt\beta_t:第 tt 步加的噪声强度(人为设定的小常数)
  • αt\alpha_t:信号保留比例,定义为 1βt1 - \beta_t
  • αˉt\bar{\alpha}_t:累积保留比例,定义为 α1×α2××αt\alpha_1 \times \alpha_2 \times \cdots \times \alpha_t

直观理解

前向过程(加噪):x0qx1qx2qqxTx_0 \xrightarrow{q} x_1 \xrightarrow{q} x_2 \xrightarrow{q} \cdots \xrightarrow{q} x_T

逆向过程(去噪):xTpθxT1pθpθx0x_T \xrightarrow{p_\theta} x_{T-1} \xrightarrow{p_\theta} \cdots \xrightarrow{p_\theta} x_0


现在开始我们的故事。

第一章:直觉的陷阱 ^chapter-1

最直观的想法

假设你想把一张清晰的图片变成噪声。最直观的做法就像撒盐一样,一步步往上叠加噪声。

x0x_0 是原图。在每一时刻 tt,在上一时刻 xt1x_{t-1} 的基础上加一点噪声 ϵ\epsilon

xt=xt1+βϵx_t = x_{t-1} + \beta \cdot \epsilon

其中 ϵN(0,1)\epsilon \sim N(0,1)β\beta 表示噪声强度。

这个公式描述的是前向过程:从清晰图 xt1x_{t-1} 加噪得到 xtx_t。用概率论的语言,我们把这个加噪过程记作 q(xtxt1)q(x_t | x_{t-1}) —— 也就是在给定 xt1x_{t-1} 的条件下,xtx_t 的分布。

现在不用纠结这个符号,你只需要知道:q(xtxt1)q(x_t | x_{t-1}) 就是我们前面写的那个加噪公式。

展开 tt 步后:

xt=x0+tβϵˉx_t = x_0 + t\beta \cdot \bar{\epsilon}

其中 ϵˉ\bar{\epsilon} 是合并后的噪声。

直觉的崩溃

这个公式有两个致命缺陷。

[!warning]- 问题 1:均值漂移

  • 均值:E[xt]=x0E[x_t] = x_0
  • 无论加多少步噪声,图像的均值永远是原图
  • 这意味着原图的底色永远消不掉

[!warning]- 问题 2:方差爆炸

  • 方差:Var(xt)=tβVar(x_t) = t\beta
  • 随着时间 tt 增加,方差会趋向于无穷大
  • 标准正态分布的方差必须固定为 1

[!failure]- 结论 这个模型无法收敛到标准正态分布 N(0,1)N(0,1),它只是造出了一个无限模糊且数值巨大的废图。


第二章:能量守恒的启示 ^chapter-2

引入衰减系数

为了防止方差爆炸,我们需要引入能量守恒的概念:既然要注入噪声能量(方差),就必须按比例拿走一部分图像能量。

xt1x_{t-1} 前面加一个衰减系数。为了保证总方差维持在 1,系数必须满足勾股定理的形式:

xt=1βtxt1+βtϵx_t = \sqrt{1 - \beta_t} \cdot x_{t-1} + \sqrt{\beta_t} \cdot \epsilon

其中 βt(0,1)\beta_t \in (0, 1) 是一个小的常数,表示每步添加的噪声比例。

为什么这样就对了?

通过这种缩放操作,可以保证 Var(xt)=1Var(x_t) = 1(假设 Var(xt1)=1Var(x_{t-1}) = 1),无论迭代多少次,数据的方差始终被控制在 1 左右。

这就构成了 Variance Preserving(保方差)的扩散过程。

这个改进后的公式就是我们前向加噪分布 q(xtxt1)q(x_t | x_{t-1}) 的核心形式。


第三章:寻找直达公式 ^chapter-3

工程需求

训练神经网络时,我们需要在任意时刻 tt 采样带噪图,然后告诉网络:这幅图里加的噪声是什么。这需要一个关键能力:给定原图 x0x_0 和任意时刻 tt,直接算出对应的噪声 xtx_t 和噪声 ϵ\epsilon

如果只能一步步递推算,我们就不知道当前这幅 xtx_t 里到底加了多少噪声——因为噪声累积了 tt 步,每一步的噪声都不同。

所以我们需要一个"直达公式":从 x0x_0tt 一步到位算出 xtx_t,这样就能清楚地知道这幅图里包含的噪声 ϵ\epsilon 是什么。

变量定义

为了书写简洁,定义两个变量:

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

αˉt=i=1tαi=α1×α2××αt\bar{\alpha}_t = \prod_{i=1}^{t} \alpha_i = \alpha_1 \times \alpha_2 \times \cdots \times \alpha_t

  • αt\alpha_t:第 tt 步的信号保留比例
  • αˉt\bar{\alpha}_t:累积保留比例(从第 1 步到第 tt 步所有 α\alpha 的连乘积,读作 Alpha Bar t)

递归推导

通过数学归纳法,推导规律:

  • t=1t = 1x0x_0 的系数是 α1\sqrt{\alpha_1}
  • t=2t = 2x0x_0 的系数是 α1α2\sqrt{\alpha_1 \alpha_2}
  • t=3t = 3:系数变成 α1α2α3\sqrt{\alpha_1 \alpha_2 \alpha_3}

规律已经很清晰了,但还需要处理噪声项的合并。

高斯分布的魔力

两个独立高斯分布 N(0,σ12)N(0, \sigma_1^2)N(0,σ22)N(0, \sigma_2^2) 相加,等于一个新的高斯分布 N(0,σ12+σ22)N(0, \sigma_1^2 + \sigma_2^2)

利用这个性质,推导出噪声项可以合并为 1αˉtϵˉ\sqrt{1 - \bar{\alpha}_t} \cdot \bar{\epsilon} 的形式。

DDPM 核心公式 ^ddpm-core-formula

通过数学归纳法,推广到任意时刻 tt

xt=αˉtx0+1αˉtϵ=q(xtx0)x_t = \sqrt{\bar{\alpha}_t} \cdot x_0 + \sqrt{1 - \bar{\alpha}_t} \cdot \epsilon \quad = \quad q(x_t | x_0)

左边是具体的计算公式,右边是符号表示(在给定原图 x0x_0 的条件下,第 tt 步的带噪图 xtx_t 的分布)。

验证收敛

来看看当 tt \to \infty(扩散到最后)时,这个公式会发生什么。

由于 αt<1\alpha_t < 1,连乘积 αˉt\bar{\alpha}_t 会趋近于 0,因此 xTϵx_T \approx \epsilon(纯标准正态分布)。

[!success]- 结论 前向过程完美收敛到标准正态分布 N(0,1)N(0,1)

训练数据准备 ^training-data

现在我们有了直达公式,就可以准备训练数据了!

给定一张清晰图片 x0x_0,训练样本是这样准备的:

  1. 随机选时刻 t{1,2,...,T}t \in \{1, 2, ..., T\}
  2. 生成噪声 ϵN(0,1)\epsilon \sim N(0,1)
  3. 计算带噪图 xt=αˉtx0+1αˉtϵx_t = \sqrt{\bar{\alpha}_t} \cdot x_0 + \sqrt{1 - \bar{\alpha}_t} \cdot \epsilon

每个训练样本包含:

  • 输入:(xt,t)(x_t, t) —— 带噪图和时间步
  • 标签:ϵ\epsilon —— 真实噪声

神经网络的任务:看带噪图 xtx_t 和时间 tt,预测这幅图里的噪声 ϵ\epsilon

这就为后面的训练做好了准备。


第四章:逆向的困境 ^chapter-4

问题:能走回去吗?

前三章我们一直在讲前向过程:从清晰图逐步加噪,最后得到 q(xtx0)q(x_t | x_0) —— 可以直接从原图生成任意时刻的带噪图。

现在的问题是:能不能走回去?

给定一张满是噪点的图 xtx_t,怎么推算出它上一秒稍微清晰一点的样子 xt1x_{t-1}

用概率论的语言,我们想求的是逆向过程 q(xt1xt)q(x_{t-1} | x_t) —— 注意,条件反过来了!不再是从 xt1x_{t-1}xtx_t,而是要从 xtx_t 推回 xt1x_{t-1}

根据贝叶斯公式:

q(xt1xt)=q(xtxt1)q(xt1)q(xt)q(x_{t-1} | x_t) = \frac{q(x_t | x_{t-1}) \cdot q(x_{t-1})}{q(x_t)}

  • q(xtxt1)q(x_t | x_{t-1}):已知(我们前三章推导的单步加噪公式)
  • q(xt1)q(x_{t-1})q(xt)q(x_t):未知!这需要知道全世界所有图片的边缘分布,在数学上是不可计算的

[!failure]- 困境 逆向过程算不出来!

解决方案:找个替身

既然算不出真实的 q(xt1xt)q(x_{t-1} | x_t),我们就训练一个神经网络(参数为 θ\theta)来近似它。我们把这个替身记作 pθ(xt1xt)p_\theta(x_{t-1} | x_t)

[!faq]- 为什么要预测高斯分布? 这里有个关键的直觉:前向过程每次加的噪声极小(βt\beta_t 很小),就像画画时每一笔只涂抹一点点。那么撤销这一笔的操作,大概率也只是在一个很小的范围内微调。

数学上这叫做 Feller 理论:当扩散步数 TT \to \infty 且每一步加噪幅度 βt0\beta_t \to 0 时,前向过程变成了连续的布朗运动。如果前向过程是高斯扩散,逆向过程在数学形式上也必然是一个高斯过程。

所以,神经网络不需要预测整张图 xt1x_{t-1},只需要预测一个高斯分布。

[!info]- 高斯分布需要什么参数? 一个高斯分布 N(μ,σ2)N(\mu, \sigma^2) 由两个参数决定:

  1. 均值 μ\mu:分布的中心位置
  2. 方差 σ2\sigma^2:分布的分散程度

理论上,神经网络需要预测这两个值。

[!tip]- DDPM 的简化 但是 DDPM 论文发现了一个事实:方差不需要训练,直接固定成常数(和前向过程的 βt\beta_t 相关)效果就很好。

因此,神经网络的任务被简化了:

  • 不需要预测:方差 Σθ\Sigma_\theta(固定为常数)
  • 只需要预测:均值 μθ(xt,t)\mu_\theta(x_t, t)

这个均值 μθ(xt,t)\mu_\theta(x_t, t) 代表什么?直觉上理解,它就是神经网络对"上一张图 xt1x_{t-1} 应该长什么样"的猜想的中心点。给定当前噪点图 xtx_t 和时间 tt,神经网络告诉我们:往这个方向走,应该能找到更清晰的图。


第五章:ELBO 的登场 ^chapter-5

目标:让神经网络生成真图

为了让这个神经网络 pθp_\theta 能够生成像 x0x_0 这样的真图,我们需要最大化对数似然:logpθ(x0)\log p_\theta(x_0)

但正如之前所说,直接算这个太难。于是我们引入 ELBO(Evidence Lower Bound,证据下界)。

什么是下界?

这里要用到一个经典的变分推断技巧:引入一个辅助分布 qq,在 log 里面玩点数学游戏。

你可能注意到公式里出现了 x1:Tx_{1:T}x0:Tx_{0:T} 这种写法,这是一种简写符号:

  • x1:Tx_{1:T} 表示从第 1 步到第 T 步的所有带噪图:x1,x2,...,xTx_1, x_2, ..., x_T
  • x0:Tx_{0:T} 表示 x0,x1,...,xTx_0, x_1, ..., x_T

从我们的目标开始:

logpθ(x0)=logx1:Tpθ(x0:T)\log p_\theta(x_0) = \log \sum_{x_{1:T}} p_\theta(x_{0:T})

这个公式的逻辑是:模型生成一张清晰图 x0x_0 的概率,等于它沿着所有可能的去噪路径(从纯噪声 xTx_Tx0x_0)推导回来的概率总和。

按照从左到右的顺序:

  • log\log:对概率取对数,将连乘转化为加法,便于优化
  • x1:T\sum_{x_{1:T}}:对所有可能的中间路径进行边缘化——把所有能产生同一张 x0x_0 的不同路径(x1,x2,...,xTx_1, x_2, ..., x_T 的各种组合)的概率全部累加
  • pθ(x0:T)p_\theta(x_{0:T}):模型参数为 θ\theta 的联合概率,描述一条完整去噪链路 {xT,xT1,...,x1,x0}\{x_T, x_{T-1}, ..., x_1, x_0\} 的发生概率

好比计算"到达山顶的总人数":把从北坡、南坡、西坡等所有路径上山的人数加起来。

现在我们在分数里乘以 q(x1:Tx0)/q(x1:Tx0)=1q(x_{1:T}|x_0) / q(x_{1:T}|x_0) = 1

logpθ(x0)=logx1:Tq(x1:Tx0)pθ(x0:T)q(x1:Tx0)\log p_\theta(x_0) = \log \sum_{x_{1:T}} q(x_{1:T}|x_0) \cdot \frac{p_\theta(x_{0:T})}{q(x_{1:T}|x_0)}

这可以写成期望的形式:

logpθ(x0)=logEq[pθ(x0:T)q(x1:Tx0)]\log p_\theta(x_0) = \log E_q \left[ \frac{p_\theta(x_{0:T})}{q(x_{1:T}|x_0)} \right]

关键步骤:利用 Jensen 不等式(log\log 是凹函数,所以 logE[X]E[logX]\log E[X] \geq E[\log X]):

logpθ(x0)Eq[logpθ(x0:T)q(x1:Tx0)]\log p_\theta(x_0) \geq E_q \left[ \log \frac{p_\theta(x_{0:T})}{q(x_{1:T}|x_0)} \right]

或者写成更熟悉的形式:

logpθ(x0)Eq[logq(x1:Tx0)pθ(x0:T)]\log p_\theta(x_0) \geq E_q \left[ \log \frac{q(x_{1:T} | x_0)}{p_\theta(x_{0:T})} \right]

  • 左边是我想最大化的目标(很难算)
  • 右边是一个下界(Lower Bound)(相对好算)

策略:如果我们拼命把右边的下界抬高,左边的目标自然也就被顶上去了。

在深度学习里,我们要 minimize Loss,所以我们取负号,变成 Minimize Negative ELBO。

拆解 Loss ^loss-decomposition

把上面那个复杂的式子展开(利用 Markov 链性质),Loss 可以被拆解成三项:

L=LT+Lt1+L0L = L_T + L_{t-1} + L_0

[!info]- LTL_T(正则项) DKL(q(xTx0)p(xT))D_{KL}(q(x_T | x_0) || p(x_T))

这里的 q(xTx0)q(x_T | x_0) 是[[第三章:寻找直达公式#^ddpm-core-formula|第三章推导的那个直达分布]]:从原图 x0x_0 出发,经过 T 步前向加噪后得到最终噪声图 xTx_T 的概率分布。

根据第三章的核心公式,这实际上是一个高斯分布:

q(xTx0)=N(αˉTx0,1αˉT)q(x_T | x_0) = N(\sqrt{\bar{\alpha}_T} \cdot x_0, 1 - \bar{\alpha}_T)

p(xT)p(x_T) 是标准高斯分布 N(0,1)N(0,1)。这一项比较的是:模型最终生成的噪声分布(qq)和标准高斯噪声(pp)有多接近。

因为前向过程是锁死的,当 TT 足够大时,αˉT0\bar{\alpha}_T \to 0,所以 q(xTx0)q(x_T | x_0) 本来就非常接近标准高斯。这一项近似为 0,不用训练。

[!info]- L0L_0(重构项) logpθ(x0x1)-\log p_\theta(x_0 | x_1)

最后一步的解码。

[!important]- Lt1L_{t-1}(去噪核心项) t>1DKL(q(xt1xt,x0)pθ(xt1xt))\sum_{t>1} D_{KL}(q(x_{t-1} | x_t, x_0) || p_\theta(x_{t-1} | x_t))

这个 KL 散度在衡量两个分布的距离。


左边:上帝视角的真实分布 q(xt1xt,x0)q(x_{t-1} | x_t, x_0) ^god-view-distribution

这是"给定原图 x0x_0 和当前带噪图 xtx_t 的条件下,上一张稍微清晰点的图 xt1x_{t-1} 的概率分布"。

[!tip]- 关键点 多了 x0x_0 这个条件!

为什么这很重要?回顾[[第四章:逆向的困境#^chapter-4|第四章]],q(xt1xt)q(x_{t-1} | x_t) 算不出来——因为只知道当前带噪图 xtx_t,但不知道它原本是什么样,有无数种可能的 xt1x_{t-1} 都能产生这个 xtx_t。就像只知道终点,不知道起点,无法确定路径。

但加了 x0x_0 之后情况就完全不同了:如果我们知道原图 x0x_0(训练时当然知道,因为 xtx_t 就是从它算出来的),就能锁定唯一的"去噪路径"。此时逆向概率 q(xt1xt,x0)q(x_{t-1} | x_t, x_0) 变得可计算。

具体怎么算?

利用贝叶斯公式:

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

看公式右边的三项:

  1. q(xtxt1,x0)q(x_t | x_{t-1}, x_0):因为马尔可夫性,给定 xt1x_{t-1} 后,xtx_t 不再依赖 x0x_0,所以等于 q(xtxt1)q(x_t | x_{t-1})。这是单步高斯加噪分布:xt=1βtxt1+βtϵx_t = \sqrt{1 - \beta_t} \cdot x_{t-1} + \sqrt{\beta_t} \cdot \epsilon

  2. q(xt1x0)q(x_{t-1} | x_0):从原图 x0x_0 一步到位到 xt1x_{t-1} 的分布。用直达公式:xt1=αˉt1x0+1αˉt1ϵx_{t-1} = \sqrt{\bar{\alpha}_{t-1}} \cdot x_0 + \sqrt{1 - \bar{\alpha}_{t-1}} \cdot \epsilon,这是高斯分布

  3. q(xtx0)q(x_t | x_0):从原图 x0x_0 一步到位到 xtx_t 的分布。同样用直达公式:xt=αˉtx0+1αˉtϵx_t = \sqrt{\bar{\alpha}_t} \cdot x_0 + \sqrt{1 - \bar{\alpha}_t} \cdot \epsilon,这也是高斯分布

[!summary]- 核心差别 第 2 和第 3 项都是从原图 x0x_0 出发的"前向"分布,我们有直达公式可以一步到位计算;而第 1 项是单步加噪,公式也很简单。

这三项都能算,这就是为什么加了 x0x_0 之后整个贝叶斯公式变得可计算——每一项都是已知的高斯分布。

既然三项都是高斯分布,它们的贝叶斯组合仍然是高斯分布。通过代数推导可以得到:

q(xt1xt,x0)=N(μ~t,σ~t2)q(x_{t-1} | x_t, x_0) = N(\tilde{\mu}_t, \tilde{\sigma}_t^2)

其中均值的具体形式是:

μ~t=1αt(xt1αt1αˉtϵ)\tilde{\mu}_t = \frac{1}{\sqrt{\alpha_t}} (x_t - \frac{1 - \alpha_t}{\sqrt{1 - \bar{\alpha}_t}} \cdot \epsilon)

这个公式不需要背,但需要理解每个参数是怎么来的:

[!info]- 公式里的参数

  • xtx_t:当前带噪图(已知,这就是我们要处理的图)
  • x0x_0:原图(已知,训练时当然知道,因为 xtx_t 就是从它算出来的)
  • αt\alpha_t:第 tt 步的信号保留比例(预设常数,训练前就设定好了)
  • αˉt\bar{\alpha}_t:累积保留比例(可以预先计算,就是 α1×α2××αt\alpha_1 \times \alpha_2 \times \cdots \times \alpha_t
  • ϵ\epsilon:关键!这是从 x0x_0 生成 xtx_t 时加的噪声(可以从第三章的直达公式反算出来:ϵ=xtαˉtx01αˉt\epsilon = \frac{x_t - \sqrt{\bar{\alpha}_t} \cdot x_0}{\sqrt{1 - \bar{\alpha}_t}}

[!tip]- 核心洞察 公式中只有 ϵ\epsilon 是"隐藏"的,但它可以通过 xtx_tx0x_0 算出来。

这就是为什么说"要想算出均值,本质上只需要知道噪声 ϵ\epsilon 是多少"——因为其他所有参数都是公开的预设值,只有噪声是需要推导的。


右边:神经网络预测的分布 pθ(xt1xt)p_\theta(x_{t-1} | x_t) ^neural-prediction

这是神经网络预测的分布——看着带噪图 xtx_t,猜上一张图 xt1x_{t-1} 长什么样。

网络不知道原图 x0x_0,只能通过观察 xtx_t 来推测。它需要预测一个高斯分布 N(μθ,Σθ)N(\mu_\theta, \Sigma_\theta),但由于 DDPM 的简化(方差固定),实际上只需要预测均值 μθ\mu_\theta

[!info]- 神经网络的输入输出

  • 输入:(xt,t)(x_t, t) —— 带噪图和时间步
  • 输出:预测的均值 μθ(xt,t)\mu_\theta(x_t, t)

小结 ^chapter-5-summary

KL 散度在衡量:神经网络的预测(pθp_\theta)和上帝视角的真实答案(qq)有多接近。

训练的目标就是让 μθ\mu_\theta 尽可能逼近 μ~t\tilde{\mu}_t


第六章:从均值到噪声的蜕变 ^chapter-6

现在我们的任务很明确了:让神经网络预测的均值 μθ\mu_\theta,去逼近[[第五章:ELBO 的登场#^god-view-distribution|第五章那个上帝视角的真实均值]] μ~t\tilde{\mu}_t

第五章末尾我们注意到一个关键洞察:均值公式的形式揭示了与噪声 ϵ\epsilon 的直接关系——要想算出均值,本质上只需要知道噪声 ϵ\epsilon 是多少。

现在深入理解这个洞察:为什么"求均值"等于"减去噪声"?

搞懂符号

先让我们把公式里的零件一个个拆下来。

μθ(xt,t)\mu_\theta(x_t, t) 是什么?

这是神经网络根据当前满是噪点的图 xtx_t,猜测出来的"上一张稍微清晰点的图 xt1x_{t-1}"的中心位置。

  • 为什么要输入 xtx_t?你需要看着当前的图,才能猜上一张图
  • 为什么要输入 tt?你需要知道现在是第几步。第 1000 步全是噪点很难猜,第 5 步基本看清了只需微调。时间 tt 告诉网络噪声的浓度

Σθ\Sigma_\theta 呢?

DDPM 论文发现了一个巧妙的事实:方差其实不用训练!前向加噪时每一步的噪声大小 βt\beta_t 是人为设定的,逆向的不确定性跟它高度相关。

所以作者直接把方差固定成常数,神经网络只需要管好均值就行了。

关键洞察 ^key-insight

现在到了最关键的地方:为什么"求均值"等于"减去噪声"?

请盯着[[第五章:ELBO 的登场#^god-view-distribution|第五章那个上帝视角的均值公式]]看三秒钟:

μ~t=1αt(xt1αt1αˉtϵ)\tilde{\mu}_t = \frac{1}{\sqrt{\alpha_t}} (x_t - \frac{1 - \alpha_t}{\sqrt{1 - \bar{\alpha}_t}} \cdot \epsilon)

  • xtx_t:当前的图(已知)
  • αt,βt\alpha_t, \beta_t:预设的常数(已知)
  • ϵ\epsilon:这幅图里包含的噪声(未知!)

发现了吗?要想算出均值,本质上只需要知道这幅图里的噪声 ϵ\epsilon 是多少!

这是一个惊人的发现:神经网络预测均值 μθ\mu_\theta,在数学上等价于预测噪声 ϵθ\epsilon_\theta

于是,神经网络的工作变得很简单:

  1. 输入:xtx_t(带噪图)
  2. 任务:告诉我这图里加的噪声 ϵ\epsilon 长什么样
  3. 计算:把预测出来的噪声套进公式,算出 xt1x_{t-1} 的均值
  4. 采样:在均值旁边随机抖一下,就得到了 xt1x_{t-1}

MSE 的诞生 ^mse-birth

现在你应该理解了:虽然理论上我们在拟合一个高斯分布:

pθ=N(μ,Σ)p_\theta = N(\mu, \Sigma)

但在实际代码里,神经网络直接预测噪声 ϵθ\epsilon_\theta,然后用 xtx_t 减去噪声的部分,就得到了去噪后的结果。

复杂的 KL 散度 Loss,最终被简化成了两个噪声向量的均方误差:

Lsimple=ϵϵθ(αˉtx0+1αˉtϵ,t)2L_{simple} = \|\epsilon - \epsilon_\theta(\sqrt{\bar{\alpha}_t} x_0 + \sqrt{1 - \bar{\alpha}_t} \epsilon, t)\|^2

  • ϵ\epsilon:训练时生成的真噪声
  • ϵθ\epsilon_\theta:神经网络预测的噪声

这个简化太重要了。让我们回顾一下它是怎么来的:

[!summary]- MSE 的诞生过程

  1. Feller 理论告诉我们:逆向过程是高斯分布
  2. DDPM 简化告诉我们:方差可以固定,只需求均值
  3. 贝叶斯推导告诉我们:求均值等价于求噪声
  4. 最终实现:神经网络看图预测噪声

每一步都自然流畅,每一步都环环相扣。


第七章:生成图片 ^chapter-7

神经网络训练好后(训练过程前面已经讲过),怎么用它生成新图片?

初始状态:从纯噪声开始,xTN(0,1)x_T \sim N(0,1)

去噪循环:从 t=Tt = T 倒推到 t=1t = 1

每一步的更新公式:

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

其中 zN(0,1)z \sim N(0,1) 是随机噪声(σt\sigma_t 是预设的方差系数)。

[!info]- 完整生成流程

  1. 初始化:从标准正态分布采样 xTN(0,1)x_T \sim N(0,1) 作为起点(纯噪声)
  2. 逐步去噪:对于 t=T,T1,...,2,1t = T, T-1, ..., 2, 1,每次迭代:
    • 把当前带噪图 xtx_t 和时间步 tt 输入神经网络
    • 网络预测噪声 ϵθ(xt,t)\epsilon_\theta(x_t, t)
    • 用上面的去噪公式计算 xt1x_{t-1}
    • 得到稍微清晰一点的图
  3. 得到结果:重复 T 次后,最终得到清晰图 x0x_0

直觉理解

  • 网络看当前带噪图 xtx_t,预测里面的噪声 ϵθ\epsilon_\theta
  • xtx_t 中减去预测的噪声,得到上一时刻的图 xt1x_{t-1}
  • 加一点随机噪声 zz(保持生成的多样性)
  • 重复 T 次(比如 1000 次),逐步去噪,最终得到清晰图 x0x_0

核心洞察 ^core-insight

[!tip]- 训练和推理的对称性

  • 训练时([[第三章:寻找直达公式#^training-data|第三章]]):我们知道 x0x_0,用直达公式生成带噪图 xtx_t,让网络学习预测噪声 ϵ\epsilon
  • 推理时(本章):我们从纯噪声开始,用训练好的网络预测噪声,逐步去除噪声得到清晰图 x0x_0

训练时教网络"加噪是什么样",推理时让网络"把噪声去掉"——这就是扩散模型的优雅之处。


终章:全流程闭环 ^finale

按照 DDPM 论文的逻辑,你现在应该彻底通透了。让我们回顾一下这个完整的故事。

故事脉络

  1. 起点:想算逆向过程 q(xt1xt)q(x_{t-1} | x_t),但算不出来
  2. 方法:用神经网络 pθp_\theta 去拟合它
  3. 手段:最大化 ELBO(变分下界)来训练
  4. 技巧:引入 x0x_0 作为条件,使得 KL 散度的目标分布 q(xt1xt,x0)q(x_{t-1} | x_t, x_0) 变得可计算
  5. 化简:把直达公式代入进去,发现拟合分布的均值,本质上就是在拟合噪声
  6. 结果:Loss 就是预测噪声和真实噪声的 MSE

核心优势 ^core-advantages

这种方法的关键优势在于利用了高斯噪声良好的数学性质,使整个过程的可建模性和可控性大大提高:

  • 数学优雅:前向过程有闭式解,可以快速生成训练数据
  • 训练稳定:通过能量守恒保持方差稳定
  • 推导清晰:从 ELBO 到 MSE 的每一步都有严格的数学推导
  • 工程可行:最终简化的 Loss 就是普通的 MSE,易于实现

这就是扩散模型背后的完整故事——从最直观的叠加噪声想法,到引入能量守恒,再到用神经网络拟合逆向过程,最终简化为预测噪声的 MSE Loss,最后落地到训练和推理的具体实现。

每一步都自然流畅,每一步都环环相扣。

[!success]- 最终结论 现在,你应该真正理解了扩散模型的数学之美。


%%hidden 内部备注:

  • 可以考虑添加相关笔记链接,如 [[VAE 原理]]、[[GAN 原理]] 等
  • 可以添加练习题或思考题
  • 可以添加代码实现示例 %%

扩散模型原理:从噪声到图像的数学之旅

想象一下修复照片的过程:起点是一张满是噪点的图片(高斯噪声),终点是一张清晰的照片。你需要找到一条路径,从无意义的噪声一步步变成有意义的图像。

这个故事要从头说起——我们如何让计算机学会这个魔法?


符号说明(查表用)

下面这些符号会在文章中反复出现。不需要记住,遇到不懂的符号时回来查这个表就行了。

图像符号

  • x0x_0:原始清晰图片(下标 0 表示第 0 步,也就是没有加过噪声)
  • xtx_t:第 tt 步的带噪声图片(tt 越大,图越模糊)
  • xt1x_{t-1}:第 t1t-1 步的图片,比 xtx_t 稍微清晰一点
  • xTx_T:最终第 TT 步的图片,全是噪声

概率符号

  • q()q(\text{后} | \text{前}):真实的前向或逆向分布(上帝视角,理论上存在但可能算不出来)
    • q(xtxt1)q(x_t | x_{t-1}):前向加噪分布,从 xt1x_{t-1}xtx_t(已知,很好算)
    • q(xt1xt)q(x_{t-1} | x_t):逆向去噪分布,从 xtx_txt1x_{t-1}(未知,很难算)
  • pθ()p_\theta(\text{后} | \text{前}):神经网络预测的分布(替身,用来近似真实分布)
    • θ\theta:神经网络的参数
    • pθ(xt1xt)p_\theta(x_{t-1} | x_t):神经网络预测的逆向分布

噪声符号

  • ϵ\epsilon:标准高斯噪声,ϵN(0,1)\epsilon \sim N(0,1)
  • βt\beta_t:第 tt 步加的噪声强度(人为设定的小常数)
  • αt\alpha_t:信号保留比例,定义为 1βt1 - \beta_t
  • αˉt\bar{\alpha}_t:累积保留比例,定义为 α1×α2××αt\alpha_1 \times \alpha_2 \times \cdots \times \alpha_t

直观理解

前向过程(加噪):x0qx1qx2qqxTx_0 \xrightarrow{q} x_1 \xrightarrow{q} x_2 \xrightarrow{q} \cdots \xrightarrow{q} x_T

逆向过程(去噪):xTpθxT1pθpθx0x_T \xrightarrow{p_\theta} x_{T-1} \xrightarrow{p_\theta} \cdots \xrightarrow{p_\theta} x_0


现在开始我们的故事。

第一章:直觉的陷阱

最直观的想法

假设你想把一张清晰的图片变成噪声。最直观的做法就像撒盐一样,一步步往上叠加噪声。

x0x_0 是原图。在每一时刻 tt,在上一时刻 xt1x_{t-1} 的基础上加一点噪声 ϵ\epsilon

xt=xt1+βϵx_t = x_{t-1} + \beta \cdot \epsilon

其中 ϵN(0,1)\epsilon \sim N(0,1)β\beta 表示噪声强度。

这个公式描述的是前向过程:从清晰图 xt1x_{t-1} 加噪得到 xtx_t。用概率论的语言,我们把这个加噪过程记作 q(xtxt1)q(x_t | x_{t-1}) —— 也就是在给定 xt1x_{t-1} 的条件下,xtx_t 的分布。

现在不用纠结这个符号,你只需要知道:q(xtxt1)q(x_t | x_{t-1}) 就是我们前面写的那个加噪公式。

展开 tt 步后:

xt=x0+tβϵˉx_t = x_0 + t\beta \cdot \bar{\epsilon}

其中 ϵˉ\bar{\epsilon} 是合并后的噪声。

直觉的崩溃

这个公式有两个致命缺陷。

问题 1:均值漂移

  • 均值:E[xt]=x0E[x_t] = x_0
  • 无论加多少步噪声,图像的均值永远是原图
  • 这意味着原图的底色永远消不掉

问题 2:方差爆炸

  • 方差:Var(xt)=tβVar(x_t) = t\beta
  • 随着时间 tt 增加,方差会趋向于无穷大
  • 标准正态分布的方差必须固定为 1

结论:这个模型无法收敛到标准正态分布 N(0,1)N(0,1),它只是造出了一个无限模糊且数值巨大的废图。


第二章:能量守恒的启示

引入衰减系数

为了防止方差爆炸,我们需要引入能量守恒的概念:既然要注入噪声能量(方差),就必须按比例拿走一部分图像能量。

xt1x_{t-1} 前面加一个衰减系数。为了保证总方差维持在 1,系数必须满足勾股定理的形式:

xt=1βtxt1+βtϵx_t = \sqrt{1 - \beta_t} \cdot x_{t-1} + \sqrt{\beta_t} \cdot \epsilon

其中 βt(0,1)\beta_t \in (0, 1) 是一个小的常数,表示每步添加的噪声比例。

为什么这样就对了?

通过这种缩放操作,可以保证 Var(xt)=1Var(x_t) = 1(假设 Var(xt1)=1Var(x_{t-1}) = 1),无论迭代多少次,数据的方差始终被控制在 1 左右。

这就构成了 Variance Preserving(保方差)的扩散过程。

这个改进后的公式就是我们前向加噪分布 q(xtxt1)q(x_t | x_{t-1}) 的核心形式。


第三章:寻找直达公式

工程需求

训练神经网络时,我们需要在任意时刻 tt 采样带噪图,然后告诉网络:这幅图里加的噪声是什么。这需要一个关键能力:给定原图 x0x_0 和任意时刻 tt,直接算出对应的噪声 xtx_t 和噪声 ϵ\epsilon

如果只能一步步递推算,我们就不知道当前这幅 xtx_t 里到底加了多少噪声——因为噪声累积了 tt 步,每一步的噪声都不同。

所以我们需要一个"直达公式":从 x0x_0tt 一步到位算出 xtx_t,这样就能清楚地知道这幅图里包含的噪声 ϵ\epsilon 是什么。

变量定义

为了书写简洁,定义两个变量:

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

αˉt=i=1tαi=α1×α2××αt\bar{\alpha}_t = \prod_{i=1}^{t} \alpha_i = \alpha_1 \times \alpha_2 \times \cdots \times \alpha_t

  • αt\alpha_t:第 tt 步的信号保留比例
  • αˉt\bar{\alpha}_t:累积保留比例(从第 1 步到第 tt 步所有 α\alpha 的连乘积,读作 Alpha Bar t)

递归推导

通过数学归纳法,推导规律:

  • t=1t = 1x0x_0 的系数是 α1\sqrt{\alpha_1}
  • t=2t = 2x0x_0 的系数是 α1α2\sqrt{\alpha_1 \alpha_2}
  • t=3t = 3:系数变成 α1α2α3\sqrt{\alpha_1 \alpha_2 \alpha_3}

规律已经很清晰了,但还需要处理噪声项的合并。

高斯分布的魔力

两个独立高斯分布 N(0,σ12)N(0, \sigma_1^2)N(0,σ22)N(0, \sigma_2^2) 相加,等于一个新的高斯分布 N(0,σ12+σ22)N(0, \sigma_1^2 + \sigma_2^2)

利用这个性质,推导出噪声项可以合并为 1αˉtϵˉ\sqrt{1 - \bar{\alpha}_t} \cdot \bar{\epsilon} 的形式。

DDPM 核心公式

通过数学归纳法,推广到任意时刻 tt

xt=αˉtx0+1αˉtϵ=q(xtx0)x_t = \sqrt{\bar{\alpha}_t} \cdot x_0 + \sqrt{1 - \bar{\alpha}_t} \cdot \epsilon \quad = \quad q(x_t | x_0)

左边是具体的计算公式,右边是符号表示(在给定原图 x0x_0 的条件下,第 tt 步的带噪图 xtx_t 的分布)。

验证收敛

来看看当 tt \to \infty(扩散到最后)时,这个公式会发生什么。

由于 αt<1\alpha_t < 1,连乘积 αˉt\bar{\alpha}_t 会趋近于 0,因此 xTϵx_T \approx \epsilon(纯标准正态分布)。

结论:前向过程完美收敛到标准正态分布 N(0,1)N(0,1)

训练数据准备

现在我们有了直达公式,就可以准备训练数据了!

给定一张清晰图片 x0x_0,训练样本是这样准备的:

  1. 随机选时刻 t{1,2,...,T}t \in \{1, 2, ..., T\}
  2. 生成噪声 ϵN(0,1)\epsilon \sim N(0,1)
  3. 计算带噪图 xt=αˉtx0+1αˉtϵx_t = \sqrt{\bar{\alpha}_t} \cdot x_0 + \sqrt{1 - \bar{\alpha}_t} \cdot \epsilon

每个训练样本包含:

  • 输入:(xt,t)(x_t, t) —— 带噪图和时间步
  • 标签:ϵ\epsilon —— 真实噪声

神经网络的任务:看带噪图 xtx_t 和时间 tt,预测这幅图里的噪声 ϵ\epsilon

这就为后面的训练做好了准备。


第四章:逆向的困境

问题:能走回去吗?

前三章我们一直在讲前向过程:从清晰图逐步加噪,最后得到 q(xtx0)q(x_t | x_0) —— 可以直接从原图生成任意时刻的带噪图。

现在的问题是:能不能走回去?

给定一张满是噪点的图 xtx_t,怎么推算出它上一秒稍微清晰一点的样子 xt1x_{t-1}

用概率论的语言,我们想求的是逆向过程 q(xt1xt)q(x_{t-1} | x_t) —— 注意,条件反过来了!不再是从 xt1x_{t-1}xtx_t,而是要从 xtx_t 推回 xt1x_{t-1}

根据贝叶斯公式:

q(xt1xt)=q(xtxt1)q(xt1)q(xt)q(x_{t-1} | x_t) = \frac{q(x_t | x_{t-1}) \cdot q(x_{t-1})}{q(x_t)}

  • q(xtxt1)q(x_t | x_{t-1}):已知(我们前三章推导的单步加噪公式)
  • q(xt1)q(x_{t-1})q(xt)q(x_t):未知!这需要知道全世界所有图片的边缘分布,在数学上是不可计算的

困境:逆向过程算不出来!

解决方案:找个替身

既然算不出真实的 q(xt1xt)q(x_{t-1} | x_t),我们就训练一个神经网络(参数为 θ\theta)来近似它。我们把这个替身记作 pθ(xt1xt)p_\theta(x_{t-1} | x_t)

为什么要预测高斯分布?

这里有个关键的直觉:前向过程每次加的噪声极小(βt\beta_t 很小),就像画画时每一笔只涂抹一点点。那么撤销这一笔的操作,大概率也只是在一个很小的范围内微调。

数学上这叫做 Feller 理论:当扩散步数 TT \to \infty 且每一步加噪幅度 βt0\beta_t \to 0 时,前向过程变成了连续的布朗运动。如果前向过程是高斯扩散,逆向过程在数学形式上也必然是一个高斯过程。

所以,神经网络不需要预测整张图 xt1x_{t-1},只需要预测一个高斯分布。

高斯分布需要什么参数?

一个高斯分布 N(μ,σ2)N(\mu, \sigma^2) 由两个参数决定:

  1. 均值 μ\mu:分布的中心位置
  2. 方差 σ2\sigma^2:分布的分散程度

理论上,神经网络需要预测这两个值。

DDPM 的简化

但是 DDPM 论文发现了一个事实:方差不需要训练,直接固定成常数(和前向过程的 βt\beta_t 相关)效果就很好。

因此,神经网络的任务被简化了:

  • 不需要预测:方差 Σθ\Sigma_\theta(固定为常数)
  • 只需要预测:均值 μθ(xt,t)\mu_\theta(x_t, t)

这个均值 μθ(xt,t)\mu_\theta(x_t, t) 代表什么?直觉上理解,它就是神经网络对"上一张图 xt1x_{t-1} 应该长什么样"的猜想的中心点。给定当前噪点图 xtx_t 和时间 tt,神经网络告诉我们:往这个方向走,应该能找到更清晰的图。


第五章:ELBO 的登场

目标:让神经网络生成真图

为了让这个神经网络 pθp_\theta 能够生成像 x0x_0 这样的真图,我们需要最大化对数似然:logpθ(x0)\log p_\theta(x_0)

但正如之前所说,直接算这个太难。于是我们引入 ELBO(Evidence Lower Bound,证据下界)。

什么是下界?

这里要用到一个经典的变分推断技巧:引入一个辅助分布 qq,在 log 里面玩点数学游戏。

你可能注意到公式里出现了 x1:Tx_{1:T}x0:Tx_{0:T} 这种写法,这是一种简写符号:

  • x1:Tx_{1:T} 表示从第 1 步到第 T 步的所有带噪图:x1,x2,...,xTx_1, x_2, ..., x_T
  • x0:Tx_{0:T} 表示 x0,x1,...,xTx_0, x_1, ..., x_T

从我们的目标开始:

logpθ(x0)=logx1:Tpθ(x0:T)\log p_\theta(x_0) = \log \sum_{x_{1:T}} p_\theta(x_{0:T})

这个公式的逻辑是:模型生成一张清晰图 x0x_0 的概率,等于它沿着所有可能的去噪路径(从纯噪声 xTx_Tx0x_0)推导回来的概率总和。

按照从左到右的顺序:

  • log\log:对概率取对数,将连乘转化为加法,便于优化
  • x1:T\sum_{x_{1:T}}:对所有可能的中间路径进行边缘化——把所有能产生同一张 x0x_0 的不同路径(x1,x2,...,xTx_1, x_2, ..., x_T 的各种组合)的概率全部累加
  • pθ(x0:T)p_\theta(x_{0:T}):模型参数为 θ\theta 的联合概率,描述一条完整去噪链路 {xT,xT1,...,x1,x0}\{x_T, x_{T-1}, ..., x_1, x_0\} 的发生概率

好比计算"到达山顶的总人数":把从北坡、南坡、西坡等所有路径上山的人数加起来。

现在我们在分数里乘以 q(x1:Tx0)/q(x1:Tx0)=1q(x_{1:T}|x_0) / q(x_{1:T}|x_0) = 1

logpθ(x0)=logx1:Tq(x1:Tx0)pθ(x0:T)q(x1:Tx0)\log p_\theta(x_0) = \log \sum_{x_{1:T}} q(x_{1:T}|x_0) \cdot \frac{p_\theta(x_{0:T})}{q(x_{1:T}|x_0)}

这可以写成期望的形式:

logpθ(x0)=logEq[pθ(x0:T)q(x1:Tx0)]\log p_\theta(x_0) = \log E_q \left[ \frac{p_\theta(x_{0:T})}{q(x_{1:T}|x_0)} \right]

关键步骤:利用 Jensen 不等式(log\log 是凹函数,所以 logE[X]E[logX]\log E[X] \geq E[\log X]):

logpθ(x0)Eq[logpθ(x0:T)q(x1:Tx0)]\log p_\theta(x_0) \geq E_q \left[ \log \frac{p_\theta(x_{0:T})}{q(x_{1:T}|x_0)} \right]

或者写成更熟悉的形式:

logpθ(x0)Eq[logq(x1:Tx0)pθ(x0:T)]\log p_\theta(x_0) \geq E_q \left[ \log \frac{q(x_{1:T} | x_0)}{p_\theta(x_{0:T})} \right]

  • 左边是我想最大化的目标(很难算)
  • 右边是一个下界(Lower Bound)(相对好算)

策略:如果我们拼命把右边的下界抬高,左边的目标自然也就被顶上去了。

在深度学习里,我们要 minimize Loss,所以我们取负号,变成 Minimize Negative ELBO。

拆解 Loss

把上面那个复杂的式子展开(利用 Markov 链性质),Loss 可以被拆解成三项:

L=LT+Lt1+L0L = L_T + L_{t-1} + L_0

LTL_T(正则项)

DKL(q(xTx0)p(xT))D_{KL}(q(x_T | x_0) || p(x_T))

这里的 q(xTx0)q(x_T | x_0) 是第三章推导的那个直达分布:从原图 x0x_0 出发,经过 T 步前向加噪后得到最终噪声图 xTx_T 的概率分布。

根据第三章的核心公式,这实际上是一个高斯分布:

q(xTx0)=N(αˉTx0,1αˉT)q(x_T | x_0) = N(\sqrt{\bar{\alpha}_T} \cdot x_0, 1 - \bar{\alpha}_T)

p(xT)p(x_T) 是标准高斯分布 N(0,1)N(0,1)。这一项比较的是:模型最终生成的噪声分布(qq)和标准高斯噪声(pp)有多接近。

因为前向过程是锁死的,当 TT 足够大时,αˉT0\bar{\alpha}_T \to 0,所以 q(xTx0)q(x_T | x_0) 本来就非常接近标准高斯。这一项近似为 0,不用训练。

L0L_0(重构项)

logpθ(x0x1)-\log p_\theta(x_0 | x_1)

最后一步的解码。

Lt1L_{t-1}(去噪核心项):这就是我们要关注的重点!

t>1DKL(q(xt1xt,x0)pθ(xt1xt))\sum_{t>1} D_{KL}(q(x_{t-1} | x_t, x_0) || p_\theta(x_{t-1} | x_t))

这个 KL 散度在衡量两个分布的距离。


左边:上帝视角的真实分布 q(xt1xt,x0)q(x_{t-1} | x_t, x_0)

这是"给定原图 x0x_0 和当前带噪图 xtx_t 的条件下,上一张稍微清晰点的图 xt1x_{t-1} 的概率分布"。

关键点:多了 x0x_0 这个条件!

为什么这很重要?回顾第四章,q(xt1xt)q(x_{t-1} | x_t) 算不出来——因为只知道当前带噪图 xtx_t,但不知道它原本是什么样,有无数种可能的 xt1x_{t-1} 都能产生这个 xtx_t。就像只知道终点,不知道起点,无法确定路径。

但加了 x0x_0 之后情况就完全不同了:如果我们知道原图 x0x_0(训练时当然知道,因为 xtx_t 就是从它算出来的),就能锁定唯一的"去噪路径"。此时逆向概率 q(xt1xt,x0)q(x_{t-1} | x_t, x_0) 变得可计算。

**具体怎么算?**利用贝叶斯公式:

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

看公式右边的三项:

  1. q(xtxt1,x0)q(x_t | x_{t-1}, x_0):因为马尔可夫性,给定 xt1x_{t-1} 后,xtx_t 不再依赖 x0x_0,所以等于 q(xtxt1)q(x_t | x_{t-1})。这是单步高斯加噪分布:xt=1βtxt1+βtϵx_t = \sqrt{1 - \beta_t} \cdot x_{t-1} + \sqrt{\beta_t} \cdot \epsilon

  2. q(xt1x0)q(x_{t-1} | x_0):从原图 x0x_0 一步到位到 xt1x_{t-1} 的分布。用直达公式:xt1=αˉt1x0+1αˉt1ϵx_{t-1} = \sqrt{\bar{\alpha}_{t-1}} \cdot x_0 + \sqrt{1 - \bar{\alpha}_{t-1}} \cdot \epsilon,这是高斯分布

  3. q(xtx0)q(x_t | x_0):从原图 x0x_0 一步到位到 xtx_t 的分布。同样用直达公式:xt=αˉtx0+1αˉtϵx_t = \sqrt{\bar{\alpha}_t} \cdot x_0 + \sqrt{1 - \bar{\alpha}_t} \cdot \epsilon,这也是高斯分布

核心差别:第 2 和第 3 项都是从原图 x0x_0 出发的"前向"分布,我们有直达公式可以一步到位计算;而第 1 项是单步加噪,公式也很简单。

这三项都能算,这就是为什么加了 x0x_0 之后整个贝叶斯公式变得可计算——每一项都是已知的高斯分布。

既然三项都是高斯分布,它们的贝叶斯组合仍然是高斯分布。通过代数推导可以得到:

q(xt1xt,x0)=N(μ~t,σ~t2)q(x_{t-1} | x_t, x_0) = N(\tilde{\mu}_t, \tilde{\sigma}_t^2)

其中均值的具体形式是:

μ~t=1αt(xt1αt1αˉtϵ)\tilde{\mu}_t = \frac{1}{\sqrt{\alpha_t}} (x_t - \frac{1 - \alpha_t}{\sqrt{1 - \bar{\alpha}_t}} \cdot \epsilon)

这个公式不需要背,但需要理解每个参数是怎么来的:

公式里的参数

  • xtx_t:当前带噪图(已知,这就是我们要处理的图)
  • x0x_0:原图(已知,训练时当然知道,因为 xtx_t 就是从它算出来的)
  • αt\alpha_t:第 tt 步的信号保留比例(预设常数,训练前就设定好了)
  • αˉt\bar{\alpha}_t:累积保留比例(可以预先计算,就是 α1×α2××αt\alpha_1 \times \alpha_2 \times \cdots \times \alpha_t
  • ϵ\epsilon:关键!这是从 x0x_0 生成 xtx_t 时加的噪声(可以从第三章的直达公式反算出来:ϵ=xtαˉtx01αˉt\epsilon = \frac{x_t - \sqrt{\bar{\alpha}_t} \cdot x_0}{\sqrt{1 - \bar{\alpha}_t}}

核心洞察:公式中只有 ϵ\epsilon 是"隐藏"的,但它可以通过 xtx_tx0x_0 算出来。

这就是为什么说"要想算出均值,本质上只需要知道噪声 ϵ\epsilon 是多少"——因为其他所有参数都是公开的预设值,只有噪声是需要推导的。


右边:神经网络预测的分布 pθ(xt1xt)p_\theta(x_{t-1} | x_t)

这是神经网络预测的分布——看着带噪图 xtx_t,猜上一张图 xt1x_{t-1} 长什么样。

网络不知道原图 x0x_0,只能通过观察 xtx_t 来推测。它需要预测一个高斯分布 N(μθ,Σθ)N(\mu_\theta, \Sigma_\theta),但由于 DDPM 的简化(方差固定),实际上只需要预测均值 μθ\mu_\theta

神经网络的输入输出

  • 输入:(xt,t)(x_t, t) —— 带噪图和时间步
  • 输出:预测的均值 μθ(xt,t)\mu_\theta(x_t, t)

小结

KL 散度在衡量:神经网络的预测(pθp_\theta)和上帝视角的真实答案(qq)有多接近。

训练的目标就是让 μθ\mu_\theta 尽可能逼近 μ~t\tilde{\mu}_t


第六章:从均值到噪声的蜕变

现在我们的任务很明确了:让神经网络预测的均值 μθ\mu_\theta,去逼近第五章那个上帝视角的真实均值 μ~t\tilde{\mu}_t

第五章末尾我们注意到一个关键洞察:均值公式的形式揭示了与噪声 ϵ\epsilon 的直接关系——要想算出均值,本质上只需要知道噪声 ϵ\epsilon 是多少。

现在深入理解这个洞察:为什么"求均值"等于"减去噪声"?

搞懂符号

先让我们把公式里的零件一个个拆下来。

μθ(xt,t)\mu_\theta(x_t, t) 是什么?

这是神经网络根据当前满是噪点的图 xtx_t,猜测出来的"上一张稍微清晰点的图 xt1x_{t-1}"的中心位置。

  • 为什么要输入 xtx_t?你需要看着当前的图,才能猜上一张图
  • 为什么要输入 tt?你需要知道现在是第几步。第 1000 步全是噪点很难猜,第 5 步基本看清了只需微调。时间 tt 告诉网络噪声的浓度

Σθ\Sigma_\theta 呢?

DDPM 论文发现了一个巧妙的事实:方差其实不用训练!前向加噪时每一步的噪声大小 βt\beta_t 是人为设定的,逆向的不确定性跟它高度相关。

所以作者直接把方差固定成常数,神经网络只需要管好均值就行了。

关键洞察

现在到了最关键的地方:为什么"求均值"等于"减去噪声"?

请盯着第五章那个上帝视角的均值公式看三秒钟:

μ~t=1αt(xt1αt1αˉtϵ)\tilde{\mu}_t = \frac{1}{\sqrt{\alpha_t}} (x_t - \frac{1 - \alpha_t}{\sqrt{1 - \bar{\alpha}_t}} \cdot \epsilon)

  • xtx_t:当前的图(已知)
  • αt,βt\alpha_t, \beta_t:预设的常数(已知)
  • ϵ\epsilon:这幅图里包含的噪声(未知!)

发现了吗?要想算出均值,本质上只需要知道这幅图里的噪声 ϵ\epsilon 是多少!

这是一个惊人的发现:神经网络预测均值 μθ\mu_\theta,在数学上等价于预测噪声 ϵθ\epsilon_\theta

于是,神经网络的工作变得很简单:

  1. 输入:xtx_t(带噪图)
  2. 任务:告诉我这图里加的噪声 ϵ\epsilon 长什么样
  3. 计算:把预测出来的噪声套进公式,算出 xt1x_{t-1} 的均值
  4. 采样:在均值旁边随机抖一下,就得到了 xt1x_{t-1}

MSE 的诞生

现在你应该理解了:虽然理论上我们在拟合一个高斯分布:

pθ=N(μ,Σ)p_\theta = N(\mu, \Sigma)

但在实际代码里,神经网络直接预测噪声 ϵθ\epsilon_\theta,然后用 xtx_t 减去噪声的部分,就得到了去噪后的结果。

复杂的 KL 散度 Loss,最终被简化成了两个噪声向量的均方误差:

Lsimple=ϵϵθ(αˉtx0+1αˉtϵ,t)2L_{simple} = \|\epsilon - \epsilon_\theta(\sqrt{\bar{\alpha}_t} x_0 + \sqrt{1 - \bar{\alpha}_t} \epsilon, t)\|^2

  • ϵ\epsilon:训练时生成的真噪声
  • ϵθ\epsilon_\theta:神经网络预测的噪声

这个简化太重要了。让我们回顾一下它是怎么来的:

  1. Feller 理论告诉我们:逆向过程是高斯分布
  2. DDPM 简化告诉我们:方差可以固定,只需求均值
  3. 贝叶斯推导告诉我们:求均值等价于求噪声
  4. 最终实现:神经网络看图预测噪声

每一步都自然流畅,每一步都环环相扣。


第七章:生成图片

神经网络训练好后(训练过程前面已经讲过),怎么用它生成新图片?

初始状态:从纯噪声开始,xTN(0,1)x_T \sim N(0,1)

去噪循环:从 t=Tt = T 倒推到 t=1t = 1

每一步的更新公式:

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

其中 zN(0,1)z \sim N(0,1) 是随机噪声(σt\sigma_t 是预设的方差系数)。

完整生成流程

  1. 初始化:从标准正态分布采样 xTN(0,1)x_T \sim N(0,1) 作为起点(纯噪声)

  2. 逐步去噪:对于 t=T,T1,...,2,1t = T, T-1, ..., 2, 1,每次迭代:

    • 把当前带噪图 xtx_t 和时间步 tt 输入神经网络
    • 网络预测噪声 ϵθ(xt,t)\epsilon_\theta(x_t, t)
    • 用上面的去噪公式计算 xt1x_{t-1}
    • 得到稍微清晰一点的图
  3. 得到结果:重复 T 次后,最终得到清晰图 x0x_0

直觉理解

  • 网络看当前带噪图 xtx_t,预测里面的噪声 ϵθ\epsilon_\theta
  • xtx_t 中减去预测的噪声,得到上一时刻的图 xt1x_{t-1}
  • 加一点随机噪声 zz(保持生成的多样性)
  • 重复 T 次(比如 1000 次),逐步去噪,最终得到清晰图 x0x_0

核心洞察

训练和推理的对称性

  • 训练时(第三章):我们知道 x0x_0,用直达公式生成带噪图 xtx_t,让网络学习预测噪声 ϵ\epsilon
  • 推理时(本章):我们从纯噪声开始,用训练好的网络预测噪声,逐步去除噪声得到清晰图 x0x_0

训练时教网络"加噪是什么样",推理时让网络"把噪声去掉"——这就是扩散模型的优雅之处。


终章:全流程闭环

按照 DDPM 论文的逻辑,你现在应该彻底通透了。让我们回顾一下这个完整的故事。

故事脉络

  1. 起点:想算逆向过程 q(xt1xt)q(x_{t-1} | x_t),但算不出来
  2. 方法:用神经网络 pθp_\theta 去拟合它
  3. 手段:最大化 ELBO(变分下界)来训练
  4. 技巧:引入 x0x_0 作为条件,使得 KL 散度的目标分布 q(xt1xt,x0)q(x_{t-1} | x_t, x_0) 变得可计算
  5. 化简:把直达公式代入进去,发现拟合分布的均值,本质上就是在拟合噪声
  6. 结果:Loss 就是预测噪声和真实噪声的 MSE

核心优势

这种方法的关键优势在于利用了高斯噪声良好的数学性质,使整个过程的可建模性和可控性大大提高:

  • 数学优雅:前向过程有闭式解,可以快速生成训练数据
  • 训练稳定:通过能量守恒保持方差稳定
  • 推导清晰:从 ELBO 到 MSE 的每一步都有严格的数学推导
  • 工程可行:最终简化的 Loss 就是普通的 MSE,易于实现

这就是扩散模型背后的完整故事——从最直观的叠加噪声想法,到引入能量守恒,再到用神经网络拟合逆向过程,最终简化为预测噪声的 MSE Loss,最后落地到训练和推理的具体实现。

每一步都自然流畅,每一步都环环相扣。

现在,你应该真正理解了扩散模型的数学之美。