在序列建模中,时间步(time step)通常指的是序列中每个元素的位置,这个位置可以表示为序列的索引。时间步在处理时序数据(如时间序列、文本序列等)时尤为重要,因为它帮助模型捕捉序列中数据点的时间依赖关系。
示例说明
假设我们有一个序列输入 ( X ) 包含多个时间步,每个时间步代表序列中的一个数据点。我们用 ( t ) 表示当前时间步。
位置嵌入中的时间步
位置嵌入(Position Embedding)是为了给序列中的每个时间步分配一个唯一的向量,从而保留时间步的顺序信息。位置嵌入的公式为:
PE
(
pos
,
2
j
)
=
sin
(
pos
(
2
L
x
)
2
j
/
d
model
)
\text{PE}(\text{pos}, 2j) = \sin\left(\frac{\text{pos}}{(2L_x)^{2j/d_{\text{model}}}}\right)
PE(pos,2j)=sin((2Lx)2j/dmodelpos)
PE
(
pos
,
2
j
+
1
)
=
cos
(
pos
(
2
L
x
)
2
j
/
d
model
)
\text{PE}(\text{pos}, 2j+1) = \cos\left(\frac{\text{pos}}{(2L_x)^{2j/d_{\text{model}}}}\right)
PE(pos,2j+1)=cos((2Lx)2j/dmodelpos)
其中,pos
是序列中元素的位置,L_x
是序列长度,dmodel 是特征维度。
全局时间戳嵌入中的时间步
全局时间戳嵌入(Stamp Embedding)用于给序列中每个时间步的全局时间信息分配一个向量。这些时间戳可以包括小时、分钟等,并且这些嵌入是可学习的。
综合例子
对于时间步 2 的第一个元素 ( x_6 ),它在全局序列中的位置 pos
为:
pos
=
L
x
×
(
t
−
1
)
+
i
=
5
×
(
2
−
1
)
+
1
=
6
\text{pos} = L_x \times (t-1) + i = 5 \times (2-1) + 1 = 6
pos=Lx×(t−1)+i=5×(2−1)+1=6
这里,
L
x
是每个时间步的长度,
t
是当前的时间步,
i
是时间步中的相对位置。
这里,L_x是每个时间步的长度,t 是当前的时间步,i 是时间步中的相对位置。
这里,Lx是每个时间步的长度,t是当前的时间步,i是时间步中的相对位置。
输入向量
为了将时间步的信息整合到输入向量中,我们将位置嵌入、全局时间戳嵌入和输入的标量上下文结合起来:
X t feed [ i ] = α u t i + PE ( L x × ( t − 1 ) + i , ) + ∑ p [ S E ( L x × ( t − 1 ) + i ) ] p X_t^{\text{feed}}[i] = \alpha u_t^i + \text{PE}\left(L_x \times (t-1) + i, \right) + \sum_{p} \left[ SE\left(L_x \times (t-1) + i\right) \right]_p Xtfeed[i]=αuti+PE(Lx×(t−1)+i,)+p∑[SE(Lx×(t−1)+i)]p
其中,u_t^i
是通过一维卷积投射后的向量,PE
是位置嵌入,SE
是全局时间戳嵌入,i
是时间步中的位置,t
是时间步编号,L_x
是每个时间步的长度,p
是时间戳类型。
具体例子
-
计算位置嵌入:
pos = 6 \text{pos} = 6 pos=6
PE ( 6 , 0 ) = sin ( 6 ( 2 × 10000 ) 0 / 4 ) = sin ( 6 ) \text{PE}(6, 0) = \sin\left(\frac{6}{(2 \times 10000)^{0/4}}\right) = \sin(6) PE(6,0)=sin((2×10000)0/46)=sin(6)
PE ( 6 , 1 ) = cos ( 6 ( 2 × 10000 ) 0 / 4 ) = cos ( 6 ) \text{PE}(6, 1) = \cos\left(\frac{6}{(2 \times 10000)^{0/4}}\right) = \cos(6) PE(6,1)=cos((2×10000)0/46)=cos(6)
PE ( 6 , 2 ) = sin ( 6 ( 2 × 10000 ) 2 / 4 ) = sin ( 6 100 ) \text{PE}(6, 2) = \sin\left(\frac{6}{(2 \times 10000)^{2/4}}\right) = \sin\left(\frac{6}{100}\right) PE(6,2)=sin((2×10000)2/46)=sin(1006)
PE ( 6 , 3 ) = cos ( 6 ( 2 × 10000 ) 2 / 4 ) = cos ( 6 100 ) \text{PE}(6, 3) = \cos\left(\frac{6}{(2 \times 10000)^{2/4}}\right) = \cos\left(\frac{6}{100}\right) PE(6,3)=cos((2×10000)2/46)=cos(1006) -
计算时间戳嵌入:
S E ( 6 ) = [ S E hour ( 6 ) , S E minute ( 6 ) ] SE(6) = [SE_{\text{hour}}(6), SE_{\text{minute}}(6)] SE(6)=[SEhour(6),SEminute(6)] -
标量上下文投射:
假设 ( x_6 = 0.5 ),通过一维卷积核宽度为 3:
u 6 = Conv1D ( x 5 , x 6 , x 7 ) u_6 = \text{Conv1D}(x_5, x_6, x_7) u6=Conv1D(x5,x6,x7)
最终的输入向量为:
X
t
feed
[
6
]
=
α
u
6
+
PE
(
6
)
+
∑
p
S
E
p
(
6
)
X_t^{\text{feed}}[6] = \alpha u_6 + \text{PE}(6) + \sum_{p} SE_p(6)
Xtfeed[6]=αu6+PE(6)+p∑SEp(6)
通过这种方式,我们将位置嵌入、全局时间戳嵌入和标量上下文结合起来,生成序列的输入向量,从而帮助模型更好地理解序列中的局部和全局上下文信息。