跳转至

第 1 章材料设计理由

这份文档回答三个问题:
为什么选这些内容?学完能做什么?不学/不做会缺什么?
也给出可修改点,方便你提出新需求。


1. 先明确项目定位

这个项目不是“从零实现 Diffusion 的工程课”,而是:

以面试表达为目标的 Diffusion/AIGC 学习课堂。

因此第 1 章的材料选择遵循四条约束:

  1. 不写完整 DDPM 代码:代码会占用大量时间,但不直接提升面试表达;
  2. 不训练模型:训练调参属于工程课,不是本章目标;
  3. 公式必须能白板推:面试会追问“为什么”,不能只背结论;
  4. 每份材料都要有输出:复述、推导、对比、练习,而不是“看过”。

这也解释了一个取舍:我们保留伪代码/流程,但不提供可运行实现。
伪代码用于理解训练/采样在做什么;完整实现留给“可选扩展”,不影响主线。


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 秒讲,最后能接追问。