跳转至

Classifier-Free Diffusion Guidance — 一行代码砍掉外挂分类器,统一所有现代文生图

2021 年 12 月 12 日,Jonathan Ho 与 Tim Salimans(Google Research, Brain Team)把一份 8 页的 workshop 投稿挂到 NeurIPS 2021 Workshop on Deep Generative Models;半年后扩展为 arXiv 2207.12598 这是一篇连主会都没投过、却在 6 个月内被 GLIDE / Imagen / DALL·E 2 / Stable Diffusion 全部抄进采样代码第一行的论文 —— 它发现只要训练时以 10% 概率把条件 \(c\) 替换成 null token,再在采样时把"有条件" 与"无条件" 的两次预测做线性外推 \(\tilde\epsilon = (1+w)\epsilon_c - w\epsilon_u\),就能完全干掉 Dhariwal & Nichol 2021 classifier guidance 那个需要外训 noisy 分类器、训文本根本无法适用的"外挂梯度"。 CFG 不是 FID 上的全面胜利(ImageNet 64 上 2.43 vs classifier guidance 的 2.07,反而略输 0.36),它赢的是工程:0 训练成本、推理只需 2× 前传、对任何条件类型(class / text / CLIP / depth)通用。 4 年后的今天,每个 Stable Diffusion WebUI 用户都在拖动那个 "CFG Scale" 滑块——这个滑块就是 Ho & Salimans 论文公式中的 \(w\)CFG 是从一篇 workshop 论文里跑出来的、几乎统一了整个 2022-2026 文生图世代的"基础设施"

一句话总结

Jonathan Ho 与 Tim Salimans 2021 年发表在 NeurIPS Workshop on DGM 的这篇 8 页 workshop 论文,把扩散模型的条件控制从"外挂训一个 noisy 分类器"重写为"同一个网络通过 null token 同时学条件 + 边际两个分支",采样时一行 \(\tilde\epsilon_\theta(x_t, t, c) = (1+w)\epsilon_\theta(x_t, t, c) - w\epsilon_\theta(x_t, t, \varnothing)\) 完成贝叶斯指数放大 \(p_w(x \mid c) \propto p(x) \cdot p(c\mid x)^{1+w}\)0 训练成本 + 2× 推理成本 直接砍掉了 Dhariwal & Nichol 2021 classifier guidance 的外训分类器+反向传播全套脚手架。

它在 ImageNet 64 上 best FID 2.43 反而比 classifier guidance 的 2.07 略高 0.36,但 IS 152 vs 132 大幅领先,真正的胜利在通用性:6 个月内被 GLIDE、Imagen、DALL·E 2、Stable Diffusion 全部采纳为采样默认,4 年后仍然是 SDXL / Flux / SD3 / Sora 的 inference-time 首选。它留下的隐藏 lesson 是:当一个方法在 benchmark 上略输但在工程上零成本通用,它一定打赢那个 benchmark 略胜但需要重训外挂模型的对手——这是 Ho 在 DDPM (2020) 之后第二次用"工程极简主义"颠覆生成模型范式。


历史背景

2021 年的扩散模型学界在卡什么

要理解 CFG 的力量,必须回到 2021 年那个"扩散模型刚踩上 GAN 的脖子、却还离不开外挂分类器"的尴尬瞬间。

2020 年 6 月 DDPM (Ho et al.) 把 Sohl-Dickstein 2015 那套被遗忘的非平衡热力学框架救活,CIFAR-10 unconditional FID 3.17。2021 年 5 月 Dhariwal & Nichol 的 Diffusion Models Beat GANs on Image Synthesis 把 ImageNet 64×64 FID 干到 1.97,论文标题等于直接给 GAN 时代下了死亡判决。但这场胜利背后藏着一个让所有从业者头疼的工程债:条件采样必须挂一个外部分类器

这就是 Dhariwal & Nichol 推广开的 classifier guidance:训练一个能识别带噪图像 \(x_t\) 类别的分类器 \(p_\phi(c \mid x_t)\),再在每个采样步把它的 logit 梯度 \(\nabla_{x_t} \log p_\phi(c \mid x_t)\) 加到 score 上。数学上漂亮(等价于把 \(p(x_t \mid c) \propto p(x_t) \, p(c \mid x_t)^w\) 这条贝叶斯公式按一个温度系数 \(w\) 拉伸),工程上却是噩梦:

你需要在 1000 个不同噪声等级上重新训练一个 ImageNet 分类器,而当时所有现成的分类器(ResNet / EfficientNet / ViT)都是在干净图像上训的。

具体痛点至少 4 条:

  • 重训成本:ImageNet 上跑一个 noisy classifier 要数天 TPU;每换一个数据集要重训一次
  • 梯度漂移:分类器在高噪声 \(t \to T\) 时几乎学不到东西,梯度几乎是噪声,guidance 失效
  • 对抗样本风险:分类器梯度可以"钻空子"——优化的图未必是该类的真实样本,而是分类器认为像该类的对抗样本(GLIDE 论文 Nichol et al. 2022 §3.3 直接讨论了这一点)
  • 不能用于文本/连续条件:classifier guidance 公式默认 \(c\) 是离散类别;文本提示词要怎么训分类器?没人说得清

与此同时,Imagen / DALL-E 2 / GLIDE 的研发已经在 Google Brain、OpenAI 内部启动,所有人都意识到下一代生成模型必须是文生图,但 classifier guidance 这条路堵死了——你不可能给"一只穿宇航服的柯基在火星上读莎士比亚"这种自由文本训分类器。学界急需一个不需要外挂分类器的引导机制。

直接逼出 CFG 的 4 篇前序

  • Sohl-Dickstein et al., 2015 (Nonequilibrium Thermodynamics) arxiv/1503.03585:扩散模型的祖父论文,给出 forward/reverse Markov 链的全部数学。CFG 的"score 线性组合"操作直接建立在这条链上。
  • Ho, Jain, Abbeel, 2020 (DDPM) arxiv/2006.11239:本文一作 Ho 的前作,证明 \(\epsilon\)-prediction + \(L_{\text{simple}}\) 可以把扩散训稳;CFG 直接沿用这套训练框架,只在采样时加一个线性组合。
  • Song et al., 2021 (Score-based SDE) arxiv/2011.13456:把 DDPM 与 NCSN 统一在 SDE 框架下,证明 \(\epsilon_\theta(x_t,t) \propto -\sigma_t \nabla_{x_t} \log p_t(x_t)\)。CFG 之所以能写成两个 score 的线性组合,全靠这条等价。
  • Dhariwal & Nichol, 2021 (Classifier Guidance) arxiv/2105.05233:CFG 直接要替代的对手。它给出 \(\nabla_{x_t} \log p_t(x_t \mid c) = \nabla \log p_t(x_t) + w \, \nabla \log p_\phi(c \mid x_t)\) 的扩展公式,但需要外训分类器。CFG 的核心 insight 就是用贝叶斯倒推 —— "如果两个 score 都来自同一个生成模型,根本不用第二个网络"。

