Classifier-Free Guidance(CFG)是扩散模型中提升条件控制力的关键技术,通过混合条件与无条件预测,实现无需额外分类器的强引导效果。

技术背景

条件生成的核心问题

扩散模型的目标是学习数据分布的得分函数

条件生成任务(如文本生成图像)中,模型需要学习条件得分函数:

其中 是条件信息(文本提示、类别标签等)。

传统方法的局限

方法问题
纯条件训练 直接输入网络 ,条件控制力不足,生成结果易偏离描述
分类器引导(CG)需额外训练分类器 $p(y

CFG 的核心思路

核心洞察:条件得分可分解为无条件得分 + 条件修正项:

CFG 的策略:

  1. 训练时:同时学习条件与无条件生成(用同一个模型)
  2. 推理时:外推混合两者预测,放大条件引导强度

数学原理

得分函数分解

由贝叶斯定理:

取对数后对 求梯度:

含义

  • :无条件得分,指向数据分布的高密度区域
  • :条件修正项,将结果推向符合条件 的区域

CFG 引导公式

直接用条件得分去噪效果有限。CFG 引入引导强度参数 (guidance scale),外推放大条件影响:

其中:

  • :条件预测噪声
  • :无条件预测噪声(条件为空)
  • :引导强度,通常取 7.5~15

公式变形

直观理解

  • :纯条件预测(无引导)
  • :外推强化条件方向,牺牲多样性换取一致性
  • :减弱条件影响,增加多样性

与分类器引导的关系

CFG 公式可改写为:

这与分类器引导公式形式一致,但 CFG 不需要额外分类器—— 的信息隐含在条件与无条件预测的差异中。


训练机制

联合训练策略

同一个模型同时学习条件生成和无条件生成:

训练流程

  1. 对每个样本,随机决定是否使用条件(概率 ,通常 10%~20%)
  2. 使用条件时:输入 ,预测噪声
  3. 不使用条件时:输入 ,预测噪声
# 训练代码示意
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.5Stable Diffusion 默认值,平衡一致性与多样性通用生成
15~20强引导,高度忠实于提示,细节可能过度锐化精确控制
>30过度引导,可能出现伪影、失真不推荐

实际调参

  • 简单提示:
  • 复杂/抽象提示:
  • 超写实需求:

与分类器引导对比

方面分类器引导(CG)CFG
额外组件需训练分类器 $p(yx_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 等)实现高质量条件生成的核心技术,其简洁的”训练时丢弃、推理时外推”设计,深刻体现了”以退为进”的工程智慧。