想象你正在陪孩子写一篇作文:孩子身边有两个“参谋”——一个是从没见过题目的普通朋友,只能按一般套路写出一篇还算通顺但模糊的作文;另一个是刚看过题目的家教,能紧扣主题给出个性化建议。只信普通朋友,文章会泛泛而谈;只信家教,文章又容易生硬、跑偏。真正聪明的做法,是把两份草稿放在一起,再拧一个“信任旋钮”:旋钮调得越高,家教的声音越响。这个“信任旋钮”,就是今天要讲的无分类器引导(Classifier-Free Guidance,简称 CFG)。它不需要额外请一个“阅卷老师”来打分,而是让同一个模型同时扮演普通朋友和家教,靠两者之间的差距来调整生成的保真度。它像一颗音量旋钮:调大了,画面对提示更听话;调得太大,画面又会过曝、失真。理解了这颗旋钮,你就理解了文生图、文生视频背后“可调保真度”的核心秘密。
对 AI 从业者而言,CFG 是控制生成质量、创意自由度和推理成本的关键工具,学会它就能在实际项目中精准调节模型输出,而不是盲目照搬别人的采样参数。
可视化演示
展示系统处理流水线、实时性能指标曲线及多方案对比分析,包含数据流转、吞吐延迟监控与方案评估。
本节配有交互动效(进入视口后自动加载,约 3KB)。
系统可视化 处理流程:输入→处理→模型→输出 性能监控:实时指标 P=L×T
核心原理
孩子写作文时,如果完全没有看过题目,只能靠长期积累的常识写出一篇“万金油”作文;如果看过题目,就能围绕题眼组织素材。这两种状态,恰好对应扩散模型里的“无条件生成”和“条件生成”。无条件生成只依赖模型对自然图像的一般理解,条件生成则额外参考文本、类别甚至视频首帧等提示信息。CFG 最奇妙的地方,是它让同一个模型同时掌握这两种状态,而不必真的去训练两个不同的模型。
要理解这个概念,可以先看看传统的“分类器引导”。它相当于额外请一位阅卷老师,专门判断“这张图像不像某个类别”,然后把这个判断的梯度加到去噪过程中。麻烦在于,这位阅卷老师需要单独训练、单独维护,而且梯度过大时还会把画面推向失真。CFG 的想法更省事:让模型自己既当普通朋友,又当看过题目的家教,然后在推理时比较两者给出的答案。
习惯上,我们用噪声预测模型 \(\epsilon_\theta\) 来表达去噪过程,但背后的分数函数可以写成下面的贝叶斯分解:
所以,CFG 并不是什么全新的生成模型,而是给现有扩散模型增加了一个“同一家教的两个答题状态”。孩子在考场里不再需要一个外部阅卷老师,只要让家教先蒙上题目写一份草稿,再看着题目写一份草稿,两份草稿之间的差距,就是这次提示带来的方向感。
- 条件对数概率\(\log p(x_t \mid c)\) 表示在给定条件 \(c\) 时,当前带噪样本 \(x_t\) 出现的对数概率值;它是我们最终要逼近的目标。
- 无条件对数概率\(\log p(x_t)\) 相当于完全不看条件时样本出现的对数概率,代表模型对“普通图像长什么样”的常识。
- 分类器概率项\(\log p(c \mid x_t)\) 是“看到图像后猜条件”的概率对数,传统分类器引导正是通过梯度 \(\nabla_{x_t} \log p(c \mid x_t)\) 来拖动生成结果。
- 整体等式条件分数等于无条件分数加上分类器梯度,这条等式说明为什么过去非要一个分类器;而 CFG 用条件模型与无条件模型的差值代替这个梯度,因此叫“无分类器”。
训练机制
想让同一个模型既能“普通朋友式答题”,又能“家教式答题”,关键在于平时训练时就要给它做“遮题训练”。具体做法是:在每一步训练中,以一定的概率把文本、类别或视频条件替换成一个空条件 \(\varnothing\)。这样一来,模型有时候看不到题目,只能凭常识去噪;有时候又能看到题目,学会利用条件信息。
这个随机丢弃条件的操作,让模型没有真正学会“无视条件”,而是学会了“条件缺失时如何兜底”。正如孩子练作文时,偶尔要练习“拿到题目却只能凭常识答题”的应变能力,真正考试时才不会因题目陌生而彻底慌神。条件丢弃率通常取 10% 到 20%,太低会让模型不太会做无条件预测,太高又会让条件预测变弱。
对应到扩散模型的训练目标,我们可以写成如下噪声预测误差:
这种训练方式没有增加新的网络,也没有引入额外的分类器,只是让“同一个模型”学会了两种状态。到了推理时,孩子只需要分别问家教“没题目怎么写”和“有题目怎么写”,就能得到两份关键草稿。
- 期望采样\(\mathbb{E}_{t, x_0, \epsilon, c}\) 表示每次从训练集中随机取一张干净图像、一个时间步、一个真实噪声和一个条件,然后计算平均损失。
- 条件随机丢弃\(\tilde{c}\) 利用均匀随机数 \(u\) 决定本次用真实条件 \(c\) 还是空条件 \(\varnothing\);当随机数 \(u\) 小于丢弃概率 \(p_{\varnothing}\) 时,模型就看不到条件。
- 噪声差平方\(\left\| \epsilon - \epsilon_\theta(x_t, t, \tilde{c}) \right\|^2\) 度量模型预测出的噪声与真实添加噪声之间的差距。
- 损失权重\(w_t\) 是不同时间步的损失权重,让模型在加噪多、加噪少的阶段都学得足够稳。
推理组合
推理阶段是 CFG 真正发挥魔法的地方。假设普通朋友交出的草稿是“无条件预测” \(\epsilon_\theta(x_t, \varnothing)\),家教交出的草稿是“条件预测” \(\epsilon_\theta(x_t, c)\),那么两份草稿的差值,就是“题目带来的修改意见”。CFG 会把这个修改意见放大或缩小,再叠加回无条件草稿上,因此只需要一个 \(\gamma\) 参数就能调节最终图像的保真度。
这在写作训练里特别直观:孩子先按常识写了一版,又按题目写了一版;真正交卷时,可以把两版对比,找出“因为看了题目而改动的那些句子”,然后选择有多信任这些改动。如果完全不信改动,就还是常识版;如果非常信任改动,就把这份改动反复加重,直到文章处处紧扣题目。
数学上,CFG 的合成噪声预测公式为:
正是因为 \(\gamma\) 可以直接调节“看重题目”的程度,CFG 才会被形容成可调保真度旋钮。实际工程中,Stable Diffusion 等模型常用的默认值是 7 左右,但这只是一个经验起点,不同提示词、不同题材需要根据画面效果微调。
- 无条件预测\(\epsilon_\theta(x_t, \varnothing)\) 是模型在空条件 \(\varnothing\) 下预测的噪声,代表“不看题目的常识答案”。
- 条件预测\(\epsilon_\theta(x_t, c)\) 是模型在真实条件 \(c\) 下预测的噪声,代表“看过题目的针对性答案”。
- 引导差值\(\epsilon_\theta(x_t, c) - \epsilon_\theta(x_t, \varnothing)\) 是条件带来的修正方向,相当于“题目让答案发生的偏移”。
- 引导尺度\(\gamma\) 是这个修正方向的放大倍数,\(\gamma=1\) 时就是普通条件预测,\(\gamma>1\) 时会大幅强调题目信息。
保真度旋钮
如果把 \(\gamma\) 拧到 0,就相当于完全不看题目,生成结果只凭模型想象,图像往往丰富多样,却常常和提示词对不上。如果把 \(\gamma\) 逐步从 1 调到 7,画面会越来越“贴题”:颜色更强调提示词里的概念、物体更符合描述、风格更接近预期。但继续调到 20、30,画面反而会出现过饱和、边缘烧焦、物体变形等奇怪伪影,就像把音响音量开到最大,声音不但没更清楚,反而撕哑了。
可以这样理解:引导尺度本质上是在“基础常识”和“提示词匹配”之间做加权。写作时反复强调“要扣题”,一开始会让文章更切题;但如果每句话都拼命塞进题目关键词,文章就会变得重复、做作、失去自然感。生成模型同样如此,过高 \(\gamma\) 会让生成分布偏离真实图像分布。
用分类器引导的视角看,这等价于对每个样本施加一个与条件置信度有关的指数权重:
所以,调参不是越大越好,而是要找“自然感”与“契合度”之间的甜点区。实践时可以先固定其他采样参数,只改变 \(\gamma\),观察一组同种子图片,快速找到合适的旋钮位置。
- 生成分布\(p_\gamma(x_t \mid c)\) 表示在引导尺度 \(\gamma\) 下,模型最终诱导出的条件分布。
- 常识先验\(p(x_t)\) 是图像自身出现的概率,也就是无条件分布,它负责让画面看起来自然。
- 条件概率指数\(p(c \mid x_t)^{\gamma}\) 把“这张图有多像条件 c”的概率取 \(\gamma\) 次方,\(\gamma\) 越大,越偏向高置信度的条件特征。
- 正比关系\(\propto\) 表示忽略归一化常数后,最终分布正比于这两项的乘积;它揭示了保真度与多样性之间的拉扯。
视频应用
CFG 并不只适用于“写一篇文章”,它更像一种通用的训练与推理策略。到了视频生成和视频理解任务中,条件不再只有一段文字,而是文本、首帧图像、运动描述、类别标签等多个信息源。例如生成一段“雪天骑行”的视频,条件可以是文字“雪天骑行”、第一帧画面,以及“镜头跟随骑手”的运动描述;这些条件组合起来,引导模型生成在时间上连贯、内容上符合类别要求的视频。
在视频分类与表示学习中,CFG 也能派上大用场:由于生成样本可以有意识地放大类别特征,我们可以用它合成“困难样本”和“类间边界样本”,用来增强视频分类器的训练集。比如视频分类模型缺少“雨夜行人闯红灯”的样本,就可以用高引导尺度的视频扩散模型生成一批接近真实分布的样本,让分类器看到更多更难的类别变化。
多条件视频 CFG 的公式可以看成单个条件公式的自然扩展:
在视频分类任务中,CFG 的价值不只是让生成视频“更贴提示词”,更重要的是为下游模型提供更鲜明的类别代表性样本。如果把视频分类器比作阅卷老师,CFG 就是一位懂得按考点“出模拟题”的命题人,让阅卷老师在真正考试前就先见过各种难题。
- 视频潜在表示\(z_t\) 是当前时间步的视频潜在特征,可能包含多帧画面的压缩信息。
- 多条件预测\(\epsilon_\theta(z_t, c_{\mathrm{txt}}, c_{\mathrm{img}}, c_{\mathrm{mov}})\) 是同时参考文本、图像、运动信息后的噪声预测。
- 视频引导尺度\(\gamma_v\) 控制视频条件整体被放大的程度,\(\gamma_v\) 太大也会导致画面闪烁或运动失真。
- 合成方向括号内外相减再相加,本质上仍是在“多条件答案”和“无条件答案”之间取差距。
性能优化
CFG 虽然效果好,却有一个明显代价:推理时每个采样步都要把同一个模型跑两遍,一遍无条件、一遍有条件。这就像每写一版作文都要让家教把“蒙题版”和“看题版”各写一遍,才能算出修改方向,时间成本直接翻倍。对于视频生成这种本来就慢的任务,双路前传会让人难以接受。
常见的优化思路有两类。第一类是工程缓存:因为视频样本相邻两步高度相似,可以复用部分中间特征,或者只在部分采样步开启 CFG,其他步用普通条件生成。第二类是算法蒸馏:训练一个学生模型,让它直接学会“输出 CFG 最终合成结果”,这样推理时只需一次前传,就同时包含了条件和常识信息。
CFG 蒸馏的损失函数可以写成:
经过蒸馏,推理时不再需要分别计算普通朋友和家教的两个答案,而是让一个“更成熟的替身”直接给出最终建议。这就像请家教久了,学生已经学会把常识和题目信息融合在一起,不用每次临时翻两份草稿。
- 学生模型预测\(\hat{\epsilon}_\theta(z_t, c)\) 是待训练的学生模型输出,它接收原始条件和加噪样本,直接输出最终合成噪声。
- 教师目标\(\tilde{\epsilon}_{\mathrm{teacher}}(z_t, c; \gamma)\) 是用完整 CFG 双路前传计算出的教师输出,也就是我们要模仿的目标。
- 均方误差两者相减并取平方,促使学生模型逐步逼近教师模型的丰富行为。
问题诊断
使用 CFG 时,最常见的翻车现场是“过曝”和“伪影”。有些新手以为引导尺度越大,画面越高级,结果把 \(\gamma\) 调到 20,生成出像过度修图一样油亮失真、边缘发光的画面。这时候,生成分布已经明显偏离真实图像分布,如同让复读机反复放大一句话,最后只剩刺耳的电流声。
另一种常见问题是“语义漂移”:当 \(\gamma\) 过高,模型会把某个局部特征无限放大,忽略整体结构。比如输入“一只戴帽子的柯基”,结果模型画出夸张的帽子,柯基的体型和五官却变得不像狗。这说明模型被条件中的强信号“带偏”了,我们需要用评估指标来量化这种偏航。
我们可以把生成分布与真实分布之间的偏离写成 KL 散度:
实际工程中,我们会同时看“贴题程度”和“自然程度”两种指标:比如 CLIP Score 用来衡量生成结果与提示词的对齐度,FID 用来衡量整体分布是否自然。两个指标往往会互相拉扯,因此不是找最高 \(\gamma\),而是找“CLIP 提升不多但 FID 明显恶化”之前的临界点。
- 生成分布\(q_\gamma(x)\) 表示在引导尺度 \(\gamma\) 下模型实际生成的图像分布。
- 真实分布\(p_{\mathrm{real}}(x)\) 是真实图像或真实视频数据所在的目标分布。
- 对数差\(\log q_\gamma(x) - \log p_{\mathrm{real}}(x)\) 比较同一个样本在生成分布与真实分布下的合理性差异。
- 期望计算\(\mathbb{E}_{q_\gamma(x)}[\cdot]\) 表示对所有生成样本求平均,结果越小,说明生成分布越接近真实分布,伪影越少。
AI 应用场景
电商海报的一稿多控
阶段:模型推理与参数调优
解决的问题:传统文生图工具只能生成“看起来对”的图片,无法让设计团队快速控制美学与贴题程度。使用 CFG 后,设计师可以对同一提示词设置 \(\gamma=5\) 得到自然装饰风,\(\gamma=9\) 得到强视觉冲击风,在同一底稿上快速横向比较。
具体案例:某电商平台生成“户外登山鞋”海报时,设计师将引导尺度从 7 调到 10,发现鞋底纹理被过多强调,画面出现过曝;回退到 8 并配合负向提示词,最终得到既贴近商品又能保留场景氛围的素材。
视频分类样本增强
阶段:数据增强与模型训练
解决的问题:真实视频数据中,罕见类别和困难样本数量不足,分类器容易把稀有场景学成简单背景。用高引导尺度的 CFG 生成带类别标签的视频片段,可以定向补充难样本。
具体案例:某安防团队需要“夜间雨天电动车逆行”的监控视频样本,真实数据只有 50 条。他们用视频扩散模型配合首帧和运动提示,以 CFG 尺度 8 生成 500 条高保真样本,并用弱标签筛选后加入训练集,分类器对这类难例的召回率明显提升。
影视分镜一致性校验
阶段:内容生成与质量评估
解决的问题:影视预演阶段,需要让多个分镜保持人物、场景和风格一致。CFG 可以把“分镜描述”和“上一帧关键画面”同时作为条件,通过调整引导尺度控制模型对分镜脚本的忠实程度。
具体案例:动画工作室使用文生视频模型制作概念预告片时,对每个镜头设置不同的 \(\gamma\):远景镜头用 6 保持自然,特写镜头用 9 强调角色特征;然后统一检查人物面部是否漂移,快速定位需要重拍的镜头。
Python 演示
import numpy as np def uncond_score(z): # 无条件分数:把样本拉向原点,代表普通常识 return -z / 2.0 def cond_score(z, cond): # 条件分数:把样本拉向类别中心,代表家教建议 mu = np.array([2.0, 2.0]) if cond else np.array([0.0, 0.0]) return -(z - mu) / 1.0 def cfg_score(z, cond, gamma=5.0): # CFG 组合公式:无条件分数 + 引导尺度 * 条件差值 u = uncond_score(z) c = cond_score(z, cond) return u + gamma * (c - u) def sample(): rng = np.random.default_rng(0) z = np.array([3.0, -3.0]) dt = 0.05 for step in range(200): s = cfg_score(z, True, gamma=5.0) noise = np.sqrt(dt) * rng.normal(size=z.shape) z = z + 0.5 * s * dt + noise print("生成的样本点:", z) if __name__ == "__main__": sample()
def uncond_score(z): return -z / 2.0普通朋友只看常识,总是把样本拉向原点。mu = np.array([2.0, 2.0]) if cond else np.array([0.0, 0.0])条件分支告诉模型“目标点在右上角”。return u + gamma * (c - u)这就是 CFG 核心公式:先用条件分数减无条件分数得到修正方向,再用 \(\gamma\) 放大。s = cfg_score(z, True, gamma=5.0)每步都同时使用两种分数,等价于推理时的双路前传。z = z + 0.5 * s * dt + noise沿分数方向更新样本,并加入少量随机噪声模拟随机采样。for step in range(200)迭代 200 次后,样本会明显偏向类别中心,而不是停在原点附近。
常见误区
误区“无分类器引导是不是要先训练一个图像分类器,不然它怎么知道图像像不像文本?”
正解CFG 并不训练分类器。它只是让同一个扩散模型在训练时偶尔看不到条件,推理时同时给出条件预测和无条件预测,用两者差值替代分类器梯度。这就像同一个家教先蒙题写草稿,再看题写草稿,并不需要另一个阅卷老师来打分。
为何常见:因为传统“分类器引导”确实需要额外分类器,CFG 这个名词容易让人误以为是在原有方法上去掉某个模块。
误区“CFG scale 调到 20,生成图一定更锐利、更符合提示词,质量肯定更好。”
正解引导尺度放大的是条件差值,而不是清晰度。过大时,画面会出现色彩过饱和、边缘烧焦、结构变形等现象。就像音量旋钮开到最大,只会收获更多噪音。
为何常见:许多新手第一次调参时发现高引导尺度下“颜色更浓”,误以为是质量提升,忽略了伪影和分布偏移。
误区“没有文本条件时,模型只会随便生成毫无意义的噪声。”
正解无条件预测仍来自同一个训练良好的扩散模型,它生成的是“没有条件约束下的平均合理图像”,可以是模糊但具有自然结构的草图,而不是纯随机噪声文档。
为何常见:“无条件”一词容易让人理解成“毫无信息”,实际含义是“不依赖此次给定的条件”。
误区“我只做视频分类和视频理解,CFG 这种文生图技巧跟我无关。”
正解CFG 适用于任意条件扩散模型,条件可以是文本、图像、运动、类别标签甚至下游任务要求。视频生成、视频分类样本增强、多模态表示学习都可以复用同一套“条件差值”逻辑。
为何常见:CFG 在文生图社区被讨论最多,导致人们忽略了它本质上是一种通用的条件采样策略。
误区“把文本条件随机丢掉,模型岂不是学不到全部信息?训练效果一定变差。”
正解条件丢弃会略微增加条件预测难度,但它换来了“可以计算引导方向”这一强大能力,综合收益远大于损失。适度的条件丢弃相当于故意安排“闭卷练习”,让模型既会看题,也会在没有题目时保持稳定。
为何常见:人们习惯认为“输入信息越多越好”,却忽略了条件缺失本身也是一种需要学习的分布。
面试题
Q1. CFG 的中文全称是什么?
- A.分类器自由引导← 正确答案
- B.分类器强制引导
- C.条件自由生成
- D.分类器联合训练
答案:A。CFG 全称是 Classifier-Free Guidance,直译即“无分类器引导”或“分类器自由引导”。它强调的是不需要额外分类器,而不是强制使用分类器。
Q2. 文生图中 CFG 的核心做法是什么?
- A.训练额外分类器来修正噪声
- B.同时使用条件和无条件预测← 正确答案
- C.无条件预测完全替代条件预测
- D.删除文本编码器只留视觉编码器
答案:B。CFG 让同一模型同时输出条件噪声预测和无条件噪声预测,再用引导尺度放大两者的差值。它不是训练分类器,更不是删除文本编码器。
Q3. 训练扩散模型时随机丢弃文本条件的目的是什么?
- A.让模型彻底不认识文本
- B.让模型在推理时也能做无条件预测← 正确答案
- C.减少训练数据量
- D.提升图像分类器的精度
答案:B。随机丢弃条件让模型学会“条件缺失时如何生成”,这样推理时才能得到可靠的无条件预测,进而计算出 CFG 需要的条件差值。
Q4. 增大引导尺度 \(\gamma\) 通常会产生什么效果?
- A.图像更贴近提示但多样性下降← 正确答案
- B.图像更随机但细节更丰富
- C.FID 指标一定持续下降
- D.采样推理速度自动变快
答案:A。\(\gamma\) 放大条件差值,会让图像更贴题,但也会压缩生成分布、降低多样性。引导过大还会引发伪影,FID 不会一直下降。
Q5. 下列哪些是 CFG 的实际特征?
- A.提示词对齐能力更强← 正确答案
- B.不需要额外训练分类器← 正确答案
- C.一定无限提高真实感
- D.引导过大时可能出现伪影← 正确答案
答案:ABD。CFG 通过条件差值增强贴题能力,且不需要分类器;但它不会无限提高真实感,过高引导反而会带来过曝、变形等伪影。
Q6. 为什么 CFG 推理通常比普通条件采样更慢?
- A.每步需要两次网络前向计算← 正确答案
- B.采样步数自动翻倍
- C.需要额外运行分类器梯度
- D.模型参数量变大
答案:A。CFG 每步要分别得到条件和无条件两个噪声预测,所以网络前向次数翻倍,而不是采样步数翻倍。它也不需要分类器或增大模型规模。
Q7. 下列哪些方法可以缓解 CFG 带来的速度开销?
- A.使用引导条件蒸馏← 正确答案
- B.采用自适应引导尺度← 正确答案
- C.删除全部文本编码器
- D.无条件分支替换成噪声
答案:AB。CFG 蒸馏把双路行为压缩到单模型中,自适应引导尺度只在部分采样步开启 CFG,都能减少计算量。删除文本编码器或乱替换无条件分支会破坏技术本身。
Q8. CFG 中“无分类器”最准确的理解是什么?
- A.不需要训练图像分类器← 正确答案
- B.不需要文本编码器
- C.不需要扩散模型
- D.不需要任何条件信息
答案:A。“无分类器”指的是省去传统 classifier guidance 中额外训练的图像分类器,而扩散模型和条件信息仍然必需。
Q9. 在视频生成中应用 CFG,哪些条件可以被组合使用?
- A.文本提示← 正确答案
- B.首帧图像← 正确答案
- C.运动描述← 正确答案
- D.任意随机数
答案:ABC。与文生图不同,视频 CFG 可以同时组合文本、首帧、运动等语义条件;随机数只是采样噪声来源,不属于条件。
Q10. 下列关于 CFG 帮助视频分类与表示学习的说法,正确的是哪些?
- A.高引导强度对任意任务都最优
- B.合成难例可用于数据增强← 正确答案
- C.条件增强可提升类别特征← 正确答案
- D.自监督任务完全用不到它
答案:BC。CFG 可以生成高保真类别样本,为分类器补充难例并增强类别代表性特征,因此可用于数据增强和表示学习;但引导强度不是越大越好,也不是与自监督任务毫无关系。