摘要
现在Transformer在时间序列预测上发挥巨大作用,但对于非平稳的现实时间序列表现并不好。之前的一些研究着重在于将时间序列平稳化,这样的方法减弱了对突发事件的预测,同时在时间序列预测方面的效果下降。本文称之为过度平稳化(over-stationarization),即Transformer对于不同的时间序列产生了相似的Attention,减弱了模型预测能力。针对这种现象,本文进而提出了Non-stationary Transformers框架,其中包含两个模块:
分别是序列平稳化模块(Series Stationarization)以及逆平稳化模块(De-stationary Attention)。序列平稳化模块之中,本文将模块输入的数据的统计量与模块输出结合。逆平稳化模块则设计为从不同时间序列中习得不同Attention,利用这些Attention恢复时间序列固有的非平稳性。
时间序列的非平稳性:时间序列的统计特征和联合分布随着时间变化而变化,非平稳性使得时间序列更加不可预测。
上图为三段不平稳时间序列的Attention的可视化图。我们可以看到在本文的模型中,不平稳时间序列的Attention能够产生明显的差异,说明不平稳时间序列本身的固有属性能够帮助我们进行预测。而Over stationarization问题就是将时间序列平稳化,而没有利用到非平稳序列的固有属性。
本文贡献
- 发现了非平稳时间序列的预测能力,以及现有平稳化方法造成的过平稳化问题。
- 提出了Non-stationary Transformers 避免过平稳化的现象。
- Non-stationary Transformers 在六个基准上,超过了四个现今主流的Transformer模型。
Non-stationary Transformers
1 Series Stationarization
1.1 Normalization module
class MyDataset(Dataset):
...
def __getitem__(self,index):
s_begin = index
#其中S就是seq_len
s_end = s_begin + self.seq_len
# seq_x[0,0]的长度为C
seq_x = self.data_x[s_begin:s_end]
seq_y = self.data_y[s_begin:s_end]
return(seq_x,seq_y)
通过移动窗口的方式得 S S S长度的序列,每个序列具有 C C C长度的特征。
μ x = 1 S ∑ i = 1 S x i , σ x 2 = 1 S ∑ i = 1 S ( x i − μ x ) 2 , x i ′ = 1 σ x ⊙ ( x i − μ x ) \mu_x = \frac{1}{S}\sum_{i=1}^{S}x_i,\sigma_x^2 = \frac{1}{S}\sum_{i=1}^{S}(x_i-\mu_x)^2,x_i^{'}=\frac{1}{\sigma_x} \odot(x_i-\mu_x) μx=S1i=1∑Sxi,σx2=S1i=1∑S(xi−μx)2,xi′=σx1⊙(xi−μx)
其中 x = [ x 1 , x 2 , . . . , x S ] T ∈ R S × C , x ′ = [ x 1 ′ , x 2 ′ , . . . , x S ′ ] T ∈ R S × C x=[x_1,x_2,...,x_S]^{T} \in\mathbb R^{S\times C},x^{'}=[x_1^{'},x_2^{'},...,x_S^{'}]^{T} \in\mathbb R^{S\times C} x=[x1,x2,...,xS]T∈RS×C,x′=[x1′,x2′,...,xS′]T∈RS×C, S S S 和 C C C 分别是序列的长度和变量个数。
1.2 De-normalization module
在经过整个模型 H H H后,可以得到O长度的向量 y ′ = [ y 1 ′ , y 2 ′ , . . . , y O ′ ] y^{'} = [y_1^{'},y_2^{'},...,y_O^{'}] y′=[y1′,y