非线性 beta 调度通过定义一个自定义函数来实现,该函数确定噪声水平 (beta) 在扩散或去噪过程的步骤中如何变化。与以恒定速率增加 beta 的线性调度不同,非线性调度使用诸如余弦、二次或指数曲线之类的数学函数来控制进程。关键是以平衡稳定性和性能的方式将时间步值映射到 beta 值,通常在过程的早期以较慢的 beta 变化开始,并在后期加速,或者反之,具体取决于用例。
要实现非线性 beta 调度,首先选择一个函数来指示曲线的形状。例如,基于余弦的调度可以使用 cos²
或类似的转换来计算 beta 值,以创建平滑的过渡。这是一个用于余弦调度的基本 Python 示例
import math
def cosine_beta_schedule(timesteps, s=0.008):
steps = timesteps + 1
x = torch.linspace(0, timesteps, steps)
alphas_cumprod = torch.cos((x / timesteps + s) / (1 + s) * math.pi * 0.5) ** 2
betas = 1 - (alphas_cumprod[1:] / alphas_cumprod[:-1])
return torch.clip(betas, 0, 0.999)
此代码使用余弦函数计算累积乘积项 (alphas_cumprod
),然后从它们的顺序比率推导出 beta 值。或者,二次调度可以使用 beta_t = (t/T)^2 * max_beta
,其中 t
是当前步,T
是总步数。函数的选择取决于您是想要更清晰的过渡(例如,二次)还是更平滑的过渡(例如,余弦)。
将非线性调度集成到扩散模型中时,请确保 beta 值保持在有效范围内(通常为 0 到 1)并避免数值不稳定性。例如,训练早期非常小的 beta 值可能会降低收敛速度,而大的跳跃可能会破坏学习的稳定性。使用可视化工具(例如,绘制 beta 随时间的变化)进行测试有助于验证曲线的形状。此外,考虑在训练期间在预先计算的 beta 值之间进行插值以提高效率。大多数框架(如 PyTorch 或 TensorFlow)允许预先将调度缓存为张量。非线性调度通常需要调整超参数,例如余弦示例中的 s
偏移量,以与特定的数据域(例如,图像与音频)对齐。