扩散模型教程第6章:训练与采样旋钮
本章是系列第 6 章:把采样加速和条件注入两大工程主战场讲透——训练好一个 DDPM 之后,怎么让它跑得快、听得懂条件。 前置:第 2 章(前向/反向机制)、第 3 章(DDPM 三式)。本章大量用到”采样器 = ODE 数值积分器”这个心智模型。 系列内:条件生成在生物领域的具体落地见 第 8 章 生物读者轨道;评估与选型见 第 7 章 按数据结构选型。
1. 本章目标与验收标准
Section titled “1. 本章目标与验收标准”学完本章,你应能在不看笔记的情况下完成下列自检:
- 说清 DDIM 相对 DDPM 原生采样”换了什么、没换什么”,以及为什么它能跳步。
- 从一张速查表里为一个场景选出合适的采样器和步数,并解释一阶 vs 二阶的取舍。
- 画出 CFG scale 的倒 U 型曲线,说明太低、太高各自的现象。
- 对三种条件注入方式(拼接 / 交叉注意力 / ControlNet),各举一个匹配的条件形状。
- 解释为什么用 CFG 必须在训练侧做条件 dropout,以及
p_uncond调坏了会怎样。
字数与深度定位:工程调参章(约 8500–12000 汉字)。不推导采样器数值格式、不训练模型、不深入某个具体生物案例(留给第 8 章)。
一句话先给你一个可以立刻用的默认栈:不确定用什么,就上 DPM++ 2M Karras + 20 步 + CFG 5.0——绝大多数场景这是个合理起点,后面各节都在解释这句话每个数字背后的取舍。
2. DDPM 原生采样为什么慢
Section titled “2. DDPM 原生采样为什么慢”2.1 原生采样的直觉
Section titled “2.1 原生采样的直觉”第 2、3 章学过:训练时把 一路加噪到 ,采样时反过来,从 一步步”减噪”回 。DDPM 原文的采样循环长这样(只贴必要公式,不推导):
翻译成人话:
- 括号里那一坨:把 里网络认为的噪声按比例扣掉,得到当前对 均值的估计。
- 前面 :重新缩放,因为前向每一步都乘了 。
- 后面 :再注入一点噪声,保持这是个随机过程(这就是 DDPM 里 P = Probabilistic 的来源)。
每一步都做这件事,做 次。 问题不在于网络太大,而在于步数太多——你花了 1000 次网络前向,才拿到 1 个样本。
2.2 为什么慢到不能忍
Section titled “2.2 为什么慢到不能忍”在生物场景,我们更关心”能不能日常迭代”:
| 场景 | 一张样本 1000 步网络前向 | 能否日常用 |
|---|---|---|
| 256×256 图像 U-Net | 几秒到十几秒 | 勉强 |
| 128³ 体素分子密度 | 几十秒到分钟级 | 只能夜里跑 |
| 蛋白结构生成(几百残基) | 分钟级 | 只能小批量 |
| 显微图像 512×512 批量 100 张 | 几分钟起步 | 不能交互 |
2.3 慢的根子在哪
Section titled “2.3 慢的根子在哪”关键问题:DDPM 那 1000 步,每一步都必要吗? 答案是不必要。那 1000 步来自”离散马尔可夫链”的建模假设——定义时把过程离散成了 1000 段小台阶,所以采样也得沿着这 1000 段走。但训练好之后,网络其实学到的是一条”从噪声流回数据”的连续路径,这条路径可以用任意数值积分方法去解,不必再拘泥于 1000 段小台阶。
flowchart LR A["DDPM 视角<br/>1000 段小台阶<br/>每步都要走"] -->|"重新看成"| B["ODE / SDE 视角<br/>一条连续路径<br/>可用大步长求解器"] B --> C["10-50 步就够"]
这就是本章所有加速方法的共同思路。从这个视角出发的第一个成果就是 DDIM,后续 DPM-Solver / DPM++ / UniPC 都是更高阶、更聪明的积分器。
2.4 生物向类比:分子动力学
Section titled “2.4 生物向类比:分子动力学”如果你熟悉分子动力学(MD):DDPM 1000 步像 fs 级时间步的 MD,非常安全但极慢;DDIM / DPM-Solver 像加大时间步 + 更高阶积分器(类似 Verlet 到更高阶显式辛法),代价是步长不能无限大,太大会积分崩掉;一致性模型像直接学一个”从任意时刻投影回终点”的函数,跳过积分本身。以后看到”采样器”这个词,就想到”数值积分器”。
3. DDIM:把随机采样变成确定式积分
Section titled “3. DDIM:把随机采样变成确定式积分”DDIM 是本章的关键 pivot,值得单独讲清楚。
3.1 DDIM 换了什么
Section titled “3.1 DDIM 换了什么”DDIM = 用完全相同的训练好的 ,换一种采样公式,让采样变成确定式的、可跳步的、可以少走的。
关键:不改训练、不改网络、不改权重,只改采样这一段代码。这也是它当年一出来就被立刻广泛采用的原因——换代码就行,不用重训。
3.2 核心思想(只讲直觉)
Section titled “3.2 核心思想(只讲直觉)”DDPM 采样每步会再注入一点噪声(前面 那项)。DDIM 问:如果把每一步的注入噪声关掉,会怎么样? 答案是采样过程从”随机马尔可夫链”变成一条”确定式的轨迹”——给定同一个 ,跑出来的 每次都一样。DDIM 采样公式(只贴含义):
翻译:先用现在的 猜一个 ,然后按 时刻的信噪比,把 和噪声重新混一混。这个公式有一个极其重要的性质:它没有强制要求”必须相邻两步 “——你可以从 直接跳到 、、甚至 。于是就有了从 1000 步稀疏采样到 50 步、20 步。
3.3 DDIM 关键性质对照表
Section titled “3.3 DDIM 关键性质对照表”| 性质 | DDPM 原生采样 | DDIM 采样 |
|---|---|---|
| 是否需要重训网络 | — | 不需要 |
| 每步是否注入随机噪声 | 是() | 可选(一般设为 0,即确定式) |
| 相同 出的样本 | 每次都不一样 | 每次一样(可复现) |
| 能否跳步 | 不能(严格马尔可夫) | 能(可 50 步、20 步) |
| 典型步数 | 1000 | 20–50 |
| 生物场景意义 | 慢到不能日常用 | 可交互、可批量筛选 |
3.4 一个必须理解的旋钮:η
Section titled “3.4 一个必须理解的旋钮:η”DDIM 论文给了一个连续旋钮 : 是纯确定式 DDIM(可复现、可跳步); 退化回 DDPM(每步注噪、不能跳步);中间值是部分注噪的中间态。现在几乎所有 diffusers 里的 DDIMScheduler 默认都是 。你先记住”DDIM = 确定式”就够,其它 值罕见调。
3.5 DDIM 的代价与不代价
Section titled “3.5 DDIM 的代价与不代价”真实的代价:步数压到 20 以下时质量会掉,尤其在细节纹理、罕见类别上更明显;因为是确定式,同一个 永远出同一张图——想要多样性得换 ,不能靠”多采几次”。
很多同学误以为的代价(其实不成立):
- “DDIM 会牺牲质量”——不准确。50 步以上,DDIM 与 1000 步 DDPM 质量几乎相同,但速度快约 20 倍。
- “DDIM 需要单独训练”——完全不用,就是换个采样代码。
- “DDIM 只适合图像”——不对,只要你训的是 DDPM 系扩散模型(分子、结构、图像都行),采样阶段就能直接换 DDIM。
可以把 DDIM 当成”扩散模型工程化的起点”:在它之前扩散只能实验室里玩,在它之后才开始有大规模应用可能。之后的 DPM-Solver / DPM++ 都是在这个 ODE 视角上继续做更聪明的数值积分。
4. 采样器家族:DPM-Solver / DPM++ / Heun / UniPC
Section titled “4. 采样器家族:DPM-Solver / DPM++ / Heun / UniPC”建立一个心智模型:采样器 = ODE 数值积分器。DDIM 只是”最原始那一版”(一阶显式),后面所有更快更强的采样器,都是数值分析里”高阶方法 / 多步方法 / 预估-校正”在扩散上的复用。
4.1 DDIM 之后为什么还要再造轮子
Section titled “4.1 DDIM 之后为什么还要再造轮子”DDIM 已经把 1000 步降到 50 步,但工程上有两个继续挤的动机:一是 50 步还是慢,图像批量筛选、蛋白结构生成动辄要几千上万个样本;二是 20 步以下 DDIM 会掉质量,因为它是一阶方法,步长压得太大就积分误差爆炸(像用大步长跑欧拉法解 ODE 会飘)。于是社区沿着”用更高阶 ODE 求解器”这条路,做出了 DPM-Solver、DPM-Solver++、Heun、UniPC。
flowchart LR E["欧拉法<br/>一阶 · 只看当前斜率"] -->|对应| DDIM["DDIM"] H["Heun / RK2<br/>二阶 · 两次斜率取平均"] -->|对应| HEUN["Heun 采样器"] LM["线性多步<br/>用前几步信息"] -->|对应| DPM["DPM-Solver"] PC["预估-校正<br/>先估再修"] -->|对应| DPMPP["DPM-Solver++"]
你不需要记数值分析细节,只要记住一件事:阶数越高、用的历史点越多,同样步数下积分误差越小、质量越好,代价是每步内部要多算一次或几次网络前向。
4.2 主流采样器速查表
Section titled “4.2 主流采样器速查表”| 采样器 | 阶数 / 类型 | 推荐步数 | 每步前向 | 什么时候用 |
|---|---|---|---|---|
| DDIM | 一阶 · 显式 | 20–50 | 1 | 需要完全可复现、做 latent 插值 / inversion |
| Euler | 一阶 · 显式 | 20–50 | 1 | 简单基线;EDM/Karras 系模型 |
| Euler a(Ancestral) | 一阶 · 随机 | 20–40 | 1 | 想要多样性更强、更”活”的生成 |
| Heun | 二阶 · 显式 | 20–30 | 2 | 中等步数下再挤一点质量 |
| DPM-Solver++ (2M) | 二阶 · 多步 | 10–20 | 1(多步共享) | 默认首选,速度质量平衡最好 |
| DPM-Solver++ (2M) Karras | 上者 + Karras 调度 | 10–20 | 1 | 很多图像模型的新默认 |
| UniPC | 统一预估-校正 | 8–15 | 1 | 想要极少步(小于 15)下仍稳 |
| DDPM 原生 | 一阶 · 随机 | 1000 | 1 | 论文复现 / 调试,几乎不再用于生产 |
记忆口诀:日常首选 DPM++ 2M(15–25 步,效果接近甚至超过 50 步 DDIM);极少步用 UniPC(8–15 步还能稳);要复现 / 做插值用 DDIM(确定式、可 inversion 不可替代);想更多样用 Euler a(不追求可复现时)。
4.3 一阶 vs 二阶到底差在哪
Section titled “4.3 一阶 vs 二阶到底差在哪”flowchart LR subgraph O1["一阶 · DDIM/Euler"] F1["看当前点斜率"] --> F2["直接迈一大步"] F2 --> F3["大步长误差累积"] end subgraph O2["二阶 · Heun/DPM-Solver"] S1["看当前斜率"] --> S2["试探迈一步"] S2 --> S3["新点再看斜率"] --> S4["两者平均再正式迈"] S4 --> S5["大步长下也稳"] end
代价:二阶方法每步跑网络 2 次,所以”20 步二阶” ≈ “40 步一阶”的网络前向次数。但因为二阶能吃更大步长,总步数往往能压到一阶的一半以下,最终反而更快。
4.4 一个值得单独讲的旋钮:Karras 噪声调度
Section titled “4.4 一个值得单独讲的旋钮:Karras 噪声调度”第 2 章学的是” 从头到尾线性或 cosine”这种离散 的调度。EDM(Karras 2022)提出另一套写法:直接以噪声标准差 为坐标——定义一系列从大到小的 ,采样时按 走,并在 分布不均匀的地方多放采样点(比如小 附近细节最多就多放)。这就是很多采样器名字后面挂 “Karras” 的意思:同样步数下,通过更聪明地分配采样点位置,再多挤 10–20% 质量。你能调的就一个开关 use_karras_sigmas=True/False,开着通常更好,尤其在少步(≤20)场景。
4.5 生物向类比
Section titled “4.5 生物向类比”蛋白结构模型(RFdiffusion、Chroma 等)大多默认用 DDPM/DDIM 系或其变体,生产上会换 DPM++ 2M;小分子扩散(EDM、GeoDiff 等)几何一致性重要,很多实现里 DDIM 或 EDM 采样器为主,步数 50–100(比图像更保守,因为几何误差不容易目视发现);显微图像扩散直接沿用 Stable Diffusion 那套 DPM++ 2M Karras、20–30 步。通用心法:不确定用什么就上 DPM++ 2M Karras + 20 步 + CFG 5–7。
5. 步数怎么选:从 1000 到 4 的经验曲线
Section titled “5. 步数怎么选:从 1000 到 4 的经验曲线”“步数”是全部采样超参里第一位重要的,它直接决定一次生成花多少时间、GPU 打多满、能不能日常迭代。
5.1 一条你要在脑子里画出来的曲线
Section titled “5.1 一条你要在脑子里画出来的曲线”总耗时 ≈ 步数 × 每步网络前向次数,步数决定一切。而步数与质量的关系不是线性的,是一条”边际递减 + 有个悬崖”的曲线:
质量 ↑ ┌───── 高原(收益极小) │ ┌────────┘ │ ┌────────┘ │ ┌────────┘ │ ┌────────┘ ← 甜点区(DPM++ 2M) │ │ │ │ ← 悬崖(少于此步数崩坏) │───┘ └────┴──────┴──────┴──────┴────────→ 采样步数 4 10 20 50 1000分区解释:≤4 步 DDPM 系采样器做不到,要靠一致性/LCM/FM(§8);5–10 步 DPM++ 2M / UniPC + Karras 勉强能出,但只在大模型 + 简单条件下稳;10–20 步是日常首选甜点区;20–50 步是保守区,追求最高质量、批量小或复杂条件时用;50–100 步边际收益极小;>100 步几乎没意义,除非做论文复现或 DDPM 原生对照。
5.2 步数该怎么选
Section titled “5.2 步数该怎么选”| 场景 | 推荐步数 | 采样器 | 备注 |
|---|---|---|---|
| 快速原型 / 交互调试 | 10–15 | DPM++ 2M Karras | 先看条件对不对,不追终稿质量 |
| 生产批量 / 高通量筛选 | 20 | DPM++ 2M Karras / UniPC | 主力区间 |
| 最终交付 / 高价值样本 | 30–50 | DPM++ 2M Karras / Heun | 边际质量 |
| 论文对照 / 复现 DDPM | 1000 | DDPM 原生 | 只为公平对比 |
| 极限少步(工业部署) | 1–4 | 换 LCM / Turbo / FM | 需重训或蒸馏 |
5.3 调坏会怎样
Section titled “5.3 调坏会怎样”| 现象 | 可疑参数 | 首选调整 |
|---|---|---|
| 像素级椒盐 / 结构完全崩坏 | 步数太少 | 步数 ↑(10 → 20) |
| 过糊、缺细节 | 步数偏少或采样器阶数太低 | 步数 ↑ 或换 DPM++ 2M |
| 过锐、有伪影 | 步数太多 + CFG 太高 | CFG ↓(见 §6) |
| 每次跑都一样、多样性差 | 用了 DDIM | 换 Euler a 或换 |
| 中间步数(≈50)比高步数(≈500)反而好 | 正常,说明已在甜点区 | 别再加步数 |
5.4 生物向类比
Section titled “5.4 生物向类比”蛋白结构保守一点(30–50 步),因为”看起来对但拓扑错”很难目视察觉;小分子构象保守到中等(20–50 步)并配几何一致性检查;显微图像激进(10–20 步)就够,人眼过一遍就能筛;组学 / 表达矩阵中等(20 步)+ 下游生物验证卡尺子。心法:领域越难验证真伪,越保守选步数。
5.5 少步新范式预告:把步数压到 1–4
Section titled “5.5 少步新范式预告:把步数压到 1–4”前面所有加速方法(DDIM / DPM++ / UniPC / Karras)都有一个共同前提:网络是 DDPM 系训好的,你只在采样端做数值积分。但工业界(以及部分生物应用)还在往 1–4 步卷,因为批量筛选(1000 样本 × 20 步 = 20000 次前向)、实时交互、端侧部署这些场景连 20 步都嫌多。突破 4 步这道坎,靠的不是换采样器,而是从训练阶段就重新设计。三条主流路线:
| 路线 | 代表方法 | 换了什么 | 步数 | 代价 |
|---|---|---|---|---|
| 采样端优化 | DDIM / DPM++ / UniPC | 只改采样代码 | 10–50 | 无(本章前几节) |
| 蒸馏出学生模型 | Progressive Distillation / LCM / SDXL Turbo | 训完 DDPM 后再蒸馏 | 1–8 | 要额外蒸馏训练 |
| 从头换训练目标 | Consistency Models / Flow Matching / Rectified Flow | 换掉训练目标本身 | 1–4 | 要重新训练 |
一致性模型(Consistency Models,Song 2023) 直接学一个”从轨迹上任意点一步投影回终点 “的函数,跳过逐步积分。LCM(Latent Consistency Model) 把一致性思想搬到隐空间,是当前”秒出图”的主力。Flow Matching / Rectified Flow 换一条更直的概率路径(第 2 章 SDE 视角的延伸),让少步积分误差更小。
两个现实要记住:这些方法需要重训或蒸馏,不是”换代码就能用”,你手上现有的 DDPM 系模型能立刻用的还是前几节那套;而且生物领域这些新范式还在早期,绝大多数已发表的分子 / 蛋白 / 组学扩散模型仍是 DDPM 系。这些替代路线的完整评估留到第 5 章 五大机制族与第 7 章。
6. CFG scale:条件强度这个决定成败的旋钮
Section titled “6. CFG scale:条件强度这个决定成败的旋钮”Classifier-Free Guidance(CFG)是所有条件扩散模型里最重要的一个采样时旋钮,它决定模型多”听话”、生成多”多样”、质量多”高”。本节讲”怎么用这个旋钮”,怎么训出支持 CFG 的模型留到 §8。
6.1 CFG 到底解决什么
Section titled “6.1 CFG 到底解决什么”假设你训好了一个条件扩散模型 , 是条件。如果直接采样,模型有时会”敷衍地听条件”——生成的东西大致对,但不精确、不聚焦。因为训练时条件只是软引导,网络没有”必须严格贴合 “的硬约束。CFG 的做法是采样时用两次网络前向:有条件预测 和无条件预测 ,然后外插:
含义:沿着从”不听条件”到”听条件”的方向,多走 倍。 等价于普通条件采样; 放大条件影响,模型更听话; 完全不听条件; 反向条件(可以做 negative prompt)。
6.2 CFG scale 的直觉图
Section titled “6.2 CFG scale 的直觉图”flowchart LR UC["无条件 ε(∅)<br/>模糊 多样 不贴合"] -->|"w=1"| M["普通条件<br/>大致对但不聚焦"] M -->|"w=3"| N["贴合 y<br/>质量↑ 多样性↓"] N -->|"w=7"| H["非常贴合<br/>细节清晰 但开始过锐"] H -->|"w=15"| B["崩坏区<br/>过饱和 结构畸变"]
关键:这是一条倒 U 型曲线——太低不听话,太高会崩。甜点在 。
6.3 CFG scale 该怎么调
Section titled “6.3 CFG scale 该怎么调”| CFG scale | 现象 | 什么时候用 |
|---|---|---|
| 1.0 | 相当于关闭 CFG | 无条件模型 / 已经很贴合 |
| 1.5–2.5 | 弱引导 | 想要多样性、类别很宽泛 |
| 3–5 | 默认区间 | 大多数条件生成的起点 |
| 5–8 | 强引导 | 条件复杂 / 有精细结构 |
| 8–12 | 很强 | 只在”必须严格按 prompt”时用 |
| > 15 | 崩坏区 | 除非做对抗实验,不要碰 |
| < 0 | 负引导 | 想”远离某类”、去除伪影 |
6.4 CFG 现象定位
Section titled “6.4 CFG 现象定位”| 现象 | 可疑 | 调整方向 |
|---|---|---|
| 很多样但不听条件 | 太低 | ↑(3 → 5 → 7) |
| 过锐、颜色饱和到发绿发紫、纹理伪影 | 太高 | ↓ 或加负 prompt |
| 多次生成几乎一样 | 太高 + 采样器确定式 | ↓ 或换 Euler a |
| 听条件但整体结构畸形 | 太高 + 步数太少 | 先 ↓ 再考虑步数 ↑ |
| 完全不听条件 | 忘了传条件 / 用了无条件模型 | 检查代码,不是 CFG 问题 |
心法:先固定步数在 20 附近,然后只扫 CFG。 CFG 是第一位可视调整的旋钮。
6.5 CFG 的隐藏代价:算力翻倍
Section titled “6.5 CFG 的隐藏代价:算力翻倍”因为 CFG 每步要跑网络两次(一次带条件、一次不带),启用 CFG 时算力约翻倍。两条优化路径:一是降低 CFG 触发频率(不是每步都做,而是前 K 步做、后面关掉,SDXL / Flux 都用了类似技巧);二是 CFG 蒸馏(把”带 CFG 的两次预测”蒸馏成一次预测,SDXL Lightning / LCM 吸收了这一思想)。对你来说,先按默认(每步都跑 CFG)用,遇到吞吐瓶颈再考虑这些优化。
6.6 生物向类比
Section titled “6.6 生物向类比”蛋白结构生成条件通常是 sequence / motif / symmetry, 就够(这些条件本身就很强,不需要放大),RFdiffusion 论文里就用较低 CFG;小分子生成条件是靶点口袋 / 性质向量,;显微 / 组织图像条件是文本 / 类别,,接近 Stable Diffusion 默认;单细胞表达矩阵 / 空间转录组条件是细胞类型 / 组织,(这类分布本身噪声大, 太高会过拟合到平均态)。通用心法:条件越”稀疏 / 抽象”(文本、类别)越需要高 ;条件越”稠密 / 具象”(motif、结构、口袋)越不需要高 。
7. 条件怎么塞进网络(三大注入方式)
Section titled “7. 条件怎么塞进网络(三大注入方式)”前面讲的都是采样端旋钮。但要能用 CFG、能做条件生成,前提是网络本身”看得见”条件。这一节讲条件怎么进网络——它决定了你能做什么样的条件生成。
7.1 一个必须先澄清的坑:“条件”≠“输入”
Section titled “7.1 一个必须先澄清的坑:“条件”≠“输入””初学者常犯:把条件 也当成”要被去噪的 “一起加噪。错。 正确心智模型:
flowchart LR Y["条件 y<br/>不加噪 · 始终干净"] Xt["被去噪对象 x_t<br/>逐步加噪"] Net["U-Net / DiT<br/>去噪网络"] Xt --> Net Y --> Net Net --> Pred["预测 ε 或 x0"]
一路带噪(第 2 章的前向过程),网络负责把它去噪; 全程保持原样(不加噪),网络负责”看着它”做去噪。唯一例外是图像修补(inpainting):被遮住的区域是 的一部分,也走加噪;未遮住的区域反而是”条件”。
7.2 条件的 5 种形状决定注入方式
Section titled “7.2 条件的 5 种形状决定注入方式”| 形状 | 通用例子 | 生物例子 | 典型注入方式 |
|---|---|---|---|
| ① 标量 / 类别 | ”cat” 类别 id | 细胞类型、物种 id | embedding 后拼进时间步 embedding |
| ② 文本 / 短序列 | prompt “a red car" | "a mitotic figure in H&E” | 文本编码器 → 交叉注意力 |
| ③ 长序列 (1D) | 音频 / 时序 | 氨基酸序列、DNA / RNA | 序列编码器(ESM / DNA-BERT)→ cross-attn |
| ④ 图像 / 结构 (2D/3D) | 边缘图、分割图 | 蛋白模板、病理 mask | ControlNet 风格逐位置控制 |
| ⑤ 图 / 集合 | 分子图 | 小分子、口袋原子云 | 等变 GNN 编码后融合 |
关键观察:条件的形状决定注入方式,不是喜好决定的。 标量加法就够;变长序列必须用 cross-attention(长度对不上硬拼不了);和输出对齐的图 / 结构要 ControlNet 类逐位置控制才准。
7.3 方式一:拼接 / 加法(concat / add)
Section titled “7.3 方式一:拼接 / 加法(concat / add)”把条件 编码成一个向量 ,加到(或拼到)时间步 embedding 上,作为每个残差块的”全局调制”。心智模型:告诉网络”你现在是在为冷杉去噪的第 500 步”——“冷杉”和”第 500 步”都是一个全局标签。
h_t = e_t + e_y # 加法融合(最常见)h_t = concat(e_t, e_y) # 拼接后再过一层 MLP为什么这么简单也管用:因为这类条件本来就没有”位置”这个概念,一个向量就能表达。关键调法:condition embedding 维度和 同宽(通常 512/768)方便直接加;训练时以概率 (通常 0.1)对 做 dropout,这是为了 CFG(§8 详说),必开。调坏了:完全不 dropout 则采样时无法用 CFG 调条件强度,多样性差; 维度太小则类别多时欠拟合(例如 100 种细胞类型压到 32 维)。
7.4 方式二:交叉注意力(cross-attention)
Section titled “7.4 方式二:交叉注意力(cross-attention)”把条件 编成一串 token(长度可变),网络每一层拿当前特征作为 Query,从条件 token 序列里做 Key/Value 检索。心智模型:文本 prompt 是一段话,图像不同区域”关心”的词不同——“红色”只被”车身”关心,“轮子”这个区域并不关心。让每个位置自己去查条件,是最合理的。
Q = W_q · h_feature # 来自被去噪对象 x_t 的当前特征K = W_k · e_y_tokens # 来自条件(可能很多 token)V = W_v · e_y_tokensattn = softmax(Q K^T / √d) · V必记含义:Q 来自 (“我这个位置想问什么”),K/V 来自 (“条件里能提供什么”),两者长度可以完全不一样(图像 1024 个位置 vs 文本 30 个 token)——这是 cross-attn 的核心优势。关键调法:生物场景优先用预训练编码器(文本用 CLIP/T5,蛋白用 ESM,DNA 用 DNA-BERT),别从零训练;cross-attn 层通常在每个分辨率级的 residual block 后各插一层。调坏了:编码器不冻结且数据量小则编码器崩、条件失效;把序列 pooling 成 1 个向量再送进 cross-attn 会退化成”方式一”、位置信息全丢;只在最粗分辨率插 cross-attn 只能控整体主题、控不了细节位置。
7.5 方式三:ControlNet / Adapter / LoRA(外挂控制)
Section titled “7.5 方式三:ControlNet / Adapter / LoRA(外挂控制)”前两种是”训练时一起训”。但很多时候你已经有一个训练好的大扩散模型,只想加一路新条件(例如”按这张深度图生成”),不想重训整个大模型,这就是”外挂”路线。三兄弟对比:
| 名字 | 结构 | 参数量 | 适合场景 |
|---|---|---|---|
| ControlNet | 复制主干一半作”控制分支”,通过 zero-conv 与主干融合 | 大(≈半个主干) | 条件是和输出严格对齐的图 / 模板;要精细空间控制 |
| T2I / IP-Adapter | 一个小得多的旁路网络 | 小(几十 MB) | 条件是参考图 / 风格图;不需像素级对齐 |
| LoRA | 主干各层插入低秩残差 | 很小(几 MB) | 风格微调 / 领域适配(把通用扩散调到 H&E 病理域) |
核心创新(ControlNet 的 zero-conv):外挂分支和主干的融合层初始化为零,含义是训练一开始外挂分支对主干毫无影响(主干输出 = 原大模型输出),随训练进行融合层从 0 慢慢学出非零权重,把控制信号逐步注入。
flowchart LR Y["条件图 y<br/>如深度图/mask"] --> CB["控制分支<br/>ControlNet"] Xt["被去噪对象 x_t"] --> Main["主干<br/>冻结的预训练 U-Net"] CB --> Z["zero-conv<br/>初值=0"] Z --> Main Main --> Out["预测 ε"]
为什么这样设计能不破坏预训练:如果一上来外挂就随机初始化并”猛推”主干,梯度会撕烂预训练权重。zero-conv 让主干在开始时感受不到扰动,先”熟悉一下新条件”再慢慢介入。关键调法:control scale 从 1.0 起调(条件太”僵”就调到 0.7,太弱就到 1.3);数据 < 数万只训外挂,> 数十万可考虑联合微调最后几层;LoRA 秩 常用 4–16。调坏了:去掉 zero-conv 用普通卷积随机初始化则训练前几十步就把主干撕坏;LoRA 秩开太大(如 128)相当于半全量微调、还容易过拟合小数据集。
7.6 三种方式怎么选
Section titled “7.6 三种方式怎么选”| 你的条件是什么 | 首选注入方式 | 备注 |
|---|---|---|
| 类别 id / 一个标量 | 加法(拼时间步 embedding) | 简单最好 |
| 一段文本 / 一条蛋白序列 / 一条 DNA | cross-attention | 用预训练编码器省事又准 |
| 空间上和输出对齐的模板图(深度图、mask、骨架) | ControlNet | zero-conv 是灵魂,别丢 |
| 只要”风格像”的参考图 | IP-Adapter / T2I-Adapter | 比 ControlNet 轻得多 |
| 想让通用扩散适配你的领域数据(病理 / 显微) | LoRA | 参数小、显存友好 |
| 分子图 / 蛋白口袋(结构化非欧数据) | 等变 GNN 编码 + cross-attn | 见第 8 章展开 |
8. CFG 的训练侧补齐
Section titled “8. CFG 的训练侧补齐”§6 讲了 CFG 的采样侧(用 CFG scale w 把条件方向拉强)。但这只是一半故事——采样时能拉强,前提是训练时你训过”无条件”的版本。
8.1 为什么要在训练侧配 CFG
Section titled “8.1 为什么要在训练侧配 CFG”回顾 CFG 公式 ,这里的 (把 置成”空”时的预测)从哪来?只能来自训练时你也训过”(空条件)“的样本。否则模型根本没见过”没有条件是什么样子”, 就是乱猜的,CFG 外插自然崩。
8.2 训练侧的”CFG dropout”
Section titled “8.2 训练侧的”CFG dropout””做法极简:训练时以概率 p_uncond(通常 10%)把条件 随机置成空(一个特殊的”空条件 embedding”):
if random() < p_uncond: y = NULL_EMBEDDING # 训练一个无条件样本else: y = actual_condition_y # 训练一个有条件样本心智模型:像给学生做题时,10% 的题目遮住题干只让他”随便答”,逼他建立一个”没有条件时的默认分布”。采样时再用 CFG 公式把两者线性外推。
8.3 关键参数与调法
Section titled “8.3 关键参数与调法”| 参数 | 位置 | 常用值 | 调坏了会怎样 |
|---|---|---|---|
p_uncond | 训练时 y 被置空的概率 | 0.1 | 太小(1%)→ 无条件路径没训熟,CFG 采样时噪声异常;太大(50%)→ 模型对条件敏感度下降,采样质量掉 |
| NULL 嵌入初始化 | 空条件的向量 | 可训练参数,初始为 0 或小随机值 | 若与真实条件嵌入分布重叠 → 模型分不清”空”和”有”,CFG 失效 |
8.4 采样侧 × 训练侧的联动
Section titled “8.4 采样侧 × 训练侧的联动”| 训练侧做了什么 | 采样侧能开什么 | 效果 |
|---|---|---|
| 完全不 dropout 条件 | 只能 (等价纯条件) | 多样性 = 训练分布,无法进一步强化条件 |
| 任意 | §6 讲的甜点 3–8 全部可用 | |
| (过高) | 名义上也能开 CFG | 采样质量下降,条件路径本身没训透 |
8.5 生物场景的两个小坑
Section titled “8.5 生物场景的两个小坑”坑 1:多条件时怎么 dropout? 如果条件不止一个(例如同时给”细胞类型” + “组织位置”),常见做法:联合 dropout(以 10% 概率把所有条件一起置空,简单,等价单条件情形)或独立 dropout(每个条件各以 10% 概率独立置空,4 种组合都训到,但采样时要更复杂的多条件 CFG 公式)。入门推荐先用联合 dropout。
坑 2:条件”必须存在”的场景。 举例:给蛋白序列生成结构——没有序列输入,输出结构毫无意义。这种任务其实不需要 CFG,你不会想在采样时开一条”无条件”路径。多数结构预测风格的扩散模型(如 RFdiffusion 的一部分设置)不用 CFG,或只在特定辅助条件(如二级结构提示)上用 CFG,主条件(序列本身)永远保留。
9. 调参实战:从”现象”到”该动哪个旋钮”
Section titled “9. 调参实战:从”现象”到”该动哪个旋钮””前面每一节都在讲单个旋钮。真正调模型时,你面对的是”生成出来不对”这个模糊症状,要能反推该动哪个旋钮。
9.1 采样调参的旋钮优先级
Section titled “9.1 采样调参的旋钮优先级”flowchart TB L1["第一优先:CFG scale<br/>最直观、影响最大"] --> L2["第二:采样步数<br/>质量-速度权衡"] L2 --> L3["第三:采样器 + Karras 开关<br/>换求解器"] L3 --> L4["最后:换范式<br/>少步蒸馏/FM(要重训)"]
顺序很重要:先在便宜的旋钮上调(CFG、步数),实在不行再动贵的(换采样器、换范式)。
9.2 现象到旋钮的定位大表
Section titled “9.2 现象到旋钮的定位大表”| 现象 | 最可能的旋钮 | 动作 |
|---|---|---|
| 生成不听条件 | CFG 太低 | :3 → 5 → 7 |
| 过锐、过饱和、伪影 | CFG 太高 | ↓,或换 CFG++/PAG |
| 整体结构崩坏、椒盐噪点 | 步数太少 | 步数 10 → 20 |
| 过糊、缺细节 | 步数少 / 采样器阶数低 | 步数 ↑ 或换 DPM++ 2M |
| 多样性差、每次都一样 | 确定式采样器 | 换 Euler a,或换 |
| 少步(小于 15)就崩 | 采样器不够高阶 | 换 UniPC / 开 Karras |
| 吞吐不够 | CFG 翻倍算力 | CFG 蒸馏 / 降触发频率 |
9.3 一个可复用的调参 SOP
Section titled “9.3 一个可复用的调参 SOP”- 先定采样器:默认 DPM++ 2M Karras。
- 固定步数 20,只扫 CFG(从 5 起,±2 试)。
- CFG 定下来后再调步数:往下压看什么时候崩(找悬崖),日常取悬崖上方一档。
- 多样性不够:换 Euler a 或换随机种子 / ,不要靠加步数。
- 还不行才换范式(LCM/FM),且要接受重训成本。
9.4 一个警告:不要越级调参
Section titled “9.4 一个警告:不要越级调参”新手常见错误是同时改三四个旋钮,结果无法归因。一次只动一类:调 CFG 时固定步数和采样器;调步数时固定 CFG。扩散模型的旋钮彼此耦合(比如高 CFG + 少步会叠加出畸形),只有单变量扫描才能建立”这个旋钮 → 这个现象”的因果直觉。
9.5 生物领域三条常见踩坑
Section titled “9.5 生物领域三条常见踩坑”- 蛋白 / 分子几何误差不可目视:图像调糊了一眼看出,但生成的蛋白骨架”拓扑错了”肉眼很难发现——所以这类任务要靠 self-consistency 等下游指标兜底(第 7 章),不能只靠调采样参数刷”看起来对”。
- CFG 在稠密条件上不宜过高:口袋、motif 这类强条件本身信息量大, 拉太高反而过拟合到”平均骨架”、丢多样性。
- 步数在难验证领域要保守:组学、结构这类”错了也不容易当场发现”的领域,宁可多花几步,别为省算力压到悬崖边。
9.6 一个完整调参案例走查
Section titled “9.6 一个完整调参案例走查”把前面的旋钮串成一次真实的排障,你就知道这套 SOP 怎么用。假设你在做”文本条件的病理图生成”,第一版结果是”图像过锐、颜色发紫、还带网格状伪影”,你该怎么定位?
- 先看现象归哪类。过锐 + 过饱和是 CFG 太高的典型信号(§6.4),网格伪影则常伴随”高 CFG + 步数偏少”的叠加。不要一上来同时动多个旋钮。
- 固定采样器与步数,先降 CFG。按 §9.3 的顺序,先把采样器锁定在 DPM++ 2M Karras、步数锁定在 20,把 CFG 从 9 降到 6,重跑同一批种子。过饱和明显缓解、伪影减轻,说明主因确实是 CFG。
- 再单独扫步数。CFG 定在 6 后,把步数从 20 往下压到 15、12、10,观察哪一档开始出现结构崩坏(悬崖)。若 12 步仍稳、10 步开始糊,就取悬崖上方一档 15 步作为日常值。
- 最后处理多样性。若此时发现”同一 prompt 多次生成几乎一样”,不要靠加步数解决——那是确定式采样器 + 高 CFG 的联合效应,改用 Euler a 或多换几个 起点即可。
- 收尾验证。锁定”DPM++ 2M Karras + 15 步 + CFG 6 + Euler a 备选”后,跑一批多种子样本,用第 7 章的下游指标(这里是病理分割增益 + 医生盲评)确认”看起来对”同时”确实有用”。
整个过程没有一步是”同时动两个旋钮碰运气”——每一步都固定其他变量、只扫一个,这样你才能把每个现象稳稳归因到具体旋钮。这就是本章所有速查表的正确用法:不是背下来,而是在排障时按优先级逐个排除。
10. 本章 Checklist
Section titled “10. 本章 Checklist”- 能说清 DDIM 相对 DDPM 换了什么、为什么能跳步、以及”确定式”的含义
- 能从速查表为一个场景选采样器和步数,并解释一阶 vs 二阶取舍
- 能画出步数-质量曲线,指出甜点区和悬崖
- 能画出 CFG 倒 U 型曲线,说明太低太高各自现象
- 能说出默认栈 DPM++ 2M Karras + 20 步 + CFG 5 每个数字的理由
- 能为三种条件形状(标量 / 序列 / 对齐图)各选对注入方式
- 能解释 ControlNet 的 zero-conv 为什么不能省
- 能解释为什么用 CFG 必须在训练侧做条件 dropout
- 拿到”生成不对”的现象,能用定位表反推该动哪个旋钮
11. 自测 4 问
Section titled “11. 自测 4 问”Q1. 同事说”我要把训练时的 从 1000 改成 20,这样采样快 50 倍”。这个想法错在哪?
参考要点
混淆了训练 和采样步数(NFE)。把训练 砍到 20 会让单步跨度过大、反向高斯假设失效、课表被迫陡峭,训练直接垮掉。想采样快,正确做法是保持训练 ,采样时用 DDIM / DPM++ 在少数步上积分。训练网格密和采样步数少并不矛盾。
Q2. 你的条件生成模型”生成很多样但完全不贴合条件”,你会先动哪个旋钮?如果调到很贴合但画面开始过饱和、有伪影,又说明什么?
参考要点
先升 CFG scale(从 3 往 5、7 试),因为”不听条件”最典型的原因是 太低。如果升上去后过饱和、有伪影,说明 冲过了倒 U 型曲线的顶点,要往回降,或改用 CFG++/PAG 这类减少过锐的变体。
Q3. 你已有一个在自然图像上训好的大扩散模型,只有 5000 张 H&E 病理图,想让它学出病理风格。用 LoRA 还是从零训 ControlNet?为什么?
参考要点
用 LoRA。这是”领域风格适配”而不是”逐像素空间控制”,LoRA 参数小(几 MB)、显存友好、在几千张小数据上不易过拟合。ControlNet 适合的是”条件是一张和输出严格对齐的模板图”(如用骨架 mask 生成完整荧光图),这里没有这样的对齐条件。
Q4. 为什么”给氨基酸序列生成 3D 结构”这类任务几乎不用”加法拼接”注入条件,也常常不需要 CFG?
参考要点
不用加法拼接:序列是变长的、每个残基位置都携带信息,加法拼接会把它压成一个全局向量、丢掉位置信息,必须用 cross-attention 让每个 3D 位置 attend 到对应残基。不需要 CFG:序列是”必须存在”的主条件,没有序列输出结构毫无意义,你不会想开一条”无条件”路径,所以这类结构预测风格的模型主条件永远保留、不做 dropout。
12. 与其他章节的关系
Section titled “12. 与其他章节的关系”- 第 2 章 前向加噪与反向去噪:本章的采样公式建立在第 2 章的反向高斯建模和”训练 T ≠ 采样 NFE”之上。
- 第 3 章 DDPM 三式精讲:本章 §2-§3 的采样递推是第 3 章”第三式”的工程展开。
- 第 5 章 五大机制族:本章 §5、§8 预告的一致性 / LCM / Flow Matching 少步范式,在第 5 章作为替代路线详讲。
- 第 7 章 按数据结构选型:本章讲”怎么调出好样本”,第 7 章讲”怎么验收样本、以及该不该用扩散”。
- 第 8 章 生物读者轨道:本章的条件注入三方式,在第 8 章的蛋白 / 分子 / 组学案例里逐一落地。
13. 延伸阅读
Section titled “13. 延伸阅读”| 文献 / 资源 | 为什么看 | 阅读深度建议 |
|---|---|---|
| Song et al., DDIM, 2021 | 确定式采样、跳步的出处 | 精读采样公式与 部分 |
| Lu et al., DPM-Solver / DPM-Solver++, 2022 | 高阶采样器的代表 | 看动机与阶数直觉,不必抠推导 |
| Karras et al., EDM, 2022 | 坐标与 Karras 噪声调度 | 读设计空间那一节 |
| Ho & Salimans, Classifier-Free Guidance, 2022 | CFG 采样侧与训练侧 dropout 的出处 | 精读 |
| Zhang et al., ControlNet, 2023 | zero-conv 外挂控制的出处 | 读结构与 zero-conv 动机 |
说明:本章聚焦采样加速与条件注入的工程调参;少步新范式的完整机制在第 5 章展开,生物落地案例在第 8 章展开。
主题色
字体
字号
视觉效果
即将离开本站
你将前往外部网站:
该网站与本站无关,本站不对其内容、安全性或可用性负责。确定后将在新标签页打开。