想象你是录音棚里的调音师。正在处理一段人声录音——原始信号叫“干信号”,干净、真实,但少了点味道;你把它送到混响效果器,出来的叫“湿信号”,有了空间感,但可能模糊了原声。调音台上有个“干湿比”旋钮,往左拧是纯干,往右拧是纯湿,甚至能拧到“湿过头”的程度——干信号不变,湿信号被放大到超过原始比例。这个旋钮,就是本文的主角:Classifier-Free Guidance(CFG)中的引导强度。 扩散模型生成图片时也面临同样的困境。给定一句话“一只戴帽子的柴犬”(条件),模型既想忠实于这句话,又想保持图像的自然与多样。CFG 提出了一种聪明的做法:让同一个模型同时学习“收到条件时”和“收不到条件时”两种预测方式。生成时,用条件预测减去无条件预测,得到一个“条件带来的方向”,再乘以引导强度 \(s\) 加回到无条件预测上。\(s\) 越大,生成结果越听话;\(s\) 越小,越自由发挥。这就像调音师拧动干湿比旋钮,在“忠诚”和“灵气”之间寻找平衡。

岗位关联

掌握 CFG 是进入文生图时代的门票。Stable Diffusion、Imagen、DALL·E 系列都以 CFG 为默认引导方式,理解它的公式与调参手感,是你调试一切基于扩散模型的生成任务的起点。

目录
  1. 可视化演示
  2. 双路信号:条件与无条件生成
  3. 分数蒸馏:两路波形
  4. 旋钮的核心公式
  5. 引导强度:旋钮的刻度感
  6. 外接与内置:对比分类器引导
  7. 训练与技巧:接对效果器的线
  8. 应用与局限:实战中的表现
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

可视化展示Classifier-Free Guidance核心原理:条件与无条件预测组合、引导强度参数控制、CFG与Classifier Guidance对比,交互切换理解扩散模型引导技术。

本节配有交互动效(进入视口后自动加载,约 3KB)。

CFG引导公式可视化 条件预测\u03b5(x,c) 无条件预测\u03b5(x,\u2205) \u03b5_cfg = (1+w)\u03b5_c - w\u03b5_u CFG组合条件与无条件预测实现引导

双路信号:条件与无条件生成

录音时,调音师会先在干路上录一版原始声音,再把信号分出一条湿路送去效果器。两条路共享同一个输入源,却输出不同的音色。扩散模型的训练也这样安排:同一个神经网络被要求同时会两件事——看见标签“柴犬”时预测带柴犬特征的噪声方向(条件生成),看见一个空白标记 \(\varnothing\) 时预测普通的噪声方向(无条件生成)。

这两个能力不是分两个模型训练的,而是在一次训练中靠“随机翻转”得到的:每次迭代,以概率 \(p\) 把条件 \(y\) 换成空标记 \(\varnothing\)。于是网络被迫学会在没有条件时也能给出合理预测。这就像录制时偶尔拔掉效果器的输入线,逼着干路也录到及格线以上,将来混音才有素材可用。

训练目标仍是标准的去噪损失,只是输入的条件有时是 \(y\)、有时是 \(\varnothing\):

这样训练完的模型就像一台上好干湿两路的调音台,随时可以单独输出“干净版”和“效果版”,供混音时选择。

L=Et,zt,ε,ξ[∥ε−εθ ⁣(zt, (1−ξ) y+ξ ∅)∥2],ξ∼Bernoulli(p)\mathcal{L} = \mathbb{E}_{t, \mathbf{z}_t, \varepsilon, \xi}\left[ \left\| \varepsilon - \varepsilon_\theta\!\left(\mathbf{z}_t,\ (1-\xi)\,\mathbf{y} + \xi\,\varnothing \right) \right\|^2 \right], \quad \xi \sim \mathrm{Bernoulli}(p)
这个公式说明模型在“给条件”和“不给条件”两种情况下都要把真实噪声 \(\varepsilon\) 预测准,\(\xi\) 就是决定给不给条件的随机开关。
  1. 期望符号对所有时间步、所有加噪样本、所有真实噪声以及所有丢弃标记求平均,代表“平均来说训练要达成的目标”。
    Et,zt,ε,ξ\mathbb{E}_{t, \mathbf{z}_t, \varepsilon, \xi}
  2. 真实噪声训练时人为添加到图像上的高斯噪声,是模型需要预测的“标准答案”。
    ε\varepsilon
  3. 条件输入开关\(\xi=0\) 时保留真实条件 \(y\),\(\xi=1\) 时替换为空标记 \(\varnothing\),一个式子写清楚“有时给条件、有时不给”。
    (1−ξ) y+ξ ∅(1-\xi)\,\mathbf{y} + \xi\,\varnothing
  4. 均方误差预测噪声与真实噪声的平方误差,扩散模型最核心的训练目标,误差越小,模型的去噪能力越强。
    ∥ε−εθ(⋅)∥2\left\|\varepsilon - \varepsilon_\theta(\cdot)\right\|^2

