【Paper】DeepAR
wangzf / 2023-03-10
论文简介
- 题目:DeepAR: Probabilistic Forecasting with Autoregressive Recurrent Networks
- 作者:亚马逊
- 代码:https://github.com/husnejahan/DeepAR-pytorch
- 简介:一种使用自回归 RNN 预测时序分布的模型 DeepAR, 它有效解决了多时序间尺度不一致问题,并基于数据特征选择似然函数预测时序概率分布。
历史研究和瓶颈
很多时候我们需要的并不是预测单条或少量的时间序列,而是要预测成千上万条时间序列, 例如对于 Amazon 来说,想预测它提供的各种产品的需求量。
- 一方面,如果用传统的方法如 ARIMA 模型一条条去建模预测的话会费时费力, 那我们能否利用与某条时间序列类似的、相关的时间序列来辅助进行预测,从而节约时间和成本呢?
- 另一方面,在进行时间序列预测时,我们不仅仅需要未来时刻的一个点预测值,还需要一个预测概率。 以商品销量为例,如果能告诉商家,下个月某产品的销量在 150~200 之间的概率超过 80%, 显然比只提供某一个月销量的预测值更有意义。因此如果能提供概率预测,将能更好地满足现实需求。
此外,碰到大量时间序列数据需要建模预测时,常见的方法是通过人工分组的方式, 将量级相同的时间序列看作一组,然后分组拟合模型提供预测。 但是如果不同时间序列的量级相差很大时,分组将需要耗费大量的人工操作。 例如,下图显示了亚马逊的数百万件商品平均每周销量的分布, 可以明显看到不同商品的周销量近似服从幂律分布,有的商品销量非常高,但是有的商品销量很低。 对于这种百万数量级的时间序列进行人工分组,无疑工作量巨大。
有时,多条时间序列的幅度差异很大, 而且幅度分布可能强烈有偏(skew distribution)。由于幅度难找到分组标准,导致时序很难被分组建模。 历史有些 Normalization 做法,例如输入标准化或 Batch Normalizaiton,但效率不高。
比如,下图的销售量和销售额的幂律函数(一个量的相对变化会导致另一个量的相应幂次比例的变化)的双对数形式, 就有长尾表现:

论文贡献
DeepAR 提出一种方法解决时序幅度分布大的算法框架。相比于传统模型,DeepAR 的好处:
- 引入协变量,通过学习季节性行为以及时间序列与协变量的依赖关系。减少人工特征工程去挖掘负责的组间依赖行为;
- 使用蒙特卡洛采样能估计未来概率分布的分位数,提供概率预测;
- 通过学习相似走势,为历史数据量较少或根本没有历史数据的个体进行未来预测;
- 噪声并不限制为高斯噪声,允许用户选择一个适合数据统计属性的噪声分布;
- 允许基于数据统计性质,选择不同的似然函数。
DeepAR 的主要特色是:预测未来时序的分布和处理多条序列之间振幅对模型的影响,从而提高准确性。
模型定义
如果一句话概括 DeepAR, 可以认为它是一个基于循环神经网络并能同时处理多条时间序列,
并以概率分布的方式提供预测的预测模型。
用 $z_{i,t}$ 表示第 $i$ 条时间序列在时刻 $t$ 的取值,目标是建立如下条件分布模型:
$$P(\mathbb{z}_{i,t_{0}:T}|\mathbb{z}_{i,1:t_{0}-1}, \mathbb{x}_{i,1:T})$$
其中:
$i$为时序 id$t_{0}$为训练集和测试集的分割时间点,表示第一个需要预测的时刻;$\mathbb{x}_{i, 1:T}$是时序的协变量。协变量要求已知,它可以是时间相关的,比如哪一年的第几个星期; 也可以是与建模对象相关的,比如家庭用电量的每户家庭常住人口; 还可以是与时间和建模对象都相关的,比如商品月销量数据对应的月份是否开展过促销活动。$\mathbb{z}_{i,1:t_{0}-1} := [\mathbb{z}_{i,1}, \mathbb{z}_{i,2},\cdots,\mathbb{z}_{i,t_{0}-1}]$是 condition range(历史 1 到$t_{0}-1$)的目标值$\mathbb{z}_{i, t_{0}:T} := [\mathbb{z}_{i,t_{0}}, \mathbb{z}_{i,t_{0}+1},\cdots,\mathbb{z}_{i,T}]$是 prediction range(未来$t_{0}$到$T$时期)的目标值
给定时序 $z_{i,t}$ 过去 $t_{0}-1$ 个时刻的观测值 $\mathbb{z}_{i,1:t_{0}-1}$,
以及协变量 $x_{i, 1:T}$,我们想知道时间序列从 $t_{0}$ 到 $T$ 时刻的取值的概率。
DeepAR 的模型是自回归循环网络(autoregressive recurrent network)结构, 下图是 DeepAR 的 Encoder 和 Decoder(共享模型结构和参数):

