目录
文献阅读:ITtransformer——转置transformer对时间序列预测的实用性
摘要
本周阅读的文献《Inverted Transformers are Effective for Time Series Forecasting》中,提出了一种更利于时间序列预测的转置transformer模型,即iTransformer。文章作者认为Transformer并非不适合于时间序列预测任务,而是没有“正确使用”Transformer。在在保留Transformer结构的同时,通过将输入Embedding的进行转置,将每个变量的整个时间序列独立地嵌入到Token中,扩大了当地的感受野,聚合了系列的全局表示,可以更加以变量为中心。而注意力机制的使用,能够利用这些变量标记来捕获多变量相关性。同时,前馈网络可以学习每个变量标记的非线性表示,并解码以预测未来序列。
Abstract
In the literature "Inverted Transformers are Effective for Time Series Forecasting" read this week, a more favorable transposed transformer model for time series prediction, namely iTransformer, is proposed. The author of the article believes that Transformers are not unsuitable for time series prediction tasks, but rather have not been "used correctly". By transposing the input Embedding while preserving the Transformer structure, the entire time series of each variable is independently embedded into the Token, expanding the local receptive field and aggregating a series of global representations, making it more variable centric. The use of attention mechanisms can utilize these variable markers to capture multivariate correlations. Meanwhile, the feedforward network can learn the nonlinear representation of each variable label and decode it to predict future sequences.
文献阅读:ITtransformer——转置transformer对时间序列预测的实用性
Inverted Transformers are Effective for Time Series Forecastinghttps://arxiv.org/abs/2310.06625
现有问题
Transformer对时间序列的时间token进行全局依赖性建模,每个token由相同时间戳的多个变体组成。Transformer通常将同一时间戳的多个变量嵌入到无法区分的通道中,并将注意力集中在这些时间标记上以捕获时间依赖性。然而由于性能下降和计算爆炸,Transformer在预测具有较大回溯窗口的序列时面临挑战。此外,每个时间token的嵌入融合了代表潜在延迟事件和不同物理测量的多个变量,这可能无法学习以变量为中心的表征,并导致无意义的attention map。因此基于transformer的预测器结构可能不适合多变量时间序列预测,Transformer在捕获基本序列表示和描绘多元相关性方面被削弱,限制了其在不同时间序列数据上的容量和泛化能力。
transformer无法学习以变量为中心的表征,导致无意义的attention map的原因:
- 将不同序列中同一个时间点嵌入到一个时间token中,而同一时间点的点基本上代表了完全不同的物理意义,而这些点是由不一致的测量记录下来的,因此无法考虑时间序列中的多变量相关性;
- 同一时间点所代表的局部感受野和时间不一致事件过多,因此单个时间步形成的token难以揭示有益信息;
- 虽然序列变化会受到序列顺序的很大影响,但在时间维度上没有适当地采用排列不变的注意力机制;
提出方法
在不对基本组件进行任何修改的情况下,重新设计了Transformer架构,提出了转置Transformer,即iTransformer 模型,该模型将每单个序列的时间点整体独立嵌入到变量标记中,然后由注意力机制利用这些变量标记来捕获多变量相关性,同时,利用前馈网络来学习每个变量标记的非线性表示。
方法论
iTransformer的整体结构与Transformer的编码器具有相同的模块排列,舍弃了Transformer中的解码器结构。在Enbedding部分进行转置,将不同变量的原始序列独立嵌入为token,然后嵌入的变量token再通过一层多变量注意力层,以增强可解释性,揭示多变量相关性。然后采用层归一化以减少变量之间的差异。再通过前馈网络提取每个token的序列表示。
模型输入为历史观测序列数据,输出为预测数据。在多变量时间序列预测中,给定历史观测数据序列大小为(T x N),其中T为时间序列的长度,N为特征维度,而预测的序列长度为S。中间通过Embedding、TrmBlock的多层堆叠以及最后的Projection来实现对未来长度为S时间序列的预测。
将表示在第t步同时记录的时间点,表示以为索引的每个变量的整个时间序列。
iTransformer模型伪代码如下:
转置Embedding:将单个变量的整个时间序列视为一个Token
iTransformer将不同的变量分开考虑,将一个变量的整个时间序列,独立Embedding为一个token,然后再通过一个linear层进行Embedding。
LayerNorm(层归一化)
原本Transforer中的LayerNorm会对相同时间戳的变量作归一化,使得变量之间的区分度下降。同时当各个变量的时间点没有对齐时,还会产生“交互噪声”。这种每个变量的归一化还会让模型拟合过于“平滑”,使得模型无法有效地区分不同的特征或模式从而造成过拟合。
在提出iTransforer的中,归一化被应用于作为下述方程的每单个变量的级数表示,让所有变量的特征通道都处于相对统一的分布下。此外,由于所有变量的特征表示都被归一化到正态分布,由变量取值范围不同造成的差异可以减弱。
Feed-forward network(前馈网络)
传统Transformer对同一时间戳下的变量编码,形成token的同一时间戳的多个变量可能发生错位,并且过于局部化,无法揭示足够的信息用于预测。在iTransforer中,FFN被用于每个Variate Token的序列表示,可以用于复杂的时间序列。
FNN包含激活函数层和两层Conv1d(第一层是对历史时间数据编码,第二层是解码进行预测),这里的FNN是计算序列内的全局表示。通过反向块的堆叠,致力于对观测到的时间序列进行编码,并使用密集的非线性连接对未来序列的表示进行解码。
Multivariate-Attention(多变量注意力机制)
注意力图可以在一定程度上揭示变量的相关性,以前的Transformer预测器通常采用注意力机制来促进时间依赖性建模,但iTransformer模型通过转置编码将一个变量的整个系列视为一个单独的过程,因此自注意力机制就可以促进不同变量之间的依赖了。
自注意力模块全面提取时间序列表示,采用线性投影获取Q、K、V的值,计算前Softmax分数,揭示变量之间的相关性,而原本的Transformer的注意力机制中的Q和K计算的是时间序列的相关性。在Softmax加权操作中,高度相关的变量将在与其Value向量的交互中获得更大的权重,更自然地建模了多变量时序数据的关联。
研究实验
实验目的
评估提出的iTransformer在各种时间序列预测应用,验证所提出的框架的通用性,并进一步验证应用在Transformer组件上的时间序列倒维的有效性。
数据集
在实验中使用了7个真实世界的数据集,包括ECL、ETT(4个子集)、Exchange、Traffic、Autoformer使用的天气,LSTNet中提出的太阳能数据集和SCINet中评价的PEMS(4个子集)。以及市场实验(6个子集),它记录了支付宝在线交易应用程序的分钟采样服务器负载,具有数百个变量。
基线模型
选择了10个公认的预测模型作为我们的基准,包括:
(1)基于Transfomer的方法:Autoformer(2021)、FEDformer(2022)、固定(2022 )、Crossformer(2023)、PatchTST(2023);
(2)基于线性的方法:DLinear(2023)、TiDE(2023)、RLinear(2023);
(3)基于TCN的方法:SCINet(2022)、TimesNet(2023)。
实验结果
1、通过与基准模型对比实验,证明iTransformer预测高维时间序列预测能力。
将基准模型与研究模型在多个数据集上进行对比实验,多变量时间序列预测基准结果如下表所示,红色与蓝色分别表示最优与次优结果。MSE/MAE越低,预测结果越准确。从综合预测结果可以看出,与其他预测器相比,iTransformer特别擅长预测高维时间序列。作为明确捕获多变量相关性的代表,Crossformer的性能仍然低于iTransformer,这表明来自不同多变量的时间未对齐的补丁的相互作用将为预测带来不必要的噪声。因此,本地Transformer组件能够胜任时间建模和多变量相关,并且所提出的倒置架构可以有效地处理真实世界的时间序列预测场景。
2、证明提出的转置框架能够获得的性能提升
其变体来评估iTransformer,其通常解决自我注意力机制的二次复杂性,表明简单的倒置视角可以提高基于Transformer的预测器的性能,提高效率,对未知变量进行泛化,并更好地利用历史观测。提出的反转框架获得包括平均性能和相对MSE降低的性能提升。此外,由于注意力机制在我们的反向结构中的变量维度上被采用,因此具有线性复杂度的有效注意力的引入本质上解决了由于众多变量而导致的计算问题。因此,iTransformer的想法可以广泛应用于基于Transformer的预测器,以更好利用高效注意力机制。
3、验证iTransformers模型对未知变量的泛化性能
将每个数据集的变量划分到五个文件夹中,用20%的变量训练模型,并使用部分训练的模型来预测所有品种。如下图所示,每个条形图显示了所有文件夹的平均结果。CI-Transformers在推理过程中需要很长时间来逐个预测每个变量,而iTransformers直接预测所有变量,并且通常呈现较小的增加,这表明FFN能够学习可转移的时间序列表示。
Q:为什么会具有对未知变量的泛化性能?
首先,得益于输入令牌数量的灵活性,变量通道的数量不再受到限制,因此可以根据训练和推理而变化。此外,前馈网络同样适用于iTransformer中的独立变量令牌。如前所述,作为过滤器的神经元学习任何时间序列的内在模式,这些模式倾向于在不同的变量之间共享和转移。
4、验证iTransformers在扩大的回溯窗口上具有更好的性能(能给更好利用回溯窗口)
回溯长度T ∈ {48,96,192,336,720}和固定的预测长度S = 96。虽然基于Transformer的预测器的性能不一定受益于增加的回溯长度,但倒置框架使vanilla Transformer及其变体在扩大的回顾窗口上具有更好的性能。随着回溯窗口长度的增加,iTransformers 的预测性能有了显著提高。
5、验证Transformer组件的合理性
消融研究包括更换组件(Replace)和移除组件(w/o)实验,在变量维度上利用attention、在时间维度上利用前馈的 iTransformer 性能最佳。在这些设计中,原始Transformer(第三行)的性能最差,这表明传统架构与该任务的责任不匹配,揭示了传统架构的潜在风险。
研究贡献
- 反思了Transformer的架构,并提炼出普通Transformer组件对多变量时间序列的胜任能力。·
- 提出了iTransformer,该模型将独立的时间序列视为Token,通过自我关注来捕获多变量相关性,并利用层归一化和前馈网络模块来学习更好的时间序列全局表示。
- 在实验上,iTransformer在现实世界的基准测试中达到了全面的最先进水平,广泛地分析了倒置模块和架构选择,为未来改进基于transformer的预测器指明了一个有希望的方向。
模型代码
第一层:Enbedding层
iTransformer的Embedding将整个输入都做转置,将每个特征的时间序列整个作为一个Embedding的Token,故而没有了原本的Positional Embedding,就将时间序列根据不同粒度分解作x_mark,也是将各个维度的变量作整个输入变为1个Embedding Token,不再使用Temporal Embedding。
#转置之后的Enbedding层
class DataEmbedding_inverted(nn.Module):
def __init__(self, c_in, d_model, embed_type='fixed', freq='h', dropout=0.1):
super(DataEmbedding_inverted, self).__init__()
#用于设置网络中的全连接层,c_in输入维度,d_model为模型的维度
self.value_embedding = nn.Linear(c_in, d_model)
#p为保留概率,对于每个输入元素,以概率p置0
self.dropout = nn.Dropout(p=dropout)
def forward(self, x, x_mark):
#将指定的矩阵维度进行重新排序,将第1维和第2维进行互换
x = x.permute(0, 2, 1)
# x: [Batch Variate Time]
if x_mark is None:
#标记不为空则进行编码
x = self.value_embedding(x)
else:
#将协变量(如时间戳)作为标记的可能性
x = self.value_embedding(torch.cat([x, x_mark.permute(0, 2, 1)], 1))
#返回正则化后的结果
return self.dropout(x)
第二层:注意力层
将每个变量token都复制三分,通过不同的线性层分别作为Q、K、V,形状变成了[Batch Variate n_head d_model],将Q、K相乘缩放以当做相关性的度量,Softmax化后乘以Values得到不同变量之间的相关性权重,从而得到全局的Attention map。
class AttentionLayer(nn.Module):
def __init__(self, attention, d_model, n_heads, d_keys=None,
d_values=None):
super(AttentionLayer, self).__init__()
d_keys = d_keys or (d_model // n_heads)
d_values = d_values or (d_model // n_heads)
self.inner_attention = attention
#采用线性投影获取Q、K、V的值
self.query_projection = nn.Linear(d_model, d_keys * n_heads)
self.key_projection = nn.Linear(d_model, d_keys * n_heads)
self.value_projection = nn.Linear(d_model, d_values * n_heads)
self.out_projection = nn.Linear(d_values * n_heads, d_model)
self.n_heads = n_heads
#这里和Transformer中的的self-attention一样,对embedding的输出分别做3个线性转换,获得queries,keys,values
def forward(self, queries, keys, values, attn_mask, tau=None, delta=None):
B, L, _ = queries.shape
_, S, _ = keys.shape
H = self.n_heads
queries = self.query_projection(queries).view(B, L, H, -1)
keys = self.key_projection(keys).view(B, S, H, -1)
values = self.value_projection(values).view(B, S, H, -1)
out, attn = self.inner_attention(
queries,
keys,
values,
attn_mask,
tau=tau,
delta=delta
)
#将out的维度进行转换
out = out.view(B, L, -1)
return self.out_projection(out), attn
第三层:前馈神经网络
FNN包含激活函数层和两层Conv1d,第一层是对历史时间数据编码,第二层是解码进行预测。注意:这里的FNN是计算序列内的全局表示。
class FullAttention(nn.Module):
def __init__(self, mask_flag=True, factor=5, scale=None, attention_dropout=0.1, output_attention=False):
super(FullAttention, self).__init__()
self.scale = scale
self.mask_flag = mask_flag
self.output_attention = output_attention
self.dropout = nn.Dropout(attention_dropout)
def forward(self, queries, keys, values, attn_mask, tau=None, delta=None):
B, L, H, E = queries.shape
_, S, _, D = values.shape
scale = self.scale or 1. / sqrt(E)
scores = torch.einsum("blhe,bshe->bhls", queries, keys)
if self.mask_flag:
if attn_mask is None:
attn_mask = TriangularCausalMask(B, L, device=queries.device)
scores.masked_fill_(attn_mask.mask, -np.inf)
A = self.dropout(torch.softmax(scale * scores, dim=-1))
V = torch.einsum("bhls,bshd->blhd", A, values)
if self.output_attention:
return V.contiguous(), A
else:
return V.contiguous(), None
Encoder
这部分就完全和Transformer中的Encoder部分一样了,包含两层Conv1d和LayerNorm,以及一层激活函数和Dropout防止全连接层过拟合,最后将一个线性层作为decoder,得到未来n个时间段的预测值。
class EncoderLayer(nn.Module):
def __init__(self, attention, d_model, d_ff=None, dropout=0.1, activation="relu"):
super(EncoderLayer, self).__init__()
d_ff = d_ff or 4 * d_model
self.attention = attention
self.conv1 = nn.Conv1d(in_channels=d_model, out_channels=d_ff, kernel_size=1)
self.conv2 = nn.Conv1d(in_channels=d_ff, out_channels=d_model, kernel_size=1)
self.norm1 = nn.LayerNorm(d_model)
self.norm2 = nn.LayerNorm(d_model)
self.dropout = nn.Dropout(dropout)
self.activation = F.relu if activation == "relu" else F.gelu
def forward(self, x, attn_mask=None, tau=None, delta=None):
new_x, attn = self.attention(
x, x, x,
attn_mask=attn_mask,
tau=tau, delta=delta
)
x = x + self.dropout(new_x)
y = x = self.norm1(x)
y = self.dropout(self.activation(self.conv1(y.transpose(-1, 1))))
y = self.dropout(self.conv2(y).transpose(-1, 1))
return self.norm2(x + y), attn
总结
这种通过阅读文献和模型代码,学习了 2024年时间序列预测领域的最新研究成果iTransformer模型,该模型在Transformer的基础上,将独立时间序列整体作为一个token,然后可以通过self-attention捕捉(每个序列)多变量相关性,并利用层归一化和前馈网络模块学习更好的序列全局表示,以用于时间序列预测,通过实验证明该模型在真实世界基准测试中取得了全面的SOTA。