ICLR/NeurIPS论文分享:任务通用的时序基础模型
发布时间:2024-02-28 10:37:00
大家好,我是来自清华大学软件学院的博士生吴海旭,师从龙明盛教授。非常高兴今天有机会可以跟各位专家和同行分享我们在时间序列基础模型上的研究成果。
时间序列在现实世界中无处不在,比如金融业、能源业、交通业等,当然也存在于我们的运维领域中。在时间序列领域,我们期待能够用深度学习的方法给时间序列的分析添砖加瓦,让它变得更加智能,比如像预测、缺失值填补、异常检测、分类等等,这些复杂的分析任务,在日常的运维工作之中都起到非常关键的作用。
在此之前,我们期望的是给每一个任务都训练一个匹配模型,但是在2021年的时候Foundation Model这个概念被提出来了,由此我们产生了一个想法:能不能用一个模型去完成多种分析任务,比如可以接受多模态输入,然后完成多种多样的任务。我们这次研究的主要是时间序列方面,所以具体的目标就是这个模型能不能接受时间序列,然后完成刚才提到的这4种任务(预测、缺失值填补、异常检测、分类)。
通常情况下,我们要建立一个这样的Foundation Model模型,需要很多种类的内容,比如大数据、模型结构的设计以及训练方法,只有这三方面都具备之后,我们才能够去完成一个大模型的设计。
我们实验室主要关注的是模型的设计以及训练方法的设计,今天我分享的两篇论文也是和这两方面相关的,一篇是TimesNet:任务通用的时间序列分析骨干网络;一篇是SimMTM:时间序列掩码预训练框架。
我们先介绍第一篇论文:TimesNet: Temporal 2D-Variation Modeling for General Time Series Analysis / TimesNet:任务通用的时间序列分析骨干网络。这是去年我们发表在ICLR 2023上的一篇论文。研究内容是尝试使用一个通用的Backbone去解决上述提到的时序分析的主流任务。
一般来说,通用的Backbone在视觉和NLP里面已经有非常成功的案例,比如大家所熟知的Transformer系列和ResNet等等。它们的范式都是在一个Backbone的后面加上一个领域任务特定的头部,也就是Backbone是共享的,头部是独特的。如果按照这个思路设计,那在时间序列里面的Backbone应该长什么样子呢?
我们可以对比一下图像、自然语言和时间序列有什么区别?
对于图像和自然语言来说,即使是很小的一部分,比如图像中一个局部或者语言之中的一个词,它都含有非常丰富的语义信息。但对于时间序列而言就特别不一样了,因为时间序列上的每一个小的时刻,都是只包含几个常数,信息量非常少,更多的信息其实被包含在了这个时间序列的变化之中,我们把它叫做Temporal Variations。
上图中展示出的是一个序列,有上升平稳和下降的过程,多种多样的过程混杂在一起,让时间序列的分析变得特别复杂。我们发现现实世界的时间序列往往表现出一种多周期的属性,比如说交通有天的和周的周期,天气有天的和年的周期等等,多个周期混叠在一起,让时间序列的变化变得特别复杂。于是我们决定通过一个多周期的视角,重新去分析时间序列的技术模型该怎么去做。
同时我们深入到每个周期,发现它还包括周期内和周期间的变化。周期内就是short-term的变化,是由于时间序列连续性造成的。周期间是不同周期相同相位的过程,是时间序列的一个long-term的信息,如何让模型同时捕捉周期内和周期间的属性,也是我们研究的一个重点。
基于上述两个观察,我们设计了TimesNet模型。为了建模多周期,它天然使用了A modular一种模块化的思路,把一个时间序列分解成多个周期去处理。
对于每个周期,我们想同时表示它周期内和周期间的变化,时间序列是排布在一个 1D的空间之中,它周期内的变化是连续的,周期间的变化是间隔的,这里就产生了一个难点:1D空间很难同时表现出两种不同的变化方式。
针对上述难点我们提出了一个Temporal 2D-variation的概念,也就是在二维空间之中去分析原来的1D时间序列。比如说一个周期长度是n,整个序列的长度是2n,我们就可以按照周期把它折叠。像图片中上面部分展示的那样,我们可以把一个时间序列按照周期,把它重新排序成一个二维的张量,它在每一行是不同周期同向位的过程,每一列是相同周期内的过程。
这样处理有一个好处,就是我们可以用2D的张量天然的把时间序列重新排布重新组织,能够非常方便的表示周期内和周期间的变化。
我们举个例子,图片中展示的是一个电力数据集,我们发现电力数据集有多个周期,包括Period 72、 Period 40和Period 24等等。重新排布之后,这个时间序列就变得特别的有趣了,原来的时间序列是很复杂的,现在它竟然表现出了一些locality也就是有一些局部性。这个其实很好理解,就是你和你周围的点相似,你和不同周期相同相位的点也是相似的,这样的2D locality在视觉之中是被非常重视的一种特征。
在这种思路的引导下,我们能不能用视觉之中的backbone去处理这种原始的1D的时间序列呢?这就是我们的一个核心概念,通过建模Temporal 2D-variation,可以让视觉的领域和时间序列分析的领域联合起来。
上图展示的是我们TimesNet的一个整体架构。它是模块化的,同时在二维空间之中去分析1D的时间序列。
我们提出一个标准的backbone,然后借鉴了ResNet的设计思想,只不过我们把ResBlock换成了TimesBlock。
具体的设计方法是首先在1D空间之中去学特征,然后通过FFT寻找周期,得到周期之后,把它折叠成二维的Tensor,然后用2D的Kernel去处理,最后在1D空间之中把这个特征结合起来。
我们的研究成果在Long-term Forecasting、Short-term Forecasting、Imputation、Classification、Anomaly Detection这5种任务上进行了测试,结果是非常令人兴奋的,5种任务都取得了令人满意的效果。
当然模型设计的过程是很难的,之前的模型是把一个任务完成好,现在我们这个模型可以展现出多功能的属性。
因为这是去年投稿的论文,今年已经有很多非常棒的论文新出来。希望我们这篇论文能给大家一个启发,时序模型的任务可以做的更加丰富多样。
刚才我们提到了设计方式可以让时间序列原始的1D的时间序列和视觉领域的一些前沿工作结合起来,把2D Kernel换成ConvNext(这是CV领域一个非常棒的工作)效果可以进一步的提升。但是因为我们要trade off efficiency和performance,最后我们选择了一个Inception的结构。
这个代码也开源了,我们提供了非常完整的5个任务的代码,大家可以非常方便的去测试自己的深度模型。Code is available at https://github.com/thuml/Time-Series-Library with 3000+ stars.
一个大模型不光需要结构,还需要一个训练方法。下面我继续分享另一篇我们在NeurIPS 2023上发表的论文, SimMTM: A Simple Pre-Training Framework for Masked Time-Series Modeling。
这篇论文主要研究的是时间序列的预训练任务。很多业界的前辈都有感受,时间序列实在是太多了,所以预训练任务非常重要。现在我们可以通过一个预训练的方法,把这些时间序列的知识压缩到一个深度模型之中,等我们有了新的场景之后,可以通过Fine-tuning模型把它的知识释放出来。
最近在深度学习领域有一个非常火的训练方法叫Masked Modeling(掩码重建),掩码重建思想在自然语言和CV里面被广泛使用,比如BERT或者MAE等。
最开始我们关注MAE的时候感觉非常惊艳。如果把一张图像75%的部分遮挡,得到的是左边图像的效果,然后拿一个深度模型去重建遮挡的部分。右边是重建的结果,效果非常理想。我想如果让一个人类去重建,比如重建一个花豹,大概率不如深度模型做的好。
这其实意味着可以让深度模型去记忆,通过没有被掩码的部分去想象出来它被掩码的部分应该是什么样子,逼迫深度模型去学习一些特征。
如果我们把掩码重建的思路应用到时间序列里面是否可行?答案是否定的,因为时间序列的每一个局部所包含的信息量非常少,它更多的信息是在变化之中,掩码之后这个变化就被破坏掉了。
我们做了一个简单的实验,把某个时间序列Masked的50%让深度模型去重建。图片右边的橘色线条是重建结果,蓝色线条是原始状态,通过对比可以看到重建的结果非常差。这意味着在原始的时间序列流行之中,给它Masked就相当于做一个扰动得到红色点,把它再重新投影回流行之中,这个过程其实是很困难的。
在研究的过程中我们产生了一个新的想法,能不能借助流形学习里面一个非常重要的概念Neighborhood Aggregation也就是近邻聚合的思想,不仅仅是依靠自己去重建,而是依靠身边的近邻点去重建。对于一个时间序列来说,连续对它Masked四、五次(Masked都是随机的),这四、五次时间序列之间是会有一个互相互补的信息,这样就可以让重建变得更好。当然重建不是最终目的,重建变得更好可以让模型训练得更好,最终目的是指导模型训练。
两种方法的结果对比非常明显,当用近邻聚合的方法代替原始的MAE的方法的时候,我们发现更多的信息被深度模型捕捉到了,它可以让时间序列被重建的更好。
对于一个时间序列来说,我们要做好两方面的事情,第一是重建什么?第二是怎么重建?
重建什么?
我们要做的是点级别的重建,就是一个序列还原出一个序列。我们需要一个Point-wise Representations,就是一个点级别的表征。
怎么重建?
我们的想法是把多个时间序列融合在一起,设计一个Series-wise Representations,它是一个序列级别的表征。同时获得这两个之后,我们可以在序列级别表征上去学习多个时间序列的相似度,然后基于相似度把点级别的表征给聚合起来,这样就可以完成一个重建。这个过程也天然利用了多个掩码序列之间的相似度。
另外还有一个隐式的表征,我们发现如果给它的局部信息更多了,可以在流行学习的时候,不光是学 projection的过程,还可以学习流行附近的表征,让我们的表征学习学习的更好。
我们的模型也在Forecasting和Classification两个任务上做了检验,两个任务的差别非常大,因为Forecasting需要的是一个low level的任务,Classification需要的是一个high level的表征,它分别是1D重建和高维度分类的过程。
我们也进行了领域内和跨领域的测试,跨领域是指在一个完全不一样的数据集上预训练,然后在另外一个数据集上做测试。最后SimMTM的表现还是不错的,也可以提升Fine-tuning的效果。
除此之外,我们发现这个模型预训练方法,还可以一致性的提升时间序列预测模型的效果,图片中显示的是我们选的几个比较前沿的时间序列预测模型测试结果,用我们这个方法预训练完之后,再去Fine-tuning,这些模型的效果变得更好了。
我们的模型代码也已经开源了,欢迎大家学习交流。Code is available at https://github.com/thuml/SimMTM
总结一下。
关于现在时间序列里面的Foundation Model,大家有许多的争论,到底我们应该怎么做,是以时间序列为中心,还是要引入更多模态进来,这件事情目前还是处于未定状态。我个人觉得更多的是需要我们工业界和学术界的深度联动,工业界和学术届分别发挥在数据、算力和模型设计等方面的优势,紧密合作才可以有突破。
以上就是我的分享,谢谢大家。