上一篇讲局部重绘时,重绘幅度管的是“从噪声表的哪一档开始走”。这一篇讲另一根几乎同样常用的滑杆,它作用在每一步去噪上,名字叫引导强度:ComfyUI 和 diffusers 里叫 CFG scale,WebUI 里就叫 CFG Scale,有些界面叫“提示词引导”。
关于它有两句互相矛盾的抱怨:一句是“图不听话,把 CFG 拉高就好了”;另一句是“拉到 12 以上就过曝、发腻、像塑料”。两句都是真的,而且出自同一个机制。弄清楚它,负向提示词为什么常常完全没用、换了模型这根滑杆为什么像失灵,也一起会有答案。
每步跑两遍模型,两遍之差就是“提示词的方向”
扩散模型出图要走几十步去噪,每一步都要模型判断“该往哪个方向减噪”。关键在于,同一张中间结果会被问两遍:一遍带着你的提示词,得到 条件预测 ;一遍把提示词置空,得到 无条件预测 。空提示词那一遍相当于问模型:“什么都不要求的时候,你会把这张图往哪推?”它给出的是模型自己对“像一张正常图”的判断。两者相减,剩下的就是提示词额外带来的那部分方向。
引导强度 干的活,是把这部分方向按倍数加上去1:
三种取值一看就明白: 时结果就是条件预测本身,提示词正常起作用,不加放大; 时结果就是无条件预测,提示词被完全无视; 时条件预测的权重是 7,无条件预测被减掉 6 倍。
对照上一篇:重绘幅度是在“原图”和“纯噪声”两端之间 插值,两头都是模型见过的合法状态;引导强度在 时是 外推,把条件预测沿着“远离无条件预测”的方向推出这条线段的端点之外。 拿到的不是“有提示词”和“没提示词”之间的折中,而是一个模型没在这个位置上被要求过的极端版本。后面所有的副作用都从这一步来。
顺带记一个代价:每步跑两遍模型,开着 CFG 的采样时间差不多是关掉它的两倍。后面讲蒸馏模型要用。
为什么调高就更听话
“听话”在机制上就是“朝条件预测指的方向多走几步”。每一步都放大提示词的影响,几十步累积下来,终点被推到条件分布里更典型、更极端的位置。副作用立刻出现:多样性下降。同一个提示词连续出图,越来越像同一种构图、同一种脸,因为所有结果都被推向同一个高峰,而不是散落在周围2。
所以调高 CFG 换来的不是“理解得更好”,而是“更用力地照着自己那点理解去做”。模型不认识的东西不会因为 CFG 高就认识,只会把对那个词的近似理解推得更夸张。“红色连衣裙”在 CFG 很高时容易变成满画面泛红,原因就在这里:被放大的方向里包含“红”这个属性,却不包含“只有裙子红”这个限定。
为什么调高就会过曝
外推把预测值推出了模型训练时见过的范围。流程要把它们裁回合法区间才能继续算下一步,而裁切很粗暴:超出上限的值一律压成上限。原本 -1.5 和 -3.0 这样大小不同的数值,一裁全都变成 -1,它们之间的差别就没了。
颜色和亮度是有序数值,差别被削平的直接结果就是高光连成一片白、暗部连成一片黑,中间的过渡丢失——画面上看就是过曝、亮部发飘、颜色饱和到不真实、纹理发腻3。而且这份代价和收益是绑在一起的:把 CFG 那一步的更新量拆开看,沿着条件预测方向的分量主要在加对比度和饱和度,垂直方向的分量才提升质量,两者比例固定,没法只加质量不加饱和2。
界面上有两个针对这一点的补丁。CFG rescale 在算完之后把结果的整体离散程度缩放回条件预测的水平,参数从 0 到 1,越大纠正越多1。动态阈值 则是不硬裁到固定范围,而按当前这步的实际分布定界,保住数值之间的大小关系再缩放回来3。判断方法很简单:想要的特征已经出现,只是颜色发腻、高光连成片,说明已经出界,往下调或者开 rescale。
负向提示词就长在这根滑杆上
负向提示词不是什么独立功能。实现上,它替换的正是公式里 那一路:本来跑空提示词,现在跑你写的“不要的东西”。于是一步步推的方向,从“远离模型的默认倾向”变成“远离你列出的那些特征”1。
这个结构决定了两件事。
CFG 为 1 时负向提示词等于不存在。 代进公式, 时 ,无条件那一路被整个消掉,负向词一次乘法都没参与。很多人觉得负向词“没用”,问题就出在这:为了画面柔和、避免过曝把 CFG 调到 1–2,然后奇怪负向词为什么毫无反应。
负向词只是反向推,并非删除。 它没法把画面里已经出现的东西擦掉,只能让每一步往背离那些特征的方向偏一点。写“多余的肢体”能减少多手多脚,是因为那确实是个能被推远的方向;写“一只猫”来去掉画面里的猫,效果通常很差,因为扩散过程不是按物体清单编辑的。
也正因为共用一根滑杆,负向词写太多太长,效果和把 CFG 调高是同构的:一端不断加大推力,另一端就更容易出界。
为什么在有些模型上这根滑杆像失灵
这几年新出的模型里有大量“引导蒸馏”版本:FLUX.1 dev、SDXL Turbo、各种 LCM 和闪电版。它们在训练时用不同引导强度去生成,让模型学会“一遍就把引导这件事做完”,推理时只跑一遍,省掉一半算力。
代价是你手上那个数字已经不是真正的 CFG。以 FLUX.1 dev 为例,界面上那个 guidance(常推荐 3.5)以数值嵌入的形式喂给模型,只是提示它“该用多强的引导”,模型内部并不做两遍相减再外推的运算4。所以在这个范围里上下调,画面变化很小,也基本不会过曝,因为它根本没有外推那一步。想要真正的 CFG 得显式打开(有些界面叫 true CFG),代价是回到两遍计算、速度减半,能用的数值区间也小得多,推到 5 以上就开始掉质量5。一步出图的 Turbo、Lightning 类模型更是连“多步累积”都没有,外推失去了作用对象。
实际怎么用这个数
先认清模型类型。 传统多步模型(SD 1.5、SDXL 基础版、SD3)上 CFG 有真实的外推作用;引导蒸馏模型上它更像一个微弱的方向提示,别指望靠它救画面。
数值不能跨模型比较。 SD 1.5 常用 7 左右,SDXL 常从 4–7 起调,某些衍生模型的有效区间与别人完全不重叠5。抄别人的参数没有意义。
只动这一个变量,固定种子扫。 从默认值向两边各走两三档,看提示词里承诺的东西有没有出现。症状对应动作:想要的特征没出现,先怀疑提示词不够具体(这是前面第二篇的事),再轻微上调;出现了但颜色发腻、高光连成片,往下调或开 rescale;每张都长得差不多,也是往下调。不要用提高 CFG 去弥补提示词的空洞,那只会让它更用力地猜。
一句话收尾:引导强度并不表示服从程度;它把“提示词造成的偏差”按倍数外推——放大偏差的同时,也把数值推出了模型熟悉的范围。听懂这句,过曝、发腻、负向词失灵、蒸馏模型上滑杆没反应,就是同一件事的不同侧面。