上图左边是训练过程,右边是预测过程,结构大致相同,唯一区别是预测阶段由于没有对应点的观察值, 需要把上一个时刻的预测值作为下一个时刻的输入值。
在上述过程中,$h_{i,t} = \varphi(h_{i,t-1}, z_{i,t-1}, x_{i,t})$ 表示网络的隐藏状态,
$\varphi$ 是由具有 LSTM 单元的多层递归神经网络实现的函数。
$h_{i,0}$ 初始化为 0,$z_{i,0}$ 也初始化为 0。可以看到,这个模型是自回归的,
这表现在 $h_{i,t-1}$ 与 $h_{i,t}$ 有关,$z_{i,t}$ 也与 $z_{i,t-1}$ 有关。
DeepAR 假设:
$$\begin{align}
P_{\theta}(z_{i,t_{0}:T} | z_{i,1:t_{0}-1}, x_{i,1:T})
&= \prod_{t=t_{0}}^{T}P_{\theta}(z_{i,t}|z_{i,1:t-1}, x_{i,1:T}) \\
&= \prod_{t=t_{0}}^{T}l(z_{i,t} | \theta(h_{i,t}, \Theta))
\end{align}$$
即认为,每个时刻的数据都服从某种类型的分布,
当参数 $\theta$ 由网络输出 $h_{i,t}$ 的函数 $\theta(h_{i,t}, \theta)$ 给出后,
似然函数 $l(z_{i,t} | \theta(h_{i,t}, \theta))$ 就对应一个参数为 $\theta$ 的固定分布中取值为 $z_{i,t}$ 的概率或者概率密度。这个分布的选取要求匹配数据的统计学性质,文章中选择了两种分布:
-
对于连续型数据,比如居民用电量,可以认为它来自正态分布。 当确定正态分布后,只需要给出均值
$\mu$和方差$\sigma^{2}$即:$$\mu(h_{i,t}) = w_{\mu}^{T}h_{i,t} + b_{\mu}\sigma(h_{i,t}) = ln(1+\text{exp}(w_{\sigma}^{T}h_{i,t} + b_{\sigma}))$$进一步可以写出此时的似然函数为:
$$l_{\text{Norm}}(z_{i,t}|\theta(h_{i,t})) = (2 \pi \sigma^{2})^{-\frac{1}{2}} \text{exp}(-(z_{i,t}-\mu)^{2} / (2\sigma^{2}))$$ -
对于计数型数据,比如商品销量这种非负整数值序列,可以认为它服从负二项分布。 假设负二项分布为:
$X \sim \text{NB}(r,p)$,$r$为正整数,即伯努利试验第$r$次成功前失败的次数,$p$为每次伯努利试验的成功概率。因此有$E(X) = \frac{r(1-p)}{p}$,$\text{Var}(X)=\frac{r(1-p)^{2}}{p}$。 对于$k=0,1,2,\cdots$,可以写出$X$的概率为:$P(X = k)=C_{r+k-1}^{k}p^{r}(1-p)^{k}$。 文章通过给出均值$\mu$和“形状参数”$\alpha$来确定负二项分布。其中:$$\mu(h_{i,t}) = \text{ln}(1+\text{exp}(w_{\mu}^{T} h_{i,t} + b_{\mu}))$$$$\alpha(h_{i,t}) = \text{ln}(1+\text{exp}(w_{\alpha}^{T}h_{i,t} + b_{\alpha}))$$
为什么选择 $\alpha$ 这个参数?文中解释是实验发现,相对而言这个参数收敛很快。
进一步可以得到此时的似然函数为:
$$l_{\text{NB}}(z_{i,t} | \theta(h_{i,t})) = \frac{\Gamma(z_{i,t} + \frac{1}{\alpha})}{\Gamma(z_{i,t} + 1)\Gamma(\frac{1}{\alpha})}\Big(\frac{1}{1+\alpha\mu}\Big)^{1/ \alpha}\Big(\frac{\alpha \mu}{1+\alpha \mu}\Big)^{z_{i,t}}$$
模型训练时的目标函数就是最大化对数似然:
$$L = \sum_{i=1}^{N}\sum_{t=1}^{t_{0}-1}\text{ln}l(z_{i,t} | \theta(h_{i,t}))$$
或者说需要极小化的损失函数就是 $-L_{o}$。注意 $h_{i,t}=\varphi(h_{i,t-1}, z_{i,t-1}, x_{i,t}, \theta)$,
因此除去神经网络中计算 $h_{i,t}$ 所需的参数和 $\Theta$ 以外,所有信息都是可以观测到的,
因此极小化损失函数可以通过梯度下降法实现,得到合适的参数值。
另外,之前提到 DeepAR 可以处理存在规模量级差异的时间序列数据集, 文章主要采用了两个操作:
- 操作 1: 对于存在数据不平衡的情况。训练时如果均匀采样, 可能导致欠拟合。在需求预测等背景下,
这是一个很严重的问题, 因为规模大的数据对于实现特定的业务目标可能更加重要。
于是第一个操作是训练时不均匀采样, 要求选取不同规模的时间序列的概率与其 scale factor
$v_{i}$成比例。 记抽取的第$i$条时序的概率为$p_{i}$, 则$p_{i} = \frac{v_{i}}{\sum_{i}v_{i}}$。 这个策略很简单, 但是能有效补偿数据的不平衡性。 - 操作 2: 由于模型的输入
$z_{i,t}$以及输出的参数(例如$\mu$)都与观察值成比例, 在不改变模型的情况下, 尝试把网络的输入缩放到一个合适的范围, 输出时再进行逆向变换。 文章的解决方式是将输入$z_{i,t}$除以一个依赖于$i$的 scale factor$v_{i}$, 输出的似然参数再做逆向变换。例如对负二项分布,$\mu = v_{i} \text{ln}(1+\text{exp}(o_{\mu}))$,$\alpha = \text{ln}(1+\text{exp}(o_{\alpha})) / \sqrt{v_{i}}$。 如何选择合适的$v_{i}$是一个有挑战性的问题, 文章的选择是$v_{i} = 1+\frac{1}{t_{0}-1}\sum_{i=1}^{t_{0}-1}z_{i,t}$, 虽然很简单, 但是实验效果不错。
总结
本文介绍了一个基于深度学习的时间序列预测方法 DeepAR。DeepAR 的文章发表距今已有 3 年, 事实上早在 2017 年,亚马逊内部就已经开始使用这个模型。由于机器学习相关的研究发展非常迅猛, 后续也出现了处理同样问题的新方法,因此,现在 DeepAR 可能主要是一个用于做 baseline 的常用模型。 但它作为一个经典的方法,依然有值得我们学习了解的地方
