Diffusion 里的 Classifier Guidance(分类器引导)详解
一、核心定位
Classifier Guidance(分类器引导,CG):
在扩散反向去噪采样阶段,利用一个预训练冻结的图像分类器,给扩散模型的去噪梯度加「类别方向约束」,让生成画面更贴合指定类别、提升画质与语义可控性;后续衍生出 Classifier-Free Guidance (CFG,无分类器引导),是现在文生图/图生图主流。
二、先回顾扩散基础:普通无引导去噪
扩散反向过程核心是预测噪声 (\varepsilon_\theta(x_t,t)),迭代:
[
x_{t-1} \leftarrow \text{Denoise}(x_t, \varepsilon_\theta(x_t,t))
]
无条件生成,画面内容随机、语义容易模糊、细节差。
三、Classifier Guidance 数学原理
1. 核心思想
把「带噪图 (x_t)」喂给冻结预训练分类器 (p_\phi(c|x_t)),求类别对数概率对 (x_t) 的梯度:
[
\nabla_{x_t}\log p_\phi(c\mid x_t)
]
这个梯度指向「让 (x_t) 更像类别 (c)」的方向,叠加到扩散去噪梯度上,强制往目标类收敛。
2. 融合引导公式
带引导的修正噪声预测:
[
\hat\varepsilon(x_t,t,c)
= \varepsilon_\theta(x_t,t)
- s\cdot \nabla_{x_t}\log p_\phi(c\mid x_t)
] - (s):引导强度(guidance scale)
- (s=0):等价无条件扩散生成
- (s\uparrow):类别贴合度更高、对比度/锐度更强,但过大容易过曝、畸形、色彩失真
3. 直观理解
- 原生扩散:只负责“去掉噪声”
- 分类器梯度:负责“纠正内容,往指定猫/狗/飞机类别拽”
两者结合=画质更清晰、语义更准。
四、完整 Pipeline(训练+采样)
- 前置准备
- 训练好标准扩散去噪模型 (\varepsilon_\theta)
- 单独训练一个能识别带噪图像的分类器 (p_\phi)(要在不同噪声等级的 (x_t) 上训练,适配扩散时序)
- 反向采样每一步
- 扩散模型预测原生噪声 (\varepsilon_\theta(x_t,t))
- 分类器计算类别梯度 (\nabla\log p_\phi(c|x_t))
- 按权重 (s) 融合梯度,修正去噪方向
- 更新 (x_{t-1}),迭代直到干净图像
五、优缺点
✅ 优点
- 显著降低 FID,提升生成清晰度、语义匹配度
- 灵活控制类别生成强度,可控性强
- 扩散主干模型不用重新训练,只外挂分类器即可
❌ 致命缺点
- 需要额外训练专用带噪分类器,成本高
- 推理时每一步都要走分类器+求梯度,速度慢、算力开销大
- 只能做「类别条件」,很难扩展到文本prompt多模态引导
六、Classifier Guidance vs Classifier-Free Guidance (CFG)
| 维度 | Classifier Guidance (CG) | Classifier-Free Guidance (CFG) |
|---|---|---|
| 外部模型 | 依赖独立冻结分类器 | 无额外外部模型 |
| 条件来源 | 图像类别标签 | 模型自身训练混合「有条件/无条件」数据 |
| 推理梯度 | 分类器梯度引导 | 同一模型输出做差值放大: (\varepsilon_{cond} + s(\varepsilon_{cond}-\varepsilon_{uncond})) |
| 多模态适配 | 难适配文本、prompt | 原生支持文生图、多模态条件(SD/Flux/DiT都用CFG) |
| 速度/成本 | 慢、高成本 | 快、工业主流 |
现在 Stable Diffusion、DiT、Sora 系列基本都用 CFG,淘汰了原始 Classifier Guidance。
七、关键补充小细节
- 分类器必须对不同噪声步 (t) 鲁棒:纯白噪声+弱噪声都能分类,不然梯度不准
- 引导强度 (s) 是调参核心:太小没效果,太大结构崩坏
- CG 是「外部单模型引导」开山之作,奠定了后续所有放大条件语义的引导范式

5546

被折叠的 条评论
为什么被折叠?



