趋近智
无分类器引导 (CFG),已在第四章介绍,它提供了一种有效方法,可在无需单独分类器模型的情况下,将扩散采样过程引向所需条件(如文本提示)。通过在条件预测和无条件预测之间进行插值,CFG 允许通过引导尺度(通常表示为 或 )来控制条件信号的强度。
虽然有效,但在整个采样过程中使用固定引导尺度有时可能不是最优的。非常高的引导尺度,虽然可能提高提示的符合度,但可能导致生成样本出现过饱和、不自然的对比度或视觉伪影。相反,低尺度可能过多地忽略了条件。引导采样改进旨在缓解这些问题,并实现对生成过程的更精细控制。
动态引导并非在所有时间步 都使用恒定引导尺度 ,而是在逆扩散过程中调整该尺度。直观思路是,最佳程度的引导可能因给定步骤图像中存在的结构或噪声量而异。
例如,一种常见策略是在初始步骤(当图像主要是噪声时)采用更高的引导尺度,以强力确立条件特征,然后在后续步骤中随着细节的完善逐渐减小尺度。这有助于防止当图像结构已大致形成时,维持高引导所带来的过饱和问题。
该调整可以基于时间步 或噪声水平 。一个简单的调度方案可能在采样步骤中,将引导尺度从最大值 线性或非线性地衰减到最小值 。
# 动态引导尺度伪代码
def dynamic_cfg_prediction(model_output_cond, model_output_uncond, w_schedule, t):
"""应用具有时变尺度的 CFG。"""
guidance_scale = w_schedule(t) # 获取当前时间步 t 的尺度
return model_output_uncond + guidance_scale * (model_output_cond - model_output_uncond)
# 示例调度函数(线性衰减)
def linear_decay_schedule(t, T, w_max, w_min):
"""在 T 步内将引导从 w_max 线性衰减到 w_min。"""
progress = t / T
return w_max - (w_max - w_min) * progress
# 在采样循环中:
# noise_pred = dynamic_cfg_prediction(cond_pred, uncond_pred, my_schedule, current_t)
下面是固定引导尺度与简单线性衰减调度方案的对比可视化:
比较了固定引导尺度(例如 7.0)与在 50 个采样步骤中从 10.0 线性衰减到 2.0 的动态尺度。
尝试不同的调度方案(例如余弦衰减、基于步骤的变化)可以在提示对齐和图像自然度之间产生不同的权衡。
另一种改进,在高引导尺度下特别有用,是阈值处理。高引导有时会将预测的 (估计的清晰图像)推到典型数据范围(例如,归一化图像的 [-1, 1])之外很远。当值在采样步骤后期被裁剪回有效范围时,这可能导致钳制伪影。
阈值处理技术旨在在使用这些预测的 值计算下一步的潜在 之前对其进行校正。
静态阈值处理: 一种简单的方法是将预测的 值钳制到数据分布的固定百分位数范围。例如,如果 99% 的训练数据像素值落在 [-1.5, 1.5] 范围内,您可以在每个步骤将预测的 钳制到此范围。
动态阈值处理: 一种更复杂的方法是根据当前步骤中预测的 的统计数据来调整阈值。由 Imagen 论文提出,动态阈值处理计算预测 中绝对像素值的百分位数 。如果此百分位数超过阈值 (通常设置略高于 1.0,例如 1.2 到 1.5),则整个预测的 将被重新缩放,以将该百分位数值降低到 。
# 动态阈值处理伪代码(简化版)
def dynamic_thresholding(predicted_x0, percentile=0.99, threshold_scale=1.5):
"""对预测的清晰图像应用动态阈值处理。"""
abs_pixels = abs(predicted_x0)
# 计算绝对像素值的指定百分位数
p_value = calculate_percentile(abs_pixels, percentile)
if p_value > threshold_scale:
# 如果百分位数超过阈值,则按比例缩小整个预测
scaling_factor = threshold_scale / p_value
predicted_x0 = predicted_x0 * scaling_factor
# 可选:如果采样器逻辑需要,缩放后钳制到 [-1, 1]
# predicted_x0 = clamp(predicted_x0, -1.0, 1.0)
return predicted_x0
# 在预测 x0 的采样步骤中使用:
# 1. 获取条件和无条件模型输出(例如,预测噪声 eps)
# 2. 计算 CFG 混合预测:eps_cfg = uncond_eps + w * (cond_eps - uncond_eps)
# 3. 计算相应的预测 x0:pred_x0 = get_x0_from_noise(xt, eps_cfg, t)
# 4. 应用阈值处理:pred_x0_thresholded = dynamic_thresholding(pred_x0)
# 5. 使用 pred_x0_thresholded 计算下一个潜在 x_{t-1}(或要使用的噪声)
动态阈值处理有助于防止过饱和并保持图像保真度,即使在非常高的引导尺度下也是如此,从而在不严重降低图像质量的情况下实现更强的提示符合度。
这些引导改进通常与采样器的选择有关联。
实施动态引导和阈值处理可以带来:
实验很重要。最佳动态调度、阈值处理参数(, )及其组合通常取决于具体的模型架构、数据集、采样器和期望的输出特性。这些改进提供了有用的工具,可提升引导扩散采样的质量和可控性。
这部分内容有帮助吗?
© 2026 ApX Machine Learning用心打造