我第一次用 Stable Diffusion 的时候,跟很多人一样,以为 CFG Scale 就是“听话程度”的旋钮:拉高一点,AI 就更听提示词的话;拉低一点,AI 就更自由发挥。这个理解对了一半,但真正让我困惑的是另一件事:为什么参数高到一定程度,图像会突然变得很诡异,颜色像被浓硫酸泼过,细节全部烧焦? 如果只是“更听话”,不应该出现这种副作用。后来我读到 Classifier-Free Guidance 的原始论文,才意识到:这个参数其实是在做一件很暴力的事——它把两个不同世界的预测强行相减,再放大差值。而你拉高的那个数字,就是放大倍数。放大倍数太高,差值里的噪声和伪影也会被一起放大,最后把图像“炸”了。这篇文章,我想把这件事讲清楚:CFG Scale 到底在算什么,它为什么能起作用,以及调高它的代价到底是什么。

没有分类器,但名字里还留着“分类器”
要理解 CFG,得先知道它丢弃的那个东西——分类器引导(Classifier Guidance)。在 2021 年 OpenAI 的 Diffusion Models Beat GANs 论文里,他们用了一个额外的分类器,在扩散模型去噪的每一步,去判断当前图像是否符合某个类别(比如“狗”),然后根据这个判断的梯度,把去噪方向往“更像狗”那边推。这个想法很直观:你有一个已经训练好的图像分类器,它知道什么是狗,你就在生成过程中问它:“喂,我现在这个半成品,算狗的概率是多少?”然后沿着提升概率的方向走一小步。
但这个方法有两个大问题:第一,你得额外训练一个分类器,而且这个分类器必须能处理充满噪声的中间图像——正常分类器是给干净图片用的,你得专门训练一个“噪声鲁棒分类器”,很麻烦。第二,引导的只是类别,不是自然语言。你没法说“一只穿着宇航服的柴犬”,因为分类器只认标签。所以这个方案很快就显得不够用了。
2022 年,Google Research 和 DeepMind 的团队在 Classifier-Free Guidance 论文里提出了一个更优雅的替代方案:根本不需要单独的分类器,训练的时候,模型既能条件生成(看到提示词),也能无条件生成(不看提示词),然后在推理时,你把两个预测结果混合,用差值来引导方向。这就是名字里“无分类器”的由来——把分类器扔掉了,但引导效果还在。而且因为引导信号直接来自模型自己的“条件”和“无条件”预测之差,它可以处理任意形式的条件,包括文本提示词、图像、甚至画风。
扩散模型在每一步到底在预测什么
要搞懂 CFG 的数学,先得快速看一眼扩散模型的推理过程。假设你有一张充满噪声的图像 x_t,模型(通常是一个 U-Net)会预测出当前这步应该去除的噪声 ε_θ(x_t, t)。然后你用这个噪声估计把 x_t 往干净图像的方向推一步,得到 x_{t-1}。如果模型是条件模型,它还会收到一个条件 c(比如文本编码),预测的噪声就是 ε_θ(x_t, t, c)。无条件模型则只收到一个空条件,通常用 ∅ 表示,预测 ε_θ(x_t, t, ∅)。
CFG 的核心操作就一步:在每一步去噪时,不直接用条件预测 ε_cond,而是用无条件预测 ε_uncond 和条件预测的差值,构造一个“外推”后的预测:
ε_guided = ε_uncond + w * (ε_cond - ε_uncond)
这里 w 就是 CFG Scale,通常大于 1。当 w=1 时,ε_guided = ε_cond,就是普通的条件生成。当 w>1 时,你在条件预测的方向上,多走了一步——走多远?走了 (w-1) 倍的 (ε_cond – ε_uncond) 这个差值。换成更直观的理解:模型在心想“如果没有提示词,我本来会生成什么噪音”,然后它又心想“如果有提示词,我会生成什么噪音”,两个噪音的差值,就是提示词“要求”你改变的方向。CFG Scale 就是把这个要求放大多少倍。
这个设计的巧妙之处在于,训练时你不需要任何额外的东西。你只需要在训练过程中,随机地把一定比例的样本的条件置空(比如 10-20% 的样本用空文本),模型就同时学会了无条件生成和条件生成。推理时,一次前向传播同时跑条件和无条件两个分支,然后做减法。所以它不仅“无分类器”,还“无额外训练”——训练代价几乎为零,这太天才了。
放大差值,就是放大“提示词效应”
你可以把 ε_cond – ε_uncond 想象成一个向量场:它指向“从万能的无条件图像空间,往特定提示词图像空间”的方向。这个向量本身可能很微弱,因为模型在大多数区域,条件和无条件的预测本来就差不多——毕竟,任何一张图都可以被看成“无提示词”的图,条件只是给它加了一个约束。CFG Scale 就是把这个微弱的向量放大,强迫模型往那个方向更远地走。
这解释了为什么 CFG Scale 提高,图像会变得更贴切提示词:你在每一步去噪中,都更激进地往条件方向偏移。但这也解释了副作用:这个向量场并不完美,尤其在远离训练数据分布的区域,它可能包含噪声、错误方向,甚至相互矛盾。放大它,就像把一张模糊的照片强行锐化——边缘是清晰了,但噪点和伪影也全出来了。这就是为什么高 CFG 下图像会出现过饱和、高对比度、甚至结构崩坏:那些被放大的“伪影”恰好落到了视觉上敏感的区域,比如颜色边界、纹理细节。
我最早以为,高 CFG 只是让模型“更自信”,就像分类器里提高温度倒数一样。但后来我意识到,CFG 更像是 “过驱动”一个控制系统:你给了系统一个目标,它本来会慢慢接近,但你强行把控制信号放大,系统就会震荡、超调,最后彻底发散。在扩散模型里,这种发散表现为图像的色彩和结构脱离正常范畴,变成“AI 味”很重的浓艳风格。
代价一:多样性崩塌
CFG Scale 调高,最直接的代价是生成结果的多样性急剧下降。这在直觉上很好理解:无条件生成可以覆盖整个数据分布,条件生成则将该分布约束到一个子集。当你用 w>1 放大条件信号时,你实际上在迫使模型向该子集的“中心”收缩,甚至收缩到几个最典型的样本附近。这就是为什么你用高 CFG 生成“一只猫”时,得到的猫总是那么几种姿势、那么几种毛色——模型觉得这些才是“最安全的猫”,因为它们在条件分布里密度最大。
论文 CFG++ 从数学上分析了这种多样性损失:标准 CFG 的引导方式会导致采样轨迹偏离真实数据流形,产生一种“流形偏移”,使得模型在生成过程中越来越集中到高密度区域,丢弃了低密度但合理的样本。你如果用过 Stable Diffusion 可能注意到,CFG 从 7 调到 15,泳池边的女孩可能从不同肤色、不同泳衣,变成清一色的白皮肤、蓝泳衣——这就是多样性崩塌的直观表现。
代价二:过饱和与伪影
我在玩 SD 1.5 的时候,发现一个规律:CFG 超过 12,图像像是被“泼了油漆”——天空蓝得发紫,草地绿得刺眼,人脸的高光部分直接过曝。这不是什么玄学,而是因为 ε_cond – ε_uncond 在色彩通道上往往有系统性的偏差。无条件模型倾向于生成平均化、偏灰的色彩(因为训练数据平均后就是灰色),而条件模型会往鲜艳方向偏。这个差值放大后,相当于把饱和度旋钮拧爆了。
更糟糕的是,高 CFG 还会导致一些结构性的伪影,比如重复的纹理、奇怪的对称性。这是因为扩散模型在去噪过程中,每一步的预测误差会累积。正常条件下,这些误差很小,但当你用 w 放大( ε_cond – ε_uncond),你同时也在放大每一步的预测误差。当 w 太大,误差累积超过某个阈值,模型就会掉进一个“坏”的吸引子,生成出像万花筒一样的重复图案——这其实是一种模式坍塌。
CFG Scale 的贝叶斯解释
如果你熟悉贝叶斯公式,Classifier-Free Guidance 可以被解释为一种 “后验温度调节”。在扩散模型中,条件生成的目标是采样 p(x|c)。根据贝叶斯,p(x|c) ∝ p(x) p(c|x)。这里 p(x) 是无条件先验,p(c|x) 是给定图像 x 后条件 c 的似然。CFG 实际上是在采样时,人为地将似然项的权重提高:
p_guided(x|c) ∝ p(x) p(c|x)^w
w 越大,模型越看重“图像符合条件”这个要求,相对忽略“图像本身看起来自然”这个先验。当 w 趋于无穷,你就在强制模型只生成那些 p(c|x) 最大的 x,也就是最“典型”的样本——这就是多样性崩塌的根源。而当 w 太小(比如小于 1),你实际上在压低条件似然,图像会变得更“自由”,但也更可能偏离提示词。通常 w 在 7-9 的范围是一个经验平衡点,但不同模型不同采样器的最优值不同。
这个贝叶斯视角也解释了为什么 CFG 不能无限制提高:p(x) 和 p(c|x) 这两个分布本来就存在冲突。最自然的图像未必最符合提示词,最符合提示词的图像未必最自然。CFG Scale 就是在这两者之间做权衡的旋钮,把它拧到极端,你得到的要么是无聊的平均图像,要么是扭曲的提示词奴隶。
动态 CFG 和未来改进
既然固定 CFG 有这么多问题,研究者们自然想到让 CFG 动态变化。比如在去噪的早期阶段使用高 CFG(确定大体结构),晚期降低 CFG(增加细节的多样性)。这就是 CFG++ 等工作的思路:他们不再用简单的线性外推,而是在去噪过程中引入一个修正项,使得引导方向更平滑,并且可以自然地衰减,从而在保持提示词一致性的同时,大幅缓解过饱和与多样性损失。另外,还有一些工作直接在训练阶段就模拟高 CFG 的效果,让模型学会自己产生“干净”的引导,而不需要推理时那么暴力的外推。
不过,在目前主流的 Stable Diffusion 生态里,CFG Scale 仍然是那个简单粗暴的滑块。了解它的原理,你至少能避免一个常见错误:图片崩了,第一反应就是拉高 CFG——其实往往是反的,你应该降低它。因为崩坏本身就是过度引导的症状,再拉高只会雪上加霜。
一张表说清 CFG Scale 的利弊
| CFG Scale 范围 | 效果 | 代价 | 适用场景 |
|---|---|---|---|
| 1-3 | 模型几乎忽略提示词,生成自由、多样 | 可能完全不匹配提示词,构图随机 | 需要随机灵感,或测试模型的无条件生成能力 |
| 4-7 | 开始遵循提示词,但留有较多解释空间 | 偶尔忽略细节,风格偏柔和 | 艺术创作,希望有意外之喜 |
| 8-12 | 严格遵循提示词,细节清晰,对比度较高 | 开始出现饱和度偏高,多样性下降 | 大多数用户的日常设置,平衡点 |
| 13-20 | 极度贴合提示词,但色彩和结构可能失真 | 过饱和、高对比度、伪影、多样性暴跌 | 需要严格遵循提示词,且能接受“AI 味” |
| 20+ | 图像严重扭曲,结构崩坏,色彩爆炸 | 完全不可用 | 几乎无,除非故意追求故障艺术 |
这个表只是经验参考,具体数值取决于你的模型和采样器。比如某些蒸馏模型(如 LCM)往往需要更低的 CFG,因为它们的采样步数少,每一步的误差累积效应更显著。
我踩过的坑:CFG 和采样步数是联动的
有一个让我困惑了很久的现象:为什么同样的 CFG,在 20 步采样时效果很好,用 50 步反而会过饱和?我一开始以为是采样器的问题,后来才想通:CFG 的引导是每一步都施加的,步数越多,累加的引导效果越强。用 20 步,w=10 的引导总量是 20 次放大;用 50 步,就是 50 次放大。虽然扩散模型本身有缩放规则,但实际效果上,高步数下 CFG 的“真实强度”会更高。所以如果你从 DPM++ 2M Karras 换到 Euler a,步数变了,CFG 的最佳值可能也要跟着微调。这提醒我,CFG Scale 不是一个独立参数,它和采样器、步数、模型架构是耦合的。
说到底,CFG Scale 是权宜之计
Classifier-Free Guidance 用极简的算式,解决了扩散模型条件生成的大问题,让 Stable Diffusion 这样的模型迅速普及。但它本质上是一个 Hack——一种在推理时强行修正模型行为的技巧。它之所以需要存在,是因为模型本身的条件跟随能力还不够强,或者说无条件先验太强了,不得不用大棒子敲打。未来的模型,如果能在训练阶段就更好地对齐条件,比如通过更精细的条件注入、或者像 DALL·E 3 那样使用图像描述重写,CFG Scale 的重要性可能会逐渐降低。但至少现在,理解它,你就不会被那个小小的滑块牵着鼻子走。
原创文章,作者:guanweilu,如若转载,请注明出处:https://guanweilu.cn/article/96.html