作者团队当时在做什么

Jonathan Ho 当时刚从 UC Berkeley 博士毕业(导师 Pieter Abbeel)入职 Google Brain,DDPM 已经在 NeurIPS 2020 拿了广泛关注。Tim Salimans 是 Google Brain 资深研究员,此前在 OpenAI 做 PixelCNN++、Improved-GAN,是生成模型领域少数横跨 GAN / VAE / 自回归 / 扩散四条路线的人。两人在 Brain Team 的研究主线非常明确:把扩散模型推到大规模文生图。CFG 就是这条主线上必须先解决的"中间问题"。

CFG 的论文最早投到 NeurIPS 2021 Workshop on Deep Generative Models(2021 年 12 月),只有短短 8 页。半年后的 2022 年 7 月,作者把扩展版传到 arXiv(2207.12598),加了更多 ImageNet 64×64 / 128×128 实验。有趣的是这篇论文从未投出工作坊以外的正会——Ho & Salimans 自己也清楚,这个 trick 简单到无法独立支撑一篇 NeurIPS / ICML 主会论文,但它的影响远远超过任何 2022 年的主会论文:Imagen、Stable Diffusion、DALL·E 2、GLIDE、几乎所有现代 T2I 系统的采样代码第一行都是它

工业界 / 算力 / 数据的状态

  • GPU:Google Brain 内部 TPUv4 / TPUv3 pods;论文实验只跑 64×64 / 128×128 ImageNet,单机 8 卡量级
  • 数据:ImageNet 64×64、ImageNet 128×128(class-conditional),无任何文本数据集——CFG 论文里完全没用文本,T2I 的应用是后续 Imagen 把 CFG "搬过去" 才证实的
  • 框架:JAX + Flax(Google Brain 标配);PyTorch 复现一周内出现
  • 行业气氛:2021 年底 OpenAI 发布 GLIDE(已用 CFG 但没单独成文)、2022 年 4 月 DALL·E 2 发布、5 月 Imagen、7 月 Stable Diffusion arXiv、8 月 SD 开源——整个 2022 年是 T2I 元年,而 CFG 是这一年所有论文的"基础设施"。后来人们才意识到:CFG 才是真正解锁 T2I 的钥匙,而不是 Transformer / U-Net / VAE encoder 任何一个 backbone 改进。

方法详解

整体框架

CFG 的整体设计干净到让人怀疑它能不能算"一个方法"——训练时就一个网络、采样时多调一次该网络。和 DDPM 比,唯一的改动是:训练时 10-20% 的概率把条件 \(c\) 替换成 null token \(\varnothing\),采样时把"有条件"和"无条件"两次预测做线性外推

训练(与 DDPM 99% 相同):
  (x_0, c) ~ p_data
    ↓ 抽 t ~ Uniform{1..T}, ε ~ N(0, I)
    ↓ x_t = √(ᾱ_t) x_0 + √(1-ᾱ_t) ε
    ↓ 抽 mask ~ Bernoulli(p_uncond=0.1~0.2)
    ↓ c̃ = ∅ if mask else c                  ← ★ 这是 CFG 的全部训练改动
  ε̂ = ε_θ(x_t, t, c̃)                        ← 同一个网络
  Loss = ||ε - ε̂||²

采样(CFG 一行):
  x_T ~ N(0, I)
  for t = T, ..., 1:
      ε_c = ε_θ(x_t, t, c)                  ← 第 1 次前传:有条件
      ε_u = ε_θ(x_t, t, ∅)                  ← 第 2 次前传:无条件
      ε̃  = (1+w) · ε_c − w · ε_u           ← ★ CFG 的全部采样改动
      x_{t-1} = DDPM_step(x_t, ε̃, t)
  return x_0

不同实验配置的差别只是 \(w\)\(p_{\text{uncond}}\)

配置 数据 \(p_{\text{uncond}}\) 采样 \(w\) FID(最佳) IS(最佳)
ImageNet 64×64 (paper Table 1) 1.28M class-cond 0.1 0.1 → 4.0 扫描 2.43 @ w=0.1 152 @ w=4.0
ImageNet 128×128 (paper Table 2) 1.28M class-cond 0.1 0.1 → 4.0 扫描 2.97 @ w=0.3 156 @ w=4.0
Imagen (Saharia et al. 2022) 460M LAION-like 0.1 7.0–15.0 7.27 (COCO 0-shot)
Stable Diffusion v1 (Rombach 2022) 2B LAION-5B 0.1 7.5(默认)
GLIDE (Nichol et al. 2022) 250M alt-text 0.2 3.0 12.24 (COCO 0-shot)

反直觉之一:CFG 的"有条件 ε" 和"无条件 ε" 用的是同一组权重——网络通过 null token \(\varnothing\) 自己学会"什么都不知道时该输出什么"。外挂分类器消失了,但分类信息没消失——它被吸收进了同一个 U-Net 的隐藏表示里。

⚠️ 反直觉之二\(w\) 是"外推系数"而不是"插值系数"。当 \(w=0\) 时退化到普通条件采样 \(\tilde\epsilon = \epsilon_c\);当 \(w > 0\)沿着 \((\epsilon_c - \epsilon_u)\) 方向把 score 推得比"有条件"还更"有条件"——把样本拉向"该条件下最典型"的高密度区。直觉是:先看你"无条件下会画什么",再看"加了条件后多画了什么",然后把"多出来那一部分"再加倍。

关键设计

设计 1:联合训练条件 + 无条件网络(Joint Conditional / Unconditional Training)—— 一个网络两副面孔

功能:用一个 U-Net 同时建模条件分布 \(p(x \mid c)\) 和边际分布 \(p(x)\),在不增加参数、不增加训练时长的前提下让采样阶段能调取两条 score。

核心思路:训练时以小概率 \(p_{\text{uncond}} \in [0.1, 0.2]\) 把条件 \(c\) 替换成一个保留的 null embedding \(\varnothing\)(实现上就是一个可学的 null_embedding 向量)。损失写成期望:

\[ \mathcal{L}_{\text{CFG-train}} = \mathbb{E}_{(x_0, c), t, \epsilon, m \sim \text{Bern}(p_{\text{uncond}})} \Big[\big\|\epsilon - \epsilon_\theta\big(x_t,\, t,\, m \cdot \varnothing + (1-m) \cdot c\big)\big\|^2\Big] \]

单步损失等价于两个目标的加权和

\[ \mathcal{L}_{\text{CFG-train}} = (1 - p_{\text{uncond}}) \cdot \mathcal{L}_{\text{cond}} + p_{\text{uncond}} \cdot \mathcal{L}_{\text{uncond}} \]

意思是:90% 的 batch 学条件 score \(\nabla \log p(x_t \mid c)\),10% 的 batch 学边际 score \(\nabla \log p(x_t)\)两者共享所有权重

