轻量化的长时间序列预测模型


✨✨ 欢迎大家来访Srlua的博文(づ ̄3 ̄)づ╭❤~✨✨

🌟🌟 欢迎各位亲爱的读者,感谢你们抽出宝贵的时间来阅读我的文章。

我是Srlua小谢,在这里我会分享我的知识和经验。🎥

希望在这里,我们能一起探索IT世界的奥妙,提升我们的技能。🔮

记得先点赞👍后阅读哦~ 👏👏

📘📚 所属专栏:传知代码论文复现

欢迎访问我的主页:Srlua小谢 获取更多信息和资源。✨✨🌙🌙

​​

​​

目录

概述

SparseTSF模型

交叉周期稀疏预测

归一化

损失函数

代码解读

实验

实验结果分析

总结


本文所有资源均可在该地址处获取。

准确的预测可以帮助决策者进行前瞻性规划。通常,为了实现精确的预测,需要依赖强大而复杂的深度学习模型,例如递归神经网络(RNNs)、时间卷积网络(TCNs)和Transformer模型。

近年来,长期时间序列预测(LTSF)引起了越来越多的关注,它要求模型能够提供更长的预测视野以支持高级规划。然而,更长的预测视野也带来了更大的不确定性,这要求模型能够从更长的历史窗口中提取更广泛的时间依赖性。

因此,模型变得更加复杂,以捕捉这些长期的时间依赖性。例如,基于Transformer的模型通常有数百万甚至数千万个参数,这限制了它们在计算资源受限的场景中的实用性。本文解读的文章是《SparseTSF: Modeling Long-term Time Series Forecasting with 1k Parameters》,这篇文章已被ICML 2024接受为Oral文章,SparseTSF是一种新型轻量级长期时间序列预测模型,使用不到1k参数,通过交叉周期稀疏预测技术,在保持低计算资源需求的同时,达到SOTA性能。

概述

准确进行长期时间序列预测的基础在于数据的固有周期性和趋势。例如,家庭电力消耗的长期预测,因为这类数据中存在清晰日常和每周的模式。文章提出了一种新的设计轻量级LTSF模型的视角,即通过分解和转换原始序列的周期性和趋势,将周期模式转换为子序列间的动态,而趋势模式则重新解释为子序列内的特征。

SparseTSF模型采用了交叉周期稀疏预测技术,通过下采样原始序列来专注于跨周期趋势预测,有效地提取周期特征,同时最小化模型的复杂性和参数数量。SparseTSF模型使用不到1k个参数,如下图,与现有模型相比,在参数规模上小了一到四个数量级,并且实现了接近SOTA的效果。

SparseTSF模型

LTSF的目标是使用历史观测窗口LL长度的多变量时间序列数据来预测未来HH长度的时间序列。这可以形式化为:

xˉt+1:t+H=f(xt−L+1:t)xˉt+1:t+H​=f(xt−L+1:t​)

其中,xt−L+1:t∈RL×Cxt−L+1:t​∈RL×C和 xˉt+1:t+H∈RH×Cxˉt+1:t+H​∈RH×C。这里,CC 是不同特征或通道的数量。

在处理多变量时间序列数据时,我们通常使用通道独立策略,即通过关注数据集中的单个单变量时间序列来简化预测过程。这种方法为每个单变量序列找到一个共享的函数,减少了考虑通道间关系的复杂性。

SparseTSF模型基于交叉周期稀疏预测技术,这一技术是SparseTSF的核心,通过下采样原始序列结合通道独立策略来专注于跨周期趋势预测,有效地提取周期特征,同时最小化模型的复杂性和参数数量。

交叉周期稀疏预测

假设时间序列xt−L+1:t(i)xt−L+1:t(i)​具有已知的周期性ww,首先将原始序列下采样成 ww 个子序列,每个子序列的长度为 n=⌊Lw⌋n=⌊wL​⌋。然后,对这些子序列进行预测。预测后,将 ww 个子序列上采样回完整的预测序列,每个子序列的长度为 m=⌊Hw⌋m=⌊wH​⌋。

交叉周期稀疏预测通过以下步骤简化预测任务:

  • 下采样:将具有固定周期性的数据序列下采样成子序列。例如,如果数据具有日周期性,可以将每天的数据下采样成一个数据点,形成一个新的子序列。具体操作为,将原始序列重塑为 n×wn×w 的矩阵,然后转置。
  • 稀疏滑动预测:对每个下采样的子序列进行趋势预测。这一步骤将原始的时间序列预测任务转化为跨周期趋势预测任务。具体操作为,在矩阵的最后一个维度上应用线性层,得到 w×mw×m 的矩阵。
  • 上采样:将预测出的子序列结果上采样回原始序列的长度,以得到完整的预测序列。具体操作为,转置 w×mw×m 矩阵并重塑为长度为 HH 的完整预测序列。

