跳转到内容

扩散模型教程第9章:迷你实验与选型清单

本章是系列第 9 章(收尾章):不讲新理论,而是用三个 CPU 就能跑的玩具脚本把前八章的机制、旋钮、评估变成肌肉记忆,再用一张 Go/No-Go 清单把整个系列的选型纪律落到你自己的课题上。 前置:第 2 章(加噪机制)、第 6 章(采样步数)、第 7 章(四层评估与选型)。本章是它们的动手验证。 配套脚本:本章代码在 content/inbox/diffusion-models-ch09-diffusers-lab/scripts/,CPU 即可运行。

学完本章并跑完三个实验,你应能:

  1. 亲眼看到 linear 与 cosine 噪声调度的 αˉt\bar\alpha_t 曲线差异,把第 2 章的公式变成图像直觉。
  2. 在 2D 玩具 DDPM 上复现「采样步数不够 → 模式粘连 / 糊成一团」的现象,把第 6 章的步数-质量权衡看在眼里。
  3. 用迷你评估仪表盘亲手制造出「L1 分布指标好、但 L3 下游任务差」的反例,把第 7 章「好看 ≠ 好用」验证一遍。
  4. 用 Go/No-Go 清单对自己的真实课题做一次开题自查。
  5. 说清「玩具能证明什么、不能证明什么」——避免拿 2D 结论去套真实生物任务。

字数与深度定位:动手收尾章(约 8500–12000 汉字)。讲新理论、追求生产级代码、要求 GPU。


2. 为什么收尾章是「动手」而不是「总结」

Section titled “2. 为什么收尾章是「动手」而不是「总结」”

学完前八章,你已经有了完整的概念地图:生成直觉(第 1 章)、加噪去噪机制(第 2、3 章)、与其他家族的对照(第 4 章)、五大机制族(第 5 章)、训练采样旋钮(第 6 章)、评估与选型(第 7 章)、生物落地(第 8 章)。但读懂 ≠ 会用。很多同学能背出「步数不够会糊」「FID 低不代表有用」,却从没亲眼见过它们长什么样——这种知识是脆的,一到真实项目就用不出来。

本章的设计哲学是:用最小的成本,把最容易「以为自己懂了」的三件事,变成亲眼见过、亲手做过的肌肉记忆。

三个实验对应的前置理论
实验对应理论你要带走的直觉脚本
1前向加噪、β schedule(第 2 章)「噪声如何一步步盖住信号」noise_schedule_viz.py
2反向采样、步数权衡(第 6 章)「20 步 vs 5 步长什么样」toy_ddpm_2d.py
3四层评估里的 L1/L3 缩微(第 7 章)「分布指标好 ≠ 下游好」eval_dashboard_toy.py
4选型纪律(第 7 章)开题一页纸diffusion_go_nogo_checklist.py + 文内表格

一个重要的边界:这一章刻意不用 diffusers 这类高层库。库很好用,但它把加噪、去噪、采样、评估都封装进了几行 API,你看不见里面在动什么。玩具脚本反过来——代码短到能逐行读懂,每个部件的因果一目了然。先在玩具上建立因果直觉,再去用库,你才知道每个参数在调什么。 等你跑完本章,再回头用 diffusers 加载一个真实模型做消融,会顺畅得多。


三个脚本都为 CPU 设计,环境极简:

Terminal window
cd content/inbox/diffusion-models-ch09-diffusers-lab/scripts/
pip install -r requirements.txt

requirements.txt 只有三行:numpymatplotlibtorch。其中 numpy 和 matplotlib 支撑实验 1、3;torch 只被实验 2(2D 玩具 DDPM)用到,且只需 CPU 版。如果你暂时装不了 torch,实验 1、3 仍能独立跑通。

想先确认环境没问题,跑一遍冒烟脚本:

Terminal window
bash run_smoke.sh

它会依次跑三个实验(2D 玩具 DDPM 用减配参数快速过一遍),最后打印 SMOKE OK。看到这行,说明三个实验都能在你的机器上跑。

