提示:
在扩散模型中,时间步嵌入是核心概念之一,能够帮助模型捕捉到时间步的特征。
为什么时间步需要嵌入(Embedding)
在扩散模型中,时间步 ( t ) 是模型生成过程中的一个重要参数,代表了扩散过程的进展。对于每一个时间步 ( t ),模型需要知道当前扩散到了哪一步,以便能够调整去噪操作。因此,我们不能简单地将 ( t ) 作为一个标量直接输入模型,而是需要对其进行嵌入。这有以下几个原因:
-
时间步 ( t ) 是离散的整数:
- ( t ) 是一个离散的整数,比如从 0 到 1000。如果直接将它作为模型输入,模型可能难以从这个单一的数值中提取足够的特征。
- 嵌入将 ( t ) 转换为一个高维向量,能够更好地捕捉不同时间步的特征,并让模型识别不同的扩散阶段。
-
时间步之间存在复杂的依赖关系:
- 在扩散模型中,不同的时间步有不同的噪声水平和恢复难度。例如,早期时间步的噪声较少,晚期时间步的噪声更多。模型需要通过时间步嵌入来捕捉这种变化,从而做出合适的去噪决策。
-
增强模型的学习能力:
- 通过对时间步进行嵌入,模型能够在不同的时间步上学习到不同的特征表示,增强了模型的表达能力。它可以帮助模型了解扩散过程的当前阶段,并相应调整生成策略。
为什么使用正余弦编码
在扩散模型中,最常见的时间步嵌入方法是使用正余弦编码(Sinusoidal Positional Encoding)。正余弦编码有以下几个好处:
-
周期性和连续性:
- 正弦和余弦函数具有周期性,可以很好地捕捉到时间步的顺序和周期关系。正余弦编码通过不同的频率为模型提供了不同的尺度信息,能够帮助模型区分相邻时间步和远离时间步的关系。
公式如下:
P E ( t , 2 i ) = sin ( t 1000 0 2 i / d ) PE(t, 2i) = \sin\left(\frac{t}{10000^{2i/d}}\right) PE(t,2i)=sin(100002i/dt)
P E ( t , 2 i + 1 ) = cos ( t 1000 0 2 i / d ) PE(t, 2i+1) = \cos\left(\frac{t}{10000^{2i/d}}\right) PE(t,2i+1)=cos(100002i/dt)这里,( t ) 是时间步,( i ) 是嵌入维度的索引,( d ) 是嵌入向量的维度。
-
多尺度表示:
- 不同维度 ( i ) 对应不同频率的正弦和余弦函数。高频部分能够捕捉较短时间步之间的细微变化,低频部分则捕捉较大时间步上的全局变化。通过这样的设计,模型可以从多个尺度上理解时间步的信息。
-
不需要额外的训练参数:
- 正余弦编码是固定的不可训练的编码方式,不会引入额外的可训练参数。这种编码已经在 Transformer 等模型中被广泛应用,证明了它的有效性和稳定性。
- 使用正余弦编码可以避免模型在不同时间步上学到不稳定或不连续的表示,从而增强生成过程的稳定性。
-
平滑性和表达能力:
- 由于正弦和余弦函数的平滑性,它们能够提供连续的时间步表示。这种平滑性帮助模型更好地处理扩散过程的渐进变化,使得模型能够生成更加自然的输出。
总结
- 时间步嵌入帮助模型理解扩散过程中的不同阶段,并为模型提供每个时间步的高维特征表示。
- 使用正余弦编码作为时间步嵌入,不仅能够捕捉时间步中的周期性变化,还能够提供多尺度的特征表示,帮助模型在生成过程中做出更加精确的去噪决策。同时,它不会增加模型的训练参数,保证了效率和稳定性。
计算步骤
我们先从公式入手,嵌入维度 ( d = 6 ),意味着我们要计算 3 对正弦和余弦值,每对值的索引 ( i