训练伪代码(PyTorch):

def train_step(x0, c, model, betas, T, p_uncond=0.1):
    # 1) 随机时刻 + 闭式造噪
    t = torch.randint(0, T, (x0.shape[0],), device=x0.device)
    x_t, eps = q_sample(x0, t, betas)
    # 2) ★ CFG 的训练改动:以 p_uncond 概率把条件置空
    mask = (torch.rand(x0.shape[0], device=x0.device) < p_uncond)
    c_input = torch.where(mask[:, None], NULL_EMBED, c)  # 同一个网络两副面孔
    # 3) 网络前传
    eps_hat = model(x_t, t, c_input)
    # 4) 普通 MSE,权重不变
    return F.mse_loss(eps_hat, eps)

\(p_{\text{uncond}}\) 取值对比(论文 Table 3 + 后续 Imagen / SD 实验):

\(p_{\text{uncond}}\) 条件分支训练量 无条件分支训练量 影响
0.0 100% 0% 退化成普通条件 DDPM,CFG 在采样时无 ε_u 可用
0.05 95% 5% ε_u 训练不足,guidance 不稳
0.1 90% 10% 论文最佳;Imagen / SD 默认
0.2 80% 20% GLIDE 选;条件 FID 略掉点但 unconditional 更稳
0.5 50% 50% 条件 FID 显著下降;不如分开训两个网络

设计动机 —— 为什么共享一个网络?

朴素想法是"训两个网络:一个 \(\epsilon_\theta(x,c)\) 一个 \(\epsilon_\phi(x)\)"。CFG 的关键洞察是:两个网络其实学的是同一份知识——条件分布 \(p(x\mid c)\) 和边际分布 \(p(x) = \mathbb{E}_c[p(x\mid c)]\) 共享底层的图像统计先验(边缘、纹理、物体形状)。让一个网络通过 null token 同时表达"知道 c"和"不知道 c"两种状态,参数效率高一倍、推理只需要 2 次前传而不是分别走两个网络的 2 倍计算量

更深层的原因:训练时条件信息是通过 cross-attention / FiLM / class-embedding-add 注入的,把条件位置塞 null embedding 等价于把信号通路"短路"——网络在该样本上只能依赖 \(x_t\) 本身,自然学到边际分布。这个 trick 之所以能 work,本质上是"条件分支和无条件分支共用同一组特征提取器"——和 multi-task learning 的 head sharing 同源。

设计 2:采样时的 score 线性外推(Sampling-time Linear Extrapolation)—— CFG 真正的灵魂

功能:在每个采样步用同一个网络做两次前传,再把"有条件"和"无条件"预测做外推(不是插值!),把 score 推向条件分布的高密度区。

核心公式——CFG 的全部数学:

\[ \boxed{\ \tilde\epsilon_\theta(x_t, t, c) = (1 + w) \cdot \epsilon_\theta(x_t, t, c) - w \cdot \epsilon_\theta(x_t, t, \varnothing)\ } \]

也可以写成等价的"差分加成"形式:

\[ \tilde\epsilon_\theta(x_t, t, c) = \epsilon_\theta(x_t, t, c) + w \cdot \big[\epsilon_\theta(x_t, t, c) - \epsilon_\theta(x_t, t, \varnothing)\big] \]

\(\epsilon\) 翻译成 score(用 \(\epsilon_\theta = -\sigma_t \nabla \log p\)):

\[ \tilde s(x_t \mid c) = \nabla \log p(x_t) + (1 + w) \cdot \big[\nabla \log p(x_t \mid c) - \nabla \log p(x_t)\big] \]

也就是从隐式贝叶斯式 \(p_w(x_t \mid c) \propto p(x_t) \cdot p(c \mid x_t)^{1+w}\) 采样。这一步是 CFG 的全部理论奇迹:外推一个本属于"分类器后验"的指数项,但完全不需要训练分类器——分类器的"梯度"由两个 score 之差自动浮现。

采样伪代码(PyTorch):

@torch.no_grad()
def cfg_sample_step(x_t, t, c, model, betas, w=4.0):
    # ★ CFG 的全部采样改动:两次前传 + 一次线性外推
    eps_c = model(x_t, t, c)                          # 有条件预测
    eps_u = model(x_t, t, NULL_EMBED.expand_as(c))    # 无条件预测
    eps_tilde = (1 + w) * eps_c - w * eps_u           # ← 外推,不是插值!
    # 之后照搬 DDPM/DDIM 的反向更新
    return ddpm_reverse_step(x_t, eps_tilde, t, betas)

\(w\) 取值的 trade-off(论文 Figure 2 + Table 1):

\(w\) FID(越低越好) IS(越高越好) 视觉质感 备注
0 2.43(最佳) 50.7 多样、平庸 退化为 DDPM 条件采样
0.1 2.43 73.9 略有偏好 ImageNet 64 论文最优 FID
0.5 3.4 110 明显偏典型 平衡区
1.0 5.7 130 颜色饱和 Stable Diffusion 风格阈值
2.0 12.5 145 过度饱和
4.0 28.6 152 严重失真 IS 最高但 FID 崩

反直觉重点\(w\) 越大 IS 越高(fidelity)但 FID 越差(diversity)——这是一个 fidelity-diversity 的"时光机",能让模型在 mode coverage 和 mode quality 之间任意滑动。GAN 时代曾用 truncation trick (BigGAN) 做类似 trade-off,但 CFG 的版本更优雅、更通用、可以应用到任何条件类型。

设计动机 —— 为什么是外推不是插值?

如果只想"加点条件",最朴素的写法是插值 \(\tilde\epsilon = (1-\lambda) \epsilon_u + \lambda \epsilon_c\)\(\lambda \in [0,1]\)),但插值本质上是在两个分布之间"软选择"——结果永远在两者之间。CFG 的外推 \((1+w)\epsilon_c - w\epsilon_u\) 把 score 推得比 \(\epsilon_c\) 还更"有条件":它告诉模型"沿着加条件后多变化的那个方向走得更远",等价于在贝叶斯式中把分类器后验做指数 \((1+w)\) 次方放大(\(p(c\mid x)^{1+w}\))——主动放大类别证据而不是软混合。这就是 CFG 比插值 baseline 强的根本原因。

设计 3:null token 的实现细节 —— 简单到让人怀疑

功能:给"无条件"分支提供一个统一的占位符,让网络能区分"我没有条件"和"我有条件 c"。

实现——3 种主流写法:

# 写法 1:class-conditional(CFG 论文原版)
NULL_CLASS = num_classes  # 用一个额外的 class id, e.g. 1001 for ImageNet-1000
class_embed = nn.Embedding(num_classes + 1, embed_dim)
c_emb = class_embed(c)  # c=1001 时取出 null embedding

