CFG:无分类器引导

定义

CFG(Classifier-Free Guidance,无分类器引导)是一种在采样阶段放大条件信号的技术,让生成结果更贴合文本或类别条件。它不训练额外的分类器,而是在训练时随机丢弃条件(以一定概率把条件置空),让同一个网络既能做条件生成、也能做无条件生成;采样时把「条件预测」沿「条件 − 无条件」的方向外推。

直观理解

直接条件生成的图往往偏「保守」——能满足条件,但不够鲜明。CFG 的思路是:

如果我知道「无条件时网络会画什么」,又知道「有条件时会画什么」,两者之差就是「条件带来的方向」。把这个方向放大,就能得到更「听话」的结果。

类比导航:不仅朝着目的地走,还要不断纠正「偏离目的地」的偏差,并把纠正力度调大。

名字里的「无分类器」是相对早期的 classifier guidance 说的:旧方法需要额外训练一个分类器 p(c∣xt)p(c\mid x_t) 来计算条件梯度,麻烦且对噪声图像不友好。CFG 干脆用「条件 vs 无条件」两个预测之差来近似这个方向,零额外组件。

代价是:训练时要随机丢条件,采样时每步要算两次网络前向(一次条件、一次无条件),计算量翻倍。

公式推导

1. 从 classifier guidance 出发

条件生成的分数可拆成:

∇xtlog⁡p(xt∣c)=∇xtlog⁡p(xt)+∇xtlog⁡p(c∣xt)\nabla_{x_t}\log p(x_t\mid c) = \nabla_{x_t}\log p(x_t) + \nabla_{x_t}\log p(c\mid x_t)

引入引导强度 γ\gamma 放大分类器项:

∇xtlog⁡pγ(xt∣c)=∇xtlog⁡p(xt)+γ ∇xtlog⁡p(c∣xt)\nabla_{x_t}\log p_\gamma(x_t\mid c) = \nabla_{x_t}\log p(x_t) + \gamma\,\nabla_{x_t}\log p(c\mid x_t)

2. 用贝叶斯消掉分类器

由 p(c∣xt)∝p(xt∣c)/p(xt)p(c\mid x_t) \propto p(x_t\mid c)/p(x_t),取对数梯度:

∇xtlog⁡p(c∣xt)=∇xtlog⁡p(xt∣c)−∇xtlog⁡p(xt)\nabla_{x_t}\log p(c\mid x_t) = \nabla_{x_t}\log p(x_t\mid c) - \nabla_{x_t}\log p(x_t)

代入上式:

∇xtlog⁡pγ(xt∣c)=(1−γ) ∇xtlog⁡p(xt)+γ ∇xtlog⁡p(xt∣c)\nabla_{x_t}\log p_\gamma(x_t\mid c) = (1-\gamma)\,\nabla_{x_t}\log p(x_t) + \gamma\,\nabla_{x_t}\log p(x_t\mid c)

分类器消失了,只剩条件分数与无条件分数的加权外推。

3. 翻译成噪声预测

利用 Score SDE 中的等价关系 ϵθ(xt,t)∝−1−αˉt ∇xtlog⁡p(xt)\epsilon_\theta(x_t,t) \propto -\sqrt{1-\bar\alpha_t}\,\nabla_{x_t}\log p(x_t),把分数外推换成噪声预测外推:

ϵ^θ(xt,t,c)=(1+γ) ϵθ(xt,t,c)−γ ϵθ(xt,t)\hat\epsilon_\theta(x_t, t, c) = (1+\gamma)\,\epsilon_\theta(x_t, t, c) - \gamma\,\epsilon_\theta(x_t, t)

等价写作:

ϵ^θ=ϵθ(xt,t,∅)+γ(ϵθ(xt,t,c)−ϵθ(xt,t,∅))\hat\epsilon_\theta = \epsilon_\theta(x_t, t, \varnothing) + \gamma\Big(\epsilon_\theta(x_t, t, c) - \epsilon_\theta(x_t, t, \varnothing)\Big)

其中 ∅\varnothing 是空条件(空文本、无类别)。γ\gamma 是引导强度,通常取 5~10;γ=0\gamma=0 退化为无条件生成。

4. 训练时的条件丢弃

为了让 ϵθ\epsilon_\theta 同时见过「有条件」和「无条件」两种样本,训练时以概率 puncondp_{uncond}(常为 10%~20%)把条件替换为空。这样采样时的两项都由同一个网络输出。

相关