但由于每个周期只利用一个数据点进行预测,忽略了其余数据点,导致预测过程中信息丢失,进而准确率下降,同时预测过程会受到下采样时的可能出现的极值影响,导致预测结果出现大幅的偏移。

为了解决信息丢失和异常值影响放大的问题,文章还提出了在执行稀疏预测之前对原始序列进行滑动聚合的方法。每个聚合的数据点包含其周围周期内的其他点的信息,这有助于解决信息丢失问题。此外,由于聚合值是周围点的加权平均值,它减轻了异常值的影响。

由上图所示,SparseTSF可以被看作是一个稀疏连接的线性层,在各个时段执行滑动预测。按照通道独立策略,将原始数据的batchsize××时间序列××特征(即输出变量)维度调整为batchsize××特征××时间序列维度,这样滑动聚合就可直接通过应用一维卷积来实现,稀疏预测过程则直接简单使用线性层或MLP实现。

归一化

为了解决训练和测试数据集之间的分布偏移问题,文章采用了简单的归一化策略。具体来说,在模型输入前减去序列的均值,并在模型输出后加回。这个过程可以减少模型对数据分布变化的敏感性。

损失函数

SparseTSF模型采用均方误差(MSE)作为损失函数,以衡量预测值和实际值之间的差异。损失函数定义为:

L=1C∑i=1C∥yt+1:t+H(i)−xˉt+1:t+H(i)∥2L=C1​i=1∑C​∥∥∥∥​yt+1:t+H(i)​−xˉt+1:t+H(i)​∥∥∥∥​2

代码解读

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__()

        # 从 configs 中获取参数
        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.d_model = configs.d_model  # 模型维度
        self.model_type = configs.model_type # 模型类型
        assert self.model_type in ['linear', 'mlp']

        # 计算下采样后的序列长度(seg_num_x)和预测序列长度(seg_num_y)
        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)

        # 根据 model_type 初始化线性层或多层感知机
        if self.model_type == 'linear':
            self.linear = nn.Linear(self.seg_num_x, self.seg_num_y, bias=False)
        elif self.model_type == 'mlp':
            self.mlp = nn.Sequential(
                nn.Linear(self.seg_num_x, self.d_model),
                nn.ReLU(),
                nn.Linear(self.d_model, self.seg_num_y)
            )


    # 定义前向传播函数 forward
    def forward(self, x):
        batch_size = x.shape[0]
        # 归一化     b,s,c -> b,c,s
        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

        # 对数据进行下采样: b,c,s -> bc,n,w -> bc,w,n
        x = x.reshape(-1, self.seg_num_x, self.period_len).permute(0, 2, 1)

        # 根据模型类型,使用线性层或多层感知机进行稀疏预测
        if self.model_type == 'linear':
            y = self.linear(x)  # bc,w,m
        elif self.model_type == 'mlp':
            y = self.mlp(x)

        # 对预测结果进行上采样: bc,w,m -> bc,m,w -> b,c,s
        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

实验

我们的实验部署配置如下:
GPU 4090D
Ubuntu 20.04
PyTorch 2.1.0
Python 3.10
Cuda 12.1

为便于讲解和对比实验效果,这里我们选取ETTh1(变压器温度)和Electricity(电力消耗)两个数据集作为示例。在模型训练过程中,对于不同的几个数据集,选取96、192、336、720四个预测时间长度进行测试,并且同时对不同的预测模块线性层和MLP分别进行测试,模型均在8-15个epoch左右进入了earlystop,收敛速度较快。

对于使用线性层的情况,计算测试集的MSE,得到下面的复现结果:

ETTh1Electricity
9619233672096192336720
论文结果0.3590.3970.4040.4170.1380.1460.1640.203
复现结果0.3620.4040.4350.4260.1390.1510.1660.207

与论文中的结果对比,MSE整体增大约2.5%,模型保持了较好的效果。我们随机选择测试集中的数据进行可视化,观察预测结果和GroundTruth之间的差异。下图依次为Electricity数据集测试集中预测长度为96、192、336、720的预测结果。

当预测长度较小时,预测结果几乎完全和GroundTruth重合,但随着预测长度的增加,预测结果出现了相对较大的偏差,特别是在预测长度为720时,模型并没有预测到出现的极值,而是重复相同的周期。