分数蒸馏:两路波形

干信号和湿信号不是凭空产生的,它们来自同一条音频的两种“形态”。在概率世界里,这两种形态被称为“得分”——概率密度上升的方向。无条件得分 \(\nabla_{\mathbf{x}}\log p(\mathbf{x})\) 是干路的波形;条件得分 \(\nabla_{\mathbf{x}}\log p(\mathbf{x}\mid\mathbf{y})\) 是湿路的波形。

贝叶斯公式告诉我们两路信号的关系:湿路 = 干路 + 条件修正项。条件修正项 \(\nabla_{\mathbf{x}}\log p(\mathbf{y}\mid\mathbf{x})\) 衡量“当前样本有多像标签 \(y\) 所描述的内容”,并把采样方向朝更符合标签的地方推:

在扩散模型里,得分函数和模型预测的噪声方向只差一个已知的系数。简单说,预测噪声 \(\varepsilon_\theta\) 近似等于“负得分”。所以训练出的 \(\varepsilon_\theta(\mathbf{z}_t, \mathbf{y})\) 和 \(\varepsilon_\theta(\mathbf{z}_t, \varnothing)\) 就是两条得分路径的可学习替身。调音台里,干湿两路的“声学差异”来自效果器;在 CFG 中,条件与无条件输出的差,正是全部条件信息的浓缩。

∇xlog⁡p(x∣y)=∇xlog⁡p(x)+∇xlog⁡p(y∣x)\nabla_{\mathbf{x}} \log p(\mathbf{x} \mid \mathbf{y}) = \nabla_{\mathbf{x}} \log p(\mathbf{x}) + \nabla_{\mathbf{x}} \log p(\mathbf{y} \mid \mathbf{x})
等式左边是“带条件的世界观”,右边第一项是“不带条件的世界观”,第二项是条件信息带来的额外推力。CFG 的思路就是绕过第二项,用模型自己两次输出之差来近似它。
  1. 条件得分给定标签后,图像空间中概率密度上升最快的方向,可以理解为“湿路波形的斜率”。
    ∇xlog⁡p(x∣y)\nabla_{\mathbf{x}} \log p(\mathbf{x} \mid \mathbf{y})
  2. 无条件得分不依赖任何标签时概率密度上升的方向,是干路基础波形。
    ∇xlog⁡p(x)\nabla_{\mathbf{x}} \log p(\mathbf{x})
  3. 条件修正项也叫贝叶斯项,它只负责回答“像不像标签”,并给出把样本推向标签的力度。
    ∇xlog⁡p(y∣x)\nabla_{\mathbf{x}} \log p(\mathbf{y} \mid \mathbf{x})
  4. 加法叠加调音台的核心操作——干路波形叠加上效果器的修正,就得到湿路波形。
    ++

旋钮的核心公式

调音台上最常用的操作就是拧干湿旋钮。假设干路输出是 \(a\),湿路输出是 \(b\),旋钮刻度为 \(s\),那么输出 \(= a + s \times (b - a)\)。当 \(s=0\) 时纯干;\(s=1\) 时是标准的“干湿参考值”;\(s>1\) 时效果被放大,声音更有侵略性,这就是“外推”——超出了干湿两点直接连线的范围。

CFG 把同样的旋钮装到了扩散模型的每次去噪预测上。采样时我们对每一步同时跑两次网络:一次给条件 \(y\),一次给空标记 \(\varnothing\),然后按下式混合:

