Classifier-Free Guidance(CFG)是扩散模型中提升条件控制力的关键技术,通过混合条件与无条件预测,实现无需额外分类器的强引导效果。
技术背景
条件生成的核心问题
扩散模型的目标是学习数据分布的得分函数 。
条件生成任务(如文本生成图像)中,模型需要学习条件得分函数:
其中 是条件信息(文本提示、类别标签等)。
传统方法的局限:
| 方法 | 问题 |
|---|---|
| 纯条件训练 | 将 直接输入网络 ,条件控制力不足,生成结果易偏离描述 |
| 分类器引导(CG) | 需额外训练分类器 $p(y |
CFG 的核心思路
核心洞察:条件得分可分解为无条件得分 + 条件修正项:
CFG 的策略:
- 训练时:同时学习条件与无条件生成(用同一个模型)
- 推理时:外推混合两者预测,放大条件引导强度
数学原理
得分函数分解
由贝叶斯定理:
取对数后对 求梯度:
含义:
- :无条件得分,指向数据分布的高密度区域
- :条件修正项,将结果推向符合条件 的区域
CFG 引导公式
直接用条件得分去噪效果有限。CFG 引入引导强度参数 (guidance scale),外推放大条件影响:
其中:
- :条件预测噪声
- :无条件预测噪声(条件为空)
- :引导强度,通常取 7.5~15
公式变形:
直观理解:
- :纯条件预测(无引导)
- :外推强化条件方向,牺牲多样性换取一致性
- :减弱条件影响,增加多样性
与分类器引导的关系
CFG 公式可改写为:
这与分类器引导公式形式一致,但 CFG 不需要额外分类器—— 的信息隐含在条件与无条件预测的差异中。
训练机制
联合训练策略
同一个模型同时学习条件生成和无条件生成:
训练流程:
- 对每个样本,随机决定是否使用条件(概率 ,通常 10%~20%)
- 使用条件时:输入 ,预测噪声
- 不使用条件时:输入 ,预测噪声
# 训练代码示意
def train_step(x_0, y):
# 随机决定是否丢弃条件
use_condition = torch.rand(1) > p_uncond # p_uncond ≈ 0.1
# 加噪
t = sample_timestep()
x_t = add_noise(x_0, t)
# 条件输入
if use_condition:
cond = y # 正常条件
else:
cond = null_embedding # 空条件(null token 或特殊 embedding)
# 预测噪声
eps_pred = model(x_t, t, cond)
# 损失
loss = MSE(eps_pred, true_noise)
return loss为什么无条件训练能学到
无条件生成本质是学习 的分布——即所有数据的平均分布。
训练时随机丢弃条件,模型被迫学会:
- 有条件时:聚焦特定类别/描述的分布
- 无条件时:学习”全局平均”分布
两者共享同一个网络,只是条件输入不同。
条件丢弃比例的选择
| 效果 | |
|---|---|
| 0%(纯条件) | CFG 无效,无法区分条件/无条件预测 |
| 10%~20% | 常用设置,平衡条件学习与无条件能力 |
| 50% | 无条件能力增强,但条件生成质量下降 |
推理机制
CFG 推理流程
每个去噪步骤需要两次前向传播:
def cfg_denoise_step(x_t, t, y, w):
# 条件预测
eps_cond = model(x_t, t, y)
# 无条件预测
eps_uncond = model(x_t, t, null_embedding)
# CFG 混合
eps_guided = eps_uncond + w * (eps_cond - eps_uncond)
# 去噪
x_t_minus_1 = denoise(x_t, eps_guided, t)
return x_t_minus_1计算代价:CFG 推理需要 2 倍前向传播次数(条件 + 无条件)。
引导强度 的影响
| 值 | 生成效果 | 适用场景 |
|---|---|---|
| 1.0 | 无引导,多样性高,一致性弱 | 创意生成 |
| 7.5 | Stable Diffusion 默认值,平衡一致性与多样性 | 通用生成 |
| 15~20 | 强引导,高度忠实于提示,细节可能过度锐化 | 精确控制 |
| >30 | 过度引导,可能出现伪影、失真 | 不推荐 |
实际调参:
- 简单提示:
- 复杂/抽象提示:
- 超写实需求:
与分类器引导对比
| 方面 | 分类器引导(CG) | CFG |
|---|---|---|
| 额外组件 | 需训练分类器 $p(y | x_t)$ |
| 训练复杂度 | 需在噪声图像上训练分类器 | 单模型联合训练 |
| 推理开销 | 分类器梯度计算 + 条件预测 | 2 次条件预测 |
| 引导强度 | 梯度缩放因子 | 引导系数 |
| 适用范围 | 类别条件 | 任意条件(文本、图像等) |
| 稳定性 | 噪声图像上分类器不稳定 | 稳定,无额外噪声训练 |
CFG 优势:
- 训练简单,无需额外分类器
- 适用于任意条件类型(文本、图像、部分遮挡等)
- 更稳定,分类器在噪声图像上难以训练
CFG 劣势:
- 推理需 2 倍前向传播
- 无条件预测在极端噪声时刻可能质量下降
实际应用
Stable Diffusion 中的 CFG
Stable Diffusion 的 guidance_scale 参数即 CFG 的 :
# Stable Diffusion 推理
pipe = StableDiffusionPipeline.from_pretrained("SD15")
image = pipe(
prompt="a cat sitting on a table",
guidance_scale=7.5, # CFG w 参数
num_inference_steps=50
)prompt-to-image 的 CFG 实现:
- 条件:文本 prompt 的 CLIP embedding
- 无条件:空字符串(或特殊 null token)的 embedding
图生图(Image-to-Image)中的 CFG
图生图任务中,CFG 仍然有效:
- 条件:文本 prompt + 初始图像强度(strength)
- 无条件:空 prompt + 同初始图像强度
Negative Prompt
Negative prompt 本质是反向 CFG:
实际应用:
- Positive prompt:描述想要的内容
- Negative prompt:描述要避免的内容(如 “blurry, low quality”)
总结
| 要点 | 说明 |
|---|---|
| 核心公式 | |
| 训练 | 随机丢弃条件(10%~20%),联合训练条件与无条件路径 |
| 推理 | 每步 2 次前向传播,混合条件与无条件预测 |
| 引导强度 | 无引导, 常用, 过度 |
| 优势 | 无需额外分类器,适用任意条件,训练简单稳定 |
CFG 是现代扩散模型(Stable Diffusion、DALL-E 2、Imagen 等)实现高质量条件生成的核心技术,其简洁的”训练时丢弃、推理时外推”设计,深刻体现了”以退为进”的工程智慧。