第 1 章材料设计理由¶
这份文档回答三个问题:
为什么选这些内容?学完能做什么?不学/不做会缺什么?
也给出可修改点,方便你提出新需求。
1. 先明确项目定位¶
这个项目不是“从零实现 Diffusion 的工程课”,而是:
以面试表达为目标的 Diffusion/AIGC 学习课堂。
因此第 1 章的材料选择遵循四条约束:
- 不写完整 DDPM 代码:代码会占用大量时间,但不直接提升面试表达;
- 不训练模型:训练调参属于工程课,不是本章目标;
- 公式必须能白板推:面试会追问“为什么”,不能只背结论;
- 每份材料都要有输出:复述、推导、对比、练习,而不是“看过”。
这也解释了一个取舍:我们保留伪代码/流程,但不提供可运行实现。
伪代码用于理解训练/采样在做什么;完整实现留给“可选扩展”,不影响主线。
2. 一页纸材料地图¶
| 材料 | 为什么选 | 学完能做什么 | 不做什么 |
|---|---|---|---|
| 1.1 生成模型全景 | 先建立坐标系,避免把 Diffusion 当孤立技巧 | 比较 GAN/VAE/Flow/Diffusion,回答“为什么 Diffusion 成为主流” | 不深入 GAN 训练技巧、不推 VAE 全部细节 |
| 1.2 前向过程与噪声日程 | D5 前半、D10 全部、A3 的核心 | 推导闭式边缘,解释 SNR/schedule,手算噪声水平 | 不实现训练循环、不调参 |
| 1.3 反向过程与 DDPM 损失 | D5 后半、D9 的理论闭环 | 推后验、ELBO、噪声预测、采样 | 不做完整 ELBO 代数、不写代码 |
| 1.4 扩散变体与非高斯噪声 | D2 的完整回答,Flow 的铺垫 | 解释“可以换噪声”及代价,比较 Cold/D3PM/Flow | 不实现离散扩散、不训练 Flow |
| 05 面试题库 | 把知识压缩成面试语言 | 90 秒回答 6 道核心题,接两层追问 | 不覆盖所有 AIGC 题 |
| 06 练习与答案 | 用输出检查理解,不靠“感觉会了” | 手算、推导、概念辨析 | 不做编程题 |
| 07 讲师手册 | 让材料可授课、可控制节奏 | 按 90 分钟组织课堂、板书、互动 | 不是学生必读 |
| 08 材料设计理由 | 解释取舍,方便你改需求 | 判断哪些该加/删/加深 | 不是知识点讲义 |
3. 每份材料的详细理由¶
3.1 为什么先讲“生成模型全景”(1.1)¶
选择理由:
- 面试问 D6 时,考的不是“扩散定义”,而是“你能不能把 Diffusion 放进生成模型版图”;
- 如果直接推 DDPM,学生容易“会算但不会比较”;
- 四路线对比表是最容易复用的一张复习卡。
学到什么:
- 三种建模语言:显式密度、隐式密度、score;
- GAN/VAE/Flow/Diffusion 的训练目标与采样方式;
- Diffusion 的“稳定、可扩展、可控、但慢”从哪来;
- DDPM 与 LDM 的区别。
能处理什么:
- “GAN 和 Diffusion 的区别”;
- “为什么 Diffusion 成为文生图主流”;
- “Diffusion 和 VAE 什么关系”;
- “DDPM 和 Stable Diffusion 是一回事吗”。
为什么不做:
- 不展开 GAN 的 WGAN-GP、StyleGAN;
- 不推 VAE 的完整 ELBO(1.3 会推扩散的 ELBO,VAE 只做对比);
- 不写代码。
取舍:这一节是“地图”,不是“景点”。先把坐标建好,后面再深入。
3.2 为什么先讲前向过程(1.2)¶
选择理由:
- DDPM 的所有公式都从 \(q(x_t\mid x_{t-1})\) 开始;
- D10 是一道很容易答浅的题,必须用 SNR 和 schedule 讲透;
- 重参数化是 VAE/Diffusion 的共同基础,A3 常考。
学到什么:
- 马尔可夫加噪链;
- 重参数化的本质;
- 闭式边缘 \(q(x_t\mid x_0)\) 的推导;
- \(\beta_t\)、\(\bar\alpha_t\)、SNR 的关系;
- linear/cosine/zero terminal SNR 的差异;
- 手算噪声水平。
能处理什么:
- “为什么 \(x_t\) 能一步采样”;
- “为什么加噪幅度不一致”;
- “重参数技巧是什么”;
- “噪声 schedule 怎么选”;
- “\(\beta_t\) 和 \(1-\bar\alpha_t\) 有什么区别”。
为什么不做:
- 不实现 schedule 代码;
- 不调参;
- 不展开 SDE。
取舍:这一节用“两步推导 + 数值例子”代替代码实验。数值例子同样能建立直觉,而且更适合面试复述。
3.3 为什么把后验和 ELBO 放在一起(1.3)¶
选择理由:
- 后验是 DDPM 推导的转折点:没有后验,就无法把“学分布”变成“学均值”;
- ELBO 是面试官判断“你是真懂还是背公式”的分水岭;
- 噪声预测、采样公式都从这两步来。
学到什么:
- 真实后验的均值和方差;
- ELBO 三项的含义;
- 固定方差时 KL 只依赖均值;
- 从后验均值到噪声预测;
- \(\mathcal L_{\mathrm{simple}}\) 与 ELBO 的关系;
- 训练/采样流程;
- \(\epsilon\)/\(x_0\)/\(v\) 的区别。
能处理什么:
- “推演 DDPM”;
- “为什么后验是高斯”;
- “为什么预测噪声”;
- “\(\mathcal L_{\mathrm{simple}}\) 是精确 ELBO 吗”;
- “采样最后一步为什么加 0”;
- “实现 DDPM 需要什么条件”。
为什么不做:
- 不写完整代码;
- 不展开所有配方代数;
- 不讨论分布式训练/显存优化。
取舍:保留“能白板写出来”的推导链条,删掉“工程实现细节”。这正是面试所需。
3.4 为什么讲非高斯与 Flow(1.4)¶
选择理由:
- D2 是区分“背过”和“理解”的题;
- 只讲高斯,会让学生误以为“扩散=高斯”;
- Flow Matching 是 SD3 的基础,必须提前铺垫;
- Cold Diffusion/D3PM 能展示知识边界。
学到什么:
- 高斯在 DDPM 中的“便利性”角色;
- 换噪声要改的五个环节;
- Cold Diffusion 的“退化—恢复”视角;
- D3PM 的离散转移;
- Flow Matching 与 DDPM 的相同/不同;
- 为什么工程默认高斯。
能处理什么:
- “能否使用其他噪声”;
- “为什么不用均匀噪声”;
- “Cold Diffusion 和 DDPM 的区别”;
- “Flow Matching 是不是 Diffusion”;
- “离散 token 用什么扩散”。
为什么不做:
- 不实现 D3PM;
- 不训练 Flow;
- 不展开概率流 ODE 的数学。
取舍:这一节是“边界课”,目标是知道“有什么、为什么、代价是什么”,不是“会实现”。
3.5 为什么单独做面试题库(05)¶
选择理由:
- 知识会了 ≠ 面试能说;
- 90 秒回答需要压缩、结构化;
- 追问需要提前准备。
学到什么:
- 6 道核心题的 90 秒版本;
- 追问树;
- 15 分钟模拟面试流程;
- 评分维度。
能处理什么:
- 面试开场/追问;
- 压力下保持结构;
- 不会时诚实回答。
为什么不做:
- 不覆盖第 2–7 章的所有题;
- 不提供“逐字稿”,避免死背。
取舍:给结构和关键词,不鼓励背全文。
3.6 为什么做纸面练习(06)¶
选择理由:
- 看懂 ≠ 会推;
- 计算题能暴露“符号混”“累乘错”“SNR 不熟”;
- 不写代码也能有效检查。
学到什么:
- 手算 \(\bar\alpha_t\)、SNR;
- 推导后验/ELBO;
- 辨析概念;
- 面试复述自评。
能处理什么:
- 白板推导;
- 面试中的数值追问;
- 快速判断自己哪里不会。
为什么不做:
- 不做编程题;
- 不要求跑实验。
取舍:用“纸笔 + 口述”替代“代码 + 训练”,更符合面试场景。
3.7 为什么需要讲师手册(07)¶
选择理由:
- 有材料不等于能上课;
- 90 分钟需要节奏、板书、互动;
- 讲师要知道哪里停、哪里追问。
学到什么(对讲师):
- 四节课的时间安排;
- 板书布局;
- 关键提问;
- 学生常见卡点;
- 课堂禁忌。
能处理什么:
- 线下/线上授课;
- 60/90/120 分钟适配;
- 根据学生基础调整深度。
4. 为什么没有 DDPM 完整代码¶
这是本次修改的核心。原因有四条:
4.1 目标不匹配¶
面试主要考:
- 你能不能解释公式;
- 你能不能比较方法;
- 你能不能做取舍;
- 你能不能把项目讲清楚。
完整代码主要训练:
- 工程实现;
- debug;
- 调参;
- 性能优化。
两者有重叠,但不是同一件事。
4.2 时间成本高¶
写一个“能跑”的 DDPM 需要:
- 数据管线;
- 网络;
- 时间步编码;
- 训练循环;
- 采样;
- 调参;
- 可视化。
这些时间足以把第 1 章所有推导练三遍。
4.3 容易产生“假会”¶
跑通代码不等于理解:
- 可以抄一个实现,但讲不清后验;
- 可以调包生成图,但答不出“为什么预测噪声”;
- 可以训练,但说不清 ELBO。
4.4 代码会挤占表达训练¶
面试是“说”和“写”的结合。把时间花在环境/依赖/debug 上,反而减少白板推导和模拟面试的时间。
结论:本章不提供完整 DDPM 代码;只提供算法流程和伪代码级理解。
如果以后需要工程实现,可以作为“可选扩展”,不放进主线。
5. “学什么 → 能处理什么”总表¶
| 学完 | 能处理的问题 | 能做的动作 |
|---|---|---|
| 1.1 | D6、为什么 Diffusion 主流、DDPM vs LDM | 画对比表、讲 90 秒 |
| 1.2 | D10、A3、前向闭式、schedule | 推导、手算、解释 SNR |
| 1.3 | D5、D9、后验、ELBO、采样 | 白板推导、2 分钟回答 |
| 1.4 | D2、Cold/D3PM/Flow | 比较、判断适用场景 |
| 05 | 面试追问 | 90 秒回答、追问树 |
| 06 | 自我检查 | 手算、推导、错题归因 |
6. 这份材料不覆盖什么¶
为了避免误解,明确边界:
- 不覆盖 score SDE 的完整数学;
- 不覆盖 分布式训练/显存优化;
- 不覆盖 数据管线/模型部署;
- 不覆盖 SD/SDXL/SD3 的工程细节(后续章节);
- 不覆盖 完整代码实现;
- 不覆盖 最新论文的全面综述。
这些不是“不重要”,而是“不属于第 1 章的面试主线”。
7. 你可以怎么改(新需求菜单)¶
如果你觉得某部分太浅/太深,可以直接按下面选项提:
7.1 加深数学¶
- 加 Fokker–Planck / SDE 推导;
- 加 score matching 的详细推导;
- 加 ELBO 的完整代数;
- 加 zero terminal SNR 的数学。
7.2 增加代码(可选)¶
- 只给 20 行伪代码;
- 给一个 notebook,但不要求运行;
- 给一个“代码阅读题”,不写实现。
7.3 增加面试训练¶
- 增加 50 题题库;
- 增加压力面试/追问脚本;
- 增加英文面试版;
- 增加白板推导视频脚本。
7.4 调整课程形态¶
- 60 分钟精简版;
- 120 分钟深度版;
- 4 次课改成 2 次课;
- 增加章节小测/结课项目(非代码)。
7.5 调整内容比例¶
- 少讲 GAN/VAE,多讲 DDPM;
- 少讲非高斯,多讲 schedule;
- 增加 Flow Matching;
- 增加论文精读。
建议改动时保持一个原则:每增加一个内容,就删掉一个低优先级内容,否则 90 分钟装不下。
8. 怎么判断“学会了”¶
四个层次:
L1 能复述¶
- 能用自己的话讲 3 分钟;
- 不追求公式,但逻辑不错。
L2 能推导¶
- 能白板写出前向、后验、ELBO、采样;
- 能解释每一步为什么。
L3 能比较¶
- 能对比 DDPM/DDIM/Flow/Cold;
- 能说出适用场景和代价。
L4 能应对追问¶
- 能接住“为什么后验是高斯”“为什么预测噪声”“为什么默认高斯”;
- 不会时能诚实说“不确定”,并给出推理。
本章目标是 L2–L3,面试冲刺目标是 L4。
9. 最后一句话¶
这份材料的价值,不是“覆盖所有知识”,而是用最少的内容,建立一条能从公式走到面试表达的路径。
如果你只记住一件事:先能白板推,再能 90 秒讲,最后能接追问。