3.3 与强化学习动手阶段的最后一次边界对照

Section titled “3.3 与强化学习动手阶段的最后一次边界对照”

如果你也学过强化学习系列的动手章,这里再钉一次两者的根本差异——因为玩具实验最容易让人混淆「在看什么」:

强化学习玩具(如 CartPole)扩散玩具(本章 2D DDPM)
你盯着看的曲线回报曲线(reward 随训练上升)生成分布(散点云是否覆盖真实数据)
「成功」长什么样回报达到阈值、策略稳定生成点云覆盖所有模式、不崩不糊
失败的典型样子奖励黑客、训练发散mode collapse(只剩一个团)、步数不够糊成一片

一句话记忆:RL 玩具看「分数上没上去」,扩散玩具看「生成的分布对不对」。别把 reward 曲线的思维套到扩散上——扩散的 loss 下降根本不保证生成变好,这正是实验 3 要亲手演示的。


第 2 章讲过:前向过程按 βt\beta_t 逐步加噪,而看懂课表的关键量是 αˉt\bar\alpha_t(还剩多少信号)。很多同学停留在「就是加高斯噪声」——但加多少、加多快,直接决定训练难度和后期采样质量。这个实验让你亲眼看到两种最常见调度的信噪比曲线差异。

一句话类比β\beta schedule 像 PCR 的退火温度曲线——升温太猛(噪声加太快)模板碎了;太温吞则变性不彻底,后面酶(网络)不好工作。

步骤为什么需要关键参数怎么调调坏会怎样
选 schedule控制信噪比下降速度linear / cosine先两个都画出来对比linear 末端有时过噪;cosine 通常更顺
设 T扩散离散步数T=100~1000(玩具 200 即可)玩具小 T 方便画图T 太小,前向「不够纯噪」
αˉt\bar\alpha_t / SNR看见信号还剩多少αˉt=(1β)\bar\alpha_t=\prod(1-\beta)看曲线是否平滑降到近 0若很早归零 → 后期 t 信息量极低

只保留讲解用公式(必记含义,第 2 章讲过):

q(xtx0)=N(xt; αˉtx0, (1αˉt)I)q(x_t\mid x_0)=\mathcal{N}\big(x_t;\ \sqrt{\bar\alpha_t}\,x_0,\ (1-\bar\alpha_t)I\big)
  • αˉt\bar\alpha_t 接近 1:还很像原数据;
  • αˉt\bar\alpha_t 接近 0:基本是纯噪声;
  • 网络在不同 t 上难度不同:中间 t 往往信息与噪声拉锯最激烈
Terminal window
python noise_schedule_viz.py
# 输出:noise_schedule_compare.png(同目录)

脚本会画四个子图:linear/cosine 的 βt\beta_t 曲线、αˉt\bar\alpha_t 曲线、log10 信噪比下降曲线,以及一团 2D 点云在 cosine 调度下 t=0/T/4/T/2/T1t=0 / T/4 / T/2 / T-1 的逐步加噪散点。

预期

  • linear 与 cosine 的 αˉt\bar\alpha_t 都从约 1 降到约 0,但 cosine 通常在中段降得更「匀」
  • 对同一个 2D 点云示意,大 tt 时点云应接近各向同性高斯(融成一个圆团)。

常见失败

  • 图是空的 → 检查是否有写文件权限、是否在脚本目录运行;
  • 曲线不降 → β 写反或累乘实现错误(脚本已写好,若你改了代码先 diff)。

看图时具体盯什么:脚本输出的 noise_schedule_compare.png 有四个子图,按这个顺序读——先看左上的 βt\beta_t 曲线(每步新加多少噪声),linear 是直线上升、cosine 是先慢后快的弧线;再看右上的 αˉt\bar\alpha_t(累计还剩多少信号),这是最关键的一张,两条线都从 1 降到 0,重点比较它们「降到一半」发生在哪个 tt——linear 往往在 t0.3Tt\approx 0.3T 就腰斩,cosine 能拖到 t0.5Tt\approx 0.5T;然后看左下的 log-SNR 曲线(信噪比的对数),它把「中段拉锯区」放大得最清楚;最后看右下的双高斯点云在不同 tt 的加噪快照,直观感受「结构如何被噪声吞没」。把这四张图连起来看,你就把第 2 章的抽象公式变成了肌肉记忆——这正是这个不需要 GPU 的实验的全部价值。

