UNet 只会说「下一步往哪改」,KSampler 决定画多少笔、每笔怎么落、听不听甲方的话、从底稿哪一段开始画。 这页把六个参数拧开看。教学性模拟,画布上的图是程序化绘制,非真实模型输出。
四根线进,一根线出--出来的那根还不能直接看。
MODEL(紫)──────────┐
正向 CONDITIONING ───┤
负向 CONDITIONING ───┼──▶ KSampler ──▶ LATENT ──▶ VAE Decode ──▶ IMAGE
LATENT(起始画布)───┘
新手最常卡的一步:把 KSampler 的输出直接拖去 Save Image,报错。
它吐出来的是潜图--压缩过的、人眼看不了的中间态,必须再过一道 VAE Decode 显影。
文生图时它接 Empty Latent Image。这个节点名字骗人--它输出的是一块全零的空白潜图,
并不是噪声。真正的随机噪声是 KSampler 内部按 seed 生成、再叠加到这块画布上的。
这个区分在 §04 会变得很重要:denoise 决定的正是「往这块画布上叠多少噪声」。
十行伪代码,解释得了后面所有现象。
x = 空白潜图 + 由 seed 生成的噪声 for 每一步 t: 负向预测 = UNet(x, t, 负向提示词) 正向预测 = UNet(x, t, 正向提示词) 方向 = 负向预测 + cfg × (正向预测 − 负向预测) x = 按 sampler 的走法,朝「方向」修正一点点 (ancestral 类采样器还会故意再撒一点新噪声) return x # 交给 VAE Decode
两个常见现象,从这段代码直接读出来:
不是「服从度调大一点」,是一支向量往外飞。
§02 那行代码值得单独拆开看:
括号里是「从不想要的东西指向想要的东西」的那支箭 --- 记作 Δ。 cfg 就是这支箭的倍数。cfg = 1 时终点正好落在正向预测上; cfg = 10 时你把它甩出去十倍远,早已飞过「想要的东西」,冲进没有图像存在的区域。 这就是烧焦的由来 --- 不是「太听话」,是外推过头。
把 cfg = 1 代进公式:负向 + 1 × (正向 − 负向) = 正向。
负向预测被完全约掉了 --- 既然结果里用不到它,那次 UNet 调用就可以整个跳过。
每一步本来要跑两次 UNet(正向一次、负向一次),现在只跑一次, 所以 Flux 那类默认 cfg = 1 的模型,单步成本差不多是别人的一半。 这也是为什么给 Flux 硬调高 cfg 既慢又容易崩。
不是。潜空间有几万维,画不出来。这里压成二维示意 ---
但方向和倍数关系是真的:落点确实等于 负向 + cfg × Δ,
到「正向预测」的距离确实是 (cfg − 1) × |Δ|,线性外推。
那条虚线前沿也是比喻。真实模型里没有一条画得出来的硬边界, 只是越往外推,落点越不像训练时见过的图像。虚线画在 cfg = 10 处, 对应经验上「超过 10 就开始崩」这个说法。
全站最容易踩的一个坑:你以为设了 30 步,其实只画了 15 笔。
steps 是「打算画多少笔」,denoise 是「从底稿的哪一段开始画」。
两个旋钮不是各管一头--它们相乘,乘出来的才是真正跑的步数。拖一拖看:
注意灰格长在左边--denoise 砍掉的是「最噪的那前半段」,等于把你直接空投到扩散过程的中途。 不是「少画几笔」,是「从半成品接着画」。
图生图把 denoise 拉到 0.5,steps 还留在 20--实际只画了 10 笔,图糊得莫名其妙。 解法:denoise 减半,steps 就翻倍。
因为噪声只叠了三到五成,原图的大块结构(人在哪、地平线在哪)根本没被埋掉。 UNet 一睁眼就看见半张成品,只能顺着已有构图往下修细节。
denoise 拉到 0.8 以上,原图基本被噪声吃干净,构图也就守不住了--这时候它和文生图没多大区别。
收敛的和不收敛的--选错了,步数一改图就全变。
| 门派 | 代表 | 特点 |
|---|---|---|
| 祖先采样 ancestral |
Euler aDPM++ 2S a |
每步偷偷再撒一点新噪声,不收敛。步数一变结果大变,自带随机灵动感。 |
| 求解器 solver |
EulerDPM++ 2M UniPC |
收敛型。步数够多时结果趋同,稳定可预期,适合调参和批量出图。 |
新手闭眼选:DPM++ 2M + karras(万能款)或 Euler(简单快速)。
scheduler 是节奏表,安排每一步去掉多少噪声。karras 前期大刀阔斧、后期精雕细琢,低步数下细节更好,默认选它。
来自 k-diffusion 采样库,作者 Katherine Crowson。 常见误传是「K = Karras」--Karras 指的是 Tero Karras(karras 调度器那篇论文的作者),两个人不是一个人。 名字里的 K 和调度器选项里的 karras 只是碰巧都以 K 开头。
背不下来就抄这张表。
| 场景 | steps | cfg | denoise |
|---|---|---|---|
| SDXL 文生图 | 25~30 | 6~8 | 1.0 |
| SD1.5 文生图 | 20~25 | 6~8 | 1.0 |
| Flux 文生图 | 20~28 | 1 | 1.0 |
| 图生图微调 | 30 | 7 | 0.3~0.5 |
KSampler 不神秘:一个循环,六个旋钮。seed 定起点,steps 定笔数,
cfg 定听话程度,sampler + scheduler 定笔法和节奏,
denoise 定从哪儿开始。
真要记一条,记这个:实际执行步数 = steps × denoise。 这条一忘,图生图就会玄学地糊掉,而你会去怪模型。