有人把 \(s\) 调到很大,得到边缘发亮、色彩过艳的“拔丝”图像;这和录音师把混响拧到产生尖锐回声,是同一手感。锚点永远是无条件预测,条件只负责提供偏移量,因此即使 \(s\) 很大,也不会彻底破坏底子。

ε^θ(zt,y,s)=εθ(zt,∅)+s⋅(εθ(zt,y)−εθ(zt,∅))\hat{\varepsilon}_\theta(\mathbf{z}_t, \mathbf{y}, s) = \varepsilon_\theta(\mathbf{z}_t, \varnothing) + s \cdot \left( \varepsilon_\theta(\mathbf{z}_t, \mathbf{y}) - \varepsilon_\theta(\mathbf{z}_t, \varnothing) \right)
括号里是“条件预测对无条件预测的偏离”,也就是效果器真正加上的东西;把它乘上 \(s\) 再加回无条件预测,就完成了干湿混合。
  1. 无条件锚点模型在空标记下的预测,是输出的地基,保证基础质量不塌。
    εθ(zt,∅)\varepsilon_\theta(\mathbf{z}_t, \varnothing)
  2. 条件预测模型在真实提示词下的预测,代表“如果想要这个标签,应该怎么走”。
    εθ(zt,y)\varepsilon_\theta(\mathbf{z}_t, \mathbf{y})
  3. 条件偏移方向两者相减得到一个向量,指向“条件带来的改变方向”,类似效果器产生的效果增量。
    εθ(zt,y)−εθ(zt,∅)\varepsilon_\theta(\mathbf{z}_t, \mathbf{y}) - \varepsilon_\theta(\mathbf{z}_t, \varnothing)
  4. 外推混合偏移量乘 \(s\) 再加回锚点。\(s\) 越大偏移越强,超过 1 就进入外推区,生成结果更加锐化。
    s⋅(⋅)+εθ(zt,∅)s \cdot (\cdot) + \varepsilon_\theta(\mathbf{z}_t, \varnothing)

引导强度:旋钮的刻度感

调音台最怕两种调法:干到底声音干瘪没氛围;湿过头声音过载破音。图像生成也一样,CFG 的引导强度需要按任务选择。当 \(s=0\),生成完全由无条件分支主导,结果多样但常常不遵循提示词;当 \(s=1\),条件作用刚好到位,但通常不够“黏”;文生图实践中 \(s\) 往往取 2~7。再往上拧,图像会出现典型的过饱和、边缘发光、纹理像油画厚涂一样的伪影。

从数学上看,\(s\) 控制的是每一步反向扩散中“条件偏移”的力度。预测噪声变了,下一步重建的潜变量 \(\mathbf{z}_{t-1}\) 也随之改变:

一个成熟的调音师靠监听判断旋钮位置;一个成熟的生成模型工程师靠验证集指标和用户反馈来调 \(s\)。动捕师、插画师偏好的 \(s\) 通常更低,产品渲染图更高——旋钮的“甜点区”永远是任务相关的。

zt−1=μθ ⁣(ε^θ(zt,y,s))+σt ξ,ξ∼N(0,I)\mathbf{z}_{t-1} = \mu_\theta\!\left( \hat{\varepsilon}_\theta(\mathbf{z}_t, \mathbf{y}, s) \right) + \sigma_t\,\boldsymbol{\xi}, \quad \boldsymbol{\xi} \sim \mathcal{N}(\mathbf{0}, \mathbf{I})
引导强度并不只是在最后一步起作用,而是通过改变每一步重建的均值,影响整条采样轨迹的方向。
  1. 均值重建\(\mu_\theta\) 根据当前去噪预测,把上一时刻的潜变量“校正”一步,这是反向扩散的骨架。
    μθ ⁣(ε^θ(zt,y,s))\mu_\theta\!\left( \hat{\varepsilon}_\theta(\mathbf{z}_t, \mathbf{y}, s) \right)
  2. 随机扰动\(\sigma_t\,\boldsymbol{\xi}\) 是每一步保留的随机性,让采样不会退化成确定性的单点。
    σt ξ,ξ∼N(0,I)\sigma_t\,\boldsymbol{\xi}, \quad \boldsymbol{\xi} \sim \mathcal{N}(\mathbf{0}, \mathbf{I})
  3. 引导进入均值注意 \(\hat{\varepsilon}_\theta\) 里面含 \(s\),说明旋钮每拧一度,整条采样轨迹都会偏转一点。
    ε^θ(zt,y,s)\hat{\varepsilon}_\theta(\mathbf{z}_t, \mathbf{y}, s)