真实任务这个实验帮你想清的问题
scRNA latent 扩散调度是否过早把稀有类型信号「洗没」?
病理 LDMlatent 空间的 schedule 是否与 VAE 动态范围匹配?
分子构象连续坐标对噪声尺度极敏感,过猛加噪会破坏键长几何先验
蛋白骨架扩散frame 空间的噪声(旋转 + 平移)也有自己的日程,别把图像 β 直搬(第 8 章)

这张表里藏着一个通用教训:调度不是一个可以「照搬默认」的次要超参。图像领域的 linear/cosine 是在自然图像的动态范围上调出来的,直接搬到 latent 空间、连续坐标、frame 空间往往水土不服——因为这些空间的「信号」和「噪声」的尺度关系完全不同。分子坐标尤其敏感:键长只有 1–1.5 Å 的量级,噪声尺度稍大就会把合理的化学几何冲垮。所以当你在一个新的生物模态上跑扩散、发现怎么调都学不好时,先回来画一下 αˉt\bar\alpha_t 曲线,确认调度和你的数据尺度匹配——这个实验一分钟就能做,却能省掉几天的瞎调。

  • 我能解释 αˉt\bar\alpha_t 从 1 到 0 的含义
  • 我能对比 linear vs cosine 的肉眼差异
  • 我知道 schedule 属于第 5 章四维度里「路径 / 离散化」相关的选择

自测:若 αˉt\bar\alpha_tt=T/4t=T/4 就接近 0,训练可能出现什么现象?(提示:大量时间步信息量极低,模型在容易的区间「摸鱼」,真正难的中段反而训不透。)


5. 实验二:2D 玩具 DDPM——步数如何换质量

Section titled “5. 实验二:2D 玩具 DDPM——步数如何换质量”

第 6 章的核心体感是:采样步数 = 质量与速度的主旋钮。真实病理图太重、蛋白结构太抽象,很难当场看出步数的影响。而 2D 双高斯 / 环形分布足够让你一眼看见「步数不够 → 模式粘连 / 糊成一团」。

一句话类比:多步去噪像把搅浑的培养液逐步透析回清澈;步数太少 = 一次硬滤,膜两侧浓度还没平衡就结束。

2D 玩具 DDPM 流程
项目默认为什么
数据双高斯混合(可切 ring / moons)一看就知道有没有 mode collapse
网络2→128→128→2 的 MLP + 时间嵌入CPU 分钟级可训
T100玩具够用
训练步约 3000–8000以「点云像样」为准,不追求极致
采样步5 / 20 / 100对齐第 6 章「步数敏感」叙事
优化器Adam, lr≈1e-3简单稳

讲解用损失(第 2 章回顾,必记含义):

L=Ex0,t,ϵϵϵθ(xt,t)2\mathcal{L}=\mathbb{E}_{x_0,t,\epsilon}\big\|\epsilon-\epsilon_\theta(x_t,t)\big\|^2

模型学的是:在带噪输入上,噪声长什么样;采样时一步步减噪。

参数怎么调调坏会怎样
steps(采样)5 → 20 → 100 扫5 步:两团粘、糊;过少可能只剩单模式
训练 iterations看真实 vs 生成散点过少欠拟合;过多玩具上易过拟合噪声
hidden64 / 128 / 256太小学不动复杂的环形分布
schedulelinear / cosine与实验 1 对照
Terminal window
python toy_ddpm_2d.py
# 输出:
# toy_ddpm_target.png — 真实数据
# toy_ddpm_steps_compare.png — 不同采样步数
# toy_ddpm_loss.png — 训练损失(辅助)

