扩散模型:扩散训练与表示

扩散模型:扩散训练与表示

Charles Lv8

这一页只回答一个基础问题:扩散模型训练时到底在学什么?

读法定位

这页先回答“扩散训练与表示”在「扩散模型」里的位置:它解决什么局部问题,依赖哪些前置,最后会影响哪类工程或研究判断。
前置:先知道张量、损失函数和高斯噪声的基本读法;不熟时回基础知识再继续。 必要时先回 扩散模型入口、基础知识 或 术语表。
主线关系:把训练目标、噪声日程、采样器、条件控制和蒸馏看成同一条链:带噪状态如何一步步被推回数据分布。

先不要把扩散想成“模型从零画图”。训练阶段更像给模型出很多道去噪题:我们拿一张干净图,随机加一点或很多噪声,再让模型猜出被加进去的噪声,或者猜出原来的干净图。

先看图:训练不是一步生成

DDPM graphical model 原论文图

图源:Denoising Diffusion Probabilistic Models,Figure 2。

原论文图意:DDPM 将数据逐步加噪形成 x1,,xTx_1,\ldots,x_T,再学习反向链 pθ(xt1xt)p_\theta(x_{t-1}\mid x_t)

本教程读法:图里的每个 pθ(xt1xt)p_\theta(x_{t-1}\mid x_t) 都是一个局部去噪问题。模型不是训练成“一口气从 xTx_T 变出 x0x_0”,而是在很多噪声水平上学会小步修复。

前向过程:怎么把图变成噪声

最经典的 DDPM 前向过程写成:

q(xtxt1)=N(xt;1βtxt1,βtI)q(x_t \mid x_{t-1}) = \mathcal{N}\left(x_t;\sqrt{1-\beta_t}x_{t-1}, \beta_t I\right)

这行式子在说:从 xt1x_{t-1}xtx_t,我们保留一部分旧图像,同时加入方差为 βt\beta_t 的高斯噪声。

这里的 N(x;μ,Σ)\mathcal{N}(x;\mu,\Sigma) 要按“被采样/被评分的变量;均值;协方差”来读:

位置 在这条公式里 含义
第 1 个位置 xtx_t 当前带噪图像 这个分布要生成或评估的变量
第 2 个位置 1βtxt1\sqrt{1-\beta_t}x_{t-1} 均值 μ\mu 以上一步图像为中心,但信号被缩小一点
第 3 个位置 βtI\beta_t I 协方差 Σ\Sigma 每个维度加入方差为 βt\beta_t 的独立高斯噪声

符号含义:

符号 含义
qq 固定的前向加噪过程,不是神经网络
xt1x_{t-1} 上一个时间步的图像
xtx_t 当前时间步的带噪图像
tt 当前时间步,越大表示噪声越重
βt\beta_t tt 步加入的噪声强度
II 单位矩阵,表示每个维度独立加噪
N(x;μ,Σ)\mathcal{N}(x;\mu,\Sigma) μ\mu 为均值、Σ\Sigma 为协方差的高斯分布,并在变量 xx 上取值或采样

直觉上,如果 βt\beta_t 很小,这一步只是轻微加噪;如果许多步连续加噪,图像最终会接近纯高斯噪声。

闭式加噪:训练时不用真的走 tt

如果每次训练都从 x0x_0 走到 xtx_t,会很慢。好消息是,高斯噪声叠加后仍然是高斯,所以可以直接采样任意时间步:

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

这行式子在说:带噪图 xtx_t 是干净图 x0x_0 和随机噪声 ϵ\epsilon 的加权混合。

ϵN(0,I)\epsilon \sim \mathcal{N}(0,I) 是采样写法,省略了“变量位置”。它表示 ϵ\epsilon 从均值为 00、协方差为 II 的标准高斯分布中采样;也就是每个维度独立抽一个均值 0、方差 1 的噪声。

符号含义:

符号 含义
x0x_0 原始干净图
xtx_t tt 个噪声水平下的图
ϵ\epsilon 真实加入的标准高斯噪声
αt=1βt\alpha_t = 1-\beta_t tt 步保留信号的比例
αˉt=s=1tαs\bar{\alpha}_t = \prod_{s=1}^{t}\alpha_s 到第 tt 步累计保留多少原图信号
αˉt\sqrt{\bar{\alpha}_t} 干净图权重
1αˉt\sqrt{1-\bar{\alpha}_t} 噪声权重

这条公式是扩散训练最重要的入口。它把“长链加噪”变成了“随机选一个 tt,一次构造一个带噪样本”。

例子:同一张猫图的三个时间步

  • tt 很小:猫的轮廓、眼睛、毛色基本都还在,只是有颗粒感。
  • tt 中等:还能看出大概是一只猫,但细节和纹理明显丢失。
  • tt 很大:几乎只剩噪声,模型需要靠数据分布先验猜结构。