外接与内置:对比分类器引导

CFG 出现之前,扩散模型获得条件引导靠的是“外接效果器”——额外训练一个分类器,判断当前噪声图属于哪一类,然后沿着“让分类器更确信”的方向推一把。这个方向就是分类器梯度。其更新公式为:

外接设备的坏处很明显:要单独训练分类器;噪声图上的分类器可能给出不稳定甚至被对抗扰动左右的梯度;每一步还要额外做一次反向传播。CFG 把“推一把”的方向替换为模型自身条件输出与无条件输出的差——两个前向、无额外模型、无需反向传播。这就是它后来成为主流的原因。效果器从外接变成内置,声音干净了、接线简单了,这是音频设备史上的一大步,也是引导技术史上的一大步。

ε^(zt)=εθ(zt)−w σt ∇ztlog⁡pϕ(y∣zt)\hat{\varepsilon}(\mathbf{z}_t) = \varepsilon_\theta(\mathbf{z}_t) - w\,\sigma_t\,\nabla_{\mathbf{z}_t}\log p_\phi(\mathbf{y}\mid\mathbf{z}_t)
这个公式相当于在无条件去噪的方向上,额外叠加一个“分类器认可的方向”。
  1. 无条件预测\(\varepsilon_\theta(\mathbf{z}_t)\) 是基础去噪方向,相当于干路输出。
    εθ(zt)\varepsilon_\theta(\mathbf{z}_t)
  2. 分类器梯度外接分类器 \(p_\phi\) 给出的梯度,衡量“当前噪声图有多像目标类别”。
    ∇ztlog⁡pϕ(y∣zt)\nabla_{\mathbf{z}_t}\log p_\phi(\mathbf{y}\mid\mathbf{z}_t)
  3. 负号预测噪声近似负得分,所以沿“让分类器更确信”的方向走时,要减去梯度。
    −∇ztlog⁡pϕ(y∣zt)-\nabla_{\mathbf{z}_t}\log p_\phi(\mathbf{y}\mid\mathbf{z}_t)
  4. 权重与缩放\(w\) 是引导权重,\(\sigma_t\) 按噪声水平缩放梯度,避免在高噪声阶段推得太猛。
    w σtw\,\sigma_t

训练与技巧:接对效果器的线

内置效果器不是天生的——调音台出厂前,要把干路信号录好,还要把湿路的插入点接对位置。对 CFG 而言,最关键的一步是训练阶段的条件丢弃:以概率 \(p\)(通常 10%~20%)把条件 \(y\) 替换为 \(\varnothing\)。\(p\) 太小,无条件分支没学好,外推时锚点不稳;\(p\) 太大,条件分支变弱,生成就不够听话。论文里常用 \(p=0.1\sim0.2\),Imagen 则用较小的 5%。

CFG 还可以与“负向提示”(negative prompt)结合:把不想要的文本(比如“模糊、水印”)作为反向条件,让采样方向主动远离它。这相当于在调音台上再接一个“反向效果器”,专门压制某些频率。

CFG 推理时要跑两次前向,成本翻倍。研究者们加了一招“引导蒸馏”:用固定 \(s\) 的教师模型输出被引导过的噪声,让学生模型一步到位模仿:

接好线、调好电平,调音台才能稳定工作;选对丢弃概率、配好蒸馏目标,CFG 才能稳定输出高质量图像。

