今天介绍一篇本周最新发表的多元时间序列预测模型SCNN。这篇文章的核心是,利用因素分解的思路将多元时间序列预测问题模块化,并得益于分解和模块化建模方法,实现多元时间序列预测的可解释性建模。
论文标题:Learning Structured Components: Towards Modular and Interpretable Multivariate Time Series Forecasting
下载地址:https://arxiv.org/pdf/2305.13036.pdf
1、基于分解的建模思路
时间序列预测中,基于分解的建模思路很常用,一般将时间序列分解成趋势项、季节项等因素,对每个因素独立建模,相比直接对复杂的混合序列建模更加容易。本文的核心思路也是分解,将多元时间序列分解成长周期项、短周期项目、季节项、序列间相关性项等4个因素分别建模。文中假设整个多元时间序列的生成由下面4个等式而来,其中Z0是原始多元序列的表示,它可以拆解为上述4个模块,每个模块由一个scale因子和一个location因子定义:
下面的问题就是如何提取各个模块的scale和location,文中的做法如下:
长周期项——使用一个较大的滑动窗口,计算窗口内的均值和方差,作为scale和factor;
短周期项——和长周期项计算方法相同,但是会使用一个较小的滑动窗口,防止短期信息被平滑掉;
季节项——可以通过傅里叶变换提取,文中增加一个简化假设,季节性的周期长度不变,因此直接采用了窗口统计的方法;
序列相关性项——多元序列比单元序列需要多考虑各个序列之间的关系这一项,文中attention计算两两序列相关性打分,利用该打分计算你scale和factor。
2、主体模型结构
基于上述4个分解模块,模型的主体结构如下图,包括Encoder和Decodeer两个部分。Encoder对4个模块的信息进行编码,Decoder对4个模块的信息进行外推预测,并产出预测结构。
通过4个模块分别提取相应的表征和scale、location等factor后,将这4个模块的信息拼接到一起,对应图中的Zn和Hn。各个模块的提取过程按照第一节中的多元时间序列生成假设来,对于原始序列,先抽取长周期模块的scale和location,去掉长周期信息后的表示,再输入到下一个组件抽取季节模块,以此类推顺序的进行抽取。4个模块抽取后剩余的序列,认为是残差部分。
在Fusion层,使用1维卷积对各个模块的信息做融合。
在各个模块的预测过程中,针对4个模块的特点分别采用不同的预测方法。对于长周期模块和季节性模块,在未来一段时间内的变化不大,因此可以直接使用长期模块和季节模块学到的scale和location factor进行预测。例如长期模块未来的值可以是观测序列最后一个值对应的结果;而季节性模块可以根据前文设置的周期窗口长度进行平移(如下图中的前两行)。
而对于残差项、短期项和序列相关性项,它们的变化波动很大,不像前文中长周期模块和季节性模块这么稳定容易预测。文中采用的方法是,学习一个DNN网络,对历史一个窗口内相应模块的表示向量、scale、location等信息进行映射,预测未来时刻的相应信息:
在得到各个模块未来的预测结果后,仍然使用一维卷积进行各个模块特征的融合,得到最终的预测结果。
3、损失函数
文中的损失函数采用极大似然估计,每个时刻预测均值和方差,方差接一个softplus保证值为正,使用极大似然损失进行优化:
由于在模型底层,4个主要模块可能被分解的不干净,导致残差部分保留了一部分4个模块没分解出去的信息,直接学习会导致模型给残差部分一个较高的权重,影响模型效果。为了解决这个问题,文中采用了另一个分支,对残差部分完全mask,也产出一个预测结果。两个分支的预测结果加权求和进行优化。
4、实验效果
本文在多个数据集上,对比了各类多元时间序列预测模型的效果,包括单元序列模型、时空预测模型等。从效果上来看,本文提出的方法效果提升程度非常明显,基本在5%以上。
从case上,本文也进行了分析,本文的模型能够取得比较平稳准确的预测效果。