# 写法 2:text-conditional(Imagen / Stable Diffusion)
# null token 是一个零向量 / 一个特殊的 [PAD] token
NULL_TEXT_EMBED = torch.zeros(seq_len, text_dim)  # 或 T5("") 的输出
c_emb = NULL_TEXT_EMBED if uncond else text_encoder(prompt)

# 写法 3:CLIP-image-conditional(DALL·E 2 的 prior)
# null token 是 CLIP("") 的输出

对比表

条件类型 null 表示 论文/系统
类别(ImageNet) 额外 class id CFG 原论文
文本(自由) 空 prompt T5("") / 零向量 Imagen / Stable Diffusion
CLIP 图像 embedding CLIP("") DALL·E 2
多模态条件 任一条件被 mask 即视为 uncond CompVis / Latent Diffusion 多模态版

设计动机:null token 必须是"训练时和推理时表示完全一致" 的固定值,否则采样阶段的 ε_u 会和训练阶段的 ε(x, ∅) 分布不一致。这是 CFG 在工程上唯一容易踩坑的地方——很多复现把 null 写成"随机 mask 部分 token"会导致采样质量崩溃。

损失函数 / 训练策略

配置 说明
Loss \(L_{\text{simple}}\) = MSE(\(\epsilon, \epsilon_\theta\)) 完全沿用 DDPM;CFG 只改条件输入
Optimizer Adam \(\beta_1=0.9, \beta_2=0.999\)
Learning rate \(1 \times 10^{-4}\) 与 Improved-DDPM 一致
Batch size 256-2048 TPUv4 8-64 chip pod
Iterations 2M-4M ImageNet 64×64 ~3 days
EMA 衰减率 0.9999 与 DDPM 同
\(p_{\text{uncond}}\) 0.1(论文)/ 0.2 (GLIDE) CFG 唯一新增超参
采样 \(w\) 0.1 (FID 最佳) → 4 (IS 最佳) 推理时调,无需重训
\(T\) 1000 训练 / 250 采样 (DDIM) 与 DDPM 同
网络参数 ~270M (ImageNet 64×64) U-Net + class embedding

注意 1:CFG 的训练成本与 baseline DDPM 完全相同——没有第二个网络、没有第二个损失项、没有额外的反向传播。仅仅是在数据增强阶段加了一行 c[mask] = NULL这是 CFG 能在 6 个月内被所有 T2I 系统采纳的根本原因:零迁移成本。

注意 2:CFG 的采样成本是 baseline 的 2 倍(每步两次前传),但因为 \(w\) 已经能让 50 步采样达到 1000 步的质量,整体 wall-clock 仍比 classifier guidance 快 ~10 倍(后者每步要前传 U-Net + 反传 classifier)。

注意 3\(w\) 是一个推理时超参——同一个训练好的网络可以在采样时任意切换 \(w \in [0, 15]\),让用户在"想要多 typical / 多 diverse"之间做实时滑动。这种 inference-time controllability 是 GAN 时代从未有过的奢侈。


失败案例

当时输给 CFG 的对手

CFG 的"对手 baseline"分两类:真实存在的旧引导方法(classifier guidance、truncation trick)和理论上的退化版本(无引导、纯无条件、纯条件 + reweight)。下面 5 个对手在 ImageNet 64×64 / 128×128 上系统输给 CFG:

  • Classifier Guidance [Dhariwal & Nichol, NeurIPS 2021] arxiv/2105.05233:CFG 的"前任"。在 ImageNet 64×64 上 best FID 2.07(带 classifier)vs CFG 2.43——FID 上略低 0.36,但 IS 仅 132 vs CFG 152。CFG 不是 FID 全面碾压,它赢的是工程:classifier guidance 需要训一个 noisy ImageNet 分类器(额外 ~3 TPU-day)+ 每步采样要前传 + 反传 classifier;CFG 完全不需要第二个网络,单网络两次前传。用 1.5× 推理成本换 0 训练成本 + 0 模型脚手架——没有任何 T2I 团队会拒绝这笔交易。
  • No Guidance / Pure Conditional [DDPM baseline]:直接用 \(\epsilon_c\) 不做任何外推,相当于 \(w=0\)。FID 2.43 看似不错,但 IS 仅 50.7——样本"多样但平庸",没有任何"典型该类样本"的视觉吸引力。GAN 时代的 BigGAN unconditional FID 7.4,但 IS 高达 165——证明 fidelity 必须靠某种 truncation/guidance 才能拉起来。
  • Pure Unconditional + Classifier Reweight:训一个无条件 DDPM,采样后用分类器 logit 选 top-\(k\) 样本。这是工业界曾经的"穷人版 guidance"。问题:采样成本指数级(要采 100 张才能选到 1 张该类)+ 选出来的样本依然"无条件分布的样本,只是被分类器筛过"——多样性低于真实条件分布。
  • Truncation trick (BigGAN) [Brock et al. 2019]:GAN 时代的 fidelity-diversity 旋钮——把潜变量 \(z\) 截断在 \(|z| < \tau\) 内,\(\tau\) 越小越 typical。但无原理推广到扩散模型——score 模型没有显式的 latent prior 可以截。CFG 本质上是扩散版的 truncation trick,但有清晰的贝叶斯解释:\(p^{1+w}\) 放大类后验。
  • Direct Logit Scaling:在 classifier guidance 公式中只放大 classifier 项的权重 \(w\),对应训一个分类器再无脑放大梯度。FID/IS 曲线比 CFG 差一档:因为分类器在 noisy \(x_t\) 上本身不准,放大不准的梯度只能增加扭曲。CFG 用两个 score 之差自动构造出"隐式分类器梯度",避开了这个 noisy classifier 的死结。

论文里承认的失败实验

CFG 论文 §3.2 + §4 给出了 3 组关键消融,每组都暗暗承认"CFG 不是免费午餐":

消融 1:\(p_{\text{uncond}}\) 的甜蜜区窄到只有一个数量级(论文 Table 3)

\(p_{\text{uncond}}\) ImageNet 64 FID @ best \(w\) 说明
0.05 2.84 unconditional 分支训练量不足,ε_u 偏
0.1 2.43 论文最优
0.2 2.51 略掉点,但 GLIDE 选了这档(更稳的 ε_u)
0.5 3.12 条件分支被牺牲过多

作者承认\(p_{\text{uncond}}\) 不能太低(ε_u 失训)也不能太高(ε_c 失训),最优值 0.1 是 grid search 出来的——没有理论指导。后续 Imagen / SD 发现 0.1 在文本条件下也基本最优,但具体最优值依条件类型(class vs text)和 dataset 规模(ImageNet vs LAION)漂移 ±0.05。

消融 2:\(w\) 越大 FID 越差(论文 Figure 2 + Table 1)

\(w\) ImageNet 64 FID IS FID/IS Pareto
0 2.43 50.7 FID 顶点
0.1 2.43 73.9 tie
0.5 3.4 110 trade-off 起点
1.0 5.7 130
2.0 12.5 145 FID 已 5× 恶化
4.0 28.6 152 IS 顶点 / FID 崩溃