脚本支持命令行参数,方便你扫不同设置:

Terminal window
python toy_ddpm_2d.py --steps 5,20,100 --iters 5000 --data moons

建议的探索顺序(每步只改一个变量,对应第 6 章「不要越级调参」的纪律):先用默认参数跑一遍,确认 toy_ddpm_target.png 里的真实数据是你预期的形状;再固定训练不变,只扫 --steps 5,20,100,把三张采样图并排看——你应该能亲眼定位「悬崖」大概在几步。然后固定步数在 20,改 --data moons--data ring 换更难的分布,看 MLP 还撑不撑得住;如果环形分布学不出来,把 --hidden 从 128 加到 256 再试。整个过程不超过十几分钟,但你会对「步数、训练量、网络容量」三者如何互相牵制建立起手感——这种手感是任何文字描述都替代不了的。

预期

  • 100 步(或满 T):两团位置、方差大致对;
  • 20 步:通常已经「能看」——呼应第 6 章的默认区段;
  • 5 步:团块模糊、偏移、甚至两团合成一团。

常见失败现象对照表(请对照你的出图):

现象可能原因你该做什么
永远只有一个团欠拟合 / 步数太少 / 模式崩加长训练;加步数;检查数据是否真是双峰
点云爆炸到很大范围采样公式实现或系数错误用原版脚本对比;检查 αˉ\sqrt{\bar\alpha} 系数
loss 降、图仍差正常!loss ≠ 观感以散点为准;这正好引出实验 3
只记住几个点过拟合 / 数据量不足降 iterations;加数据量

注意倒数第二行——「loss 降了但图还是差」不是 bug,而是本系列反复强调的核心事实:训练损失下降只说明模型更贴合训练目标,不说明生成变好。 这也是实验 3 要放大演示的。

把三张步数图并排看,你要读出的是一条曲线:从 5 步到 20 步,质量往往有一次肉眼可见的跃升(跨过「悬崖」);从 20 步到 100 步,改善则小得多(进入「高原」)。这条「悬崖—甜点—高原」的形状,正是第 6 章讲的步数-质量关系在玩具上的缩影。记住:你在这里看到的不是「某个具体步数好」,而是这条曲线的形状本身——真实任务里拐点位置会变,但形状不变。所以调步数的正确做法永远是「往下压看什么时候崩,取悬崖上方一档」,而不是拍脑袋定一个数。另一个值得留意的细节:如果你换了 --data ring(环形分布),会发现同样的步数下环形比双高斯更难恢复——数据分布越复杂、模式越连续,需要的步数越多,这也解释了为什么真实的高分辨率生成往往比玩具需要更多步。

玩具现象真实生物可能对应
5 步两团粘连少步采样导致亚型边界糊掉(病理亚型、细胞亚群)
只覆盖一个高斯mode collapse → 稀有细胞类型消失;蛋白骨架只反复采到几个 fold
20 步够用、100 步收益小第 6 章:盲目加步数性价比低;可考虑 DPM-Solver 或换少步范式(第 5 章)
  • 我亲眼看到步数不够时点云的样子
  • 我理解 loss 下降和生成质量不是一回事
  • 我能把「20 步够用」和第 6 章的甜点区对应起来

自测:如果你把 --steps 一路加到 500,生成质量会持续变好吗?为什么?(提示:边际收益递减,20–100 步之间往往已进入高原区,加步数只是烧算力。)


6. 实验三:迷你评估仪表盘——好看 ≠ 好用

Section titled “6. 实验三:迷你评估仪表盘——好看 ≠ 好用”

第 7 章的灵魂是:分布指标好 ≠ 下游任务好。这句话读起来像口号,但玩具里能亲手把它做出来——制造一个「L1 分布指标还凑合、但下游 TSTR 明显掉」的反例,你就再也不会只看 FID 下结论了。

真实四层(第 7 章)玩具缩微
L1 分布匹配(FID / MMD)2D 的 MMD + 均值 / 协方差比对
L2 结构(玩具略)
L3 下游任务简易 TSTR:合成数据训小分类器,真实数据上测
L4 领域专家(玩具略)

