← 返回题目列表

什么是 Classifier-Free Guidance(CFG)?guidance scale 起什么作用?

高频 困难 第 14 / 25 题 更新于 2026/08/03
CFGClassifier-Free Guidance条件生成Stable Diffusion

简化版

Classifier-Free Guidance(无分类器引导,CFG)是让扩散模型「更听话地贴合提示词」的关键技巧。训练时随机把条件(文本)丢掉一部分,让同一个网络既会有条件去噪也会无条件去噪;采样时把两者的预测按公式外推:ε̃ = ε_uncond + w·(ε_cond − ε_uncond)。这里 w 就是 guidance scale,越大越贴合提示词但多样性下降、易过饱和/失真;越小越自由但可能跑题。它不需要额外训练一个分类器,故名「无分类器」。

详细版

要解决的问题

纯条件扩散模型直接用 ε_θ(x_t, t, c) 去噪,往往「对提示词的服从度不够」——生成的图和文本只是大致相关。我们想要一个旋钮,能调节「有多贴合提示词」。

CFG 的两步

  1. 训练:条件随机丢弃(conditioning dropout)

    • 以一定概率(通常 10%–20%)把条件 c 替换成空条件 (如空文本 / 全零嵌入)。
    • 于是同一个网络既学会了 ε_θ(x_t, t, c)(有条件),也学会了 ε_θ(x_t, t, ∅)(无条件)。
  2. 采样:外推放大条件方向

    • 每一步同时算有条件和无条件两个噪声预测;
    • 按下式组合:
ε̃ = ε_θ(x_t, t, ∅) + w · ( ε_θ(x_t, t, c) − ε_θ(x_t, t, ∅) )
  • ε_θ(x_t,t,c) − ε_θ(x_t,t,∅) 是「加了条件后去噪方向的变化」,w 把这个方向放大。

guidance scale w 的影响

w 取值效果
w = 0完全无条件,忽略提示词
w = 1普通条件生成(不放大)
w = 5~9(SD 常用 7.5)明显贴合提示词,质量与服从度平衡
w 过大(>15)过饱和、对比度炸裂、细节失真、多样性差

代价:每步要跑两次网络(有条件 + 无条件),推理成本约翻倍。

完整版教学

一、先理解它的前身:Classifier Guidance

要讲清「无分类器」,得先讲「有分类器」。

早期的 Classifier Guidance(分类器引导) 思路是:额外训练一个噪声鲁棒的分类器 p(c|x_t)(能对带噪图判类别),采样时用它的梯度 ∇_{x_t} log p(c|x_t) 去「推」去噪方向,让生成朝着「更像类别 c」的方向走:

ε̃ = ε_θ(x_t,t) − √(1-ᾱ_t)·w·∇_{x_t} log p(c|x_t)

它的问题很明显:

  • 额外训练一个能处理带噪输入的分类器,麻烦且局限于分类标签,难以扩展到自由文本。
  • 分类器梯度可能不可靠,容易产生对抗样本式的伪影。

二、CFG 的核心洞察:用模型自己充当「隐式分类器」

Ho & Salimans 2021 提出的 CFG 抓住一个漂亮的贝叶斯关系。由贝叶斯公式:

∇_{x_t} log p(c|x_t) = ∇_{x_t} log p(x_t|c) − ∇_{x_t} log p(x_t)

而扩散网络预测的噪声正比于分布的 score(得分)∇_{x_t} log p。所以「分类器的梯度」可以用「有条件预测 − 无条件预测」来替代:

ε_θ(x_t,t,c) − ε_θ(x_t,t,∅)  ≈  −√(1-ᾱ_t)·∇_{x_t} log p(c|x_t)

于是根本不需要单独的分类器——一个同时会有条件和无条件去噪的网络,其两个预测之差就隐含了「分类器梯度」。把这个差放大 w 倍,就等价于放大了对条件的服从度。这就是「Classifier-Free」的含义。

心法:CFG = 用「有条件预测 − 无条件预测」当作指向”更符合提示词”的方向,然后沿这个方向多走 w 倍。 理解了这个几何直觉,公式就不用死记。

三、几何直觉:把两个预测当成向量

把每一步的噪声预测看成一个向量:

  • ε_uncond:网络在「不看提示词」时认为该往哪去噪。
  • ε_cond:网络在「看着提示词」时认为该往哪去噪。
  • 二者之差 Δ = ε_cond − ε_uncond是提示词带来的”修正方向”,指向「更符合 c 的图像流形」。