Ldistill=Et[ w(t)  ∥ ε^teacher(zt,y,s)−εθ(zt,y) ∥2]\mathcal{L}_{\text{distill}} = \mathbb{E}_t\left[\, w(t)\; \Big\|\, \hat{\varepsilon}_{\mathrm{teacher}}(\mathbf{z}_t, \mathbf{y}, s) - \varepsilon_\theta(\mathbf{z}_t, \mathbf{y}) \,\Big\|^2 \right]
蒸馏让学生模型在普通一次前向下,也能模仿高引导强度的锐利效果,推理成本从两次压回一次。
  1. 教师目标\(\hat{\varepsilon}_{\mathrm{teacher}}\) 是加了 CFG 引导后的教师噪声预测,作为想复制的“完美作品”。
    ε^teacher(zt,y,s)\hat{\varepsilon}_{\mathrm{teacher}}(\mathbf{z}_t, \mathbf{y}, s)
  2. 学生预测学生模型只做一次普通条件预测,却必须逼近教师的引导结果。
    εθ(zt,y)\varepsilon_\theta(\mathbf{z}_t, \mathbf{y})
  3. 时间步权重\(w(t)\) 对不同噪声程度的时间步给予不同重视程度,通常中间步更重要。
    w(t)w(t)
  4. 距离度量平方误差告诉学生“你离教师的引导效果还差多远”,反复练到逼近为止。
    ∥⋅∥2\big\| \cdot \big\|^2

应用与局限:实战中的表现

今天几乎所有主流文生图产品——Stable Diffusion、Midjourney 的底层、Imagen、DALL·E 2/3——都在采样时使用 CFG。工程师把它做成一个叫 “CFG Scale“ 的滑块,用户无需懂公式,像调音师拧旋钮一样就能控制”听话程度”。默认值通常设在 7 附近,动漫风格任务常降到 5~6 保留多样性,产品渲染图则调到 8~10 增强文字遵循度。

在图像编辑(局部重绘、参考图引导)和视频生成(Sora、Runway 等)中,CFG 及其变体同样承担“语义对齐”的职责。编辑时局部区域的提示词融合强度由 CFG 类机制控制,视频扩散则用 CFG 让每一帧都牢牢粘住文本描述,避免画面叙事跑偏。

但内置旋钮也有脾气:\(s\) 过大导致过饱和、伪影,还伴随“多样性坍缩”——所有图片都像同一种声音的拷贝;无条件分支要额外跑一次前向,推理成本接近翻倍。此外,CFG 本质上是在放大条件置信区间,对提示词本身的歧义也会放大,用户堆砌过长提示词时反而更容易出现“四不像”。调音台的旋钮从来没有绝对正确的刻度,只有“适合当前项目”的刻度。CFG 的强处,是把这个旋钮交到了每个使用者的手里。

AI 应用场景

文生图产品中的 "CFG Scale" 滑块设计

阶段:模型推理与调参部署

解决的问题:用户描述千差万别,固定引导强度无法兼顾所有提示词。传统方案靠 prompt 工程师反复堆砌关键词来强行拉高忠实度,成本高且不稳定。CFG 让“遵循提示词”和“保留多样性”变成同一个旋钮的两端,算法工程师可以在不重训模型的情况下为用户提供直观的调参入口。

具体案例:Stable Diffusion WebUI 把 CFG Scale 暴露为 0~30 的滑块,默认 7。线上数据显示,动漫风格任务用户常调到 5~6 以保留画风多样性,电商产品图任务调到 8~10 以增强品牌元素还原。算法团队根据 A/B 测试决定默认值,并在不同风格预设(LoRA)中绑定各自的推荐 \(s\)。

负向提示与图像编辑

阶段:推理阶段的后处理与语义控制

解决的问题:文生图常出现多余肢体、水印、模糊等用户不想要的元素,仅靠正向提示难以压制。CFG 的公式天然支持“反向偏移”:把“水印、低质量”作为负向条件,让采样方向主动远离这些语义,相当于在调音台上加了一个反相效果器。

具体案例:Stable Diffusion 的 negative prompt 功能利用 CFG 的扩展形式,在每一步同时参考正向提示“一只戴帽子的柴犬”和负向提示“模糊、水印”,引导强度 \(s\) 控制两个方向的拉力。图像编辑工具(如 inpaint 局部重绘)也用类似机制控制重绘区域对提示词的贴合程度,\(s\) 调低时保留原图纹理,调高时让新物体更明显。