为什么玩具里只保留 L1 和 L3:L2 结构层(联合关系、空间一致性)和 L4 领域专家层(盲评、物理硬约束)都需要真实数据的结构或领域知识才能定义——2D 双高斯没有「基因-基因相关」可查,也没有「病理医生」可请。但 L1 和 L3 这一对已经足够演示本章最想让你看到的反差:L1(分布指标)可能还不错,L3(下游任务)却明显掉。真实任务里 L2/L4 是加上去的更硬防线(第 7 章讲全),玩具里先把 L1 vs L3 这个最基础的错配看透。

TSTR 评估协议

脚本会生成三种合成数据:good_syn(接近真实分布)、bad_noise(纯噪声)、bad_collapse(单峰崩溃),分别算 L1 统计(均值 L2 距离、方差比、RBF-MMD)和 TSTR 分数,让你对比看清「哪种坏法能被 L1 抓住、哪种只能被 L3 抓住」。

Terminal window
python eval_dashboard_toy.py
# 输出:
# eval_dashboard_report.txt — 数值摘要
# eval_dashboard_plots.png — 真 / 好生成 / 坏生成对比
  • 好的合成(接近真实分布):TSTR 分数接近「真实训、真实测」的基线;
  • 坏的合成(刻意加偏 / collapse):L1 也许还凑合,TSTR 明显掉
  • 这就是第 7 章的玩具级铁证:拿下游说话,不被分布指标忽悠。

怎么读那份报告:打开 eval_dashboard_report.txt,重点看两组对照。第一组是 bad_collapse(单峰崩溃)——它的均值可能和真实数据很接近(因为崩到了分布中心),所以均值 L2 距离这类 L1 指标不一定能抓到它,但方差比会明显偏小,TSTR 一定崩。第二组是 bad_noise(纯噪声)——它连 L1 都过不了,是最容易被识破的坏法。真正危险的是 bad_collapse 这种「L1 看着还行、L3 一测就露馅」的类型,它对应真实任务里最隐蔽的 mode collapse。把这两种坏法的数值并排看一遍,你就明白为什么第 7 章反复强调「L1 是入场券、L3 才是通行证」。

玩具真实
TSTR 掉分scRNA 合成细胞训分类器、真实上崩 → 别用
L1 好但 TSTR 差病理 FID 好但分割不涨 → 生成没抓到判别特征
分类器太强看不出差换更弱分类器或更难任务,放大差异
  • 我理解 TSTR 的思路(合成训、真实测)
  • 我亲手看到了 L1 好但 L3 差的可能
  • 我知道下游任务是评估的硬通货

自测:为什么「合成数据自己训、自己测」不能作为有效性证据?(提示:分布自洽 ≠ 对真实有用,自训自测只证明合成数据内部一致,绕过了真实分布这个裁判。)


7. 纸上实验:把四维度替换拆给自己看

Section titled “7. 纸上实验:把四维度替换拆给自己看”

不写一行代码,也有一个值得做的思维练习——它对应第 5 章的四维度替换框架。拿两个你在论文或社群里见过的扩散变体(比如 Stable Diffusion 3、某个蛋白扩散模型),对每一个填这张表:

维度这个模型选了什么相比经典 DDPM 换了没有
① 建模空间像素 / latent / 3D 结构 / 图 / 离散?
② 路径随机 SDE / 直线 ODE(流匹配)?
③ 主干U-Net / DiT / 等变网络?
④ 步数多步 / 少步 / 一步蒸馏?

填完你会发现:任何一个「新模型」,都是在这四维里换了一两格。 例如 SD3 = 流匹配(②)+ latent(①)+ DiT(③),三格都换了;而一个普通的蛋白骨架扩散可能只换了①③(结构空间 + 等变主干)。这个练习能把「又一个要背的新名字」变成「哦,它在这两维上做了替换、代价是什么」——这才是读论文该有的姿势。

一个填好的示例(RFdiffusion) 帮你对照自己填得对不对:

