Classifier-free guidance 和Classifier Guidance

发布时间:2026/7/8 4:12:55
Classifier-free guidance 和Classifier Guidance CFGCFG 在生成阶段 classifier-free guidanc, Inference/Sampling生效。它的效果是提高生成内容与条件如文本提示词的一致性。具体表现假设你输入提示词“一只穿着宇航服的猫” (A cat in a spacesuit)。如果不使用 CFG (或 CFG Scale 0)模型只看图像本身的概率分布。它可能会生成一只很可爱的猫但可能没有穿宇航服或者宇航服穿得很奇怪。图像看起来自然、柔和但可能偏离提示词。如果使用权重较大的 CFG (例如 CFG Scale 7-15)模型会强行将生成路径拉向“宇航服猫”的方向。图像中会清晰地出现宇航服、猫、甚至可能还有星球背景。效果增强提示词的各个要素猫、宇航服被更紧密地组合在一起。如果 CFG 过高 (例如 20)负面效果图像可能出现伪影Artifacts、色彩过饱和、结构扭曲例如猫有多个头或肢体融合。这是因为模型为了强行满足条件牺牲了图像的自然分布。既然 CFG 是推理时的技巧那么训练阶段需要做什么才能让模型在推理时能玩 CFG 呢答案是你需要在训练数据中随机“丢弃”条件。在训练扩散模型如 Stable Diffusion或流匹配模型时网络需要学习两件事给定条件ccc如何生成数据xxx (p(x∣c)p(x|c)p(x∣c))不给条件数据xxx长什么样 (p(x)p(x)p(x)即无条件分布)训练步骤如下准备数据你有一批数据每个样本包含图像xxx和对应的文本提示词ccc。前向传播训练循环中对于每一个 batch 的数据模型以一定的概率例如 10%-20%做以下两件事之一情况 A (80%-90% 概率)将文本提示词ccc输入到文本编码器中得到条件向量送入去噪网络。情况 B (10%-20% 概率)将文本提示词清空输入一个空字符串或特殊的 token如uncond得到一个“无条件”向量。计算损失模型同时接收这两种输入并预测噪声。损失函数Loss是将预测噪声与真实噪声做对比。对于情况 A模型学习p(x∣c)p(x|c)p(x∣c)。对于情况 B模型学习p(x)p(x)p(x)。结果训练结束后模型内部已经学会了两种模式当输入有文字时它知道怎么画具体的物体。当输入为空时它知道“一般情况”下的物体长什么样比如“一般的猫”长什么样。在推理阶段CFG 的公式是ϵguidedϵuncondw(ϵcond−ϵuncond) \epsilon_{guided} \epsilon_{uncond} w (\epsilon_{cond} - \epsilon_{uncond})ϵguided​ϵuncond​w(ϵcond​−ϵuncond​)ϵcond\epsilon_{cond}ϵcond​我们输入提示词“宇航服猫”模型输出基于条件的预测。ϵuncond\epsilon_{uncond}ϵuncond​我们输入“空提示词”模型输出无条件的预测。因为模型在训练时见过这两种情况所以它都能给出准确的预测。我们通过线性组合放大“条件”与“无条件”之间的差异从而强行把图像推向符合条件的方向。CG**分类器引导Classifier Guidance, CG**是扩散模型早期如 DALL-E 1 或早期 DDPM 论文中使用的一种主要技术用于让生成的图像符合特定的文本描述条件。CG需要训练两个独立的模型。1. 分类器引导的效果是什么核心效果通过外部信号强制图像符合特定类别或属性。高精度类别对齐CG 最初主要用于分类任务中的引导。例如如果你希望生成“猫”它会极大地提高生成结果中包含“猫”这一特征的概率。在早期的实验ว่า对于简单的类别引导如猫 vs. 狗CG 的效果往往比 CFG 更稳定、更锐利。计算开销巨大为了得到引导后的梯度你需要在每一步去噪过程中不仅运行去噪模型Score Model还要运行一个额外的分类器模型并计算梯度。这使得生成速度非常慢通常是 CFG 的一半或更慢因为每一步要做两次前向传播和一次反向传播。2. 怎么训练分类器引导要使用分类器引导你必须完成两个独立模型的训练。第一步训练去噪模型 (The Denoising Model / Score Model)目标学习从噪声中还原图像分布p(x)p(x)p(x)。输入带噪声的图像xtx_txt​。输出预测的噪声ϵθ(xt)\epsilon_\theta(x_t)ϵθ​(xt​)或分数∇xlog⁡p(xt)\nabla_x \log p(x_t)∇x​logp(xt​)。注意这个模型通常是无条件的或者在训练时不强制绑定标签。它的主要任务是掌握“什么样的像素分布构成一张好看的图片”。第二步训练分类器 (The Classifier)目标学习图像与标签之间的映射关系即学习p(y∣x)p(y|x)p(y∣x)给定图像xxx它属于类别yyy的概率。输入带噪声的图像xtx_txt​注意是在加噪过程中的图像而不是干净图像。输出类别概率分布例如80% 是猫20% 是狗。训练数据你需要大量的(x,y)(x, y)(x,y)对其中xxx是干净图像yyy是标签。关键点这个分类器是在**加噪过程Forward Process**中训练的这意味着它必须能够处理充满噪声的输入并依然能准确判断图像内容。训练完成后的推理采样过程在生成图像时假设我们要生成“猫”去噪模型预测首先让去噪模型预测当前步骤的去噪方向∇xlog⁡p(xt)\nabla_x \log p(x_t)∇x​logp(xt​)。分类器评估将当前带噪声的图像xtx_txt​输入分类器计算梯度∇xtlog⁡p(ycat∣xt)\nabla_{x_t} \log p(y\text{cat} | x_t)∇xt​​logp(ycat∣xt​)。组合引导将两个梯度结合。公式如下∇xtlog⁡p(ycat,xt)≈∇xtlog⁡p(xt)σ2∇xtlog⁡p(ycat∣xt) \nabla_{x_t} \log p(y\text{cat}, x_t) \approx \nabla_{x_t} \log p(x_t) \sigma^2 \nabla_{x_t} \log p(y\text{cat} | x_t)∇xt​​logp(ycat,xt​)≈∇xt​​logp(xt​)σ2∇xt​​logp(ycat∣xt​)∇xtlog⁡p(xt)\nabla_{x_t} \log p(x_t)∇xt​​logp(xt​)来自去噪模型保证图像自然。∇xtlog⁡p(ycat∣xt)\nabla_{x_t} \log p(y\text{cat} | x_t)∇xt​​logp(ycat∣xt​)来自分类器保证图像是猫。σ2\sigma^2σ2是引导强度系数。更新图像使用这个组合后的梯度来更新下一步的图像xt−1x_{t-1}xt−1​。在经典的分类器引导框架下你几乎无法直接输入“穿宇航服的猫”或者实现起来极其困难且效果很差。1. 为什么“穿宇航服的猫”对分类器引导是个难题分类器引导依赖于一个预训练的分类器。这个分类器通常是在一个特定的数据集上训练的比如 ImageNet。ImageNet 的标签体系ImageNet 中有“猫cat”这个类别也有“宇航服spacesuit”这个类别。但是ImageNet 中通常没有“穿宇航服的猫cat in a spacesuit”这个联合类别。场景模拟如果你想在采样时使用 CG 生成“穿宇航服的猫”你有以下几种尝试路径但都会失败或效果极差尝试 1只使用“猫”分类器结果模型会生成一只普通的猫。原因分类器只看到了“猫”它不知道宇航服的存在。它无法引导模型画出宇航服。尝试 2只使用“宇航服”分类器结果模型会生成一个宇航员或者一个穿着宇航服的人/机器人但不会有猫的特征。原因同理分类器只关注“宇航服”忽略了“猫”。尝试 3同时运行两个分类器“猫” “宇航服”并相加梯度逻辑Gradient∇log⁡p(cat∣x)∇log⁡p(spacesuit∣x)\text{Gradient} \nabla \log p(\text{cat}|x) \nabla \log p(\text{spacesuit}|x)Gradient∇logp(cat∣x)∇logp(spacesuit∣x)结果这可能会产生一些有趣但通常不连贯或语义冲突的结果。模型可能会生成一个穿着宇航服的猫这是你想要的。但也可能生成一个穿着宇航服的狗或者一只巨大的猫或者一个有着猫脸的宇航员。根本问题分类器是独立训练的。它不知道“猫”和“宇航服”在空间上是如何组合的。它只分别知道“什么东西像猫”和“什么东西像宇航服”。它缺乏对联合概率分布p(cat, spacesuit∣x)p(\text{cat, spacesuit}|x)p(cat, spacesuit∣x)的理解。尝试 4重新训练一个“穿宇航服的猫”专用分类器结果理论上可行但工程上不可行。原因语义组合是无限的。你想要“穿宇航服的猫”。明天你可能想要“戴眼镜的猫”。后天你想要“在月球上的猫”。你不可能为每一个可能的形容词名词组合都训练一个新的分类器。这需要无限的数据和无限的训练时间。2. 分类器引导的本质缺陷缺乏语义理解分类器引导本质上是基于视觉特征的引导而不是基于语义理解的引导。它问的是“这张图看起来像猫吗”和“这张图看起来像宇航服吗”它不问的是“这张图是否描绘了一只猫穿着宇航服”由于缺乏对语言语义和物体间空间关系比如“穿着”表示覆盖关系的理解CG 很难处理这种复杂的、多对象的、带修饰关系的自然语言描述。3. 对比为什么 CFG 能解决“穿宇航服的猫”这就是为什么后来的 Stable Diffusion 和 DALL-E 2 采用**无分类器引导CFG**的原因。文本编码器如 CLIP的作用在 CFG 中我们输入的是文本提示词“a cat in a spacesuit”。文本编码器将这个短语转化为一个高维向量Embedding。这个向量捕捉了“猫”、“宇航服”以及它们之间的语义关系“in” 表示位置/穿着。模型的统一学习扩散模型在训练时不仅学习图像的特征还学习图像特征与文本向量之间的关联。当模型看到“猫”和“宇航服”这两个概念在文本向量中同时出现时它通过学习训练数据中的模式学会了如何将这些视觉元素组合在一起。引导机制有条件预测模型看到向量VcatspacesuitV_{\text{catspacesuit}}Vcatspacesuit​预测带有这两个特征的图像。无条件预测模型看到空向量预测一般图像。CFG 计算通过差值放大“带有这两个特征”与“一般图像”之间的差异。因为模型在训练时见过成千上万张“猫”和“宇航服”的组合或者通过 CLIP 的泛化能力它能够理解这种语义组合。4. 总结分类器引导 (CG)输入类别标签如 “cat”, “dog”, “spacesuit”。处理“穿宇航服的猫”极其困难。你需要训练一个专门识别“穿宇航服的猫”的分类器或者尝试组合多个独立分类器的梯度但效果不可控。本质基于视觉特征的逐像素引导。无分类器引导 (CFG)输入自然语言提示词如 “a cat in a spacesuit”。处理“穿宇航服的猫”非常自然。模型通过理解文本向量中的语义自动调整像素分布以符合描述。本质基于语义对齐的联合概率分布引导。因此在现代 AI 绘画中如果你想要生成“穿宇航服的猫”你必须使用支持文本条件的模型如 Stable Diffusion并依赖 CFG 机制而不能使用传统的分类器引导方法。