而对于ETTh1这种周期性并不显著的数据集,模型的预测效果则出现了预测结果与实际数据的趋势完全相反的情况,下图依次为预测长度为96、720的预测结果。

不难看出,SparseTSF对于周期性明显的数据,可以很好的捕获其周期性,得到比较平稳的预测,而对于不具有显著周期性的数据,模型难以找到有效的模式来进行准确预测。

SparseTSF模型在设计时,通过按周期降采样的策略,强调了对周期性特征的提取和利用,数据本身的周期性特征在被分解并转换为子序列之后,实际上已经被明确地提取出来,因此模型无需再对这些周期性特征进行建模。这样,模型的重点就可以转移到预测子序列之间的长期趋势变化上。简而言之,模型的核心任务从捕捉周期性转变为分析和预测跨周期的趋势动态。在周期性明显的数据集上,模型能够利用这些趋势特征进行有效预测。但在周期性不明显或复杂的数据集上,模型无法找到稳定的模式,导致预测效果不佳。

对于使用MLP的情况,计算测试集的MSE,得到下面的复现结果:

ETTh1Electricity
9619233672096192336720
论文结果0.3590.3970.4040.4170.1380.1460.1640.203
复现结果0.3720.4120.4440.4990.1340.1480.1650.202

与论文中的结果对比,MSE整体增大约4%,与使用线性层的实验结果相比,Electricity数据集的MSE在不同长度的预测下均略有减小,而ETTh1数据集则有较大幅度的增大。这表明MLP这种更复杂的预测模块有助于学习下采样后的子序列之间的相关关系,并对子序列进行跨周期趋势建模,从而做出更准确的预测结果。

实验结果分析

下表展示了SparseTSF与其他基线模型的性能比较。SparseTSF在所有情况下都排名前两位,以显著较小的参数规模达到或接近最先进的预测水平。SparseTSF的结果的标准差也非常小,表明模型的鲁棒性。

下表展示了SparseTSF与其他主流模型在Electricity数据集上的静态和运行时指标比较,包括模型参数、MACs(乘累加操作数)、最大内存使用量和每个epoch的训练时间。SparseTSF在这些指标上显著优于其他模型。

为分析超参数ww对SparseTSF模型预测性能的影响,论文在ETTh1数据集上,使用不同的ww值进行实验,观察模型性能的变化。下表显示,当ww设置为数据的内在主周期时,SparseTSF模型的性能最佳。当ww与数据的主周期不一致时,性能略有下降。

下图通过可视化模型的权重分布,揭示了两种模型在提取时间序列数据周期特征方面的能力。X轴代表输入序列的时间步长。Y轴代表预测序列的时间步长。颜色代表权重的大小,颜色越深表示权重的绝对值越大。

在图a中,线性模型学习到的权重分布呈现出较为均匀的条纹状模式。这些条纹代表了模型从数据中提取的周期性特征。图b展示了SparseTSF模型学习到的权重分布。与线性模型相比,SparseTSF模型的权重分布呈现出更明显、更密集的等间距条纹。这表明SparseTSF模型在提取周期特征方面更为有效,能够更准确地捕捉时间序列数据中的周期性模式。这是因为SparseTSF的按周期ww降采样后预测的策略,给了模型一种更有效的利用时序数据周期特性的bias。

总结

SparseTSF模型在长期时间序列预测领域具有显著的优势,尤其是在处理具有明显周期性的数据集时。模型通过其创新的交叉周期稀疏预测技术,能够有效地提取时间序列数据中的周期性特征,并以极小的参数量实现了与现有先进模型相媲美的预测性能。

实验结果表明,SparseTSF在短周期预测中与真实数据的拟合度很高,但在长周期预测中出现了一定的偏差,尤其是在预测极值时。对于周期性不明显的数据集,SparseTSF的预测效果不佳,这表明模型在捕捉非周期性模式方面存在局限性。

尽管如此,SparseTSF在资源受限的环境中仍然具有很高的应用价值,因为它在保持较小计算成本的同时,提供了相对准确的预测结果。

我们在附件中提供了数据集和训练好的模型,为便于直观地观察模型的预测效果,我们增加了预测结果的可视化部分,并且修改了代码为可以一键运行,读者也可以使用自己的数据集进行训练和测试。

​​

希望对你有帮助!加油!

若您认为本文内容有益,请不吝赐予赞同并订阅,以便持续接收有价值的信息。衷心感谢您的关注和支持!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值