维度RFdiffusion 的选择相比经典 DDPM 换了没有
① 建模空间SE(3) 上的残基 frame(位置 + 朝向)换了:从像素换成 3D 结构流形
② 路径高斯 / SO(3) 加噪的随机路径基本没换(仍是加噪去噪)
③ 主干RoseTTAFold 微调而来的等变网络换了:从 U-Net 换成结构预测器改的等变主干
④ 步数多步去噪采样没换(仍多步)

读这张填好的表,你能一眼看出 RFdiffusion 的创新集中在 ①③ 两维(把扩散搬到 3D 结构空间、用带物理先验的等变主干),而路径和步数沿用经典。这就解释了它的特点:物理合理性强(③带先验),但采样不算快(④没优化)——后者正是后续「蛋白流匹配」工作想改的那一格。四维度框架的威力就在这里:它让你不仅能拆解一个模型,还能预判「下一篇论文会去换哪一格」。

建议动作:找 2–3 篇你所在子领域的论文各填一遍,横向对比。你会很快看出这个方向「主流稳定在哪几格、前沿正在换哪一格」,这比读十篇综述都更快建立领域全局观。


8. Go/No-Go 清单:把选型纪律落成一页纸

Section titled “8. Go/No-Go 清单:把选型纪律落成一页纸”

这是整个系列选型判断力的落地工具。开题前、换模型前、审稿自查时,对着你的真实课题填一遍。

#检查项Go 信号No-Go 信号你的填写
1任务类型需要多样高维样本纯预测 / 只要 Top-1 标量
2数据量与质量足够支撑分布;标签 / 条件可靠n 极小;批次混乱不可校正
3成功定义写得清 L1–L4 指标与及格线只有「看起来像」
4基线已有简单基线(检索 / AF / 对接 / 监督)无基线就直接上扩散
5算力与延迟预算可承受,或可接受 LDM / LCM预算只够训一个小 MLP
6评估可行性能做下游 + 至少一种硬约束 / 专家完全无法评 L3/L4
7风险隐私 / 毒性 / 双用途已有对策医学可识别风险无方案
8替代路线已用四维度表比较过 FM / CM / DiT / LDM盲追开源明星名字

经验规则2 个以上 No-Go 就先别训扩散,回去补问题定义或基线;全 Go 但仍犹豫,先用默认采样栈做最小可行实验,用 L3 下游指标说话。

脚本 diffusion_go_nogo_checklist.py 提供交互式版本:

Terminal window
python diffusion_go_nogo_checklist.py # 交互逐项问答
python diffusion_go_nogo_checklist.py --blank # 导出空白 markdown 模板

8.2 最小可行实验(1–2 周)协议

Section titled “8.2 最小可行实验(1–2 周)协议”

清单过关后,别一上来就训大模型。先跑一个能证伪的最小实验:

  1. 冻结评估脚本:先写好 L1 子集 + 一个 L3 主指标,别边训边改评估。评估标准一旦随模型一起漂移,你就永远说不清「是模型变好了还是尺子变松了」——这是自欺的头号来源。
  2. 一个强非扩散基线:检索 / 监督学习 / AF 调用——给扩散一个要超越的对象。没有基线的「扩散能生成 X」是没有意义的陈述:能生成不等于比现有方法好。基线的存在把问题从「能不能做」变成「值不值得做」。
  3. 一个最简扩散 / LDM 基线:用第 6 章的默认采样栈(DPM++ 2M Karras + 20 步 + CFG 5),别一开始就调花活。先确认「最朴素的扩散」能不能打过非扩散基线,再谈优化。
  4. 多种子 × 分层报告:主结果取多种子均值 ± 标准差,按长度 / 类型 / 亚型分层看。单种子、单一汇总数容易掩盖「只在简单子集上好」的假象(第 7 章的 cherry-picking 陷阱)。
  5. 只有 L3 有正向信号,才进入流匹配 / 少步 / DiT 等替换实验。如果最简扩散基线连 L3 都打不过非扩散基线,换更花哨的范式通常也救不回来——先回去查数据、条件或问题定义。

