在使用Stable Diffusion、DALL-E这类文生图模型时,你可能注意过一个叫CFG Scale的参数,调高它画面会更贴合提示词,调低它则更自由但容易跑偏。这个参数背后其实就是Classifier-Free Guidance(CFG)技术,而它的前身则是OpenAI提出的Classifier Guidance。两种方案都试图解决同一个问题:如何让扩散模型在生成过程中听话地跟随条件输入,比如文本描述或类别标签。理解这两者的原理差异与取舍,对调参、微调乃至自己训练模型都有实际帮助。

一、为什么扩散模型需要条件引导
扩散模型的核心思想是先给干净图像逐步加噪声,训练一个神经网络学会预测噪声,采样时再一步步去噪还原出图像。如果没有任何条件约束,模型只会从训练分布中随机采样,生成结果是“碰运气”式的。比如你用无条件模型生成一万张图,可能只有少数几张符合你想要的内容。
条件引导的本质,是在去噪的每一步中把模型的预测方向往“更符合条件”的一侧拉扯。数学上,这可以理解为对条件分布的分数函数(score function)进行修正。扩散模型学习的是数据分布的梯度场 ∇x log p(x),而引入条件c后,我们希望模型逼近的是 ∇x log p(x|c)。根据贝叶斯公式:
import torch
# 条件分数可以分解为无条件分数加条件项
# score_cond = score_uncond + grad_x log p(c | x)
def guided_score(score_model, x, t, c, classifier, w):
# 无条件分数
s_uncond = score_model(x, t, None)
# 分类器给出的梯度项
with torch.enable_grad():
x.requires_grad_(True)
logits = classifier(x, t)
log_prob = torch.log_softmax(logits, dim=-1)[:, c]
grad = torch.autograd.grad(log_prob.sum(), x)[0]
return s_uncond + w * grad关键点在于p(c|x)这一项——它表示“这张图属于某个类别或匹配某段文本的概率”。如何估计这个梯度,就衍生出了两条完全不同的技术路线:外挂分类器的Classifier Guidance,和无需分类器的Classifier-Free Guidance。
二、Classifier Guidance:外挂分类器的引导方案
Classifier Guidance由OpenAI在2021年的论文Diffusion Models Beat GANs中提出。它的思路非常直接:既然条件项的梯度难以直接获得,那就单独训练一个噪声感知的分类器p(c|x_t, t),在采样时用分类器对带噪图像x_t的梯度来修正去噪方向。
这个方案有个明显的工程难点——分类器必须能在高噪声图像上正常工作。扩散采样的早期步骤中图像几乎是纯噪声,普通分类器在这种输入上会给出毫无意义的梯度。因此Classifier Guidance要求在训练分类器时,把训练图像加上与各个时间步匹配的噪声再喂给分类器,让它学会在任意噪声水平下判断类别。这等于额外引入了一个需要专门训练的模型,训练管线复杂度几乎翻倍。
它的优势同样存在。第一,引导所依赖的分类器是独立于生成模型之外的,理论上可以换用不同的分类器来实现不同风格的控制,灵活性不错。第二,对于类别数量固定的任务(比如ImageNet的1000类生成),分类器训练相对成熟。引导强度的调节通过参数w实现,w越大生成结果越贴合条件,但也越偏离原始数据分布,图像多样性和质量会随之下降,实践中需要仔细权衡。
三、Classifier-Free Guidance:无需分类器的引导方案
Classifier-Free Guidance(CFG)由Jonathan Ho和Tim Salimans在2022年提出,它的巧妙之处在于完全抛弃了外挂分类器。做法是在训练扩散模型本身时,以一定概率(通常10%到20%)随机丢弃条件信息,把条件替换为空值。这样同一个网络就同时具备了两种能力:给定条件c时的条件生成ε(x_t, t, c),以及无条件生成ε(x_t, t, ∅)。
采样时的引导公式非常简洁:
def cfg_denoise(unet, x_t, t, cond, guidance_scale=7.5):
# 一次前向得到条件预测
eps_cond = unet(x_t, t, cond)
# 一次前向得到无条件预测
eps_uncond = unet(x_t, t, None)
# 按引导强度外推
return eps_uncond + guidance_scale * (eps_cond - eps_uncond)从公式看,(ε_cond - ε_uncond)这一差值起到了分类器梯度的作用,可以证明它与Classifier Guidance中的条件梯度项在形式上等价,但全部信息都来自生成模型自身,不需要任何额外网络。代价是采样时要做两次前向传播,推理计算量大约翻倍;另外训练时随机丢条件会略微增加收敛所需的训练量。
CFG最迷人的特性是那个引导系数。当系数等于1时退化为普通条件生成;系数大于1时,生成结果会朝条件方向“用力过猛”,反而产生更贴合提示的图像。Stable Diffusion中默认的CFG Scale为7.5,调到12以上画面往往过度饱和、细节锐化失真,调到1到3之间则会出现无视提示词的随机输出,这些现象都是引导强度与数据分布博弈的直接体现。
四、两种方案的横向对比与选型建议
把两种方案放在同一个维度下对比,差异一目了然:
| 对比维度 | Classifier Guidance | Classifier-Free Guidance |
|---|---|---|
| 额外模型 | 需要专门训练噪声感知分类器 | 不需要,单一网络即可 |
| 训练复杂度 | 两个模型分别训练,管线复杂 | 一个模型,训练时随机丢条件 |
| 推理开销 | 分类器梯度需反向传播 | 两次UNet前向传播 |
| 条件类型扩展 | 换条件需重训分类器,扩展难 | 文本、图像等条件均可,扩展容易 |
| 典型应用 | 早期学术工作、类别条件生成 | Stable Diffusion、DALL-E 2、Imagen等 |
从表中可以看出,CFG在工程实用性上几乎是全面胜出的。尤其对于文本条件这种条件空间极其复杂的情况,训练一个能对“带噪图像是否匹配这段文本”打分的分类器本身就极其困难,而CFG只需要把文本编码拼接进UNet的交叉注意力层,配合随机丢弃策略即可,这也是为什么主流文生图模型几乎清一色采用CFG。
不过Classifier Guidance并没有被彻底淘汰。在一些需要精细控制、且条件空间低维的场景下(比如特定的类别约束或属性编辑),外挂分类器或判别器的思路仍被广泛借鉴,例如一些图像编辑方法会用现成的分割模型、人脸识别模型的梯度来引导编辑方向,本质上是Classifier Guidance思想的延续。理解两者的等价关系后,你会发现很多论文中的引导技巧都能归到这两条路线上来。
五、实践中的调参与注意事项
对于普通使用者来说,最常接触的就是CFG Scale这个滑块。经验上,写实风格人像建议5到7之间,避免皮肤纹理过度锐化;插画或动漫风格可以放宽到7到9,风格化程度更浓;想要严格遵守提示词构图时可以冲到10以上,但要接受色彩过饱和的副作用。如果提示词很长且包含多个要素,适当提高CFG比反复改提示词更有效。
对于自己微调模型的开发者,有两点值得注意。一是训练时的条件丢弃概率不宜过高,通常10%到20%即可,丢太多会伤害条件生成能力,丢太少则无条件分支学不好,引导效果打折。二是推理时可以尝试负向提示词技巧:把不想要的内容填入无条件分支的“条件”位置,相当于人为构造一个偏离方向,这已经成为Stable Diffusion生态中的标准玩法,也是CFG框架下衍生出的实用扩展。
总结来说,Classifier Guidance用外挂分类器换取了引导的独立性,Classifier-Free Guidance用两次前向和训练扰动换来了极简的架构和强大的可扩展性。后者以更优雅的工程形态赢得了工业界的青睐,但两者共同揭示的核心思想是一致的:通过对条件信息方向的外推,让随机生成变得可控。掌握这一点,再看各类条件生成与图像编辑技术,脉络就会清晰许多。
Classifier GuidanceClassifier-Free Guidance扩散模型修改时间:2026-09-03 06:04:44