Python 演示

python47 行
import numpy as npimport matplotlib.pyplot as plt  def gauss(x, mu, sigma):    """高斯概率密度函数"""    return np.exp(-0.5 * ((x - mu) / sigma) ** 2) / (sigma * np.sqrt(2.0 * np.pi))  def score_uncond(x):    """无条件得分:双峰混合高斯的对数密度梯度"""    mus = np.array([-3.0, 3.0])    sigmas = np.array([1.0, 1.0])    weights = np.array([0.5, 0.5])    density = sum(w * gauss(x, m, s) for w, m, s in zip(weights, mus, sigmas))    grad = sum(w * gauss(x, m, s) * (-(x - m) / s ** 2)               for w, m, s in zip(weights, mus, sigmas))    return grad / density  def score_cond(x):    """条件得分:把样本拉向右侧峰(模拟标签 y=1)"""    return -(x - 3.0) / 0.5 ** 2  def cfg_score(x, s):    """CFG 组合得分:无条件得分 + s * (条件偏移)"""    return score_uncond(x) + s * (score_cond(x) - score_uncond(x))  def langevin_sample(score_fn, n_steps=2000, step_size=0.01, seed=0):    """Langevin 采样:沿得分方向迭代逼近目标分布"""    rng = np.random.default_rng(seed)    x = rng.normal(0.0, 3.0, 300)    for _ in range(n_steps):        x = x + step_size * score_fn(x) + np.sqrt(2.0 * step_size) * rng.normal(0.0, 1.0, x.size)    return x  if __name__ == "__main__":    for s in (0.0, 1.0, 3.0):        samples = langevin_sample(lambda x: cfg_score(x, s))        plt.hist(samples, bins=40, density=True, alpha=0.5, label=f"CFG s={s}")    plt.legend()    plt.title("Classifier-Free Guidance 在一维玩具分布上的效果")    plt.savefig("cfg_demo.png", dpi=120)    print("已保存采样分布图 cfg_demo.png")
目的:在一维玩具分布上演示 CFG 公式——无条件双峰分布 + 条件单峰分布,调节引导强度 \(s\) 后观察采样点如何从“左右都画”变成“死死盯住右侧峰”。
  1. grad = sum(w * gauss(x, m, s) * (-(x - m) / s ** 2) ...)解析计算密度梯度,这就是“干路信号”的走势。
  2. return grad / density对数密度梯度 = 密度梯度 ÷ 密度,数学上就是得分函数。
  3. return -(x - 3.0) / 0.5 ** 2条件得分给出一条明确的“向右峰靠拢”的湿路方向。
  4. return score_uncond(x) + s * (score_cond(x) - score_uncond(x))一行实现 CFG 核心公式,干路加外推偏移。
  5. x + step_size * score_fn(x) + sqrt(...) * noiseLangevin 迭代,等价于扩散模型每一步去噪采样。
  6. plt.hist(samples, ...)把不同 \(s\) 下采样点的分布画在一起,直观看到引导强度如何改变最终分布。

常见误区

误区我觉得 CFG 就是把条件生成结果和无条件生成结果按比例混合一下,比如 \(0.7\) 的条件加 \(0.3\) 的无条件,两个权重加起来等于 1。

正解CFG 不是线性内插,而是“外推”——先算出条件与无条件输出的差值,再乘上引导强度 \(s\) 加回无条件输出。当 \(s>1\) 时,结果会超出条件与无条件两点之间的连线范围。写成混合形式是 \((1-s)\varepsilon_\varnothing + s\varepsilon_y\),注意两个系数之和为 1 当且仅当 \(s\in[0,1]\),而实际常用 \(s>1\),两个系数加起来根本不为 1。这就像干湿旋钮可以拧过湿信号满刻度,效果量超过原始湿路本身。

为何常见:公式长得很像加权平均,名字里的 "Free Guidance" 又让人联想到折中,于是容易忽略外推这一关键性质。

误区既然叫“引导”,那应该像分类器引导那样,先训练一个图像分类器,用它算梯度把生成结果引向指定类别。