这五步的顺序本身就是一种纪律:先把「能证伪的最小闭环」搭起来,再逐步加复杂度。 大多数失败的扩散项目,不是模型不够强,而是在没有基线、没有冻结评估的情况下就投入了几周训练,最后拿不出「比什么都强」的证据。

8.3 与强化学习清单的差异(勿混用)

Section titled “8.3 与强化学习清单的差异(勿混用)”

学过强化学习系列的同学,注意两套开题清单的判断轴完全不同:RL 问「这个任务是不是序贯决策、有没有明确的奖励信号」;扩散问「这个任务要不要一整簇候选、有没有独立于生成模型的评估」。 如果你的任务本质是「最大化一个标量分数」,那多半该走 RL / 优化 / 贝叶斯优化,而不是扩散——第 7 章的决策树对此有详细展开。


玩具实验最大的风险,是让你误以为 2D 双高斯上的结论能直接套到真实任务。这一节明确划出「可迁移」与「不可偷换」的边界。

  • 步数-质量权衡的形状:真实任务也有「悬崖—甜点—高原」的步数曲线,只是拐点位置不同。
  • mode collapse 的样子:玩具里「两团变一团」,真实里「稀有细胞类型消失」「蛋白只出几个 fold」,本质是同一回事。
  • loss ≠ 质量、L1 ≠ L3:这个因果在任何规模都成立,是本章最硬的可迁移结论。
  • 先基线后扩散、先评估后换新的纪律:规模无关,永远适用。
  • 具体数值:玩具上「20 步够用」绝不能当成真实任务的定论——真实模型、真实数据的甜点区要重新扫。
  • 数据结构:2D 连续点云没有离散约束、没有 3D 等变要求、没有高维稀疏性。蛋白、分子、单细胞各有各的硬约束(第 8 章),玩具一个都不覆盖。
  • 评估工具:玩具用 MMD + 简易 TSTR,真实任务要用 path-FID、scTM、gene-gene 相关等领域工具(第 7 章),不能拿玩具指标交差。

一个真实会踩的坑:有人在玩具上验证了「20 步够用」,就把真实的蛋白骨架扩散也设成 20 步,结果生成的骨架 self-consistency 通过率极低。原因是——玩具是 2D 连续点云、肉眼一眼能看出崩没崩;蛋白骨架是 SE(3) 空间的高维结构,「拓扑错了」肉眼根本看不出来,必须靠 scTM 这种下游指标兜底(第 7、8 章)。越是「错了也不容易当场发现」的领域,越要保守选步数、越要靠硬评估——这恰恰是玩具无法替你验证的部分。玩具给你的是「步数曲线长什么形状」的直觉,不是「你的任务该用几步」的答案。

9.3 真实课题「第一周」动作清单

Section titled “9.3 真实课题「第一周」动作清单”
  • 用 §8 的 Go/No-Go 清单过一遍,确认 No-Go 信号 < 2
  • 找到并跑通一个非扩散基线,记录它的 L3 指标
  • 用第 8 章对应轨道的四要素模板,写清你的输入 / 输出 / 条件 / 评估
  • 冻结评估脚本(至少一个 L3 主指标)
  • 用第 6 章默认采样栈跑一个最简扩散基线,和非扩散基线比 L3

这份清单的顺序是刻意的:它把「训一个扩散模型」这件最诱人、最想立刻动手的事,排在了最后一步。 前四步没有一步在训扩散——它们在逼你回答「这事该不该用扩散、用了怎么算成功、有没有一个更简单的对手」。绝大多数失败的生成项目,不是模型训得不好,而是这四步里有一步从来没认真做过:没有基线所以不知道扩散到底有没有增量,没冻结评估所以指标可以随便挑好看的报,没写四要素所以做到一半才发现条件根本注入不进去。把动手训练排在最后,不是拖延,而是把最贵的算力留给一个已经想清楚的问题。 如果你能诚实地打勾前四项,第五步的扩散基线才有意义——否则你只是在用 GPU 掩盖一个没定义清楚的问题。


