噪声调度方法概述

可以把扩散模型想象成“修复一张被逐渐撕碎的拼图”。正向过程是按步骤撕碎图片(加噪),反向过程则是学习如何修复(去噪)。噪声调度决定了“撕碎”的速度和节奏,其关键意义在于:

  1. 控制学习难度:噪声调度决定了模型在每个阶段的学习任务。如果初始阶段噪声过大,模型可能难以从纯噪声中识别出有效的结构信息;反之,若噪声过小,模型又可能学习不到有意义的去噪过程。

  2. 平衡细节与结构:理想的噪声调度能在早期保留图像的宏观结构(如轮廓、布局),而在后期专注于恢复微观细节(如纹理、毛发)。糟糕的调度会导致模糊或伪影等问题。

  3. 影响训练与生成效率:不同的噪声调度对计算资源的需求不同。一个高效的调度可以在更少的步骤内达到相同的生成质量,从而显著加速训练和推理。

以下是几种常见的噪声调度策略及其实现方法。


线性噪声调度(Linear Schedule)

线性调度是最简单的噪声调度方法,噪声水平随时间线性变化,即β值随时间线性增加,每个时间步增加恒定的噪声。Jonathan Ho 等人在Denoising Diffusion Probabilistic Models介绍了线性噪声调度

优点:实现简单,计算高效,是许多基线模型(如DDPM)的默认选择。缺点:后期噪声增长过快,可能导致模型难以学习精细细节,生成图像可能模糊。

低分辨率图像生成、快速原型验证。

数学表达
噪声水平  \beta_t  在时间步t 的值为:


\beta_t = \beta_{\text{min}} + (\beta_{\text{max}} - \beta_{\text{min}}) \cdot \frac{t}{T}

代码实现(Python):

def linear_schedule(t, T, beta_min=0.0001, beta_max=0.02):
    return beta_min + (beta_max - beta_min) * (t / T)


余弦噪声调度(Cosine Schedule)

余弦调度通过余弦函数调整噪声水平,避免线性调度的突变问题。β值的变化遵循余弦函数,初期和末期变化慢,中期变化快。Alex Nichol 等人在Improved Denoising Diffusion Probabilistic Models提出了余弦噪声调度,作为线性噪声调度的改进,尤其解决了线性噪声调度在 t=T 附近信噪比的快速下降。

优点:生成图像细节更丰富、更锐利,训练更稳定,通常能获得更高的FID/IS分数。缺点:计算稍复杂,早期学习速度可能较慢。

当前最主流的选择,广泛应用于高分辨率图像生成(如Stable Diffusion等)。

数学表达
噪声水平 \beta_t 的计算公式为:


\beta _{t}=1-\frac{\bar{\alpha _{t}}}{\bar{\alpha _{t-1}}}

\bar{\alpha _{t}}=\frac{f(t)}{f(0)}

f(t)=\cos \left ( \frac{t/T+s}{1+s} *\frac{\pi }{2}\right )^{2}

此处 s 是一个小的偏移量(例如 0.006),以防止 \beta _{t} 在 t=0 附近过小。在实践中,我们将 \beta _{t} 限制为不大于 0.999,以防止在扩散过程结束时接近 t = T 时出现奇点。


平方根噪声调度(Sqrt Schedule)

平方根调度使噪声变化更平缓,适合某些扩散模型的需求。Xiang Lisa Li 等人在《Diffusion-LM Improves Controllable Text Generation》提出Sqrt Schedule 。作者觉得前两种噪声表对文本数据不具有鲁棒性。作者认为在接近原始数据的地方,即 t=0  附近去噪比较简单,如果添加噪声太小,不足以扰乱数据,因此应该添加更大的噪声。

数学表达
噪声水平\beta_t 为:


\beta_t = \sqrt{1-\bar{\alpha _{t}}}

\bar{\alpha _{t}}=1-\sqrt{\frac{t}{T}+s}

s 是一个小常数,对应于起始噪声水平。该文提出的sqrt 时间表以更高的噪声水平开始,并且在前 50 个步骤中噪声迅速增加。然后 sqrt 减慢注入噪声的速度,以避免在高噪声问题上花费太多步骤,这可能很难很好地解决。


指数噪声调度(Exponential Schedule)

指数调度通过指数函数调整噪声水平,适用于快速变化的场景,可处理音频生成、多尺度数据等特定任务。β值呈指数级增长,初期变化迅速,后期逐渐放缓。

优点:初期快速变化有助于捕捉细节,在处理数据尺度差异大时表现出色。缺点:初期噪声增长过快,可能不利于学习稳定的结构信息。

数学表达
噪声水平\beta_t的计算公式为:


\beta_t = \beta_{\text{min}} \cdot \left(\frac{\beta_{\text{max}}}{\beta_{\text{min}}}\right)^{\frac{t}{T}}

代码实现(Python):

def exponential_schedule(t, T, beta_min=0.0001, beta_max=0.02):
    return beta_min * (beta_max / beta_min) ** (t / T)


选择噪声调度的建议

  • 线性调度:简单易用,适合初步实验。
  • 余弦调度:平滑过渡,适合高质量生成任务。
  • 平方根调度:噪声变化更缓慢,适合稳定训练。
  • 指数调度:噪声快速变化,适合某些特定场景。

根据具体任务需求调整参数(如 beta_minbeta_max)以获得最佳效果。

本文来源于网络学习后,通过个人总结等完成,感谢各位前辈的讲解,如有不妥或有误的地方,欢迎大家来讨论,批评指正。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