作者承认:CFG 是个"取舍器"而不是"提升器"——FID 和 IS 不能同时拿满。论文 §4 直接承认:"classifier-free guidance has the same fundamental limitation as classifier guidance: it can only trade fidelity for diversity, not improve both"。这条 limitation 后来催生了 [Karras et al. 2024 (Auto-guidance)] 等"小模型 ε_u + 大模型 ε_c"的修补工作。

消融 3:高 \(w\) 下样本饱和度异常(论文 Figure 5)

论文 Figure 5 给出 ImageNet 128×128 上 \(w=4\) 时的"饱和度爆表"现象——颜色异常鲜艳、对比度爆炸。论文未能解决,只是承认问题存在。半年后 Imagen (Saharia et al. 2022) 引入 dynamic thresholding 把每步预测的 \(\hat x_0\) clamp 到分位数内,部分修复——这是 CFG 论文留下的最大"工程债"。

2022 年的反例(如果有)

论文 §5 自承的失败场景:CFG 在训练数据本身就具有强类间相关性的数据集(如 ImageNet)上效果好,但在类别极度不平衡 / 长尾的数据集上 ε_u 会被高频类别污染——少数类的 guidance 几乎不起作用。论文用 ImageNet 64×64 的"罕见类"(如 "tench" / "stingray")做了一组失败展示:\(w=4\) 下生成的"罕见类样本"仍然偏 "金毛犬 / 跑车"(ImageNet 高频类)。这个失败后来成为 [Long-tail diffusion (Qin et al. 2023)] 的研究起点

另一组失败:在分布外 (OOD) 条件上 CFG 的 ε_u 失效。如果训练时只见过 1000 类 ImageNet,采样时给一个完全没见过的类别 token,\(\epsilon_c \approx \epsilon_u\)(网络不认识),CFG 退化为无引导采样——没有 guidance 能"无中生有"。这条限制在 T2I 上表现为:模型不会画训练集没见过的概念,再大的 \(w\) 也补不出来。

真正的"反 baseline"教训

Classifier Guidance 比 CFG 早 1 年发表,思想几乎一致——为什么 CFG 胜出?

两者都是"从 \(p(x)\)\(p(x \mid c)^{1+w} \cdot p(x)^{-w}\)"的贝叶斯放大,唯一区别是"梯度从哪里来":

维度 Classifier Guidance CFG
梯度来源 外训分类器 \(\nabla_x \log p_\phi(c \mid x_t)\) 两个 score 之差 \(\epsilon_c - \epsilon_u\)
训练成本 DDPM + 1 个 noisy classifier (~3 TPU-day extra) 仅 DDPM(\(p_{\text{uncond}}\) dropout)
推理成本 U-Net forward + classifier forward + classifier backward U-Net forward × 2
文本/连续条件支持 ❌(无法训文本分类器) ✅(null token 通用)
ImageNet 64 best FID 2.07 2.43
工业采纳 仅 ADM 内部使用 Imagen / SD / DALL·E 2 / GLIDE 全采用

CFG 在纯 FID 上输 0.36 但赢得了整个 T2I 时代——因为它把 guidance 从"外挂工程"变成"训练内嵌的 dropout"。教训:当一个方法在 benchmark 上略胜但在工程上重 10×,它一定输给那个 benchmark 略弱但工程零成本的对手。这是 ResNet 选 B 不选 C、DDPM 不学 \(\Sigma_\theta\) 的同款工程哲学:简单 + 可组合 + 零迁移成本,长期一定赢

第二条教训:"原创性"不等于"价值"。CFG 论文只有 8 页(workshop),数学几乎是 classifier guidance 的"另一面"——某种意义上,CFG 是把别人的方法用更便宜的实现重写了一遍。但正是这次"重写"让扩散模型从学术 prototype 变成可工业化部署的基础设施。会议论文界对"原创性"的执着,反而让 CFG 这种工程价值碾压 NeurIPS Best Paper 的 trick 只能屈居 workshop——这是 NeurIPS 评审制度自身的失败案例。


实验关键数据

主实验:ImageNet 64×64 class-conditional

方法 引导类型 best FID ↓ best IS ↑ sampling cost / step
BigGAN-deep truncation \(\tau=0.5\) 6.95 124.5 1× G forward
ADM (Dhariwal 2021) none 2.07 1× U-Net
ADM + Classifier Guidance classifier 2.07 132.4 1× U-Net + classifier f/b
DDPM + CFG (paper Table 1) classifier-free 2.43 152 2× U-Net
Pure conditional DDPM (w=0) none 2.43 50.7 1× U-Net

关键发现:CFG 的 IS 比 classifier guidance 高 +15%(132 → 152)——意味着样本"更典型"。在 ImageNet 这种类别区分明确的数据集上,IS 反映的"类别可识别性"比 FID 更接近人类感知。CFG 用更便宜的方法换来了更高的 perceptual fidelity——这是它能统治 T2I 的真正原因。

主实验:ImageNet 128×128 class-conditional

方法 best FID ↓ best IS ↑
BigGAN-deep + truncation 5.92 173
ADM (Dhariwal 2021) 5.91 93
ADM + Classifier Guidance 2.97 141
DDPM + CFG (paper Table 2) 2.97 156

128×128 上 CFG 的 FID 与 classifier guidance 完全持平 (2.97),但 IS 显著更高 (+15)。两者在 fidelity 上拉开差距,CFG 全面胜出。

消融:CFG 的所有超参

配置 (ImageNet 64) best FID best IS 关键发现
Full CFG (\(p_{\text{uncond}}=0.1\), w 扫描) 2.43 152 baseline
\(p_{\text{uncond}} = 0.05\) 2.84 140 ε_u 失训
\(p_{\text{uncond}} = 0.5\) 3.12 145 ε_c 失训
只调 \(w\),固定不学 ε_u(即 ε_u 用纯随机噪声替代) 跑不出 证明 ε_u 必须真训
\(w \in [-1, 0]\)引导) FID 反向劣化 IS 反向 证明外推方向必须正
\(w = 100\) 极端 NaN NaN 数值发散
用 interpolation \(\lambda \epsilon_c + (1-\lambda) \epsilon_u\) FID/IS 曲线劣 CFG ~1.5× 证明外推 > 插值