训练目标:最常见的是预测噪声

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

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

这行式子在说:随机取干净图 x0x_0、随机噪声 ϵ\epsilon、随机时间步 tt,构造 xtx_t,然后让模型预测噪声;预测噪声和真实噪声越接近,损失越小。

符号含义:

符号 含义
Lϵ\mathcal{L}_{\epsilon} 噪声预测损失
Ex0,ϵ,t\mathbb{E}_{x_0,\epsilon,t} 对训练图、噪声和时间步取平均
ϵ\epsilon 真实噪声
ϵθ(xt,t)\epsilon_\theta(x_t,t) 模型根据 xt,tx_t,t 预测的噪声
22\|\cdot\|_2^2 平方误差
θ\theta 模型参数

为什么预测噪声有用?因为 xtx_t 是“原图 + 噪声”的混合。如果模型知道噪声是哪一部分,就能把噪声减掉,反推出更干净的图像。

更准确地说,模型预测出的 ϵ^\hat{\epsilon} 不会孤零零地“涂掉噪声”然后结束。它会被采样器拿去计算两件事:第一,当前 xtx_t 对应的干净图估计 x^0\hat{x}_0;第二,从当前噪声水平走到更低噪声水平时,下一步样本应该落在哪里。

可以先把一次反向更新理解成这条小流水线:

1
2
3
4
x_t -> model predicts eps_hat
-> convert eps_hat into x0_hat
-> sampler combines x0_hat, eps_hat and next noise level
-> x_{t-1} or a skipped lower-noise state

也就是说,训练学到的是“局部去噪答案”,采样器负责把这个答案变成实际移动的一步。

从噪声预测恢复干净图

由闭式加噪公式可以反解出干净图估计:

x^0=xt1αˉtϵ^αˉt\hat{x}_0 = \frac{x_t-\sqrt{1-\bar{\alpha}_t}\hat{\epsilon}} {\sqrt{\bar{\alpha}_t}}

这行式子在说:从带噪图 xtx_t 中减掉模型估计的噪声部分,再除以信号权重,就得到干净图估计 x^0\hat{x}_0

符号含义:

符号 含义
x^0\hat{x}_0 模型间接恢复出的干净图
xtx_t 当前带噪图
ϵ^\hat{\epsilon} 模型预测的噪声
αˉt\bar{\alpha}_t 累计信号保留比例

这个式子也解释了为什么同一个模型输出在采样器里经常被来回转换:模型可能预测 ϵ\epsilon,采样器却需要 x^0\hat{x}_0 来更新下一步。

如果用确定性的 DDIM 思路看,下一步可以粗略写成:

xt=αˉtx^0+1αˉtϵ^,t<tx_{t'} = \sqrt{\bar{\alpha}_{t'}}\hat{x}_0 + \sqrt{1-\bar{\alpha}_{t'}}\hat{\epsilon}, \qquad t' < t

这里 tt' 可以是相邻的 t1t-1,也可以是跳过若干时间步后的更低噪声位置。这行式子的含义很直接:先用模型输出估计“这张图应该是什么” x^0\hat{x}_0,再按下一噪声水平 tt' 重新混合少量噪声方向 ϵ^\hat{\epsilon},得到更干净的状态。DDPM 会在这个基础上再加入随机项;DPM-Solver、Euler、Heun 等则用更复杂的数值规则减少走偏。

反向过程:模型学的是局部转移

理想的生成方向可以写成:

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

这行式子在说:生成从一个简单噪声分布 p(xT)p(x_T) 开始,然后不断使用模型学习到的局部反向转移 pθ(xt1xt)p_\theta(x_{t-1}\mid x_t),最后得到 x0x_0

符号含义:

符号 含义
pθp_\theta 模型学习的反向生成分布
p(xT)p(x_T) 起点噪声分布,通常是标准高斯
pθ(xt1xt)p_\theta(x_{t-1}\mid x_t) 从当前噪声状态走向更干净状态的局部规则
t=1T\prod_{t=1}^{T} 把每一步反向转移连起来

很多实现会把反向一步写成高斯分布:

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

这行式子在说:给定当前 xtx_t,模型决定下一步 xt1x_{t-1} 的均值和方差。实际工程里常固定或简化方差,重点学习均值,而均值可以由噪声预测推出来。

这条 N\mathcal{N} 也按同样顺序读:第 1 个位置 xt1x_{t-1} 是要生成的更干净样本;第 2 个位置 μθ(xt,t)\mu_\theta(x_t,t) 是模型预测的反向均值;第 3 个位置 Σθ(xt,t)\Sigma_\theta(x_t,t) 是这一步反向采样的不确定性或协方差。

三种常见预测坐标

6.1 预测噪声 ϵ\epsilon

ϵ^=ϵθ(xt,t)\hat{\epsilon}=\epsilon_\theta(x_t,t)

这行式子在说:模型直接猜当前图里混入了什么噪声。它是 DDPM 最经典的训练坐标,实现简单、监督明确。

适合先学它,因为它和闭式加噪公式天然对应:训练时我们知道真实噪声 ϵ\epsilon,所以可以直接做回归。

6.2 预测原图 x0x_0

x^0=x0,θ(xt,t)\hat{x}_0=x_{0,\theta}(x_t,t)

这行式子在说:模型不猜噪声,而是直接猜干净图。它更符合人类直觉,但高噪声时 xtx_tx0x_0 相距很远,直接回归会更难。

6.3 预测 velocity vv

常见定义为:

v=αtϵσtx0v=\alpha_t\epsilon-\sigma_t x_0

这行式子在说:vv 同时混合了噪声 ϵ\epsilon 和干净图 x0x_0 的信息,可以理解为沿“信号到噪声”路径移动的速度方向。

符号含义:

符号 含义
vv velocity 目标,不是视频物体速度,而是数据空间里的路径方向
αt\alpha_t 信号权重
σt\sigma_t 噪声标准差或噪声权重
ϵ\epsilon 真实噪声
x0x_0 干净图

很多 latent diffusion 和视频扩散方法喜欢 vv-prediction,因为它在高噪声和低噪声两端更平衡,和少步采样也更容易配合。

但这里要分清两层含义:在普通扩散的 vv-prediction 里,模型输出的 v^\hat{v} 通常先被换算回 x^0\hat{x}_0ϵ^\hat{\epsilon},再交给 DDIM、DDPM、DPM-Solver 等采样器更新下一步;在 Flow Matching / Rectified Flow 里,模型预测的 velocity 常常直接就是 ODE 右边的速度场,采样时可以按“当前位置 + 步长 × 速度”积分前进。

ELBO 在这里扮演什么角色

DDPM 原论文从变分下界(ELBO)推导训练目标。初学时可以先这样理解:

  • ELBO 是概率模型里用来训练隐变量模型的一种目标;
  • 在 DDPM 的高斯设定和参数化下,复杂的 ELBO 项可以化成很多时间步上的去噪回归;
  • 实践中最常见的简化版本就是前面的噪声预测 MSE。

也就是说,ELBO 给了理论来源,但入门时更重要的是先理解:我们知道自己加了什么噪声,所以能训练模型把它预测出来。

一次训练 step 长什么样

1
2
3
4
5
6
7
def train_step(model, x0):
t = sample_timestep()
eps = randn_like(x0)
xt = sqrt(alpha_bar[t]) * x0 + sqrt(1 - alpha_bar[t]) * eps
eps_pred = model(xt, t)
loss = mse(eps_pred, eps)
return loss

这段伪代码对应本页全部主线:

  1. 取干净图 x0x_0
  2. 随机取时间步 tt
  3. 随机取噪声 ϵ\epsilon
  4. 用闭式公式构造 xtx_t
  5. 让模型预测噪声。
  6. 用平方误差训练。

和下一页的关系

这一页解释了“模型怎么学会去噪”。下一页 噪声日程与参数化 会继续问:时间步 tt 怎么安排?βt\beta_tαˉt\bar{\alpha}_t、SNR 为什么会影响训练难度?为什么预测 ϵ\epsilonx0x_0vv 虽然能相互转换,训练效果却不完全一样?

进阶理解

真实大模型训练还会遇到数据质量、caption 质量、分辨率分桶、loss weighting、EMA、混合精度和分布覆盖问题。但这些工程细节都建立在本页的核心训练题目上:随机加噪,再让模型预测可用于去噪的目标。

本页结论

扩散训练的关键不是让模型直接生成完整图片,而是让它在许多噪声水平上反复练习局部去噪。闭式加噪公式负责高效造题,噪声预测损失负责给模型明确答案,反向采样则在推理时把这些局部能力连成完整生成过程。

下一站
  • 回到本专题入口:扩散模型,确认这页在整条路线中的位置。
  • 按导航顺序继续:噪声日程与参数化
  • 概念或符号卡住时,先查 术语表,再回到当前页。
  • Title: 扩散模型:扩散训练与表示
  • Author: Charles
  • Created at : 2025-05-17 09:00:00
  • Updated at : 2025-05-17 09:00:00
  • Link: https://charles2530.github.io/2025/05/17/ai-files-diffusion-training/
  • License: This work is licensed under CC BY-NC-SA 4.0.
Comments