跳转到内容

扩散模型教程第6章:训练与采样旋钮

本章是系列第 6 章:把采样加速条件注入两大工程主战场讲透——训练好一个 DDPM 之后,怎么让它跑得快、听得懂条件。 前置:第 2 章(前向/反向机制)、第 3 章(DDPM 三式)。本章大量用到”采样器 = ODE 数值积分器”这个心智模型。 系列内:条件生成在生物领域的具体落地见 第 8 章 生物读者轨道;评估与选型见 第 7 章 按数据结构选型

学完本章,你应能在不看笔记的情况下完成下列自检:

  1. 说清 DDIM 相对 DDPM 原生采样”换了什么、没换什么”,以及为什么它能跳步。
  2. 从一张速查表里为一个场景选出合适的采样器和步数,并解释一阶 vs 二阶的取舍。
  3. 画出 CFG scale 的倒 U 型曲线,说明太低、太高各自的现象。
  4. 对三种条件注入方式(拼接 / 交叉注意力 / ControlNet),各举一个匹配的条件形状。
  5. 解释为什么用 CFG 必须在训练侧做条件 dropout,以及 p_uncond 调坏了会怎样。

字数与深度定位:工程调参章(约 8500–12000 汉字)。推导采样器数值格式、训练模型、深入某个具体生物案例(留给第 8 章)。

一句话先给你一个可以立刻用的默认栈:不确定用什么,就上 DPM++ 2M Karras + 20 步 + CFG 5.0——绝大多数场景这是个合理起点,后面各节都在解释这句话每个数字背后的取舍。


第 2、3 章学过:训练时把 x0x_0 一路加噪到 xTx_T,采样时反过来,从 xTx_T 一步步”减噪”回 x0x_0。DDPM 原文的采样循环长这样(只贴必要公式,不推导):

xt1=1αt(xtβt1αˉtε^θ(xt,t))+σtz,zN(0,I)x_{t-1} = \frac{1}{\sqrt{\alpha_t}}\left(x_t - \frac{\beta_t}{\sqrt{1-\bar\alpha_t}}\,\hat\varepsilon_\theta(x_t, t)\right) + \sigma_t\, z, \quad z \sim \mathcal N(0, I)

翻译成人话:

  • 括号里那一坨:xtx_t 里网络认为的噪声按比例扣掉,得到当前对 xt1x_{t-1} 均值的估计。
  • 前面 1/αt1/\sqrt{\alpha_t}重新缩放,因为前向每一步都乘了 αt\sqrt{\alpha_t}
  • 后面 σtz\sigma_t z再注入一点噪声,保持这是个随机过程(这就是 DDPM 里 P = Probabilistic 的来源)。

每一步都做这件事,做 T=1000T=1000 次。 问题不在于网络太大,而在于步数太多——你花了 1000 次网络前向,才拿到 1 个样本。

在生物场景,我们更关心”能不能日常迭代”:

场景一张样本 1000 步网络前向能否日常用
256×256 图像 U-Net几秒到十几秒勉强
128³ 体素分子密度几十秒到分钟级只能夜里跑
蛋白结构生成(几百残基)分钟级只能小批量
显微图像 512×512 批量 100 张几分钟起步不能交互

关键问题:DDPM 那 1000 步,每一步都必要吗? 答案是不必要。那 1000 步来自”离散马尔可夫链”的建模假设——定义时把过程离散成了 1000 段小台阶,所以采样也得沿着这 1000 段走。但训练好之后,网络其实学到的是一条”从噪声流回数据”的连续路径,这条路径可以用任意数值积分方法去解,不必再拘泥于 1000 段小台阶。

从离散台阶到连续路径

这就是本章所有加速方法的共同思路。从这个视角出发的第一个成果就是 DDIM,后续 DPM-Solver / DPM++ / UniPC 都是更高阶、更聪明的积分器。

如果你熟悉分子动力学(MD):DDPM 1000 步像 fs 级时间步的 MD,非常安全但极慢;DDIM / DPM-Solver 像加大时间步 + 更高阶积分器(类似 Verlet 到更高阶显式辛法),代价是步长不能无限大,太大会积分崩掉;一致性模型像直接学一个”从任意时刻投影回终点”的函数,跳过积分本身。以后看到”采样器”这个词,就想到”数值积分器”。


3. DDIM:把随机采样变成确定式积分

Section titled “3. DDIM:把随机采样变成确定式积分”

