无分类器引导
扩散模型的条件生成需要将采样过程引向目标条件(文本、类别、说话人身份),但早期方法依赖额外训练的分类器,无分类器引导(CFG)通过一个极简的训练技巧彻底消除了这一依赖,成为现代生成式 AI 的基石技术。
Sohl-Dickstein 等人(2015)提出扩散概率模型时,条件生成能力极为有限。同期 GAN 通过条件拼接(Conditional GAN, Mirza & Osindero 2014)实现可控生成,但扩散模型的迭代去噪过程缺乏自然的条件注入点。2020 年 Ho 等人的 DDPM 复兴了扩散模型,在无条件图像生成上取得突破,但如何让模型"听从指令"仍是核心短板。将条件信息简单拼接到输入或通过交叉注意力注入,虽然可行,但生成结果对条件的遵循度(fidelity)远不及 GAN。
Dhariwal 与 Nichol 在里程碑论文 "Diffusion Models Beat GANs on Image Synthesis"(NeurIPS 2021)中提出分类器引导(Classifier Guidance):在各噪声水平的数据上训练一个独立分类器 $p_\phi(c|x_t)$,利用其梯度 $\nabla_{x_t}\log p_\phi(c|x_t)$ 在每步去噪时将采样推向目标类别。这一方法首次让扩散模型在 ImageNet 上全面超越 BigGAN,证明了"引导"思路的巨大潜力。但代价显而易见:需要额外训练一个在所有噪声水平上都有效的分类器,训练成本高;且分类器只能处理离散类别标签,难以扩展到自由文本等复杂条件。
Ho 与 Salimans 在 "Classifier-Free Diffusion Guidance"(首发于 NeurIPS 2021 Workshop,正式发表于 2022)中提出了一个优雅到令人惊叹的替代方案:训练时以概率 $p_{uncond}$(通常 10%-20%)随机将条件替换为空标记 $\varnothing$,使同一个模型同时学会条件预测 $\epsilon_\theta(x_t, c)$ 和无条件预测 $\epsilon_\theta(x_t, \varnothing)$;推理时,通过线性外推两者之差来放大条件信号。无需额外分类器,无需修改模型架构,仅需改动数据加载逻辑和采样公式。这一方法迅速被 DALL·E 2(OpenAI, 2022)、Imagen(Google, 2022)、Stable Diffusion(Stability AI, 2022)全面采纳,成为条件扩散模型的标准配置。
CFG 从图像生成扩展到视频(Make-A-Video、Sora)、音频(AudioLDM、MusicGen)、语音合成(VoiceBox、VALL-E、F5-TTS)和 3D 生成(DreamFusion 中的 SDS 损失本质上依赖 CFG)。实践中发现引导尺度 $w$ 需要精细调节,催生了动态引导调度和负提示(Negative Prompting)等实用改进。
随着流匹配取代传统扩散成为主流范式,CFG 被自然移植但行为出现微妙差异。论文 [30] 提出联合残差重加权(Joint Residual Reweighting),针对流匹配 TTS 中文本条件与说话人条件的不同引导需求分别调控,解决了多条件场景中单一 $w$ 无法兼顾的问题。
扩散模型条件生成的核心是得分函数。贝叶斯定理给出分解:$\nabla_{x_t}\log p(x_t|c) = \nabla_{x_t}\log p(x_t) + \nabla_{x_t}\log p(c|x_t)$,其中 $x_t$ 是第 $t$ 步噪声样本,$c$ 是条件。右侧第二项是隐式分类器梯度。分类器引导直接用外部分类器估计该项。CFG 的关键洞察是将其改写为两个模型已知量之差:$\nabla_{x_t}\log p(c|x_t) = \nabla_{x_t}\log p(x_t|c) - \nabla_{x_t}\log p(x_t)$。代入并引入引导尺度 $w$,得到核心公式:$$\tilde{\epsilon}_\theta(x_t, c) = \epsilon_\theta(x_t, \varnothing) + w \cdot \big[\epsilon_\theta(x_t, c) - \epsilon_\theta(x_t, \varnothing)\big]$$ 其中 $\epsilon_\theta(x_t, c)$ 是条件噪声预测,$\epsilon_\theta(x_t, \varnothing)$ 是无条件预测(训练时条件被替换为空标记),$w$ 是引导尺度。当 $w=1$ 退化为标准条件生成;$w>1$ 放大条件信号。从分布角度,这等价于采样自修改后的分布 $\tilde{p}(x|c) \propto p(x)^{1-w} \cdot p(x|c)^w$,即对条件后验做指数加权——分布变得更尖锐,集中在高条件似然区域,牺牲多样性换取保真度。负提示将 $\varnothing$ 替换为负面条件 $c_{neg}$:$\tilde{\epsilon} = \epsilon_\theta(x_t, c_{neg}) + w \cdot [\epsilon_\theta(x_t, c) - \epsilon_\theta(x_t, c_{neg})]$,直观含义是"远离负面、靠近正面"。多条件场景的一般形式为 $\tilde{\epsilon} = \epsilon_\varnothing + \sum_i w_i(\epsilon_{c_i} - \epsilon_\varnothing)$,各条件可独立控制引导强度。
通过训练时的条件随机丢弃让单一模型内化两种生成模式,推理时利用两者的差异向量作为隐式引导信号,控制生成的条件遵循程度。
①做什么:在标准条件扩散/流匹配模型训练中,以概率 $p_{uncond}$(通常 0.1-0.2)将条件 $c$ 替换为空标记 $\varnothing$(全零向量或特殊 token)。模型在同一训练过程中同时优化条件预测和无条件预测。②为什么这样设计:这是 CFG 最精妙之处——避免了训练两个独立模型或额外分类器。当条件被丢弃时,模型被迫仅依赖数据边际分布预测,自然学会了无条件生成。$p_{uncond}$ 是关键超参数:过高(如 0.5)会严重削弱条件学习能力,过低(如 0.01)则无条件预测质量差,引导效果不佳。③关键细节:对于文本条件,$\varnothing$ 通常是空字符串经文本编码器后的嵌入向量;对于多条件输入(文本+图像+说话人),可独立丢弃各条件,产生 $2^n$ 种组合,但训练成本随条件数指数增长,实践中常只丢弃全部或不丢弃。
①做什么:推理时每个去噪步执行两次前向传播——一次输入真实条件 $c$,一次输入空标记 $\varnothing$——分别得到 $\epsilon_\theta(x_t, c)$ 和 $\epsilon_\theta(x_t, \varnothing)$。②为什么这样设计:这是 CFG 的主要计算代价——推理 FLOPs 翻倍。但相比训练额外分类器的方案,这是训练简单、推理略贵的优雅权衡。③关键细节:实践中将条件和无条件输入在 batch 维度拼接,一次前向得到两个输出再拆分。在 GPU 上,当模型受显存带宽而非算力限制时(大模型常见情况),batch 合并几乎不增加