关键发现

  • \(w=0\) 退化:CFG 在 \(w=0\) 时严格等价于无引导条件采样——验证了"CFG 是在 baseline DDPM 上的 inference-time 增强"
  • fidelity-diversity 是不可调和的:FID 和 IS 在 \(w\) 上是单调反向的——这是 CFG 的根本 limitation,所有后续工作都在试图打破
  • 2× 采样成本是好交易:CFG 的 2× cost 完全抵消了 classifier guidance 的额外训练 + 维护开销,总 wall-clock 反而 10× 更快
  • null token 训练 10% 已足够:超过 0.2 反而劣化条件 FID——意味着 ε_u 是个"低成本副产品",不需要为它牺牲太多条件训练量
  • 跨条件类型通用:CFG 论文只验证了 class label,但 6 个月内被验证可推广到文本(Imagen / GLIDE)、CLIP 嵌入(DALL·E 2)、深度图(ControlNet)、骨架(OpenPose)等任意条件——这是 CFG 真正的 killer feature
  • 隐含 truncation trick 等价:CFG 的 \(w\) 在 GAN 视角下等价于 BigGAN 的 truncation parameter \(\tau\),但CFG 是建立在 score function 上的、可推广到任何条件分布的、无需 latent prior 的版本——更通用、更优雅

思想史脉络

graph LR
  SD15[Sohl-Dickstein 2015<br/>diffusion math] -.diffusion chain.-> DDPM
  SCORE05[Hyvarinen 2005<br/>score matching] -.score view.-> NCSN
  NCSN[NCSN 2019<br/>Song and Ermon] -.score parameterization.-> DDPM
  DDPM[DDPM 2020<br/>epsilon prediction] -.training recipe.-> CFG
  SDE[Score SDE 2021<br/>Song] -.unifies score.-> CFG
  CG[Classifier Guidance 2021<br/>Dhariwal Nichol] -.bayes posterior tilt.-> CFG
  BIGGAN[BigGAN 2019<br/>truncation trick] -.fidelity-diversity dial.-> CFG
  TX[Transformer 2017<br/>cross-attention] -.condition injection.-> CFG

  CFG[CFG 2022<br/>Ho Salimans<br/>jointly trained eps_c eps_u]

  CFG --> GLIDE[GLIDE 2022<br/>OpenAI text-to-image]
  CFG --> IMAGEN[Imagen 2022<br/>T5 plus cascaded diffusion]
  CFG --> DALLE2[DALL-E 2 2022<br/>CLIP prior plus decoder]
  CFG --> SD[Stable Diffusion 2022<br/>latent diffusion]
  CFG --> CONTROLNET[ControlNet 2023<br/>spatial conditioning]
  CFG --> DIT[DiT 2023<br/>diffusion transformer]
  CFG --> SDXL[SDXL 2023<br/>refiner plus dual-stage]
  CFG --> SORA[Sora 2024<br/>video diffusion]
  CFG --> SD3[Stable Diffusion 3 2024<br/>MMDiT plus rectified flow]
  CFG --> AUTOG[Auto-guidance 2024<br/>Karras small eps_u]
  CFG --> CADS[CADS 2024<br/>condition annealing]
  CFG --> APG[APG 2024<br/>adaptive projected guidance]

前世(被谁逼出来的)

  • 2015 Sohl-Dickstein "Nonequilibrium Thermodynamics" [arXiv 1503.03585]:扩散模型的祖父论文,定义了 forward/reverse Markov 链。CFG 的"线性外推 score"操作完全建立在这条链上——没有 DDPM 的 score-based 反向过程,CFG 没有可外推的对象。
  • 2005 Score Matching [Hyvärinen, JMLR]:从分布 \(p_\theta\)\(\nabla_x \log p_\theta(x)\)(score)的统计学方法。CFG 的贝叶斯解释 \(p_w(x \mid c) \propto p(x) \cdot p(c \mid x)^{1+w}\) 必须在 score 空间才成立——直接在 PDF 空间上做这种放大是 intractable 的。
  • 2020 DDPM [Ho, Jain, Abbeel, NeurIPS]:本文一作 Ho 的前作,证明 \(\epsilon\)-prediction + \(L_{\text{simple}}\) 是稳定训练扩散的关键。CFG 把"一个 ε 模型"扩展为"通过 null token 共享同一组权重的两个 ε 视图",前提是 DDPM 的训练流程已经稳如磐石。
  • 2021 Score SDE [Song et al., ICLR Outstanding Paper]:用连续时间 SDE 把 DDPM 与 NCSN 统一在 \(\mathrm{d}x = f(x,t)\mathrm{d}t + g(t)\mathrm{d}w\) 下,证明 \(\epsilon_\theta = -\sigma_t \nabla \log p\)。这是 CFG 把"两个 ε 之差"翻译成"两个 score 之差"再翻译成"贝叶斯指数项"的数学桥梁。
  • 2021 Classifier Guidance [Dhariwal & Nichol, NeurIPS]:CFG 的直系父辈。给出 \(\nabla \log p(x_t \mid c) = \nabla \log p(x_t) + w \nabla \log p_\phi(c \mid x_t)\) 的扩展公式,CFG 只是把第二项的"分类器"替换成"两个生成模型之差"——理论翻新很小,工程颠覆很大
  • 2019 BigGAN truncation trick [Brock et al., ICLR]:GAN 时代的 fidelity-diversity 旋钮。CFG 的 \(w\) 在精神上是它在扩散空间的对应物——但 CFG 有清晰的贝叶斯推导,truncation trick 只是经验启发式。

今生(继承者)

直接派生(2022)—— T2I 元年的全部主力

CFG 在 2022 年被 4 个大型 T2I 系统几乎同时采纳,它的论文还没在 arXiv 上传,工业界已经在用了

  • GLIDE [Nichol et al., ICML 2022]:OpenAI 在 CFG 论文之前就在用 CFG(论文里把它归功于 Ho & Salimans 的 workshop 版本),text-conditional 设置下 \(w=3\),COCO 0-shot FID 12.24。CFG 的第一个实战验证
  • Imagen [Saharia et al., NeurIPS 2022]:Google 自家 T2I,T5-XXL + cascaded DDPM,CFG \(w=7\sim15\)。论文同时引入 dynamic thresholding 修补 CFG 高 \(w\) 的饱和问题。
  • DALL·E 2 [Ramesh et al., OpenAI 2022]:CLIP image embedding + diffusion decoder,prior 和 decoder 两阶段都用 CFG。
  • Stable Diffusion (LDM) [Rombach et al., CVPR 2022]:LMU/Runway 的 latent diffusion,CFG \(w=7.5\) 是开源后的事实默认值——整个 ComfyUI / Automatic1111 / SDWebUI 生态里 "CFG Scale" 滑块就是这个 \(w\)

跨架构借用(2022-2024)

  • DiT (Diffusion Transformer) [Peebles & Xie, ICCV 2023]:把 U-Net 换成 ViT,CFG 的实现完全不变(只是改 backbone 的内部)。这证明 CFG 与 backbone 解耦——任何能 take "条件 token" 的扩散模型都自动支持 CFG
  • Sora [OpenAI 2024]:视频扩散,CFG 用于"text → video" 条件控制,\(w \sim 7\),是文本-视频对齐的核心机制。
  • Stable Diffusion 3 / MMDiT [Esser et al. 2024]:把 CFG 与 rectified flow 结合,\(w\) 在 RF 框架下重新校准(更小区间),证明 CFG 对采样路径形式(SDE / ODE / RF)也是不变的。

