一、背景Classifier Guidance 利用外部分类器指导扩散模型扩散模型的目标是在去噪过程中预测噪声如果希望模型生成某一个类别例如猫最直接的方法就是加入条件 yOpenAI 最早提出的方法除训练扩散模型UNet之外再额外训练一个分类器Classifier。系统变成x_t │ ┌─────┴─────┐ │ │ ▼ ▼ UNet Classifier ε(x,t,y) p(y|x,t) │ │ │ ∇logp(y|x) └─────┬─────┘ │ 修正去噪方向UNet负责预测噪声Classifier负责判断当前图片属于哪个类别分类器不仅给出类别还通过梯度告诉扩散模型应该往哪个方向修改图像更符合目标类别。最终采样方向变成二、Classifier Guidance 引发的质疑虽然 Classifier Guidance 能明显提升生成质量但论文作者提出了一个非常深刻的问题模型真的画得更好了还是只是学会了迎合分类器扩散模型经典评估指标如FID、ISInception Score本质上都依赖Inception-V3 分类网络。换句话说生成图片最后也是交给分类器评分。而 Classifier Guidance 在采样过程中每一步都利用分类器梯度修改图片。就像学生考试 → 提前知道阅卷老师是谁 → 专门写老师喜欢的答案 → 最终得高分因此产生质疑Classifier Guidance 会不会其实是在做一种对抗攻击不断调整像素让分类器越来越确信这一定是一只猫 即使人眼看起来未必更自然。因此作者希望找到一种完全不依赖任何外部分类器的方法。三、CFG 的数学思想作者利用贝叶斯公式进行了一个非常漂亮的推导。原来利用得到代回去整理得这就是著名的 CFG 公式。通常写成四、CFG 的核心思想CFG 的核心思想可以概括成一句话不用分类器而是利用同一个 UNet 自己学习有条件和无条件之间的差异。以前UNet Classifier现在只有UNet把原来分类器提供的信息变成即Prompt 对图像产生的影响五、CFG 在网络中到底如何实现CFG 最大的改变发生在训练阶段。没有增加新的网络只是改变了训练方式。1. Condition Dropout训练时随机丢弃条件。例如文本A cat训练过程90%输入x_t t A cat10%输入 x_t t NULL这里 NULL 可以是空 Token、全零 Embedding、空 Prompt论文称为Condition Dropout。于是x_t │ ┌─────────┴─────────┐ │ │ ▼ ▼ Promptcat PromptNULL │ │ └─────────┬─────────┘ ▼ 同一个UNet ▼ ε(x,t,condition)始终只有一个 UNet。2. UNet 学到了什么由于训练过程中有时候有 Prompt有时候没有 PromptUNet 自然学会第一种情况输入cat输出猫图片对应噪声即第二种情况输入NULL输出整个数据集平均噪声即一个网络同时学会了条件预测、无条件预测六、推理阶段UNet 运行两次CFG 推理流程如下x_t │ ┌───────┴────────┐ │ │ ▼ ▼ Promptcat PromptNULL │ │ ▼ ▼ UNet UNet │ │ ▼ ▼ ε_cond ε_uncond │ │ └───────┬────────┘ ▼ ε_cfg ε_uncond w(ε_cond-ε_uncond) │ ▼ 更新x_{t-1}虽然没有 Classifier但UNet 会运行两次。相比 Classifier Guidance少了Classifier Forward、Classifier Backward速度明显更快。七、Stable Diffusion 中 CFG 的实现CFG 中的UNet 基本没有变化变化的是文本条件输入。例如 Stable DiffusionPrompt → CLIP Text Encoder → Text Embedding → Cross Attention → UNet → 预测噪声如果 Prompt 是A catUNet 就得到条件预测。如果 Prompt 是空CLIP 输出 NULL EmbeddingUNet 仍然可以正常工作因此CFG 根本没有增加新的网络。只是同一个 UNet 接受不同的文本条件。八、Guidance Scale 的物理意义CFG 中w 为 CFG Scalew1几乎没有强化 Prompt生成更加自然但可能Prompt 不够准确。w≈7.5 Stable Diffusion 默认值。通常效果最好Prompt 与自然度取得平衡。w15 Prompt 非常强。模型拼命满足文字描述。但容易出现过饱和、人脸崩坏、色彩失真、重复纹理、结构异常Guidance Scale 本质就是Prompt 对生成过程施加影响的强弱。九、为什么 CFG 能替代 ClassifierClassifier Guidance 中分类器提供的是告诉模型朝目标类别方向修改图片。而 CFG 中表达的是加入 Prompt 后预测噪声发生了怎样的变化。这个差值实际上就是条件信息带来的引导方向。因此Classifier GuidanceClassifier-Free Guidance引导方向来自分类器梯度引导方向来自两次 UNet 预测差值两个网络UNet Classifier一个网络UNet每步需要前向和反向传播分类器每步仅进行两次 UNet 前向推理需要额外训练分类器无需分类器只需训练时进行 Condition Dropout难以扩展到开放文本条件天然支持自然语言 Prompt可以看到两者的目标完全一致都是估计“条件引导方向”只是来源不同。CFG 将这一能力内化到 UNet 中从而摆脱了对外部分类器的依赖。
Classifier-Free Guidance(CFG)全面解读:从 Classifier Guidance 到现代扩散模型的核心技术
一、背景Classifier Guidance 利用外部分类器指导扩散模型扩散模型的目标是在去噪过程中预测噪声如果希望模型生成某一个类别例如猫最直接的方法就是加入条件 yOpenAI 最早提出的方法除训练扩散模型UNet之外再额外训练一个分类器Classifier。系统变成x_t │ ┌─────┴─────┐ │ │ ▼ ▼ UNet Classifier ε(x,t,y) p(y|x,t) │ │ │ ∇logp(y|x) └─────┬─────┘ │ 修正去噪方向UNet负责预测噪声Classifier负责判断当前图片属于哪个类别分类器不仅给出类别还通过梯度告诉扩散模型应该往哪个方向修改图像更符合目标类别。最终采样方向变成二、Classifier Guidance 引发的质疑虽然 Classifier Guidance 能明显提升生成质量但论文作者提出了一个非常深刻的问题模型真的画得更好了还是只是学会了迎合分类器扩散模型经典评估指标如FID、ISInception Score本质上都依赖Inception-V3 分类网络。换句话说生成图片最后也是交给分类器评分。而 Classifier Guidance 在采样过程中每一步都利用分类器梯度修改图片。就像学生考试 → 提前知道阅卷老师是谁 → 专门写老师喜欢的答案 → 最终得高分因此产生质疑Classifier Guidance 会不会其实是在做一种对抗攻击不断调整像素让分类器越来越确信这一定是一只猫 即使人眼看起来未必更自然。因此作者希望找到一种完全不依赖任何外部分类器的方法。三、CFG 的数学思想作者利用贝叶斯公式进行了一个非常漂亮的推导。原来利用得到代回去整理得这就是著名的 CFG 公式。通常写成四、CFG 的核心思想CFG 的核心思想可以概括成一句话不用分类器而是利用同一个 UNet 自己学习有条件和无条件之间的差异。以前UNet Classifier现在只有UNet把原来分类器提供的信息变成即Prompt 对图像产生的影响五、CFG 在网络中到底如何实现CFG 最大的改变发生在训练阶段。没有增加新的网络只是改变了训练方式。1. Condition Dropout训练时随机丢弃条件。例如文本A cat训练过程90%输入x_t t A cat10%输入 x_t t NULL这里 NULL 可以是空 Token、全零 Embedding、空 Prompt论文称为Condition Dropout。于是x_t │ ┌─────────┴─────────┐ │ │ ▼ ▼ Promptcat PromptNULL │ │ └─────────┬─────────┘ ▼ 同一个UNet ▼ ε(x,t,condition)始终只有一个 UNet。2. UNet 学到了什么由于训练过程中有时候有 Prompt有时候没有 PromptUNet 自然学会第一种情况输入cat输出猫图片对应噪声即第二种情况输入NULL输出整个数据集平均噪声即一个网络同时学会了条件预测、无条件预测六、推理阶段UNet 运行两次CFG 推理流程如下x_t │ ┌───────┴────────┐ │ │ ▼ ▼ Promptcat PromptNULL │ │ ▼ ▼ UNet UNet │ │ ▼ ▼ ε_cond ε_uncond │ │ └───────┬────────┘ ▼ ε_cfg ε_uncond w(ε_cond-ε_uncond) │ ▼ 更新x_{t-1}虽然没有 Classifier但UNet 会运行两次。相比 Classifier Guidance少了Classifier Forward、Classifier Backward速度明显更快。七、Stable Diffusion 中 CFG 的实现CFG 中的UNet 基本没有变化变化的是文本条件输入。例如 Stable DiffusionPrompt → CLIP Text Encoder → Text Embedding → Cross Attention → UNet → 预测噪声如果 Prompt 是A catUNet 就得到条件预测。如果 Prompt 是空CLIP 输出 NULL EmbeddingUNet 仍然可以正常工作因此CFG 根本没有增加新的网络。只是同一个 UNet 接受不同的文本条件。八、Guidance Scale 的物理意义CFG 中w 为 CFG Scalew1几乎没有强化 Prompt生成更加自然但可能Prompt 不够准确。w≈7.5 Stable Diffusion 默认值。通常效果最好Prompt 与自然度取得平衡。w15 Prompt 非常强。模型拼命满足文字描述。但容易出现过饱和、人脸崩坏、色彩失真、重复纹理、结构异常Guidance Scale 本质就是Prompt 对生成过程施加影响的强弱。九、为什么 CFG 能替代 ClassifierClassifier Guidance 中分类器提供的是告诉模型朝目标类别方向修改图片。而 CFG 中表达的是加入 Prompt 后预测噪声发生了怎样的变化。这个差值实际上就是条件信息带来的引导方向。因此Classifier GuidanceClassifier-Free Guidance引导方向来自分类器梯度引导方向来自两次 UNet 预测差值两个网络UNet Classifier一个网络UNet每步需要前向和反向传播分类器每步仅进行两次 UNet 前向推理需要额外训练分类器无需分类器只需训练时进行 Condition Dropout难以扩展到开放文本条件天然支持自然语言 Prompt可以看到两者的目标完全一致都是估计“条件引导方向”只是来源不同。CFG 将这一能力内化到 UNet 中从而摆脱了对外部分类器的依赖。