分类器无关引导 (CFG) 提供了一种有效方法来引导生成过程,而无需依赖单独的预训练分类器模型。这种技术避免了与分类器准确性或数据域不匹配相关的问题,并已成为现代扩散模型中的一种标准方法。
主要思路是训练一个单一的扩散模型 ϵ θ \epsilon_\theta ϵ θ ,使其能够同时 有条件地和无条件地运行。这是通过在训练阶段进行修改来实现的。
条件Dropout训练
在训练期间,对于每个数据样本 x 0 x_0 x 0 及其对应的条件信息 y y y (例如类别标签或文本嵌入),我们执行以下步骤:
采样一个时间步长 t ∼ U ( 1 , T ) t \sim \mathcal{U}(1, T) t ∼ U ( 1 , T ) 。
采样噪声 ϵ ∼ N ( 0 , I ) \epsilon \sim \mathcal{N}(0, \mathbf{I}) ϵ ∼ N ( 0 , I ) 。
使用前向过程方程计算噪声样本 x t x_t x t :x t = α ˉ t x 0 + 1 − α ˉ t ϵ x_t = \sqrt{\bar{\alpha}_t} x_0 + \sqrt{1 - \bar{\alpha}_t} \epsilon x t = α ˉ t x 0 + 1 − α ˉ t ϵ 。
以一定的概率 p u n c o n d p_{uncond} p u n co n d (例如,10-20%),将实际的条件信息 y y y 替换为一个特殊的空 或无条件 标记,表示为 ∅ \emptyset ∅ 。这种替换就像一种“条件Dropout”形式。
将噪声样本 x t x_t x t 、时间步长 t t t 和(可能已替换的)条件信息输入到U-Net模型中:ϵ p r e d = ϵ θ ( x t , t , y e f f ) \epsilon_{pred} = \epsilon_\theta(x_t, t, y_{eff}) ϵ p re d = ϵ θ ( x t , t , y e ff ) ,其中 y e f f y_{eff} y e ff 为 y y y 或 ∅ \emptyset ∅ 。
计算损失,通常是均方误差 (MSE),在预测噪声 ϵ p r e d \epsilon_{pred} ϵ p re d 和真实噪声 ϵ \epsilon ϵ 之间:L = ∣ ∣ ϵ − ϵ p r e d ∣ ∣ 2 L = ||\epsilon - \epsilon_{pred}||^2 L = ∣∣ ϵ − ϵ p re d ∣ ∣ 2 。
使用此损失的梯度下降法更新模型参数 θ \theta θ 。
通过在训练期间随机省略条件信息,模型同时学习两件事:
如何在给定条件下预测噪声:ϵ θ ( x t , t , y ) \epsilon_\theta(x_t, t, y) ϵ θ ( x t , t , y ) 。
如何无条件地预测噪声:ϵ θ ( x t , t , ∅ ) \epsilon_\theta(x_t, t, \emptyset) ϵ θ ( x t , t , ∅ ) 。
空标记 ∅ \emptyset ∅ 需要一个特定的表示。对于类别标签,它可能是一个专用的“无条件”类别索引。对于文本嵌入(如CLIP嵌入),它通常是一个固定的、可学习的嵌入向量,与模型一同训练,以表示文本条件的缺失。
带有引导的采样
在生成(采样)过程中,我们借助模型的这种能力,在每一步进行有条件和无条件的预测。对于给定的时间步长 t t t 和当前的噪声样本 x t x_t x t ,我们计算两个 噪声预测:
无条件预测: ϵ u n c o n d = ϵ θ ( x t , t , ∅ ) \epsilon_{uncond} = \epsilon_\theta(x_t, t, \emptyset) ϵ u n co n d = ϵ θ ( x t , t , ∅ )
有条件预测: ϵ c o n d = ϵ θ ( x t , t , y ) \epsilon_{cond} = \epsilon_\theta(x_t, t, y) ϵ co n d = ϵ θ ( x t , t , y ) (其中 y y y 是输出所需的条件)
我们不只是使用 ϵ c o n d \epsilon_{cond} ϵ co n d 来执行去噪步骤,而是使用一个引导比例参数 w w w (通常称为引导强度或比例,有时表示为 s s s 或 γ \gamma γ )来结合这两个预测。组合噪声预测 ϵ ~ t \tilde{\epsilon}_t ϵ ~ t 计算如下:
ϵ ~ t = ϵ u n c o n d + w ⋅ ( ϵ c o n d − ϵ u n c o n d ) \tilde{\epsilon}_t = \epsilon_{uncond} + w \cdot (\epsilon_{cond} - \epsilon_{uncond}) ϵ ~ t = ϵ u n co n d + w ⋅ ( ϵ co n d − ϵ u n co n d )
这个公式有清晰的解释:
从无条件噪声预测 ϵ u n c o n d \epsilon_{uncond} ϵ u n co n d 开始。
计算“引导方向”:有条件预测和无条件预测之间的差值 ( ϵ c o n d − ϵ u n c o n d ) (\epsilon_{cond} - \epsilon_{uncond}) ( ϵ co n d − ϵ u n co n d ) 。这个向量从无条件生成路径指向有条件生成路径。
按引导比例 w w w 缩放此方向,并将其加到无条件预测中。
另一种等价的写法是:
ϵ ~ t = ( 1 − w ) ϵ u n c o n d + w ⋅ ϵ c o n d \tilde{\epsilon}_t = (1-w)\epsilon_{uncond} + w \cdot \epsilon_{cond} ϵ ~ t = ( 1 − w ) ϵ u n co n d + w ⋅ ϵ co n d
从这种形式中,我们可以看出:
如果 w = 0 w = 0 w = 0 ,我们得到 ϵ ~ t = ϵ u n c o n d \tilde{\epsilon}_t = \epsilon_{uncond} ϵ ~ t = ϵ u n co n d ,导致纯粹的无条件生成。
如果 w = 1 w = 1 w = 1 ,我们得到 ϵ ~ t = ϵ c o n d \tilde{\epsilon}_t = \epsilon_{cond} ϵ ~ t = ϵ co n d ,这对应于没有额外引导增强的标准有条件生成。
如果 w > 1 w > 1 w > 1 ,我们沿引导方向进行外推,更强烈地将生成推向条件 y y y 。
这个组合噪声估计 ϵ ~ t \tilde{\epsilon}_t ϵ ~ t 然后用于标准的去噪步骤(例如,DDPM 或 DDIM 更新规则)来计算噪声更少的样本 x t − 1 x_{t-1} x t − 1 。该过程从 t = T t=T t = T 重复到 t = 1 t=1 t = 1 。
下图说明了在单个采样步骤中的计算:
流程图用于计算在单个去噪步骤 t t t 中使用分类器无关引导的引导噪声预测 ϵ ~ t \tilde{\epsilon}_t ϵ ~ t 。
实际考虑
引导比例 (w w w ): 这是一个重要的超参数。典型值范围为 1.5 1.5 1.5 到 15 15 15 。较高的值会更强地强制执行条件,这可以提升对齐效果(例如,使图像看起来更像文本提示),但可能导致饱和、伪影或生成样本多样性降低。较低的值会产生更多样但可能与条件对齐度较低的结果。您通常需要通过实验为您的特定任务和模型找到一个好的平衡点。
条件输入: y y y 和 ∅ \emptyset ∅ 如何集成到U-Net架构中很重要。常见方法包括将它们的嵌入添加到时间步嵌入,或在U-Net块中使用交叉注意力层,使模型能够关注条件信息的关键部分。我们将在稍后更详细地讨论架构修改。
计算成本: CFG 要求在每个采样步骤中运行模型两次前向传播(一次有条件,一次无条件)。这使得采样计算成本大致翻倍,相比于标准的有条件或无条件生成。考虑到在控制和质量方面的大幅改进,这种权衡通常是可以接受的。
实现CFG涉及修改训练循环(以处理条件dropout)和采样循环(以执行两次前向传播并组合结果)。接下来的章节将阐述常用于条件化的特定架构变化,并提供实际例子。