虽然线性调度和余弦调度等标准噪声调度提供了良好的起点并被广泛使用,但它们可能并非所有数据集或生成任务的最佳选择。鉴于我们已讨论过这些固定调度的局限性,接下来的合理步骤是思考如何设计定制的噪声调度,以适应特定需求。目标是在正向过程中控制噪声添加的速度,从而影响模型学习到的逆向去噪过程。正向过程的方差调度通常用$\beta_t$表示时间步$t=1, ..., T$,它规定了整个扩散过程。从$\beta_t$可以推导出$\alpha_t = 1 - \beta_t$以及累积乘积$\bar{\alpha}t = \prod{i=1}^t \alpha_i$。$\beta_t$值的选择直接影响初始数据$x_0$中的信息被遮蔽的速度。添加噪声过快的调度可能在早期就破坏精细细节,使得模型更难恢复它们。相反,添加噪声过慢的调度可能需要非常大的时间步数$T$,或者在信号已然微弱的后期阶段导致学习效率低下。设计定制调度通常涉及为$\beta_t$定义一个函数或序列,使其偏离标准的线性或余弦形式。定制调度的原因为何要不拘泥于既有调度?数据集特点: 具有特定结构的数据集(例如,以精细纹理为主的图像与大片平滑区域)可能从在不同时间步添加噪声的调度中获益。任务特定性: 某些任务,如图像修复或图像编辑,可能需要相比无条件生成,在早期扩散步骤中更仔细地保持信息。样本质量侧重: 可以设计定制调度来提高样本质量的特定方面,例如减少模糊或增强细节保真度,这可能通过将模型的学习能力集中在特定噪声级别范围来实现。效率: 定制调度可能允许在更少的扩散时间步($T$)下达到相近或更好的结果。噪声调度设计方法除了依靠线性或余弦等预定义公式,我们还可以使用其他函数形式或规则来定义$\beta_t$:多项式调度: 推广线性调度$\beta_t \propto t$或余弦调度。我们可以使用高阶多项式来定义$\beta_t$,例如: $$ \beta_t = c_1 \left(\frac{t}{T}\right)^p + c_0 $$ 本式中 $p$ 是多项式次数,$c_1, c_0$ 是常数,它们的选择旨在确保$\beta_t$保持在期望的范围内(例如,$10^{-4}$到$0.02$)并保持单调性。调整$p$可以使噪声添加率呈现不同的曲率。分段调度: 在$t$的不同区间上为$\beta_t$定义不同的函数。例如,一个调度可以在前$T/2$个步骤中是线性的,然后对于剩余步骤过渡到类似余弦的衰减。这允许在扩散过程的不同阶段对噪声添加进行精细控制。基于信噪比(SNR)的设计: 一种更有原则的方法是根据每个时间步$t$的期望信噪比(SNR)来设计调度。信噪比定义为: $$ \text{SNR}(t) = \frac{\mathbb{E}[ ( \sqrt{\bar{\alpha}_t} x_0 )^2 ]}{\mathbb{E}[ ( \sqrt{1 - \bar{\alpha}_t} \epsilon )^2 ]} = \frac{\bar{\alpha}_t \mathbb{E}[x_0^2]}{(1 - \bar{\alpha}_t) \mathbb{E}[\epsilon^2]} $$ 假设归一化后$\mathbb{E}[x_0^2] \approx 1$且$\mathbb{E}[\epsilon^2] = 1$,则$\text{SNR}(t) \approx \frac{\bar{\alpha}_t}{1 - \bar{\alpha}_t}$。我们可以反向操作:定义一个目标SNR($t$)函数(例如,指数衰减),然后导出所需的$\bar{\alpha}_t$,随后是$\beta_t$。这直接将调度设计与每一步中剩余的信息量联系起来。例如,确保信噪比平滑下降可能带来更稳定的训练。对数调度: 调度也可以在对数空间中定义,通常侧重于对数信噪比。这可以对动态特性提供更好的控制,尤其是在处理非常小或非常大的$\bar{\alpha}_t$值时。调度差异可视化我们来比较在$T=1000$个时间步下,不同调度类型的累积噪声水平,由$\sqrt{1-\bar{\alpha}_t}$表示(这表明噪声对信号的主导程度)。值越高意味着噪声越多。{ "layout": { "title": "不同调度的噪声水平(sqrt(1 - \u00e1\u00b5\u209c))比较", "xaxis": { "title": "时间步 (t)" }, "yaxis": { "title": "累积噪声水平 (sqrt(1 - \u00e1\u00b5\u209c))", "range": [0, 1] }, "legend": { "title": "调度类型" }, "template": "plotly_white", "width": 700, "height": 450 }, "data": [ { "x": [0, 100, 200, 300, 400, 500, 600, 700, 800, 900, 1000], "y": [0.0, 0.14, 0.28, 0.41, 0.53, 0.63, 0.73, 0.81, 0.88, 0.94, 1.0], "mode": "lines", "name": "线性 (\u03b2\u209c=1e-4 到 2e-2)", "line": { "color": "#4263eb" } }, { "x": [0, 100, 200, 300, 400, 500, 600, 700, 800, 900, 1000], "y": [0.0, 0.31, 0.44, 0.55, 0.64, 0.72, 0.79, 0.85, 0.91, 0.96, 1.0], "mode": "lines", "name": "余弦", "line": { "color": "#12b886" } }, { "x": [0, 100, 200, 300, 400, 500, 600, 700, 800, 900, 1000], "y": [0.0, 0.05, 0.15, 0.28, 0.42, 0.56, 0.69, 0.80, 0.89, 0.95, 1.0], "mode": "lines", "name": "定制 (类二次)", "line": { "color": "#f76707", "dash": "dash" } } ] }本图比较了噪声在线性、余弦和定制(类二次)调度下积累的速度。与余弦调度在早期更快地添加噪声相比,定制调度最初缓慢添加噪声,随后加速。实现考量在实现定制调度时,您通常需要预计算$t=1, ..., T$的$\beta_t$、$\alpha_t$和$\bar{\alpha}_t$值。这些值随后被存储并用于训练(给定$x_0$采样$x_t$)和推断(去噪步骤)。步骤包括:定义$\beta_t$: 在$t \in [1, T]$的范围内为$\beta_t$选择一个函数或序列。确保$\beta_t$值合理(例如,小、正,并且普遍非递减,尽管并非总是要求严格单调性)。起始值和结束值($\beta_1$,$\beta_T$)对接近纯数据和纯噪声时的行为有显著影响。计算导出值: 计算$\alpha_t = 1 - \beta_t$和$\bar{\alpha}t = \prod{i=1}^t \alpha_i$。同时预计算其他常用值,如$\sqrt{\bar{\alpha}_t}$、$\sqrt{1 - \bar{\alpha}_t}$,以及去噪步骤中使用的项(这取决于特定的参数化,例如涉及$\tilde{\beta}t = \frac{1-\bar{\alpha}{t-1}}{1-\bar{\alpha}_t}\beta_t$)。集成应用: 在扩散模型的训练循环和采样过程中使用这些预计算值。评估与权衡评估定制噪声调度需要进行经验测试。使用新调度训练您的扩散模型并比较:训练动态: 损失是否平稳收敛?是否存在不稳定性?样本质量: 使用FID(Fréchet Inception Distance)、IS(Inception Score)等指标或特定领域指标评估生成的样本。定性评估也同样重要。采样速度: 定制调度是否允许在使用DDIM等采样器时,以更少的推断步骤($N < T$)获得良好结果?设计定制调度通常是一个迭代过程,包括提出调度、训练、评估和改进。调度设计的复杂性与潜在收益之间存在权衡。虽然标准调度通常表现良好,但精心设计的定制调度可以为特定应用提供显著优势,或提升样本质量的上限。这种认识有助于我们研究那些不仅是设计出来、更是学习而来的调度,我们将在下一节中进行介绍。