正解CFG 恰恰不需要任何额外分类器。它用同一个扩散模型跑两次前向——一次带条件 \(y\)、一次带空标记 \(\varnothing\)——把两次输出的差当作引导方向。训练分类器的方案叫 Classifier Guidance,是 CFG 出现之前的老方法。CFG 的外推锚点是模型自身的无条件预测,分类器梯度不再出现。

为何常见:早期扩散模型引导确实靠分类器,“引导”这个词先入为主,加上论文标题里的 “Classifier-Free“ 字面是否定式,容易被记反成”需要分类器”。

误区CFG 里最核心的是条件预测,无条件预测只是配角。那我干脆省掉无条件分支,把条件预测直接乘个大系数,效果不也一样吗?

正解无条件预测是整个外推的锚点,锚点移动,外推基准也跟着变,生成的“底子”会不稳定。直接放大条件预测会让模型输出偏离训练分布,产生严重的颜色畸变和结构崩坏。CFG 中无条件分支始终在分母的逻辑位置,它不仅不能省,还要训练得足够好——训练时丢弃条件的概率就是为此服务的。

为何常见:人本能地觉得“条件信息越多越好”,容易把无条件分支当成拖后腿的部分,而忽略了它是扩散模型保持自然度的基准面。

误区我把 CFG Scale 从 7 调到 15,图确实更“像”提示词了;那调到 30 是不是更完美?调得越大越听话。

正解\(s\) 过大会导致过饱和、边缘伪影、内容畸变,甚至出现“条件噪声”——模型被推向超出训练分布的置信区域,生成结果反而偏离人类审美。实践上不同任务存在甜点区间,SD 默认 7,动漫场景 5~6,产品图 8~10。过大的 \(s\) 还会让多样性急速坍缩,所有图都长得像同一个模子刻出来的。

为何常见:小尝试时加大 \(s\) 确实改善了提示词遵循度,容易让人误以为响应是单调的,忽略了超出甜点区后的急剧恶化。

误区CFG 采样的每一步都要跑一个条件模型和一个无条件模型,所以显存和加载时间都会翻倍,等于同时跑两个模型。

正解条件分支和无条件分支是同一个网络的两次前向,模型参数只有一份,权重不翻倍,显存主要增加在激活值和中间特征上,而不是模型参数。推理时间确实接近翻倍,但可以通过引导蒸馏把两步合成一步,采样时只跑一次普通前向就用上高 \(s\) 的引导效果。

为何常见:两次前向传播很容易被想象成“两个模型”,尤其在看到代码里出现两个分支调用时,更容易产生这种误解。

面试题

Q1. CFG 中引导强度 \(s=0\) 时,生成过程相当于什么?

单选题 · easy

  • A.完全条件模式的生成
  • B.完全无条件模式的生成← 正确答案
  • C.条件与无条件取平均
  • D.反向扩散过程直接停止

答案:B。CFG 公式为 \(\hat{\varepsilon}=\varepsilon_\varnothing+s(\varepsilon_y-\varepsilon_\varnothing)\),当 \(s=0\) 时只剩 \(\varepsilon_\varnothing\),即纯无条件生成。它不是平均,也不是停止,只是效果器被完全关掉,只剩干信号。

Q2. 训练 CFG 时,为了获得无条件分支,条件信息会被随机替换成什么?

单选题 · easy

  • A.随机噪声向量
  • B.空标记 \(\varnothing\)← 正确答案
  • C.类别中心向量
  • D.全一的常数向量

答案:B。论文用特殊空标记 \(\varnothing\) 表示“没有条件”,网络见到它时输出无条件预测。随机噪声或类别中心都会引入额外语义,无法代表纯净的“无条件”状态。

Q3. 在 CFG 公式 \(\hat{\varepsilon}=\varepsilon_\varnothing+s(\varepsilon_y-\varepsilon_\varnothing)\) 中,\(s=2\) 表示什么?

单选题 · mid

  • A.完全忽略无条件信息
  • B.条件偏移量被放大两倍← 正确答案
  • C.条件偏移量被缩小一半
  • D.无条件信息被放大两倍

答案:B。括号里 \(\varepsilon_y-\varepsilon_\varnothing\) 是条件偏移量,\(s=2\) 意味着这个偏移被放大两倍后加到无条件预测上。由于锚点始终是无条件预测,无条件信息并没有被忽略,也不会被“放大两倍”。