DDIM 是本章的关键 pivot,值得单独讲清楚。

DDIM = 用完全相同的训练好的 εθ\varepsilon_\theta,换一种采样公式,让采样变成确定式的、可跳步的、可以少走的。

关键:不改训练、不改网络、不改权重,只改采样这一段代码。这也是它当年一出来就被立刻广泛采用的原因——换代码就行,不用重训。

DDPM 采样每步会再注入一点噪声(前面 σtz\sigma_t z 那项)。DDIM 问:如果把每一步的注入噪声关掉,会怎么样? 答案是采样过程从”随机马尔可夫链”变成一条”确定式的轨迹”——给定同一个 xTx_T,跑出来的 x0x_0 每次都一样。DDIM 采样公式(只贴含义):

xt1=αˉt1x^0(xt,t)当前对 x0 的猜测+1αˉt1ε^θ(xt,t)朝噪声方向留一点x_{t-1} = \sqrt{\bar\alpha_{t-1}}\,\underbrace{\hat x_0(x_t, t)}_{\text{当前对 }x_0\text{ 的猜测}} + \underbrace{\sqrt{1-\bar\alpha_{t-1}}\,\hat\varepsilon_\theta(x_t, t)}_{\text{朝噪声方向留一点}}

翻译:先用现在的 xtx_t 猜一个 x^0\hat x_0,然后按 t1t-1 时刻的信噪比,把 x^0\hat x_0 和噪声重新混一混。这个公式有一个极其重要的性质:它没有强制要求”必须相邻两步 tt1t \to t-1——你可以从 t=1000t=1000 直接跳到 t=980t=980t=900t=900、甚至 t=500t=500。于是就有了从 1000 步稀疏采样到 50 步、20 步。

