扩散模型引导技术深度解析
1. 有分类器引导 (Classifier Guidance)
概念
有分类器引导(Classifier Guidance)是一种通过引入一个**外部专家(分类器)来“纠正”和“指导”一个通用生成器(扩散模型)**的技术。
您可以将其想象成一个场景:一位画家(扩散模型)正在进行创作,他擅长画出符合物理规律和自然纹理的图像,但并不知道具体要画什么。这时,一位艺术评论家(分类器)站在旁边,他虽然不会画画,但对特定主题(如“猫”、“风景”)有深刻的鉴赏力。在画家创作的每一步,评论家都会审视半成品,并给出建议:“你这里画得更像猫一点会更好”。画家听取这个建议,并结合自己对绘画本身的理解,来调整下一步的笔触。
技术与实现
此技术需要两个独立训练好的模型:
- 一个标准的扩散模型
p_θ(x)
: 它学习了如何从噪声中生成一张普普通通的、自然的图像。 - 一个分类器
p_φ(y|x)
: 这个分类器经过特殊训练,不仅能识别清晰的图像,还能识别带噪声的图像x_t
,并判断其属于类别y
的概率。
实现流程(推理时):
在生成图像的每一个去噪步骤(从 t
到 t-1
),流程如下:
- 扩散模型首先根据当前的噪声图像
x_t
预测一个基础的去噪方向。 - 同时,将这个
x_t
输入到分类器中。 - 分类器计算出梯度
∇_x_t log p_φ(y|x_t)
。这个梯度指向了能让x_t
被识别为目标类别y
的最快变化方向。 - 将这个梯度乘以一个引导强度系数
s
,然后加到扩散模型原始的去噪方向上。 - 模型根据这个被“引导”了的新方向,来计算出下一步的图像
x_{t-1}
。
数学公式
其核心思想基于贝叶斯定理,将条件概率 p(x_t|y)
的对数梯度进行分解:
∇xtlogp(xt∣y)=∇xtlogp(xt)+∇xtlogp(y∣xt)\nabla_{\mathbf{x}_t} \log p(\mathbf{x}t | y) = \nabla{\mathbf{x}_t} \log p(\mathbf{x}t) + \nabla{\mathbf{x}_t} \log p(y | \mathbf{x}_t)∇xtlogp(xt∣y)=∇xtlogp(xt)+∇xtlogp(y∣xt)
- ∇xtlogp(xt)\nabla_{\mathbf{x}_t} \log p(\mathbf{x}_t)∇xtlogp(xt): 这是扩散模型自身的去噪方向。它代表了模型在没有任何特定目标时,将噪声图像变得更“真实”的趋势。在实际应用中,这通常与模型预测的噪声
ε_θ(x_t)
相关。 - ∇xtlogp(y∣xt)\nabla_{\mathbf{x}_t} \log p(y | \mathbf{x}_t)∇xtlogp(y∣xt): 这正是分类器提供的引导梯度。它告诉模型,应该如何修改
x_t
才能最大化它属于类别y
的概率。 - 最终的去噪方向是这两者的结合,再通过引导强度
s
来调节分类器的话语权。
2. 无分类器引导 (Classifier-Free Guidance, CFG)
概念
无分类器引导(CFG)是一种更先进、更优雅的方案。它的核心思想是不再需要外部专家,而是通过一种特殊的训练方式,让生成模型自身变得“多才多艺”,既能进行无目标的自由创作,也能进行有目标的命题创作,并最终实现自我引导。
这好比我们不再需要画家和评论家两个角色,而是培养出了一位大师级的画家。这位大师通过特殊的训练,既掌握了“随便画点什么都好看”的通用技巧,也掌握了“按照‘猫’这个主题来画”的特定技巧。在创作时,他可以先构思一个通用草图,再思考如何在这个草图的基础上,最大程度地凸显出“猫”的特征,从而实现自我引导和升华。
技术与实现
此技术仅需一个模型,但训练方式特殊。
实现流程(训练时):
在训练这个唯一的扩散模型时,会随机地(例如以10-20%的概率)丢弃或清空输入的条件信息 c
(如文本描述)。
- 有条件训练: 大部分时间,模型接收噪声图
x_t
和条件c
,学习预测噪声ε_θ(x_t, c)
。 - 无条件训练: 小部分时间,模型接收噪声图
x_t
和一个空的条件∅
,学习在没有指导的情况下预测噪声ε_θ(x_t, ∅)
。
通过这种方式,同一个模型网络 ε_θ
被迫同时学会了两种模式的预测能力。
实现流程(推理时):
在每个去噪步骤 t
,模型会并行地进行两次预测:
- 有条件预测: 使用具体的条件
c
(如 “a photo of a cat”)进行一次前向传播,得到ε_θ(x_t, c)
。 - 无条件预测: 使用空的条件
∅
进行第二次前向传播,得到ε_θ(x_t, ∅)
。 - 最后,通过一个公式将两者结合,得到最终的去噪方向。
数学公式
CFG的实现不依赖于贝叶斯定理,而是通过对预测噪声的直接线性组合来完成:
ϵ^θ(xt,c)=ϵθ(xt,∅)+w⋅(ϵθ(xt,c)−ϵθ(xt,∅))\hat{\epsilon}_\theta(\mathbf{x}_t, c) = \epsilon_\theta(\mathbf{x}_t, \emptyset) + w \cdot (\epsilon_\theta(\mathbf{x}t, c) - \epsilon_\theta(\mathbf{x}_t, \emptyset))ϵ^θ(xt,c)=ϵθ(xt,∅)+w⋅(ϵθ(xt,c)−ϵθ(xt,∅))
- ϵθ(xt,∅)\epsilon_\theta(\mathbf{x}_t, \emptyset)ϵθ(xt,∅): 无条件预测。这是模型的“基线”或“通用创作”方向。
- ϵθ(xt,c)\epsilon_\theta(\mathbf{x}_t, c)ϵθ(xt,c): 有条件预测。这是模型在遵循具体指令时的“命题创作”方向。
- (ϵθ(xt,c)−ϵθ(xt,∅))(\epsilon_\theta(\mathbf{x}_t, c) - \epsilon_\theta(\mathbf{x}_t, \emptyset))(ϵθ(xt,c)−ϵθ(xt,∅)): 这是整个技术的精髓——纯粹的引导向量。它代表了从“通用”到“特定”所需的方向差异,即条件
c
带来的纯粹的、额外的信息。 w
: 引导强度系数 (CFG Scale)。它控制着我们要在多大程度上强调这个“引导向量”。当w=1
时,公式简化为ε_θ(x_t, c)
。当w>1
时,引导效果被放大。
详细区别
- 架构区别:
- Classifier Guidance: 需要两个独立模型(一个生成器,一个分类器)。架构更复杂,需要分别维护和调用。
- CFG: 只需要一个统一模型。架构更简洁、更优雅。
- 引导来源区别:
- Classifier Guidance: 引导信号来自一个外部模型(分类器)。这个分类器可能没有在与生成器完全相同的数据或方式上进行训练,两者之间可能存在“认知偏差”,有时会导致奇怪或对抗性的结果。
- CFG: 引导信号是内部生成的。它是模型自身在有条件和无条件两种状态下的预测差异。因为来源相同,所以引导和生成之间高度协调,“不存在认知偏差”,效果更稳定、质量更高。
- 训练过程区别:
- Classifier Guidance: 两个模型可以完全分开训练。但分类器必须在带噪声的图像上进行额外训练,这是一个不小的负担。
- CFG: 训练过程是统一的,只需在训练生成模型时加入“随机丢弃条件”这一简单而有效的技巧即可。
- 灵活性和能力区别:
- Classifier Guidance: 灵活性较差。它的能力受限于分类器所能识别的固定类别。很难扩展到能理解任意自然语言描述的复杂场景。
- CFG: 灵活性极高。它的条件
c
可以非常通用,能够轻易地与强大的文本编码器(如CLIP)结合,从而理解和生成基于任意复杂、细腻文本描述的图像,这是其成为现代文生图模型标配的关键原因。
最终总结
从技术实现的核心差异来看,Classifier Guidance 代表了一种外部组合式的引导方案。它在架构上依赖于一个生成器和一个独立的分类器两个模型,其引导信号是通过计算外部自分类器的梯度来产生,并将其“注入”到生成过程中。这种方式的技术关键在于如何让分类器有效地在带噪声的数据上工作,并将其梯度与生成器的更新步调相协调。
相比之下,Classifier-Free Guidance (CFG) 则是一种内部差分式的引导方案。它在架构上仅需一个统一模型,技术核心在于其独特的训练范式——通过随机丢弃条件,使单一模型同时掌握有条件和无条件两种生成模式。其引导信号完全在内部产生,通过计算模型自身两种模式预测结果的向量差来获得纯粹的引导方向。这种“自我引导”的方式不仅在架构上更为优雅,也因其引导源和执行者的高度同源性,带来了更强的保真度和对复杂语义(如长文本)的卓越解析能力,从而成为当前技术的主流。