Q4. 与 Classifier Guidance 相比,CFG 的主要优势是什么?

单选题 · mid

  • A.不需要额外训练分类器← 正确答案
  • B.推理速度完全不增加
  • C.不需要训练扩散模型
  • D.自动获得更高分辨率

答案:A。Classifier Guidance 需要额外分类器并提供梯度,CFG 用模型自身条件/无条件输出之差替代分类器梯度。推理仍要两次前向,速度并非不增加;扩散模型仍然要训练,分辨率也由模型结构决定。

Q5. CFG 中引导强度 \(s\) 过大,最典型的副作用是什么?

单选题 · hard

  • A.生成结果过饱和且出现伪影← 正确答案
  • B.无条件分支权重自动变小
  • C.模型训练损失不收敛
  • D.分类器梯度直接消失

答案:A。\(s\) 过大会把条件偏移外推过远,生成图像出现典型的过饱和、边缘发光、结构伪影,同时伴随多样性坍缩。这类似于调音台湿信号拧过头导致破音,是采样阶段现象而非训练问题。

Q6. 训练 CFG 时,条件丢弃概率通常取多少?

单选题 · mid

  • A.0%,从不丢条件
  • B.10%~20%← 正确答案
  • C.50%~60%
  • D.100%,全丢掉

答案:B。10%~20% 既能训练出可靠的无条件分支,又不至于削弱条件分支。50% 会让条件分支学不充分,100% 等于完全取消条件生成,0% 则无条件分支不存在。

Q7. 关于 CFG 的推理计算量,下列说法正确的是?

多选题 · mid

  • A.需条件与无条件两个前向← 正确答案
  • B.需要独立分类器的前向传播
  • C.可用引导蒸馏压缩为一步← 正确答案
  • D.条件分支完全不需要计算

答案:AC。CFG 采样每一步都要对同一个模型跑条件与无条件两次前向,因此 A 正确。它不需要分类器,B 错误。引导蒸馏让学生模型一步模仿教师的高 \(s\) 输出,C 正确。条件分支是必须计算的核心,D 错误。

Q8. CFG 公式中 \(\varepsilon_\theta(\mathbf{z}_t, \varnothing)\) 的核心作用是什么?

单选题 · hard

  • A.充当锚点,提供无条件基础方向← 正确答案
  • B.充当分类器的输出概率
  • C.用于计算损失函数的权重
  • D.用于替代学习率调度器

答案:A。无条件预测是外推的锚点,所有条件偏移都是以它为基准叠加的。锚点质量决定了生成图像的自然度,因此训练时要专门靠条件丢弃保证它学得够好。B、C、D 都与它的角色无关。

Q9. 关于 CFG 的数学原理,下列哪些说法正确?

多选题 · extreme

  • A.用模型自身输出差近似分类器梯度← 正确答案
  • B.本质是把条件得分外推到无条件得分之外← 正确答案
  • C.无条件分支就是模型将标签设为零向量
  • D.\(s>1\) 时等价于贝叶斯公式的精确求解

答案:AB。CFG 定义中 \(\varepsilon_y-\varepsilon_\varnothing\) 恰好替代了 \(\nabla\log p(y|x)\) 的角色,A 正确。\(s>1\) 时条件偏移被放大,采样中心越过条件点,属于外推,B 正确。无条件分支用的是空标记 \(\varnothing\) 而非零向量,两者语义不同,C 错误。\(s>1\) 是启发式外推,不是贝叶斯精确解,D 错误。

Q10. 在 Stable Diffusion 界面中调节 "CFG Scale" 滑块,下列说法正确的是?

多选题 · mid

  • A.实际调节的是引导强度 \(s\)← 正确答案
  • B.改变采样总步数的多少
  • C.影响生成结果对提示词的遵循程度← 正确答案
  • D.改变随机种子的初始化值

答案:AC。CFG Scale 滑块就是用户界面对引导强度 \(s\) 的暴露,A 正确。增大 \(s\) 让采样更贴提示词,C 正确。采样步数由另一个滑块控制,随机种子也独立设置,B、D 错误。