SparseTSF:Modeling Long-term Time Series Forecasting with 1k Parameters [时序必读论文]
文章目录
前言
该文章发表在 ICML 2024 (CCF A)。该文章介绍了一个及其轻量级的模型Sparse,用于长期时间序列预测。SparseTSF的核心技术是跨周期稀疏预测技术,通过解耦时间序列的周期性和趋势来简化预测任务。首先对原始序列进行降采样,专注跨周期的趋势预测,提取周期特征。
论文连接:https://arxiv.org/pdf/2405.00946
github连接:https://github.com/lss-1138/SparseTSF/blob/main/models/SparseTSF.py
一、滑动聚合
事实上在这里,论文使用的方法是对原始序列简单的卷积操作,保留更多的上下文信息。
二、下采样(Downsample)
将输入数据序列按照已知的周期w分为n个子序列,每个子序列的长度为n=[L/w],其中L为输入长度。
三、线性预测(Linear Layer)
使用线性层将长度n映射为m,其中m=[H/w],H为预测长度。
四、上采样(Upsample)
将预测到长度为w的n个子序列重新组合为一个完整的预测序列。这样使得SparseTSF能够生成与原始序列长度一致的预测结果。
五、模型部分代码
import torch
import torch.nn as nn
from layers.Embed import PositionalEmbedding
class Model(nn.Module):
def __init__(self, configs):
super(Model, self).__init__()
# 输入长度
self.seq_len = configs.seq_len
# 输出长度
self.pred_len = configs.pred_len
# 通道数,或者说为变量个数
self.enc_in = configs.enc_in
# 子序列长度
self.period_len = configs.period_len
# 输入子序列个数
self.seg_num_x = self.seq_len // self.period_len
# 输出组序列个数
self.seg_num_y = self.pred_len // self.period_len
# 滑动聚合
self.conv1d = nn.Conv1d(in_channels=1, out_channels=1, kernel_size=1 + 2 * (self.period_len // 2),
stride=1, padding=self.period_len // 2, padding_mode="zeros", bias=False)
# 线性预测
self.linear = nn.Linear(self.seg_num_x, self.seg_num_y, bias=False)
def forward(self, x):
batch_size = x.shape[0]
# 实例标准化以及转置 (Batch_size, Seq_len, Channel_num) -> (Batch_size, Channel_num, Seq_len)
seq_mean = torch.mean(x, dim=1).unsqueeze(1)
x = (x - seq_mean).permute(0, 2, 1)
# 卷积聚合以及残差连接
x = self.conv1d(x.reshape(-1, 1, self.seq_len)).reshape(-1, self.enc_in, self.seq_len) + x
# 下采样: (Batch_size, Channel_num, Seq_len) -> (B*C, Seg_num_x, period_len) -> (B*C, period_len, Seg_num_x)
x = x.reshape(-1, self.seg_num_x, self.period_len).permute(0, 2, 1)
# 线性预测 (B*C, period_len, Seg_num_x) -> (B*C, period_len, Seg_num_y)
y = self.linear(x)
# 上采样: (B*C, period_len, Seg_num_y) -> (B*C, Seg_num_y, period_len) -> (B, C, pred_len)
y = y.permute(0, 2, 1).reshape(batch_size, self.enc_in, self.pred_len)
# 转置和逆实例标准化
y = y.permute(0, 2, 1) + seq_mean
return y
六、实验效果
这里使用常用的几个数据集,在ETTh1和ETTh2这样的轻量级数据集上确实有很好的效果,但是在Electricity和Traffic这样重的数据集上,效果相比PatchTST确实有所下降,但是SparseTSF它轻呀,比FITS还轻,PatchTST多重。
总结
该论文的模型部分较为简单,简单来说是一个基于子序列的Linear预测,但是在数学上的意义比较大。