跨任务渗透(2023+)

  • ControlNet [Zhang et al., ICCV 2023]:CFG 推广到深度图、骨架、边缘等空间条件——"双 CFG" 公式 \(\tilde\epsilon = \epsilon_u + w_t (\epsilon_t - \epsilon_u) + w_c (\epsilon_{t,c} - \epsilon_t)\) 同时调控文本和空间条件强度,继承了 CFG 的"线性外推" 范式但扩展到多条件
  • Diffusion Policy [Chi et al., RSS 2023]:CFG 用于机器人动作生成的目标条件(如"把红色 block 放到蓝色 box 上"),\(w \sim 1\)
  • AlphaFold 3 (扩散版) [Abramson et al., Nature 2024]:分子结构生成,蛋白序列 + 配体结构作为多重条件,CFG 用于把生成拉向"功能正确"的高密度区。

跨学科外溢

  • Diffusion-based PDE solvers(如 PDE-Refiner, 2023):把 CFG 思想用于物理仿真——"低分辨率边界条件 = 弱条件"vs "高分辨率边界 = 强条件",外推得到精修结果。但这条线尚未进入主流,仅有零星探索。
  • AI4Science 中蛋白结构生成:RFdiffusion / Chroma 等用 CFG 让生成偏向"目标功能位点",证明扩散范式在生物物理领域同样有效。

误读 / 简化

  • "CFG 越大越好":很多新手把 SD WebUI 的 CFG slider 拉到 20 期望"更准",结果得到一张过饱和、伪影满天飞的图。\(w\) 是 fidelity-diversity 旋钮不是质量旋钮——SD 默认 7.5 已经是经验最佳,超过 12 几乎一定崩。这条误解直接催生了 [Karras et al. 2024 Auto-guidance] 等"小模型 ε_u"修补工作。
  • "CFG 是数学定律 / 唯一解":CFG 只是众多引导方式之一。后续工作给出大量改进版:APG (adaptive projected guidance)、CADS (condition annealing)、Auto-guidance(用小模型替代 ε_u)、CFG++(重写采样 SDE)。CFG 是一个范式而不是终极公式
  • "CFG 等价于 classifier guidance 的实现 trick":CFG 的贝叶斯解释虽然形似,但两者在样本分布上不严格等价——CFG 隐式地从 \(p(x)\cdot p(c\mid x)^{1+w}\) 采样,但这个 \(p(c\mid x)\) 不是任何真实分类器后验,而是网络两个分支的隐式建模。Sander Dieleman 和 Karras 等人 2023 后多次撰文澄清这一点。
  • "CFG 必须 2× 推理成本":实际上有多种省钱方案——batch 维度复用(把 (x, c) 和 (x, ∅) 拼成一个 batch 一次前传)、Auto-guidance 用小模型做 ε_u(成本仅 1.1×)、CFG++ 把外推融进采样器一步完成。2× 是 naive 实现,不是理论下限

当代视角

站不住的假设

  • "\(w\) 越大 fidelity 越高,是单调有益的旋钮":CFG 论文的实验给人留下"\(w \in [1, 4]\) 都能继续提 IS"的印象,工业界曾普遍把 SD 的 \(w\) 拉到 10+。今天看完全错:[Karras et al. 2024 Auto-guidance] 系统证明大 \(w\) 不仅过饱和,而且会把样本拉出训练分布的支持域 (mode collapse onto over-typical samples)。SDXL 默认 \(w=7\)、Imagen 用动态 \(w\) 调度、Flux 用 \(w=3.5\)——整个产业在 2023-2024 年悄悄把默认 \(w\) 从 7.5 降到 3-5 区间
  • "\(\varnothing\) 是网络真学到的'无条件分布'":CFG 论文暗示 ε_θ(x, ∅) 学到的是边际分布 \(p(x)\)今天的研究表明它学的远不是真正的边际——它是"我看到 null token 时该输出什么"的特定函数,受训练数据的条件分布偏差强烈污染。Karras 2024 提出"用一个独立的小型 unconditional 模型"做 ε_u,FID 反而比 CFG 自己的 ε_u 更好——证明 CFG 的 ε_u 是个"凑合的边际近似",远非最优。
  • "CFG 与采样器解耦":CFG 在 DDPM、DDIM、PNDM、DPM-Solver 等所有采样器上"看起来" work,但 [CFG++ (Chung et al. 2024)] 发现 CFG 的线性外推与 ODE 采样器的 Tweedie 公式有微妙的 mismatch——把 CFG 重写成一个新的 SDE 修正项后,少步采样质量大幅提升。CFG 与采样器之间不是真正解耦的,只是耦合较弱
  • "贝叶斯式 \(p \cdot p(c\mid x)^{1+w}\) 是 CFG 的 ground truth":这个推导假设 ε_c 和 ε_u 都是各自分布的精确 score。但两者其实来自同一个有限容量的网络,所以 \(\epsilon_c - \epsilon_u\) 不严格等于 \(\nabla \log p(c \mid x)\)——它是个隐式的、存在偏差的近似。Dieleman 2023 博客《Diffusion is spectral autoregression》以及多篇后续论文都指出,CFG 的"贝叶斯解释"是事后讲故事,不是因果机制。

时代证明的关键 vs 冗余

  • 关键
    • 联合训练条件 + 无条件分支 —— null token + 10% dropout 这一套是所有现代扩散模型的标配
    • score 线性外推 —— \(\tilde\epsilon = (1+w)\epsilon_c - w\epsilon_u\) 这条公式 4 年后仍然是 SDXL / Flux / SD3 的采样默认
    • fidelity-diversity trade-off 旋钮 —— 给用户一个推理时可调的"风格滑块",UI/UX 价值极高
  • 冗余 / 误导
    • \(p_{\text{uncond}} = 0.1\) 不是普世最优 —— 文本条件、长 prompt、高分辨率上最优值会漂到 0.05-0.2
    • \(w\) 取值 [1, 4] 这个范围 —— SDXL/Flux 实际默认 3-7.5,超过 10 几乎不再使用
    • "必须 2× 推理" —— 已被 batch 复用、auto-guidance、CFG distillation 等多种方式打破