性质DDPM 原生采样DDIM 采样
是否需要重训网络不需要
每步是否注入随机噪声是(σtz\sigma_t z可选(一般设为 0,即确定式)
相同 xTx_T 出的样本每次都不一样每次一样(可复现)
能否跳步不能(严格马尔可夫)(可 50 步、20 步)
典型步数100020–50
生物场景意义慢到不能日常用可交互、可批量筛选

DDIM 论文给了一个连续旋钮 η[0,1]\eta \in [0, 1]η=0\eta = 0 是纯确定式 DDIM(可复现、可跳步);η=1\eta = 1 退化回 DDPM(每步注噪、不能跳步);中间值是部分注噪的中间态。现在几乎所有 diffusers 里的 DDIMScheduler 默认都是 η=0\eta = 0你先记住”DDIM = 确定式”就够,其它 η\eta 值罕见调。

真实的代价:步数压到 20 以下时质量会掉,尤其在细节纹理、罕见类别上更明显;因为是确定式,同一个 xTx_T 永远出同一张图——想要多样性得换 xTx_T,不能靠”多采几次”。

很多同学误以为的代价(其实不成立)

  • “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。

采样器对应的数值方法

你不需要记数值分析细节,只要记住一件事:阶数越高、用的历史点越多,同样步数下积分误差越小、质量越好,代价是每步内部要多算一次或几次网络前向。

采样器阶数 / 类型推荐步数每步前向什么时候用
DDIM一阶 · 显式20–501需要完全可复现、做 latent 插值 / inversion
Euler一阶 · 显式20–501简单基线;EDM/Karras 系模型
Euler a(Ancestral)一阶 · 随机20–401想要多样性更强、更”活”的生成
Heun二阶 · 显式20–302中等步数下再挤一点质量
DPM-Solver++ (2M)二阶 · 多步10–201(多步共享)默认首选,速度质量平衡最好
DPM-Solver++ (2M) Karras上者 + Karras 调度10–201很多图像模型的新默认
UniPC统一预估-校正8–151想要极少步(小于 15)下仍稳
DDPM 原生一阶 · 随机10001论文复现 / 调试,几乎不再用于生产

记忆口诀:日常首选 DPM++ 2M(15–25 步,效果接近甚至超过 50 步 DDIM);极少步用 UniPC(8–15 步还能稳);要复现 / 做插值用 DDIM(确定式、可 inversion 不可替代);想更多样用 Euler a(不追求可复现时)。

一阶与二阶方法的迈步方式

代价:二阶方法每步跑网络 2 次,所以”20 步二阶” ≈ “40 步一阶”的网络前向次数。但因为二阶能吃更大步长,总步数往往能压到一阶的一半以下,最终反而更快。

4.4 一个值得单独讲的旋钮:Karras 噪声调度

Section titled “4.4 一个值得单独讲的旋钮:Karras 噪声调度”

第 2 章学的是”βt\beta_t 从头到尾线性或 cosine”这种离散 tt 的调度。EDM(Karras 2022)提出另一套写法:直接以噪声标准差 σ\sigma 为坐标——定义一系列从大到小的 σi\sigma_i,采样时按 σmaxσmin\sigma_{\max} \to \sigma_{\min} 走,并在 σ\sigma 分布不均匀的地方多放采样点(比如小 σ\sigma 附近细节最多就多放)。这就是很多采样器名字后面挂 “Karras” 的意思:同样步数下,通过更聪明地分配采样点位置,再多挤 10–20% 质量。你能调的就一个开关 use_karras_sigmas=True/False,开着通常更好,尤其在少步(≤20)场景。

蛋白结构模型(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 原生对照。

场景推荐步数采样器备注
快速原型 / 交互调试10–15DPM++ 2M Karras先看条件对不对,不追终稿质量
生产批量 / 高通量筛选20DPM++ 2M Karras / UniPC主力区间
最终交付 / 高价值样本30–50DPM++ 2M Karras / Heun边际质量
论文对照 / 复现 DDPM1000DDPM 原生只为公平对比
极限少步(工业部署)1–4换 LCM / Turbo / FM需重训或蒸馏
现象可疑参数首选调整
像素级椒盐 / 结构完全崩坏步数太少步数 ↑(10 → 20)
过糊、缺细节步数偏少或采样器阶数太低步数 ↑ 或换 DPM++ 2M
过锐、有伪影步数太多 + CFG 太高CFG ↓(见 §6)
每次跑都一样、多样性差用了 DDIM换 Euler a 或换 xTx_T
中间步数(≈50)比高步数(≈500)反而好正常,说明已在甜点区别再加步数

蛋白结构保守一点(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) 直接学一个”从轨迹上任意点一步投影回终点 x0x_0“的函数,跳过逐步积分。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。

假设你训好了一个条件扩散模型 εθ(xt,t,y)\varepsilon_\theta(x_t, t, y)yy 是条件。如果直接采样,模型有时会”敷衍地听条件”——生成的东西大致对,但不精确、不聚焦。因为训练时条件只是软引导,网络没有”必须严格贴合 yy“的硬约束。CFG 的做法是采样时用两次网络前向:有条件预测 εθ(xt,t,y)\varepsilon_\theta(x_t, t, y) 和无条件预测 εθ(xt,t,)\varepsilon_\theta(x_t, t, \varnothing),然后外插:

ε^=εθ(xt,t,)+w(εθ(xt,t,y)εθ(xt,t,))\hat\varepsilon = \varepsilon_\theta(x_t, t, \varnothing) + w \cdot \bigl(\varepsilon_\theta(x_t, t, y) - \varepsilon_\theta(x_t, t, \varnothing)\bigr)

含义:沿着从”不听条件”到”听条件”的方向,多走 www=1w=1 等价于普通条件采样;w>1w>1 放大条件影响,模型更听话;w=0w=0 完全不听条件;w<0w<0 反向条件(可以做 negative prompt)。

CFG scale 的倒 U 型曲线

关键:这是一条倒 U 型曲线——太低不听话,太高会崩。甜点在 w[3,8]w \in [3, 8]

CFG scale ww现象什么时候用
1.0相当于关闭 CFG无条件模型 / 已经很贴合
1.5–2.5弱引导想要多样性、类别很宽泛
3–5默认区间大多数条件生成的起点
5–8强引导条件复杂 / 有精细结构
8–12很强只在”必须严格按 prompt”时用
> 15崩坏区除非做对抗实验,不要碰
< 0负引导想”远离某类”、去除伪影
现象可疑调整方向
很多样但不听条件ww 太低ww ↑(3 → 5 → 7)
过锐、颜色饱和到发绿发紫、纹理伪影ww 太高ww ↓ 或加负 prompt
多次生成几乎一样ww 太高 + 采样器确定式ww ↓ 或换 Euler a
听条件但整体结构畸形ww 太高 + 步数太少ww ↓ 再考虑步数 ↑
完全不听条件忘了传条件 / 用了无条件模型检查代码,不是 CFG 问题

心法:先固定步数在 20 附近,然后只扫 CFG。 CFG 是第一位可视调整的旋钮。

因为 CFG 每步要跑网络两次(一次带条件、一次不带),启用 CFG 时算力约翻倍。两条优化路径:一是降低 CFG 触发频率(不是每步都做,而是前 K 步做、后面关掉,SDXL / Flux 都用了类似技巧);二是 CFG 蒸馏(把”带 CFG 的两次预测”蒸馏成一次预测,SDXL Lightning / LCM 吸收了这一思想)。对你来说,先按默认(每步都跑 CFG)用,遇到吞吐瓶颈再考虑这些优化。

蛋白结构生成条件通常是 sequence / motif / symmetry,w[1,3]w \in [1, 3] 就够(这些条件本身就很强,不需要放大),RFdiffusion 论文里就用较低 CFG;小分子生成条件是靶点口袋 / 性质向量,w[2,5]w \in [2, 5];显微 / 组织图像条件是文本 / 类别,w[4,8]w \in [4, 8],接近 Stable Diffusion 默认;单细胞表达矩阵 / 空间转录组条件是细胞类型 / 组织,w[1.5,3]w \in [1.5, 3](这类分布本身噪声大,ww 太高会过拟合到平均态)。通用心法:条件越”稀疏 / 抽象”(文本、类别)越需要高 ww;条件越”稠密 / 具象”(motif、结构、口袋)越不需要高 ww


7. 条件怎么塞进网络(三大注入方式)

Section titled “7. 条件怎么塞进网络(三大注入方式)”

前面讲的都是采样端旋钮。但要能用 CFG、能做条件生成,前提是网络本身”看得见”条件。这一节讲条件怎么进网络——它决定了你能做什么样的条件生成。

7.1 一个必须先澄清的坑:“条件”≠“输入”

Section titled “7.1 一个必须先澄清的坑:“条件”≠“输入””

初学者常犯:把条件 yy 也当成”要被去噪的 xx“一起加噪。错。 正确心智模型:

条件不加噪,被去噪对象才加噪

xtx_t 一路带噪(第 2 章的前向过程),网络负责把它去噪;yy 全程保持原样(不加噪),网络负责”看着它”做去噪。唯一例外是图像修补(inpainting):被遮住的区域是 xx 的一部分,也走加噪;未遮住的区域反而是”条件”。

7.2 条件的 5 种形状决定注入方式

Section titled “7.2 条件的 5 种形状决定注入方式”
形状通用例子生物例子典型注入方式
① 标量 / 类别”cat” 类别 id细胞类型、物种 idembedding 后拼进时间步 embedding
② 文本 / 短序列prompt “a red car""a mitotic figure in H&E”文本编码器 → 交叉注意力
③ 长序列 (1D)音频 / 时序氨基酸序列、DNA / RNA序列编码器(ESM / DNA-BERT)→ cross-attn
④ 图像 / 结构 (2D/3D)边缘图、分割图蛋白模板、病理 maskControlNet 风格逐位置控制
⑤ 图 / 集合分子图小分子、口袋原子云等变 GNN 编码后融合

关键观察:条件的形状决定注入方式,不是喜好决定的。 标量加法就够;变长序列必须用 cross-attention(长度对不上硬拼不了);和输出对齐的图 / 结构要 ControlNet 类逐位置控制才准。

7.3 方式一:拼接 / 加法(concat / add)

Section titled “7.3 方式一:拼接 / 加法(concat / add)”

把条件 yy 编码成一个向量 eye_y,加到(或拼到)时间步 embedding ete_t 上,作为每个残差块的”全局调制”。心智模型:告诉网络”你现在是在为冷杉去噪的第 500 步”——“冷杉”和”第 500 步”都是一个全局标签。

h_t = e_t + e_y # 加法融合(最常见)
h_t = concat(e_t, e_y) # 拼接后再过一层 MLP

为什么这么简单也管用:因为这类条件本来就没有”位置”这个概念,一个向量就能表达。关键调法:condition embedding 维度和 ete_t 同宽(通常 512/768)方便直接加;训练时以概率 pp(通常 0.1)对 eye_y 做 dropout,这是为了 CFG(§8 详说),必开。调坏了:完全不 dropout 则采样时无法用 CFG 调条件强度,多样性差;eye_y 维度太小则类别多时欠拟合(例如 100 种细胞类型压到 32 维)。

7.4 方式二:交叉注意力(cross-attention)

Section titled “7.4 方式二:交叉注意力(cross-attention)”

把条件 yy 编成一串 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_tokens
attn = softmax(Q K^T / √d) · V

必记含义:Q 来自 xtx_t(“我这个位置想问什么”),K/V 来自 yy(“条件里能提供什么”),两者长度可以完全不一样(图像 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 慢慢学出非零权重,把控制信号逐步注入。

ControlNet 的 zero-conv 融合

为什么这样设计能不破坏预训练:如果一上来外挂就随机初始化并”猛推”主干,梯度会撕烂预训练权重。zero-conv 让主干在开始时感受不到扰动,先”熟悉一下新条件”再慢慢介入。关键调法:control scale α\alpha 从 1.0 起调(条件太”僵”就调到 0.7,太弱就到 1.3);数据 < 数万只训外挂,> 数十万可考虑联合微调最后几层;LoRA 秩 rr 常用 4–16。调坏了:去掉 zero-conv 用普通卷积随机初始化则训练前几十步就把主干撕坏;LoRA 秩开太大(如 128)相当于半全量微调、还容易过拟合小数据集。

你的条件是什么首选注入方式备注
类别 id / 一个标量加法(拼时间步 embedding)简单最好
一段文本 / 一条蛋白序列 / 一条 DNAcross-attention用预训练编码器省事又准
空间上和输出对齐的模板图(深度图、mask、骨架)ControlNetzero-conv 是灵魂,别丢
只要”风格像”的参考图IP-Adapter / T2I-Adapter比 ControlNet 轻得多
想让通用扩散适配你的领域数据(病理 / 显微)LoRA参数小、显存友好
分子图 / 蛋白口袋(结构化非欧数据)等变 GNN 编码 + cross-attn见第 8 章展开

§6 讲了 CFG 的采样侧(用 CFG scale w 把条件方向拉强)。但这只是一半故事——采样时能拉强,前提是训练时你训过”无条件”的版本

回顾 CFG 公式 ε^=εuncond+w(εcondεuncond)\hat\varepsilon = \varepsilon_\text{uncond} + w \cdot (\varepsilon_\text{cond} - \varepsilon_\text{uncond}),这里的 εuncond\varepsilon_\text{uncond}(把 yy 置成”空”时的预测)从哪来?只能来自训练时你也训过”y=y = \varnothing(空条件)“的样本。否则模型根本没见过”没有条件是什么样子”,εuncond\varepsilon_\text{uncond} 就是乱猜的,CFG 外插自然崩。

做法极简:训练时以概率 p_uncond(通常 10%)把条件 yy 随机置成空(一个特殊的”空条件 embedding”):

if random() < p_uncond:
y = NULL_EMBEDDING # 训练一个无条件样本
else:
y = actual_condition_y # 训练一个有条件样本

心智模型:像给学生做题时,10% 的题目遮住题干只让他”随便答”,逼他建立一个”没有条件时的默认分布”。采样时再用 CFG 公式把两者线性外推。

参数位置常用值调坏了会怎样
p_uncond训练时 y 被置空的概率0.1太小(1%)→ 无条件路径没训熟,CFG 采样时噪声异常;太大(50%)→ 模型对条件敏感度下降,采样质量掉
NULL 嵌入初始化空条件的向量可训练参数,初始为 0 或小随机值若与真实条件嵌入分布重叠 → 模型分不清”空”和”有”,CFG 失效
训练侧做了什么采样侧能开什么效果
完全不 dropout 条件只能 w=1w=1(等价纯条件)多样性 = 训练分布,无法进一步强化条件
puncond=0.1p_\text{uncond}=0.1任意 w[1,15]w \in [1, 15]§6 讲的甜点 3–8 全部可用
puncond=0.5p_\text{uncond}=0.5(过高)名义上也能开 CFG采样质量下降,条件路径本身没训透

坑 1:多条件时怎么 dropout? 如果条件不止一个(例如同时给”细胞类型” + “组织位置”),常见做法:联合 dropout(以 10% 概率把所有条件一起置空,简单,等价单条件情形)或独立 dropout(每个条件各以 10% 概率独立置空,4 种组合都训到,但采样时要更复杂的多条件 CFG 公式)。入门推荐先用联合 dropout。

坑 2:条件”必须存在”的场景。 举例:给蛋白序列生成结构——没有序列输入,输出结构毫无意义。这种任务其实不需要 CFG,你不会想在采样时开一条”无条件”路径。多数结构预测风格的扩散模型(如 RFdiffusion 的一部分设置)不用 CFG,或只在特定辅助条件(如二级结构提示)上用 CFG,主条件(序列本身)永远保留。


9. 调参实战:从”现象”到”该动哪个旋钮”

Section titled “9. 调参实战:从”现象”到”该动哪个旋钮””

前面每一节都在讲单个旋钮。真正调模型时,你面对的是”生成出来不对”这个模糊症状,要能反推该动哪个旋钮。

调参旋钮优先级

顺序很重要:先在便宜的旋钮上调(CFG、步数),实在不行再动贵的(换采样器、换范式)。

现象最可能的旋钮动作
生成不听条件CFG 太低ww:3 → 5 → 7
过锐、过饱和、伪影CFG 太高ww ↓,或换 CFG++/PAG
整体结构崩坏、椒盐噪点步数太少步数 10 → 20
过糊、缺细节步数少 / 采样器阶数低步数 ↑ 或换 DPM++ 2M
多样性差、每次都一样确定式采样器换 Euler a,或换 xTx_T
少步(小于 15)就崩采样器不够高阶换 UniPC / 开 Karras
吞吐不够CFG 翻倍算力CFG 蒸馏 / 降触发频率
  1. 先定采样器:默认 DPM++ 2M Karras。
  2. 固定步数 20,只扫 CFG(从 5 起,±2 试)。
  3. CFG 定下来后再调步数:往下压看什么时候崩(找悬崖),日常取悬崖上方一档。
  4. 多样性不够:换 Euler a 或换随机种子 / xTx_T,不要靠加步数。
  5. 还不行才换范式(LCM/FM),且要接受重训成本。

新手常见错误是同时改三四个旋钮,结果无法归因。一次只动一类:调 CFG 时固定步数和采样器;调步数时固定 CFG。扩散模型的旋钮彼此耦合(比如高 CFG + 少步会叠加出畸形),只有单变量扫描才能建立”这个旋钮 → 这个现象”的因果直觉。

  • 蛋白 / 分子几何误差不可目视:图像调糊了一眼看出,但生成的蛋白骨架”拓扑错了”肉眼很难发现——所以这类任务要靠 self-consistency 等下游指标兜底(第 7 章),不能只靠调采样参数刷”看起来对”。
  • CFG 在稠密条件上不宜过高:口袋、motif 这类强条件本身信息量大,ww 拉太高反而过拟合到”平均骨架”、丢多样性。
  • 步数在难验证领域要保守:组学、结构这类”错了也不容易当场发现”的领域,宁可多花几步,别为省算力压到悬崖边。

把前面的旋钮串成一次真实的排障,你就知道这套 SOP 怎么用。假设你在做”文本条件的病理图生成”,第一版结果是”图像过锐、颜色发紫、还带网格状伪影”,你该怎么定位?

  1. 先看现象归哪类。过锐 + 过饱和是 CFG 太高的典型信号(§6.4),网格伪影则常伴随”高 CFG + 步数偏少”的叠加。不要一上来同时动多个旋钮。
  2. 固定采样器与步数,先降 CFG。按 §9.3 的顺序,先把采样器锁定在 DPM++ 2M Karras、步数锁定在 20,把 CFG 从 9 降到 6,重跑同一批种子。过饱和明显缓解、伪影减轻,说明主因确实是 CFG。
  3. 再单独扫步数。CFG 定在 6 后,把步数从 20 往下压到 15、12、10,观察哪一档开始出现结构崩坏(悬崖)。若 12 步仍稳、10 步开始糊,就取悬崖上方一档 15 步作为日常值。
  4. 最后处理多样性。若此时发现”同一 prompt 多次生成几乎一样”,不要靠加步数解决——那是确定式采样器 + 高 CFG 的联合效应,改用 Euler a 或多换几个 xTx_T 起点即可。
  5. 收尾验证。锁定”DPM++ 2M Karras + 15 步 + CFG 6 + Euler a 备选”后,跑一批多种子样本,用第 7 章的下游指标(这里是病理分割增益 + 医生盲评)确认”看起来对”同时”确实有用”。

整个过程没有一步是”同时动两个旋钮碰运气”——每一步都固定其他变量、只扫一个,这样你才能把每个现象稳稳归因到具体旋钮。这就是本章所有速查表的正确用法:不是背下来,而是在排障时按优先级逐个排除。


  • 能说清 DDIM 相对 DDPM 换了什么、为什么能跳步、以及”确定式”的含义
  • 能从速查表为一个场景选采样器和步数,并解释一阶 vs 二阶取舍
  • 能画出步数-质量曲线,指出甜点区和悬崖
  • 能画出 CFG 倒 U 型曲线,说明太低太高各自现象
  • 能说出默认栈 DPM++ 2M Karras + 20 步 + CFG 5 每个数字的理由
  • 能为三种条件形状(标量 / 序列 / 对齐图)各选对注入方式
  • 能解释 ControlNet 的 zero-conv 为什么不能省
  • 能解释为什么用 CFG 必须在训练侧做条件 dropout
  • 拿到”生成不对”的现象,能用定位表反推该动哪个旋钮

Q1. 同事说”我要把训练时的 TT 从 1000 改成 20,这样采样快 50 倍”。这个想法错在哪?

参考要点

混淆了训练 TT 和采样步数(NFE)。把训练 TT 砍到 20 会让单步跨度过大、反向高斯假设失效、课表被迫陡峭,训练直接垮掉。想采样快,正确做法是保持训练 T=1000T=1000,采样时用 DDIM / DPM++ 在少数步上积分。训练网格密和采样步数少并不矛盾。

Q2. 你的条件生成模型”生成很多样但完全不贴合条件”,你会先动哪个旋钮?如果调到很贴合但画面开始过饱和、有伪影,又说明什么?

参考要点

先升 CFG scale(从 3 往 5、7 试),因为”不听条件”最典型的原因是 ww 太低。如果升上去后过饱和、有伪影,说明 ww 冲过了倒 U 型曲线的顶点,要往回降,或改用 CFG++/PAG 这类减少过锐的变体。

Q3. 你已有一个在自然图像上训好的大扩散模型,只有 5000 张 H&E 病理图,想让它学出病理风格。用 LoRA 还是从零训 ControlNet?为什么?

参考要点

用 LoRA。这是”领域风格适配”而不是”逐像素空间控制”,LoRA 参数小(几 MB)、显存友好、在几千张小数据上不易过拟合。ControlNet 适合的是”条件是一张和输出严格对齐的模板图”(如用骨架 mask 生成完整荧光图),这里没有这样的对齐条件。

Q4. 为什么”给氨基酸序列生成 3D 结构”这类任务几乎不用”加法拼接”注入条件,也常常不需要 CFG?

参考要点

不用加法拼接:序列是变长的、每个残基位置都携带信息,加法拼接会把它压成一个全局向量、丢掉位置信息,必须用 cross-attention 让每个 3D 位置 attend 到对应残基。不需要 CFG:序列是”必须存在”的主条件,没有序列输出结构毫无意义,你不会想开一条”无条件”路径,所以这类结构预测风格的模型主条件永远保留、不做 dropout。


  • 第 2 章 前向加噪与反向去噪:本章的采样公式建立在第 2 章的反向高斯建模和”训练 T ≠ 采样 NFE”之上。
  • 第 3 章 DDPM 三式精讲:本章 §2-§3 的采样递推是第 3 章”第三式”的工程展开。
  • 第 5 章 五大机制族:本章 §5、§8 预告的一致性 / LCM / Flow Matching 少步范式,在第 5 章作为替代路线详讲。
  • 第 7 章 按数据结构选型:本章讲”怎么调出好样本”,第 7 章讲”怎么验收样本、以及该不该用扩散”。
  • 第 8 章 生物读者轨道:本章的条件注入三方式,在第 8 章的蛋白 / 分子 / 组学案例里逐一落地。

文献 / 资源为什么看阅读深度建议
Song et al., DDIM, 2021确定式采样、跳步的出处精读采样公式与 η\eta 部分
Lu et al., DPM-Solver / DPM-Solver++, 2022高阶采样器的代表看动机与阶数直觉,不必抠推导
Karras et al., EDM, 2022σ\sigma 坐标与 Karras 噪声调度读设计空间那一节
Ho & Salimans, Classifier-Free Guidance, 2022CFG 采样侧与训练侧 dropout 的出处精读
Zhang et al., ControlNet, 2023zero-conv 外挂控制的出处读结构与 zero-conv 动机

说明:本章聚焦采样加速与条件注入的工程调参;少步新范式的完整机制在第 5 章展开,生物落地案例在第 8 章展开。