跑完三个实验、填完 Go/No-Go,你就走完了整个系列。这里给一张「毕业 checklist」——如果每一项都能不看笔记做到,你已经具备独立开一个生物扩散课题的判断力。

全系列九章闭环
  • 我能判断一个生物问题是否「更像扩散场景」(第 1 章)
  • 我能写出前向闭式、解释 ε / x0 / v 三种预测目标(第 2、3 章)
  • 我能从目标函数、稳定性、算力、边界四维对比扩散 / GAN / VAE(第 4 章)
  • 我能用四维度框架拆解任何一个新扩散变体(第 5 章)
  • 我能对着现象定位该调哪个采样旋钮(第 6 章)
  • 我能用四层评估框架 + Go/No-Go 给一个课题做选型(第 7 章)
  • 我能给蛋白 / 分子 / 单细胞 / 病理任务各填出四要素、说清 RFdiffusion 三段式分工(第 8 章)
  • 我亲手跑过三个玩具实验,见过步数不够、mode collapse、L1 好但 L3 差的样子(第 9 章)

这张清单也是一张「回看地图」:哪一项打不了勾,就回对应章节重读。它们不是孤立的知识点,而是一条环环相扣的推理链——判断该不该用扩散(第 1 章)依赖你理解扩散在做什么(第 2、3 章)和它相对其他家族的取舍(第 4 章);会调采样旋钮(第 6 章)依赖你知道机制族里换了什么(第 5 章);会做选型(第 7 章)又依赖你清楚生物落地的真实约束(第 8 章)。任何一环断了,下游的判断都会虚。所以打不了勾的那一项,往往不是”没记住”,而是”上一环没打通”——顺着链条往回找,通常能定位到真正的断点。

  1. 扩散拟合数据分布,RL 优化期望奖励——别用同一张成绩单。
  2. 训练拟合分布,评估验证价值——分布好是必要条件,下游有用才是充分条件。
  3. 步数是质量与速度的主旋钮,但有悬崖和高原,不是越多越好。
  4. 任何新模型都是四维度里换了几格——先问换了什么、代价是什么。
  5. 先基线后扩散,先评估后换新——这条纪律比任何模型选择都重要。
  6. 生成是候选引擎,不是终点——化学有效性、可折叠性、湿实验才是真正的裁判。

拿你真正在做或想做的一个课题,一次性回答:它是不是生成问题?属于第 8 章哪条轨道?该用哪个机制族(第 5 章)?采样起点怎么定(第 6 章)?四层评估怎么安排(第 7 章)?Go/No-Go 有几个 No-Go?答得越顺,说明这个系列你学通了。


  • 第 2 章 前向加噪与反向去噪:实验 1 是它的可视化;实验 2 的损失就是它的 Lsimple\mathcal{L}_{\text{simple}}
  • 第 6 章 训练与采样旋钮:实验 2 的步数对比是它的玩具版。
  • 第 7 章 按数据结构选型:实验 3 是四层评估的缩微版,§8 的 Go/No-Go 是它选型决策的落地工具。
  • 第 5 章 五大机制族:§7 的纸上练习是它四维度框架的应用。
  • 第 8 章 生物读者轨道:§9 的「不可偷换」清单提醒你玩具结论别乱套到真实轨道。

文献 / 资源为什么看阅读深度建议
Ho et al., DDPM, 2020实验 2 玩具 DDPM 的原始出处对照玩具代码读方法节
Nichol & Dhariwal, Improved DDPM, 2021实验 1 cosine 调度的来源读调度那一节
lucidrains, denoising-diffusion-pytorch从玩具到可用实现的过渡参考读最小实现,对照本章脚本
Hugging Face diffusers 文档跑完玩具后过渡到真实模型按需查 API,重点看 scheduler

说明:本章以动手验证与选型纪律为主;真实模型的加载、微调、消融可在跑通玩具后,用 diffusers 这类库继续实践。