如何改良基于Basis的时间序列预测模型?
今天介绍一篇NIPS 2023中上海交大和蚂蚁集团联合发表的时间序列预测文章,基于basis的时间序列建模。目前代码已经开源,论文的详细信息如下。
论文标题:BasisFormer: Attention-based Time Series Forecasting with Learnable and Interpretable Basis
下载地址:https://arxiv.org/pdf/2310.20496v1.pdf
机构:上海交大
开源代码:https://github.com/nzl5116190/Basisformer
1.基于Basis的时序预测
在时序预测中,basis指的是从时间序列数据集中,抽取出数量较少的、整个数据集时间序列都遵循的一些子序列,数据集中每个时间序列,都可以通过这些basis的加权还原出来。这种方法,最早出现在基于矩阵分解的时间序列建模中,将时间序列分解成basis和权重乘积的形式。比如原来的时间序列维度是M*T,那么会分解成M*a、a*T两个矩阵。第一个矩阵代表每个时间序列在每个basis上的权重,第二个矩阵代表各个basis序列。后续的Nbeats等方式也是基于这类方法。
然而,之前这类基于basis的方法存在的问题是,对于basis的学习过滤简单,或者根本就不学习basis,而是直接生成相应的basis系数。这导致basis可能无法反映数据集中全部时间序列的共性信息。为了解决这个问题,上海交大的这篇文章提出一种基于对比学习预训练的basis生成方法。
2.核心结构
本文提出的BasisFormer模型的核心包含以下3个组件:
Coef Module:对于每个序列生成各个basis权重
Basis Module:生成basis
Forecast Module:生成预测结果
下面分别介绍一下这些模块的实现逻辑。
Coef Module:这部分是计算时间序列和basis之间的相关性系数,用来对basis进行融合。整体采用的是基于multi-head attention的计算方法,对于每个时间序列,计算其和各个basis之间的attention,得到attention score。每个head会计算不同的attention score,这个attention score代表时间序列和各个basis之间的相关系数,用来对basis进行加权融合。
Forecast Module:将各个head的权重系数和basis进行加权求和,得到每个head的初始预测结果。将这些结果拼接到一起后,输入一个多层MLP网络,得到最终的预测结果。
Basis Module:这个模块是本文的核心,如何学习一组良好的basis向量。这里的一个核心假设是,希望每个时间序列的basis融合权重,是随着时间固定不变的,历史的权重和未来待预测区间的权重是一致的,这样才能实现基于basis的预测。为了达成这个目标,文中采用对比学习的方式进行basis的学习。具体方法为,对于一个时间序列,将其历史已知部分和未来待预测部分,分别输入到Coef Module中,得到每个序列的basis权重,然后通过对比学习让同一个时间序列的历史序列权重和未来序列权重相近,随机负采样的权重拉远。在这个过程中,同步训练basis,让basis尽可能满足能够产生历史和未来相一致的权重向量。
这种basis的约束,在之前的工作中是没有引入的,但是其非常重要,决定了basis的有效性。之前看basis的工作,其实就有过类似的疑问,完全没有约束的情况下,历史的权重是否能泛华到未来的权重。这篇文章比较好的解决了这个问题。
3.实验效果
本文的实现效果如下表所示,对比了多元时间序列6个数据集、单变量时间序列6个数据集中,不同预测长度的效果差异,Basisformer在多个数据集上取得了效果提升。