1.2 前向过程与噪声日程¶
所属章节:第 1 章 扩散模型基础
课时:90 分钟
前置:1.1 生成模型全景
对应面试题:D5(前向部分)、D10(主)、A3(重参数)
一句话目标:学完能独立推导 \(q(x_t\mid x_0)\),解释 \(\beta_t\)、\(\bar\alpha_t\)、SNR 的关系,并回答“为什么噪声幅度不一致”。
1. 学习目标¶
学完本节,你应该能够:
- 写出 DDPM 的前向转移和马尔可夫链;
- 解释 重参数化技巧,并说明它在 VAE 和 Diffusion 中的不同用法;
- 推导 闭式边缘分布 \(q(x_t\mid x_0)\);
- 计算 给定 schedule 下的 \(\bar\alpha_t\)、信号/噪声系数和 SNR;
- 解释 为什么每步加噪幅度不一致,以及 schedule 的作用;
- 比较 linear、cosine、zero terminal SNR 等 schedule;
- 用 90 秒回答 D10 和 A3。
2. 为什么这一节是 DDPM 的入口¶
DDPM 的所有公式都建立在一个非常简单的操作上:
每一步,把上一时刻的数据乘上一个略小于 1 的系数,再加上一点高斯噪声。
但面试不会只问“怎么加噪”,而是会追问:
- 为什么 \(x_t\) 可以直接从 \(x_0\) 采样?
- 为什么 \(\beta_t\) 要变化?
- \(\bar\alpha_t\) 到底是什么?
- 重参数化在这里有什么用?
- 噪声 schedule 怎么选?
这一节把这些问题一次讲清。学完它,你才能进入反向过程和 ELBO。
3. 记号:不要被符号吓到¶
| 符号 | 含义 | 直觉 |
|---|---|---|
| \(x_0\) | 真实数据 | 一张图/一个样本 |
| \(x_t\) | 第 \(t\) 步加噪后的数据 | 越来越像噪声 |
| \(T\) | 总步数 | 通常 1000 |
| \(\beta_t\) | 第 \(t\) 步的噪声方差 | 每步加多少噪声 |
| \(\alpha_t\) | \(1-\beta_t\) | 保留多少信号 |
| \(\bar\alpha_t\) | \(\prod_{s=1}^t\alpha_s\) | 从 \(x_0\) 到 \(x_t\) 累计保留多少信号 |
| \(\epsilon\) | 标准高斯噪声 | \(\mathcal N(0,I)\) |
核心关系:
一句话:\(\beta_t\) 是“每一步的噪声增量”,\(\bar\alpha_t\) 是“累计信号保留率”。
4. 前向过程:马尔可夫加噪链¶
DDPM 定义:
用重参数化写:
整个链:
为什么叫“马尔可夫”?
- 给定 \(x_{t-1}\),\(x_t\) 只依赖它,不依赖更早的历史;
- 所以可以逐步写成一阶链;
- 但边缘 \(q(x_t\mid x_0)\) 仍然是高斯的,可以一步采样。
5. 重参数化技巧:把随机性剥离出去¶
5.1 一般形式¶
若:
直接采样 \(z\) 不可导。改写成:
这样:
- 随机性全部来自 \(\epsilon\);
- \(\mu,\sigma\) 通过确定性变换进入 \(z\);
- 梯度可以对 \(\mu,\sigma\) 反传:
5.2 在 VAE 中¶
编码器输出 \(\mu,\sigma\),采样:
这让 ELBO 的重建项可以对编码器求导。
5.3 在 Diffusion 中¶
前向加噪:
同样是“确定性缩放 + 标准噪声”。它让:
- 任意时刻 \(x_t\) 可以直接从 \(x_0\) 采样;
- 训练目标可以写成对 \(\epsilon\) 的回归;
- 不需要逐步模拟整条链。
5.4 和 VQ-VAE 的区别¶
- VAE/Diffusion:连续高斯,重参数化是无偏的路径导数;
- VQ-VAE:离散选择,不能用普通重参数化,通常用 straight-through estimator(有偏)。
面试要点:重参数化不是“把参数重新定义”,而是“把随机性移到外部噪声 \(\epsilon\)”。
6. 闭式边缘分布:为什么能一步采样¶
我们想证明:
即:
6.1 两步推导¶
先看 \(t=2\):
代入:
两个独立高斯相加,方差相加:
所以:
6.2 归纳到 \(t\)¶
假设:
则:
方差合并:
因此:
这就是“任意时刻一步采样”的来源。
6.3 一个容易忽略的点¶
如果 \(x_0\) 已经归一化到单位方差,那么:
信号方差 \(\bar\alpha_t\) 和噪声方差 \(1-\bar\alpha_t\) 加起来是 1。这就是“方差保持(variance-preserving)”的含义。
7. SNR 与“为什么噪声幅度不一致”¶
7.1 信号系数、噪声系数、SNR¶
由:
定义:
- 信号系数:\(\sqrt{\bar\alpha_t}\);
- 噪声系数:\(\sqrt{1-\bar\alpha_t}\);
- 信噪比:
随着 \(t\) 增大:
- \(\bar\alpha_t\) 单调下降;
- 信号系数下降;
- 噪声系数上升;
- SNR 单调下降。
7.2 数值例子¶
取一个 4 步的玩具 schedule:
则:
累计:
| \(t\) | \(\beta_t\) | \(\bar\alpha_t\) | 信号系数 \(\sqrt{\bar\alpha_t}\) | 噪声系数 \(\sqrt{1-\bar\alpha_t}\) | SNR |
|---|---|---|---|---|---|
| 1 | 0.1 | 0.9 | 0.949 | 0.316 | 9.00 |
| 2 | 0.2 | 0.72 | 0.849 | 0.529 | 2.57 |
| 3 | 0.3 | 0.504 | 0.710 | 0.704 | 1.02 |
| 4 | 0.4 | 0.3024 | 0.550 | 0.835 | 0.43 |
观察:
- 第 1 步噪声很小,信号还很清晰;
- 第 3 步 SNR 接近 1,信号和噪声势均力敌;
- 第 4 步噪声已经大于信号;
- 到更晚的时刻,\(\bar\alpha_t\to0\),\(x_t\) 趋近标准高斯。
7.3 为什么每步 \(\beta_t\) 不一样¶
有三个层面的原因:
- 课程学习:早期图像结构清晰,应该加小噪声,让模型先学细节;后期需要破坏结构,让 \(x_T\) 接近高斯,所以加大噪声。
- SNR 平滑下降:训练时 \(t\) 通常均匀采样。如果某个区间 SNR 变化太剧烈,模型在该区间学不好。schedule 控制的是“难度曲线”。
- 端点匹配:\(t=T\) 时希望 \(x_T\approx\mathcal N(0,I)\),否则反向采样从标准高斯开始就不匹配。
7.4 “幅度不一致”到底指什么¶
容易混淆的两个层次:
- 每步增量:\(\beta_t\) 从 \(10^{-4}\) 增到 \(0.02\),这是“每步加多少”;
- 累计噪声:\(\sqrt{1-\bar\alpha_t}\) 从 0 增到 1,这是“总共加了多少”。
面试时要说清:\(\beta_t\) 是每步方差,\(\bar\alpha_t\) 是累计信号保留率,\(1-\bar\alpha_t\) 是累计噪声方差。
7.5 如果 \(\beta_t\) 取常数会怎样¶
理论上也能定义一个扩散过程,但 SNR 轨迹不同:
- 可能早期噪声太大,细节被破坏;
- 也可能后期噪声不够,\(x_T\) 不接近标准高斯;
- 实际效果通常不如精心设计的 schedule。
所以 schedule 不是理论强制,而是工程/优化上的设计选择。
8. 常见噪声 schedule¶
8.1 线性 schedule¶
DDPM 原始:
常见 \(\beta_1=10^{-4}\),\(\beta_T=0.02\),\(T=1000\)。
特点:
- 简单;
- 高分辨率/大 \(T\) 时,两端 SNR 变化可能不够平滑。
8.2 Cosine schedule¶
定义:
其中 \(s\) 是小偏移(如 0.008),避免 \(t=0\) 时导数太小。
特点:
- SNR 下降更平滑;
- 在中段保留更多信号;
- 常用于改善生成质量。
8.3 Scaled linear / sigmoid¶
Stable Diffusion 常用 scaled linear:
- \(\beta\) 从约 \(0.00085\) 到 \(0.012\);
- 用平方根缩放;
- 配合
leading时间步间隔。
不同实现细节不同,面试时不必背具体数值,但要知道schedule 影响 SNR 轨迹。
8.4 Zero Terminal SNR¶
标准 schedule 在 \(t=T\) 时 \(\bar\alpha_T\) 往往很小但不严格为 0,导致训练/推理端点不完全一致。Zero terminal SNR 强制:
让最后一步信号完全消失,\(x_T\) 严格为标准高斯。常配合 \(v\)-prediction 使用。
特点:
- 改善高噪声端的行为;
- 减少“训练时 \(x_T\) 不是纯噪声”的 mismatch;
- 与 Offset Noise 解决的是不同问题。
8.5 一张表¶
| schedule | 特点 | 常见场景 |
|---|---|---|
| Linear | 简单、原始 | DDPM 基线 |
| Cosine | SNR 更平滑 | 图像生成改进 |
| Scaled linear | SD 常用 | Stable Diffusion |
| Zero terminal SNR | 端点严格匹配 | 高噪声端稳定训练 |
| Karras sigma | 采样时步长更合理 | 采样器配置 |
9. 90 秒回答:为什么 DDPM 加噪幅度不一致¶
面试官问:为什么 DDPM 加噪声的幅度是不一致的?
参考回答:
“因为 DDPM 的 \(\beta_t\) 是一个 schedule,不是常数。前向过程是 \(x_t=\sqrt{\alpha_t}x_{t-1}+\sqrt{\beta_t}\epsilon\),展开后 \(x_t=\sqrt{\bar\alpha_t}x_0+\sqrt{1-\bar\alpha_t}\epsilon\)。随着 \(t\) 增大,信号系数 \(\sqrt{\bar\alpha_t}\) 下降,噪声系数 \(\sqrt{1-\bar\alpha_t}\) 上升,SNR 从大变小。这样设计是为了让早期小噪声保留结构、后期大噪声把数据破坏成标准高斯,同时让训练难度平滑变化。\(\beta_t\) 是每步噪声方差,\(1-\bar\alpha_t\) 是累计噪声方差,两者不要混。”
结构:
- 先纠正:\(\beta_t\) 是 schedule;
- 公式:展开后的信号/噪声系数;
- 原因:早期/后期/SNR;
- 区分:每步增量 vs 累计噪声。
10. 90 秒回答:重参数技巧是什么¶
面试官问:重参数技巧是什么?
参考回答:
“重参数化是把随机采样写成‘确定性变换 + 外部噪声’。比如 \(z\sim\mathcal N(\mu,\sigma^2)\),直接采样不可导;写成 \(z=\mu+\sigma\odot\epsilon\),\(\epsilon\sim\mathcal N(0,I)\),随机性就只来自 \(\epsilon\),梯度可以对 \(\mu,\sigma\) 反传。VAE 用它训练编码器;Diffusion 的前向加噪也是同一个技巧,所以 \(x_t\) 可以直接从 \(x_0\) 采样,训练目标可以写成对噪声的回归。注意 VQ-VAE 的离散选择不能用普通重参数化,通常用 straight-through。”
11. 常见误区¶
- 把 \(\beta_t\) 当成 \(x_t\) 的方差:\(\beta_t\) 是每步增量;\(x_t\) 的噪声方差是 \(1-\bar\alpha_t\)。
- 把 \(\bar\alpha_t\) 当成累加:它是累乘。
- 认为 \(\beta_t\) 必须递增:线性 schedule 是递增的,但理论上可以有别的形状;关键是 SNR 轨迹。
- 忘记 \(x_0\) 归一化:方差保持的推导依赖 \(x_0\) 的单位方差。
- 把重参数化和 straight-through 混为一谈:前者无偏,后者有偏。
- 把“噪声幅度”与“噪声方差”混用:口语可以,但公式里要区分。
12. 课堂练习¶
答案见 06-章节练习与答案。
- 用归纳法证明 \(q(x_t\mid x_0)\) 是高斯。
- 取 \(\beta=[0.1,0.2,0.3,0.4]\),计算 \(\bar\alpha_t\)、SNR,并判断哪一步 SNR 最接近 1。
- 若 \(\bar\alpha_t=0.5\),\(x_0=1\),\(\epsilon=0.2\),求 \(x_t\)。
- 解释:为什么 \(t=T\) 时希望 \(x_T\approx\mathcal N(0,I)\)?
- 如果 \(\beta_t\) 取常数,SNR 曲线会怎样?有什么潜在问题?
- 用 90 秒回答“为什么加噪幅度不一致”。
13. 自测清单¶
- [ ] 能写出前向转移和马尔可夫链;
- [ ] 能解释重参数化;
- [ ] 能推导 \(q(x_t\mid x_0)\);
- [ ] 能计算 \(\bar\alpha_t\) 和 SNR;
- [ ] 能解释 \(\beta_t\) 与 \(1-\bar\alpha_t\) 的区别;
- [ ] 能说出 3 种 schedule;
- [ ] 能 90 秒回答 D10;
- [ ] 能 90 秒回答 A3。
14. 本节材料为什么这样设计¶
- 先讲记号:很多卡壳不是数学难,而是符号混。
- 两步推导 + 归纳:比直接甩公式更容易内化。
- 数值例子:让 SNR 从抽象概念变成可感知的曲线。
- schedule 对比:面试常问“怎么选”,不能只知道线性。
- 90 秒回答:把推导压缩成面试语言。
- 不写代码:本节重点是推导和直觉,代码不是必需。
详细设计理由见 08-材料设计理由。