作者当时没想到的副作用

  1. CFG 成了 T2I UX 的核心交互旋钮:Stable Diffusion WebUI 里"CFG Scale" 滑块是用户最常调的参数,比 sampling steps、scheduler、prompt 都频繁。Ho & Salimans 2021 写论文时没想到这个学术 trick 会变成消费级产品的一颗按键——这种"算法变成 UI 元素"的现象在 AI 史上极少见(GAN 的 truncation、LLM 的 temperature 是少数同类)。
  2. CFG distillation 让"1 步生成"成为可能:[Meng et al. 2023 (Guided Distillation)]、[LCM (2023)]、[InstaFlow (2023)]、[SD Turbo (2023)] 等工作把 CFG 的 2× 推理成本"蒸馏"进单网络,让 1-4 步采样成为可能。没有 CFG 就没有今天的实时 T2I——SDXL Lightning / Flux Schnell 全都是 CFG-distilled。
  3. CFG 把"prompt engineering" 变成一门学问:因为 \(w\) 放大条件信号,prompt 的措辞细节被 CFG 几何级放大。"trending on artstation, 4k, masterpiece" 这种 SD prompt 套路本质上是被 CFG 训练出来的人类适应行为——用户学会了用 prompt + \(w\) 联合调控。这种"人 + AI 共同适应"的工程现象,CFG 论文 2021 年完全无法预测。

如果今天重写

如果 Ho & Salimans 在 2026 年重写 CFG,他们大概率会改下面 5 处:

  • 加 dynamic \(w\) scheduling:把 \(w\) 从常数改成 \(w(t)\) 函数——早期高噪声步用大 \(w\) 抓主体,晚期低噪声步用小 \(w\) 保细节。Imagen 已部分实现,CADS / APG 等后续工作完善。
  • 替换 ε_u 来源:用一个独立的小 unconditional 模型(Auto-guidance 范式),FID 和 fidelity 同时提升,且训练成本可控。
  • 把外推公式改成 manifold-aware 版本:用 APG 的 projected guidance 投影到样本流形切空间,避免 over-saturation。
  • 针对 rectified flow / flow matching 重新校准:SD3 已经验证 CFG 在 RF 上需要更小的 \(w\) 区间(2-5 而非 5-15),公式形式略有调整。
  • 加入 CFG distillation 选项:直接训练时让 ε_θ 同时学"已 guidance 的 score",省掉 2× 推理。

不会变的核心: - "用一个网络通过条件 dropout 同时学条件 + 边际" 这条工程哲学——它是 multi-task learning 在生成模型领域最优雅的一次实践 - "在 score 空间做线性外推 = 在 PDF 空间做指数放大" 这条贝叶斯桥梁——任何 score-based 生成模型都绕不开它 - "用户能在推理时滑动 fidelity-diversity" 这个 UX——一旦给了用户这个旋钮,再也回不去了

CFG 像 ResNet 的残差连接一样,已经从"一篇论文的方法"变成"一条物理常数"——你可以重写它的实现细节、给它新名字、用更复杂的数学包装,但它的核心思想已成为该领域的下意识动作


局限与展望

作者承认的局限

  • fidelity-diversity 不可同时优化:CFG 论文 §4 直接承认"can only trade fidelity for diversity, not improve both"。这是 CFG 的根本理论 limitation,催生了 4 年的"非 CFG 引导"研究浪潮(Auto-guidance、APG、CADS、CFG++)。
  • \(w\) 下样本饱和:论文 Figure 5 展示但未解决,留给 Imagen 的 dynamic thresholding 和后续工作修补。
  • \(p_{\text{uncond}}\) 必须 grid search:没有理论指导最优值,仅靠经验。

自己发现的局限(站在 2026 年视角)

  • OOD 条件失效:训练时未见过的条件 token 上 ε_c ≈ ε_u,CFG 退化为无引导。这是 T2I 模型"画不出训练集没见过的概念"的根本原因。
  • 多模态 / 多条件耦合不优雅:ControlNet 双 CFG 公式工作但显式分解成 text 部分 + spatial 部分,并不是数学上的最优——两个 \(w\) 之间的相互作用至今没有清晰理论。
  • 少步采样劣化:在 4-8 步的快速采样器(LCM, Turbo)下,2× CFG 推理成本变成显著负担,需要额外的 distillation step。
  • 理论 vs 实证的 gap:贝叶斯解释只在"网络容量无限"假设下成立,实际网络下 \(\epsilon_c - \epsilon_u\) 是个"经验上 work 的近似"——这种"理论后置 + 实证驱动"的现象在深度学习里常见但不优雅。
  • Memory footprint 翻倍:在 batch reuse 实现下,每步 batch 大小 ×2,对显存敏感的部署不友好。

改进方向(已被后续工作证实)

  • Dynamic guidance scheduling:CADS (Sadat et al. 2024)、APG (Sadat 2024)、\(w(t)\) 调度——已成为 SD3 / Flux 默认配置
  • Auto-guidance 用小模型做 ε_u:[Karras et al. 2024],FID 全面优于自 CFG,且推理成本仅 1.1×
  • CFG distillation:Meng et al. 2023, SD-Turbo, LCM-LoRA, Flux Schnell——把 2× 推理蒸成 1×
  • CFG++:Chung et al. 2024,把 CFG 重写为 SDE 修正项,少步采样质量大幅提升
  • Multi-condition 引导:ControlNet, T2I-Adapter 把 CFG 拓展到任意条件组合

相关工作与启发

  • vs Classifier Guidance [Dhariwal & Nichol 2021]:他们外训 noisy classifier 给梯度,本文用同一个网络两个分支的差代替。区别是工程:CFG 0 训练成本,分类器需要重训。本文优势是通用性(支持任意条件类型)和工程简洁;劣势是 ImageNet 64 best FID 略低 0.36。教训:在 benchmark 上略输但在工程上大胜的方法,长期一定赢
  • vs BigGAN truncation trick [Brock et al. 2019]:BigGAN 截断潜变量 \(z\),本文外推 score。区别是 GAN 范式 vs diffusion 范式——CFG 不需要 latent prior,能在任何 score-based 模型上工作。教训:把 GAN 时代的 fidelity-diversity dial 抽象成 score 空间的操作,立刻获得范式无关的通用性
  • vs CLIP guidance / latent-space guidance [Crowson 2021, Liu et al. 2022]:用 CLIP 的图文相似度梯度引导扩散。本文用模型自身的 ε_c-ε_u 差。区别是 CLIP guidance 引入第三方网络,CFG 完全自包含。教训:能用模型自己的内部信号代替外挂模型时,永远选自包含的方案
  • vs Auto-guidance [Karras et al. 2024]:用一个小 unconditional 模型做 ε_u 替代 CFG 的同模型 ε_u,FID 全面更好。这是 CFG 自己的"继承者反超"——证明 CFG 的"用同一网络做两个分支"虽然方便但不是最优解。教训:让 ε_u 与 ε_c 解耦(甚至用不同模型)能解开 CFG 的 fidelity-diversity 死结
  • vs Rectified Flow / Flow Matching [Liu 2023, Lipman 2023]:替代 SDE 形式的扩散,CFG 在 RF 上仍然适用但 \(w\) 区间不同(更小)。教训:CFG 是个范式无关的 inference-time 修正,对底层生成路径形式(SDE / ODE / RF)几乎免疫——这种范式无关性是好的工程方法的标志。

相关资源


🌐 English version · 📚 awesome-papers project · CC-BY-NC