CFG 的最终预测是从 ε_uncond 出发,沿 Δ 走 w 步:ε̃ = ε_uncond + w·Δ

  • w=1 时就是普通条件预测 ε_cond
  • w>1 时过冲,把图像更强地拉向提示词描述的区域,服从度上升。
  • w 太大时冲过头,落到流形之外,出现过饱和、颜色炸裂、结构失真。

四、为什么 w 太大反而变差

放大条件方向是一把双刃剑:

  • 服从度↑:图像更紧贴提示词,语义更准。
  • 多样性↓:所有采样都被强拉向同一个「最符合提示词」的模式,输出趋同。
  • 保真度先↑后↓:适度放大提升质量,但过度放大会把像素推出正常范围(颜色溢出、高对比、油画感、细节崩坏),因为外推点离真实数据流形太远。

所以 w 是一个需要调的超参:SD 默认 7.5 是经验甜点;写实风常用 4–7,插画/强控制可到 9–12。近年也有动态 CFG、CFG rescale等技巧缓解高 w 的过饱和。

五、工程细节与代价

  • 推理成本翻倍:每步要两次前向(cond + uncond)。实现上通常把 cond 和 uncond 拼成一个 batch 一起过网络,减少调度开销,但计算量仍约 2×。
  • 负向提示词(negative prompt)复用了 CFG 机制:把「无条件分支」的 换成「负面提示」的嵌入,公式变成 ε̃ = ε_neg + w·(ε_cond − ε_neg),于是生成会主动远离负面提示描述的东西(如 “blurry, lowres”)。这是 CFG 一个非常实用的衍生用法。
  • 训练侧只需一件事:以 10%–20% 概率把条件置空。代价几乎为零,却让采样期获得了可调的引导旋钮。

六、面试拆解算例

扩散题最好用一次加噪和去噪的小推演讲清楚。假设训练图像像素归一化后是 x0,第 500 个时间步的噪声强度很高,模型看到的是混合样本 xt,目标通常是预测噪声 epsilon。如果预测噪声误差很小,就能从 xt 反推出更接近干净图像的估计;如果误差在早期步骤积累,后面细节会一起漂。

xt = sqrt(alpha_bar_t) * x0 + sqrt(1 - alpha_bar_t) * epsilon
model(xt, t, condition) -> predicted_epsilon
x0_hat = (xt - sqrt(1 - alpha_bar_t) * predicted_epsilon) / sqrt(alpha_bar_t)
维度训练阶段采样阶段面试要点
输入干净图 + 随机噪声随机噪声或潜变量起点不同
目标学会预测噪声/速度逐步还原样本目标一致
条件文本、边缘、姿态等CFG/ControlNet 引导控制方向
代价大量图像训练多步迭代推理速度质量权衡
干净图 x0 -> 加噪 xt -> 模型估计噪声 -> 反推 x0_hat -> 下一步更清晰
     |          |             |               |
   训练目标     时间步 t       条件控制          误差累积

所以回答「什么是 Classifier-Free Guidance(CFG)?guidance scale 起什么作用?」时,不要停在“从噪声生成图片”。要说明训练时为什么要加噪、模型到底预测什么、采样器怎样反推、条件信号如何改变方向,以及少步采样为什么会牺牲一部分稳定性。

七、常见误区与追问

  • 误区:CFG 需要额外训练分类器。 恰恰相反,CFG 的卖点就是不需要分类器,只需训练时随机丢条件。
  • 误区:w 越大越好。 过大导致过饱和失真、多样性坍缩,存在最优区间。
  • 追问:CFG 和 Classifier Guidance 区别? 后者需外接带噪分类器、用其梯度;前者用「条件-无条件预测之差」隐式替代,无需分类器、能处理自由文本。
  • 追问:负向提示词原理? 把无条件分支替换成负面提示嵌入,让生成远离该方向。
  • 追问:为什么要训练无条件分支? 采样公式需要 ε_θ(x_t,t,∅),不训练它网络就不会「无条件去噪」,CFG 无从计算。

八、加强记忆

CFG 记一个公式加简要说:公式 ε̃ = ε_uncond + w·(ε_cond − ε_uncond);简要说——「训练时随机丢条件让网络学会有/无条件两种去噪,采样时把两者之差放大 w 倍,把图像更用力地推向提示词」。w(guidance scale)是服从度与多样性的旋钮:太小跑题、太大过饱和,SD 默认 7.5。它不用分类器,代价是每步两次前向;把「无条件」换成「负面提示」就得到负向提示词。