时间序列预测的新老baseline——deepar和temporal fusion transformer(待续)
- 2021 年 6 月 22 日
- AI
DEEPAR部分
deepar这篇论文的亮点不仅在于提出了新的模型结构,许多关于时序预测的见解也很具有启发性,下面是对论文的阅读笔记和思考:
1、
在现实世界的预测问题中,试图共同学习多个时间序列时经常遇到的一个挑战是,时间序列的数量级差异很大,而且数量级的分布具有很强的倾斜性。这个问题如图1所示,图中显示了亚马逊销售的数百万件商品的销售速度(即平均每周销售一件商品)的分布情况。分布在几个数量级上,近似幂律。

据我们所知,这一发现是新的(尽管可能并不令人惊讶),并且对试图从这些数据集学习全局模型的预测方法具有基本意义。由于该分布的无标度特性,很难将数据集划分为具有一定速度带的时间序列子组,并为它们学习单独的模型,因为每个速度子组都会有相似的偏态。此外,基于分组的正则化方案,比如Chapados[4]提出的方案,可能会失败,因为每个分组的速度将有很大的不同。最后,这种偏态分布使得使用某些常用的标准化技术,如输入标准化或批标准化[14],效果较差。
这里说的是最常见的多序列预测问题,web traffic,rossman store forecasting等比赛以及电商的商品销量预测的都是典型的多序列预测问题,不同商品的base level(时序数据四分量之一)差异很大,整体也呈现幂律分布,常规标准化处理无效,因为常规的标准化基于全局的统计特征无法改变不同商品之间的相对大小关系,使得不同商品的base level差异仍旧很大,冷门商品的销量和热门商品的销量相差成千上万倍,这导致输入数据的量纲差异极大(一般基本是做分组标准化),即不同的商品自己内部做标准化,从而使得不同商品的序列数据具有可比性。
2、模型说明部分
为了便于说明,这里我们以电商销量预测的问题为例:
问题定义:

其中:

表示已知的,从时刻1~时刻t0 -1的商品的销量数据

表示从时刻1到时刻T的所有的协变量,这里需要说明,我们假设[1, t0− 1]为已知销量的时间区间,[t0, T]为我们需要预测的时间区间,而Xi,1:T是横跨了[1, t0− 1]和[t0, T]两个时间区间的,这意味着X 必然是 静态特征(例如商品的大类,商品所在的省,城市或商品的历史销量的统计值)或者是可以推断的动态特征,time varying known features,例如月份,年份,随着时间变化,但是他们未来的值是可以直接推算出来的,而销量这种数据属于不可推断的动态特征(同时也是标签),即time varying unknown features。

模型结构图如上,在理解上图之前,需要了解两个背景知识:
1、时间序列预测中的自回归模型:时间序列预测中进行自回归式的预测本质上是把多步预测转化为多个递归式的单步预测,一个典型的例子就是基于RNN的seq2seq结构。seq2seq的结构有两种形式:

简单的seq2seq的结构是无法使用预测的数据的特征,仅仅是将t时刻的隐层输出作为decoder部分的共同输入。

实际上上图的seq2seq结构才算是在做真正意义上的自回归,t+1时刻的预测结果被用于帮助预测t+2时刻的结果,t+2时刻的预测结果被用于帮助预测t+3时刻的结果。
当然,在这个过程中,外生变量是可以放进来的,假设我们的encoder部分的输入的序列数据是[5,4,3,2,1,0]对应t-5到t,外生变量是[a5,b5,c5]….[a0,b0,c0],则encoder部分的输入数据的形式就是[5,a5,b5,c5]…..[0,a0,b0,c0],decoder部分的初始输入是t时刻的特征即[0,a0,b0,c0],我们在decoder的t时刻部分产生了t+1时刻的预测 t+1_pred,然后我们将t+1_pred和t+1时刻的可推断特征(例如城市,省份,店铺,品类,月份,星期等)合并得到了[t+1_pred,a-1,b-1,c-1],作为t+2时刻的输入特征帮助预测t+2,依次类推。
由于这种递归式的训练很容易产生误差累积的问题,即如果t+1的预测误差大,则后续的decoder都是在错误的预测结果上继续训练的,所以更常见的训练方式是使用teacher forcing:

decoder的时候直接使用真实的值帮助模型训练。
而常规的LSTM是直接做的向量输出:

seq2seq式的encoder-decoder结构相对于LSTM这样单一的encoder的结构有两个好处:
1、’seq2seq可以支持不定长的输入和输出,而单一的encoder结构只能支持不定长输入无法支持不定长的输出,因为单一的encoder结构最终是通过一个固定的dense层完成预测任务的,dense层的size是固定不变的;
2、seq2seq的训练过程可以使用到未来的特征,当然这些特征必须是可以推断的(前面描述过过了),这可能可以帮助模型更好的学习。
deepar的模型结构介于常规的RNN和基于RNN的seq2seq之间,这在原文中提到了:

即deepar中,encoder和decoder使用的是同一个RNN模型,这个RNN模型就是常规意义上的RNN模型,可以是单层的LSTM或多层的LSTM。
那么deepar的模型是怎么训练的?和使用teacher forcing的seq2seq一样,deepar的训练和预测过程是不一样的,基于teacher forcing训练策略的seq2seq训练的时候用到了真实的标签,但是预测的时候我们是没有真实标签可用的,因此这类seq2seq预测的行为退化为了普通的recursive seq2seq:

在代码实现上也比较麻烦,我们需要手动写decoder部分的循环(不知道有没有什么方便的开源可以实现这个功能,没有找过)

deepar的训练过程如上,其实去掉中间的

部分,deepar看起来就是一个LSTM,为了方便描述,中间部分暂时先不考虑,看一下deepar的输入和输出是什么
输入部分:Xi(t-1),即t-1时刻的外生变量,即可推断的特征,比如前面说过的城市,省份,店铺,品类,月份,星期等,Zi(t-2),即t-2时刻的标签,比如商品的销量(也就是我们想要预测的目标),通过一个RNN cell得到 t-1时刻的表征,然后接一个dense(1)的层得到Zi(t-2),依次类推。其中t-1,t和t+1都是我们需要预测的标签,和teacher forcing seq2seq一样,训练的过程中,待预测的标签被放进来用于模型训练了。
然后在预测阶段:

和recursive seq2seq一样,进行迭代预测,这种预测方式可以预测无限长的序列,只不过当预测的序列变长之后精度往往很差,这也是时序预测问题的一个挑战,长时序的预测如何保证精度的问题,和本文无关,不废话。
2、

当然deepar没这么简单,deepar的设计本身不是针对点预测,而是针对概率预测的。
这又涉及到频率派和贝叶斯学派之争,我们还需要了解一下贝叶斯机器学习和深度学习的一些背景知识,即如何用模型来完成对概率分布的预测。