← aipaipai.cloud · INDEX
DOCS // INTERACTIVE NO MATH

KSampler://
六个旋钮

UNet 只会说「下一步往哪改」,KSampler 决定画多少笔、每笔怎么落、听不听甲方的话、从底稿哪一段开始画。 这页把六个参数拧开看。教学性模拟,画布上的图是程序化绘制,非真实模型输出。

SAMPLER_READY NODE: KSampler OUT: LATENT (not IMAGE) SECTIONS: 07

01 它不输出图片

四根线进,一根线出--出来的那根还不能直接看。

MODEL(紫)──────────┐
正向 CONDITIONING ───┤
负向 CONDITIONING ───┼──▶  KSampler  ──▶ LATENT ──▶ VAE Decode ──▶ IMAGE
LATENT(起始画布)───┘

新手最常卡的一步:把 KSampler 的输出直接拖去 Save Image,报错。 它吐出来的是潜图--压缩过的、人眼看不了的中间态,必须再过一道 VAE Decode 显影。

那根 “LATENT 起始画布” 到底是什么?

文生图时它接 Empty Latent Image。这个节点名字骗人--它输出的是一块全零的空白潜图, 并不是噪声。真正的随机噪声是 KSampler 内部seed 生成、再叠加到这块画布上的。

这个区分在 §04 会变得很重要:denoise 决定的正是「往这块画布上叠多少噪声」。

02 循环里在干什么

十行伪代码,解释得了后面所有现象。

x = 空白潜图 + 由 seed 生成的噪声

for 每一步 t:
    负向预测 = UNet(x, t, 负向提示词)
    正向预测 = UNet(x, t, 正向提示词)
    方向 = 负向预测 + cfg × (正向预测 − 负向预测)
    x = 按 sampler 的走法,朝「方向」修正一点点
    (ancestral 类采样器还会故意再撒一点新噪声)

return x   # 交给 VAE Decode

两个常见现象,从这段代码直接读出来:

// P3 · 待补:逐行点亮动画 + 每行右侧的潜图快照

03 交互 #1 · CFG 是一次外推

不是「服从度调大一点」,是一支向量往外飞。

§02 那行代码值得单独拆开看:

方向 = 负向预测 + cfg × ( 正向预测负向预测 )

括号里是「从不想要的东西指向想要的东西」的那支箭 --- 记作 Δ。 cfg 就是这支箭的倍数。cfg = 1 时终点正好落在正向预测上; cfg = 10 时你把它甩出去十倍远,早已飞过「想要的东西」,冲进没有图像存在的区域。 这就是烧焦的由来 --- 不是「太听话」,是外推过头

▸ 外推向量 · 潜空间示意 落点在安全侧
负向预测 正向预测 实际落点
▸ 出图效果 自然
同 seed · 只改 cfg
cfg · 外推倍数 7.0
1.0▲ 甜点区 5~815.0
甜点区 · 平衡听话与自然 5~8

为什么 cfg = 1 会快接近一倍?

把 cfg = 1 代进公式:负向 + 1 × (正向 − 负向) = 正向。 负向预测被完全约掉了 --- 既然结果里用不到它,那次 UNet 调用就可以整个跳过。

每一步本来要跑两次 UNet(正向一次、负向一次),现在只跑一次, 所以 Flux 那类默认 cfg = 1 的模型,单步成本差不多是别人的一半。 这也是为什么给 Flux 硬调高 cfg 既慢又容易崩。

这张向量图是真的潜空间吗?

不是。潜空间有几万维,画不出来。这里压成二维示意 --- 但方向和倍数关系是真的:落点确实等于 负向 + cfg × Δ, 到「正向预测」的距离确实是 (cfg − 1) × |Δ|,线性外推。

那条虚线前沿也是比喻。真实模型里没有一条画得出来的硬边界, 只是越往外推,落点越不像训练时见过的图像。虚线画在 cfg = 10 处, 对应经验上「超过 10 就开始崩」这个说法。

04 交互 #2 · steps × denoise

全站最容易踩的一个坑:你以为设了 30 步,其实只画了 15 笔。

steps 是「打算画多少笔」,denoise 是「从底稿的哪一段开始画」。 两个旋钮不是各管一头--它们相乘,乘出来的才是真正跑的步数。拖一拖看:

① steps · 打算画多少笔 30
450
② denoise · 从哪一段开始 1.00
0.00 · 原图不动1.00 · 纯噪声
▸ 一键场景
实际执行步数 = steps × denoise
30
甜点区 · 够用
30 × 1.00 = 30 步
▸ 步数尺 · 50 格 = steps 上限 跑满 30 格
实际执行的步 被 denoise 跳过的前段

注意灰格长在左边--denoise 砍掉的是「最噪的那前半段」,等于把你直接空投到扩散过程的中途。 不是「少画几笔」,是「从半成品接着画」。

▸ 输入 · 起始图被噪声吃掉 100%
▸ 输出 · 跑完 30全新生成
⚠ 经典翻车:denoise 降了,steps 忘了翻倍

图生图把 denoise 拉到 0.5,steps 还留在 20--实际只画了 10 笔,图糊得莫名其妙。 解法:denoise 减半,steps 就翻倍

为什么 0.3~0.5 能「保留构图」?

因为噪声只叠了三到五成,原图的大块结构(人在哪、地平线在哪)根本没被埋掉。 UNet 一睁眼就看见半张成品,只能顺着已有构图往下修细节。

denoise 拉到 0.8 以上,原图基本被噪声吃干净,构图也就守不住了--这时候它和文生图没多大区别。

05 采样器两大门派

收敛的和不收敛的--选错了,步数一改图就全变。

门派代表特点
祖先采样
ancestral
Euler a
DPM++ 2S a
每步偷偷再撒一点新噪声,不收敛。步数一变结果大变,自带随机灵动感。
求解器
solver
Euler
DPM++ 2M UniPC
收敛型。步数够多时结果趋同,稳定可预期,适合调参和批量出图。

新手闭眼选:DPM++ 2M + karras(万能款)或 Euler(简单快速)。

scheduler 是节奏表,安排每一步去掉多少噪声。karras 前期大刀阔斧、后期精雕细琢,低步数下细节更好,默认选它。

KSampler 的 “K” 是哪来的?

来自 k-diffusion 采样库,作者 Katherine Crowson。 常见误传是「K = Karras」--Karras 指的是 Tero Karras(karras 调度器那篇论文的作者),两个人不是一个人。 名字里的 K 和调度器选项里的 karras 只是碰巧都以 K 开头。

// P3 · 待补:收敛 vs 不收敛的 tabs + canvas 对比(同 seed 扫 steps)

06 参数配方速查

背不下来就抄这张表。

场景stepscfgdenoise
SDXL 文生图25~306~81.0
SD1.5 文生图20~256~81.0
Flux 文生图20~2811.0
图生图微调3070.3~0.5
// P3 · 待补:点一行 → 自动把 §04 实验台的滑块摆到该配方

07 所以--

KSampler 不神秘:一个循环,六个旋钮。seed 定起点,steps 定笔数, cfg 定听话程度,sampler + scheduler 定笔法和节奏, denoise 定从哪儿开始。

真要记一条,记这个:实际执行步数 = steps × denoise。 这条一忘,图生图就会玄学地糊掉,而你会去怪模型。

▸ 延伸阅读