深夜十一点,你坐进驾驶座,要去一位住在老城区巷子深处的朋友家。手机导航的提示音响起——“前方三百米右转”“驶入主路后靠左行驶”。你面临一个选择:是百分之百执行导航的每一条指令,还是偶尔凭自己对这座城市的直觉自由变道?执行得太死,导航一旦抽风,你就被带进工地;执行得太松,你又可能因为错过关键路口而绕远路。这个“到底多听导航的话”的抉择,每天都在 Stable Diffusion 的采样过程里上演。那个负责调节“听导航程度”的旋钮,叫做 CFG Scale(Classifier-Free Guidance Scale,无分类器引导强度)。它决定了去噪模型在多大程度上听从文本提示词的指挥:关掉它,模型画什么都像梦游;调到中等,它乖乖还原你的描述;拧到最大,画面便像过度听信导航一样冲进湖里——色彩过曝、细节崩坏。
学会 CFG Scale,等于给图像生成装上一只“曝光表”:懂得它的数学原理与调节手感,你才能在贴合提示词与保留创作自由之间游走自如。这是每位 AIGC 创作者必备的基本功。
可视化演示
演示扩散模型双路径推理机制、CFG引导强度对图像质量与多样性的权衡、负向Prompt协同工作原理,交互调节CFG值查看效果变化。
本节配有交互动效(进入视口后自动加载,约 3KB)。
CFG双路径推理机制 条件路径:文本引导噪声预测ε_cond 无条件路径:空文本噪声预测ε_uncond ε=ε_uncond+s·(ε_cond-ε_uncond) CFG通过线性插值融合两条路径的噪声预测
CFG数学原理
导航不是凭空开口的。在你深夜出发前,导航已经做了两件事:拿到你手机上报的“当前位置”,读入你输入的目的地。然后它结合地图数据库,给出“前方右转”的指令。Stable Diffusion 里的“导航”——噪声预测网络也是同样的工作模式:它拿到当前版本的图像状态,抬头看一眼你写的文本提示,再参照自己在大规模图像上学到的“城市地图”(模型参数),输出一条指向“去噪方向”的建议。
但如果你把文本提示撤掉,只在输入里留一个空占位符,导航就变成了“盲导”——它不知道该把你往哪送,只能凭对城市平均路况的记忆给出一个最平庸的建议。前者叫“条件预测”,后者叫“无条件预测”。CFG 的核心思想,就是把这两个建议放到一起看:条件建议与直觉建议差多少,差出来的方向,就是提示词真正想让你去的地方。
1. 无条件预测项:去噪网络不看任何文本提示,只凭当前的带噪图像 \( z_t \) 预测噪声,这是生成的“直觉基线”。
2. 条件预测项:去噪网络在文本嵌入 \( c \) 的引导下预测噪声,代表导航给出的“路线建议”。
3. 引导向量:条件预测减去无条件预测,得到文本提示带来的方向修正量,这是引导的核心动力。
4. 缩放因子加权:用引导强度 \( w \) 放大或缩小修正量,\( w \) 越大,提示词的影响力越强。
5. 合成引导噪声:在直觉基线上叠加加权后的修正量,得到真正用于去噪的混合噪声。
所以 CFG Scale 并不是一个“油门”,它是一个“差值放大器”。它不直接决定图像长什么样,而是决定“提示词与直觉的分歧”被放大到什么程度。信任导航的差值多一点,画面就往提示词方向多挪一点;这不正是你在车里做的动作吗——采纳导航的修正,而不是完全丢掉自己的驾驶直觉。
条件与无条件
深夜开车,最考验人的不是技术,而是“方向感从哪来”。如果手机没电、导航失灵,你只能靠平时对这座城市的模糊印象——哪条路热闹、哪条街是单行线——这就是无条件生成:模型没有文本可看,只能依赖训练数据里学到的“平均世界”,画出来的东西像一张没有主题的信手涂鸦,看着合理,却抓不住重点。
当你把“一只戴着草帽的柴犬在沙滩上”写进提示词,导航就上线了。文本编码器把这句话变成一个高维向量,注入噪声预测网络,模型开始把每一次去噪都往“戴草帽的柴犬”方向拉扯。注意:条件预测并不是凭空新建一张图,而是在同一个模型里,用文本条件改变了输出的噪声分布。
1. 无条件去噪路径:不提供任何文字信息,模型依靠训练数据形成的先验完成一步去噪,结果偏向“平均化”的图像。
2. 条件去噪路径:注入文本条件 \( c \) 后,模型预测的噪声包含了“语义修正”,去噪结果明显向提示词描述的内容靠拢。
3. 两条路径的差异:把两条路径的预测噪声相减,得到的就是“文本条件带来的语义方向”,CFG 正是沿这个方向施加拉力。
两条路径就像同一个司机的两种状态:没有导航时,他凭肌肉记忆开;有导航时,他按前方路牌开。CFG 要做的,就是不断把这两个状态下的方向盘角度相减,提取出“路牌到底在纠正什么”。条件与无条件越不同,说明提示词越有主见,引导向量也越强劲。
强度与多样性
你终于开上了城市快速路,导航说“保持直行”,但你开始纠结:完全听导航,是不是会错过路边那家传说中很好吃的夜宵摊?信任度调到最低,你会自由变道,享受探索的乐趣,但也可能开到一个和目的地毫无关系的地方;信任度调到最高,你目不斜视直奔终点,一路上什么风景都没看到。
这个“自由探索 vs 直奔主题”的矛盾,映射到图像生成上就是多样性(diversity)与贴合度(fidelity)的经典权衡。\( w \) 很小时,模型几乎只按条件预测去噪,但因为没有额外的“放大推力”,提示词的约束很松,同一提示词能生成差异很大的构图;\( w \) 很大时,模型把每一处“提示词与直觉的分歧”都当成圣旨,图像确实非常贴题,但所有样本都挤向同一个狭窄的峰值,几乎失去了变化空间。
1. 低档极限:当 \( w \) 从右侧趋近 1 时,修正量被完全保留但不再放大,结果恰好是纯条件预测,提示词温和生效。
2. 高档极限:当 \( w \) 趋于无穷时,直觉基线项被淹没,只剩被无限放大的差值项,图像被强行拽向提示词。
3. 多样性崩溃:差值项本身携带随机波动,无条件基线的“自由感”被压制后,同一批种子生成的图像会高度雷同。
这就像你一次次提高导航音量:刚开始,提示词的声音盖过了你的直觉,图像变得“听话”;可音量开到最大,满耳朵都是“左转左转左转”的机器音,你反而听不见路况,动作变形,撞上护栏。回看 CFG:7 附近往往是“听得清导航又不失判断力”的甜点区,10 以上就进入“路怒”区间了。
负向提示词
有导航不等于无忧无虑。有些路你心里是有数的:不想走高架,太堵;不想走河边,怕车技不够。导航也懂这个——你可以在设置里勾选“避开高速”“避开收费路段”。在 Stable Diffusion 里,这个“避开”的开关就是负向提示词(negative prompt)。
普通提示词是正向条件,告诉模型“要什么”;负向提示词是另一个文本嵌入,告诉模型“不要什么”——比如“水印、模糊、畸形手指、过曝”。模型同样会对负向条件做一次条件预测,得到一个“反面教材的引导方向”,然后在最终的引导里把它减掉,形成一条安全走廊。
1. 正向条件嵌入:正向提示词 \( c_p \) 描述“想要的内容”,生成正向引导向量。
2. 负向条件嵌入:负向提示词 \( c_n \) 描述“想避免的内容”,同样得到一条引导向量。
3. 正向引导加权:用正向强度 \( w_p \) 放大“要什么”的修正力度。
4. 负向引导削减:用负向强度 \( w_n \) 减去“不要什么”的方向,把模型推离雷区。
5. 双向合成:最终引导噪声同时包含“靠近正向”与“远离负向”两种力量。
回看导航:正向导航给你“该走的路”,负向导航给你“千万别走的路”,两个声音一加一减,你就在这条安全走廊里稳稳前进。注意负向提示词的权重 \( w_n \) 并不是越大越好——把“避开”拉满,等于导航反复警告“前面有坑”,你反而会因为过度紧张而手忙脚乱,生成出另一种奇怪伪影。
参数调优实战
熟悉城市的老司机从不把导航音量调到一个固定值走天下:高速上听个大概,进了老城区就调大声音逐句听。CFG Scale 的调节同样讲究“路况适配”,你生成的题材不同,甜点区间也不同。
经验上:写实人像、产品展示这类“必须贴题”的场景,CFG 7-10 之间能兼顾还原与自然;概念插画、风格探索这类“要留白”的场景,4-6 更舒服;一旦画面里要出现文字、Logo 这类“差一点就穿帮”的元素,可以大胆上到 10-12,代价是要防着伪影;超过 15 就进入危险区,画面会像过度锐化的照片一样发硬。
1. 贴合度项:衡量生成图像 \( x_w \) 与提示词 \( c \) 的语义匹配程度,\( w \) 越大通常越贴合。
2. 伪影成本项:衡量图像中的过曝、锯齿等画质损伤,\( w \) 过高时急速上升。
3. 权衡系数:\( \alpha \) 与 \( \beta \) 分别控制“贴题”与“画质”两项目标的优先级,可由创作者按题材调整。
4. 最优档位:找一个 \( w \) 使总分最高,那个位置就是你的甜点区。
别人给不了你一个万能档位,就像没人能告诉你“导航音量永远调到 60%”。真正高效的做法是把调参当成选歌单:先粗筛几个档位各生成一张,看哪张“顺耳”,再在附近微调。把贴合度与伪影两个指标装在心里,你就不需要背参数表了。
过曝伪影处理
导航最离谱的时刻是什么?它气定神闲地对你说“请直行进入湖泊”。你如果百分之百信任它,下一秒就连人带车泡水里了。CFG 拉满时,模型也会说出类似鬼话——它无比自信地把颜色推成高饱和的塑料质感,把皮肤画成蜡像,把边缘画出刺眼的锯齿,这就是“过曝伪影”(over-exposure artifacts)。
为什么高 CFG 必然带来伪影?回到公式,被 \( w \) 放大的那个修正量本身也是随机变量,含有噪声成分。当你把修正量放大 \( w \) 倍,它的波动幅度会按 \( w \) 的平方速度膨胀——直觉项还保持在正常范围,修正项却已经像打满鸡血一样横冲直撞。
1. 方差分解:混合引导噪声的方差由两个独立来源构成——无条件基线本身、以及被加权的修正量。
2. 平方放大:修正量缩放 \( w \) 倍后,其方差变为 \( w^2 \) 倍,这是伪影爆炸的数学根源。
3. 过曝表现:\( w \) 越大,采样轨迹的波动越剧烈,色彩偏移、细节崩坏等伪影越明显。
这解释了为什么“降档”是最有效的修复手段:把导航音量从 20 调回 7,画面立刻从“暴走”状态恢复平静。如果降档后又觉得贴题不够,可以换个思路——不是继续加音量,而是把负向提示词加上“过曝、塑料感、锯齿”,让模型绕开这些雷区。
实战排查流程
老司机拿到一条陌生路线,不会一把油门踩到底,而是先来一次“试驾”:低速跑一遍,确认路况,再决定每段开多快。排查 CFG 也一样——它是一场有方法的实验,而不是靠运气抽卡。
标准动作是分档对照:固定提示词、采样器和步数,用不同档位各生成一张,几张图排在一起,选出那个“既不松散也不过曝”的档位。然后进入微调:主体不满意,就加强正向提示词里对应词组的权重;背景脏乱差,就补一句负向提示词。最后做质量验收——放大看边缘、看皮肤、看文字,确认没有伪影后再定稿。
1. 候选档位集合:先圈定一组离散的候选值,比如常见的 \( \mathcal{W} \) 集合,覆盖从低到高的代表性档位。
2. 对齐惩罚项:\( 1 - \text{align} \) 表示“不够贴题”的代价,值越大说明画面离提示词越远。
3. 伪影惩罚项:\( \text{art} \) 表示画质损伤的代价,档位过高时这一项迅速抬升。
4. 最优档位:找出让总代价最小的那个 \( w \),就是本次任务的最佳引导强度。
这套流程本质上是把“导航信任度”当成一个可调旋钮,用对照试验找到它的最佳位置。等你对几个题材多跑几轮,就会形成肌肉记忆——看到一张过曝图,你不再盲目地猛拉 CFG,而是下意识先降档,再补负向提示词,最后在几张候选图里挑出最顺眼的那张。这就是创作者与工具之间的默契。
AI 应用场景
电商产品主图生成
阶段:图像生成与精修
解决的问题:传统方式拍摄产品图成本高、周期长;AI 生成时如果 CFG 太低,产品形状和 Logo 会被改得面目全非。把 CFG 调到 8-10,模型会非常听话地还原产品描述;再配上一句负向提示词“文字扭曲、水印、模糊”,出图质量就能直接商用。
具体案例:某电商设计团队生成一款保温杯的主图。提示词写“奶油白色保温杯,磨砂质感,极简桌面布景”,CFG 从 6 一路试到 11,最后锁定 9:杯身造型精准,品牌 Logo 一个笔画都不歪;而 CFG=6 时杯口形状明显走形,CFG=12 时背景出现过曝噪点。
游戏概念美术灵感发散
阶段:创意构思与草图
解决的问题:概念设计需要“多而不腻”的方案,高 CFG 会让所有草图千篇一律。把 CFG 降到 4-5,模型保留提示词的大方向,但在光影、构图、服饰细节上留出大量随机性,一次出多张草稿,每张都有不同的气质,方便美术挑选拼贴。
具体案例:某独立游戏团队设计“废弃机械城”场景,提示词只写核心元素,CFG=4 生成 20 张概念图,从中挑出 3 张差异最大的再喂给图生图精修,大幅提升了灵感筛选效率。
图像瑕疵批量修复
阶段:后期修复与质量控制
解决的问题:高 CFG 图生图重绘时人脸容易塑料化,需要负向提示词与 CFG 协同。做法是保持 CFG 7-8,在负向提示词里写“塑料皮肤、过度锐化、油光”,让模型知道绕开这些雷区,而不是盲目降低引导强度牺牲贴题度。
具体案例:照片转二次元风格时,原始素材携带噪点和瑕疵,团队用 CFG=8 加上负向提示词“瑕疵、噪点、五官畸形”批量修复了 500 张素材,一次通过率达 85%,将人工修图时间压缩了六成。
Python 演示
"""Toy demo: CFG Scale guided denoising (educational, no real diffusion)."""import numpy as np class CFGSimulator: def __init__(self, size=32, seed=0): self.size = size self.rng = np.random.default_rng(seed) # concept maps act as text embeddings self.apple = self._make_blob(self.size // 2, self.size // 2, radius=4.0) self.house = self._make_blob(self.size // 2, self.size // 4, radius=6.0) def _make_blob(self, cy, cx, radius): y, x = np.ogrid[:self.size, :self.size] dist2 = (x - cx) ** 2 + (y - cy) ** 2 return np.exp(-dist2 / (2 * radius * radius)) def predict_noise(self, latent, embedding): """Mock noise predictor: unconditional drifts, conditional points to concept.""" drift = latent * 0.1 if embedding is None: return drift + self.rng.normal(0, 0.01, latent.shape) return drift + embedding * 0.8 def denoise_step(self, latent, embedding, cfg, step_size=0.1): eps_uncond = self.predict_noise(latent, None) eps_cond = self.predict_noise(latent, embedding) eps_guided = eps_uncond + cfg * (eps_cond - eps_uncond) return latent - step_size * eps_guided def run(self, prompt="apple", cfg=7.0, steps=50): if prompt == "apple": emb = self.apple else: emb = self.house latent = np.random.default_rng(42).normal(0, 1, (self.size, self.size)) for _ in range(steps): latent = self.denoise_step(latent, emb, cfg) return latent @staticmethod def alignment(latent, embed): return float(np.mean(latent * embed) / np.sqrt(np.mean(embed ** 2))) if __name__ == "__main__": sim = CFGSimulator() for cfg in [1.0, 3.0, 7.0, 15.0]: out = sim.run(prompt="apple", cfg=cfg) score = sim.alignment(out, sim.apple) max_abs = float(np.max(np.abs(out))) print("cfg=%5.1f alignment=%.3f max_abs=%6.2f" % (cfg, score, max_abs))
drift = latent * 0.1模拟无条件分支的“惯性漂移”,相当于关掉导航后凭直觉开车。if embedding is None: return drift + self.rng.normal(...)无条件分支只输出平庸的漂移预测。return drift + embedding * 0.8条件分支被文本概念像导航一样持续拉拽。eps_guided = eps_uncond + cfg * (eps_cond - eps_uncond)CFG 核心公式的代码表达,一行完成“直觉 + 差值放大”。latent = latent - step_size * eps_guided按引导噪声走一步去噪,相当于按导航指令修正一次方向。latent = np.random.default_rng(42).normal(...)固定种子保证不同 CFG 从同一个起点出发,对照才公平。for cfg in [1.0, 3.0, 7.0, 15.0]:分档对照测试的标准写法,跑完四档即可观察趋势。
常见误区
误区我一直以为 CFG 就是“听话程度”,所以每次生成都把引导强度拉到 15 以上,觉得数字越大,提示词执行得越彻底,画面就越清晰。
正解CFG 放大的是“条件预测与无条件预测的差值”,而这个差值里混着噪声。\( w \) 越高,噪声波动按 \( w^2 \) 放大,画面会变得色彩过曝、边缘锯齿、皮肤塑料化——不是更清晰,而是更像过度锐化后的劣质 HDR。真正的甜点区通常在 4-12,超过 15 就要警惕伪影。
为何常见:“越大越强”是生活中调控旋钮的直觉(音量、亮度),但 CFG 放大的是差值信号与噪声的混合体,简单类比在这里失效。
误区我理解的 CFG 最低是 1,那 1 就应该是“无引导”,也就是完全忽略提示词、随便生成。
正解CFG=1 时公式是 \( \hat{\epsilon} = \epsilon_u + 1 \times (\epsilon_c - \epsilon_u) = \epsilon_c \),也就是纯条件预测——提示词仍然全程参与去噪,只是不再被额外放大。真正“无引导”是 \( w=0 \),即纯无条件生成,但大多数界面把下限设成了 1,所以 CFG=1 绝不是“没写提示词”。
为何常见:把“引导强度”误当成“提示词开关”,忽略了 CFG 的本质是差值缩放,而不是条件本身的有无。
误区负向提示词既然能帮我排除水印和畸形,那我多写几段“不要这不要那”,再配合高 CFG,一定出完美图。
正解负向提示词的工作方式同样是提取“条件预测与无条件预测的差值”再反向减掉。写得太杂或权重过高,会把模型推向一个同样不自然的极端,产生灰蒙感、细节丢失或构图空泛。正向提示词管“要什么”,负向提示词管“不要什么”,两者要像油门刹车一样平衡使用。
为何常见:视觉上负向提示词的确能快速消除明显瑕疵,让人误以为“排除得越多越干净”,忽略了过度排除的副作用。
误区我在 A 采样器上调出的 CFG=8 很好用,就把这个值复制到 B 采样器上,结果图崩了,我还以为是模型问题。
正解不同采样器对引导的响应曲线不同:DDIM、Euler a、DPM++ 2M 等对高 CFG 的耐受度差异明显,同一 CFG 在某些采样器上已经过曝,在另一些上才刚刚好。更换采样器后,应该用分档对照重新标定 CFG。
为何常见:人们习惯把参数当成跨工具的“万能设置”,忽略了采样器本身也在影响去噪轨迹的平滑度,CFG 的甜点区自然随之迁移。
面试题
Q1. CFG Scale 在数学上主要起什么作用?
- A.放大条件与无条件预测的差值← 正确答案
- B.直接修改生成模型的权重
- C.增加训练集的图像数量
- D.提升输出图像的分辨率
答案:A。CFG 的核心公式是“无条件预测 + w × 差值”,它放大的是条件与无条件预测之间的方向修正量,并不改动模型权重、训练数据或分辨率。A 描述准确,其余选项都是对 CFG 作用的误解。
Q2. CFG=1 时,图像生成效果接近哪种状态?
- A.纯无条件生成的结果
- B.纯条件预测的结果← 正确答案
- C.完全随机噪声的结果
- D.全黑图像的输出结果
答案:B。代入公式 \( \hat{\epsilon} = \epsilon_u + 1 \times (\epsilon_c - \epsilon_u) = \epsilon_c \),恰好是纯条件预测。提示词仍然在起作用,只是没有被额外放大。A 是 w=0 的情形,C 和 D 与 CFG 无关。
Q3. 将 CFG 从 7 提升到 20,最可能出现什么现象?
- A.色彩过饱和与伪影增多← 正确答案
- B.生成速度大幅提升
- C.输出图像分辨率增加
- D.采样步数自动减少
答案:A。高 CFG 使修正量的方差按 w² 放大,采样轨迹剧烈波动,典型表现是色彩过饱和、边缘锯齿、细节崩坏。CFG 不影响速度、分辨率和步数,这些由采样器与图像尺寸决定。
Q4. 负向提示词在 CFG 框架中的角色是什么?
- A.提供反向修正的引导向量← 正确答案
- B.显著提升采样计算速度
- C.自动优化图像的空间尺寸
- D.代替正向提示词的作用
答案:A。负向提示词也会做一次条件预测,得到“不要什么”的引导向量,然后从总引导中减去,相当于导航里的“避开路段”设置。它不加速、不改尺寸,也不能替代正向提示词。
Q5. 下列哪些方式可以缓解高 CFG 导致的过曝伪影?
- A.适当降低 CFG 数值← 正确答案
- B.无限放大负向提示词
- C.更换适配的采样器← 正确答案
- D.降低输出图像分辨率
答案:AC。降档是直接减小方差放大效应;更换对高 CFG 耐受度更好的采样器也能平滑轨迹。无限放大负向提示词会引入新的不稳定,降低分辨率与伪影无直接因果关系。
Q6. 在公式 \( \hat{\epsilon} = \epsilon_u + w \times (\epsilon_c - \epsilon_u) \) 中,当 w>1 时起什么作用?
- A.放大提示词与直觉的差值← 正确答案
- B.直接消除采样过程的噪声
- C.让生成退化为无条件模式
- D.压缩提示词对图像的引导
答案:A。w>1 意味着对条件与无条件的差值做放大,提示词的影响力被增强,方向修正更激进。B 是去噪本身做的事,C 对应 w=0,D 对应 w<1 的压缩行为。
Q7. 关于无条件预测 \( \epsilon_\theta(z_t, \varnothing) \),下列说法正确的有哪些?
- A.生成结果与条件预测完全相同
- B.输入中不包含任何文本信息← 正确答案
- C.提供引导修正的基线方向← 正确答案
- D.等价于随机高斯噪声本身
答案:BC。无条件预测使用空文本占位符,不含文本信息,同时它在公式里充当基线与条件预测做差,提供修正方向。它仍是模型的预测输出而非随机噪声,也与条件预测不同。
Q8. 在实际使用中,CFG 的理想常用范围通常是?
- A.通常在 1 到 3 之间
- B.通常在 4 到 12 之间← 正确答案
- C.通常在 20 到 30 之间
- D.通常在 50 到 100 之间
答案:B。经验上 CFG 4-12 是多数场景的甜点区:太低贴题不足,太高伪影泛滥。1-3 偏松弛,20 以上几乎必现过曝,50 以上早已失去实际用途。
Q9. CFG 过低(接近 1)可能带来哪些问题?
- A.内容与提示词相关性下降← 正确答案
- B.主体构图容易发生漂移← 正确答案
- C.出现大量过曝伪影
- D.图像色彩严重过饱和
答案:AB。低 CFG 时提示词的修正力不足,模型更依赖训练先验,容易出现主体不贴题、构图漂移。过曝与过饱和是高 CFG 的典型问题,与低 CFG 相反。
Q10. 在带负向提示词的 CFG 公式中,负向引导项的作用方向是?
- A.与正向提示方向相反的修正← 正确答案
- B.与无条件预测完全相同的方向
- C.放大正向提示词的引导
- D.对图像方向无任何实际影响
答案:A。负向引导项以减号形式进入合成公式,\( -w_n (\epsilon_{c_n} - \epsilon_u) \),把模型推离负向提示描述的内容,即与“要什么”方向相反的修正。它不会等于无条件方向,更不会放大正向引导。