用于预测的专门深度学习架构

我们在深度学习世界中的旅程即将结束。在上一章中,我们了解了预测的全局范式,并看到了如何使诸如循环神经网络(RNN)之类的简单模型接近全局机器学习模型设定的高基准。在本章中,我们将回顾一些专为时间序列预测设计的流行深度学习架构。借助这些更复杂的模型架构,我们将能更好地处理现实世界中那些需要比普通RNN和LSTM更强大模型的问题。

本章涵盖以下主要主题:

技术要求

你需要按照前言中的说明设置Anaconda环境,以获得包含本书代码所需所有包和数据集的运行环境。

本章配套代码可在https://github.com/PacktPublishing/Modern-Time-Series-Forecasting-with-Python/tree/main/notebooks/Chapter16找到。

你需要运行本章的以下笔记本:

对专用架构的需求

归纳偏置,或称学习偏置,是指学习算法为了将在训练数据上学习到的函数推广到未见数据而做出的一组假设。归纳偏置本身并非坏事,并与学习理论中偏差与方差背景下的“偏差”不同。我们通过模型架构或特征工程来使用和设计归纳偏置。例如,卷积神经网络CNN)在图像上比标准前馈网络FFN)在纯像素输入上表现更好,因为 CNN 具有 FFN 所不具备的局部性和空间偏置。尽管 FFN 在理论上是通用逼近器,但利用 CNN 的归纳偏置,我们可以学到更好的模型。

深度学习被认为是一种完全数据驱动的方法,特征工程和最终任务以端到端的方式学习,从而避免了模型设计者在设计特征时嵌入的归纳偏置。但这种观点并不完全正确。这些曾经通过特征引入的归纳偏置,现在通过架构设计得以体现。每种深度学习架构都有其自身的归纳偏置,这就是为什么某些类型的模型在某些类型的数据上表现更好。例如,CNN 在图像上表现良好,但在序列上则不那么出色,因为 CNN 带来的空间归纳偏置和平移等变性在图像上最为有效。

在理想情况下,我们会有无限量的优质标注数据,从而能够在没有强归纳偏置的情况下完全学习数据驱动的网络。但遗憾的是,在现实世界中,我们永远不会有足够的数据来学习如此复杂的函数。这就是设计正确类型的归纳偏置决定深度学习系统成败的地方。我们曾经严重依赖 RNN 来处理序列,而它们内部嵌入了很强的自回归归纳偏置。但后来,对序列具有更弱归纳偏置的 Transformer 出现了,借助大量数据,它们能够为序列学到更好的函数。因此,关于我们在模型中嵌入多强的归纳偏置这一决策,是设计深度学习架构时的一个重要问题。

多年来,许多专门用于时间序列预测的深度学习架构被提出,每种架构都有其自身的归纳偏置。我们无法逐一回顾所有这些模型,但将介绍对该领域产生持久影响的主要模型。我们还将看看如何使用一些开源库在我们的数据上训练这些模型。

我们将专门关注能够直接或间接处理全局建模范式的模型。这是因为当进行大规模预测时,为每个时间序列训练单独的模型是不可行的。

我们将探讨一些为时间序列预测开发的流行架构。决定是否包含某个模型的一个重要因素是其是否拥有稳定且支持该模型的开源框架。这绝不是一份完整的列表,因为有许多架构我们并未涵盖。我会尝试在进一步阅读部分分享一些链接,帮助你开启探索之旅。

在进入本章核心内容之前,我们先了解一下我们将要使用的库。

NeuralForecast 简介

NeuralForecast 是 NIXTLA 的优秀团队开发的又一个库。你可能还记得第4章《建立强基线预测》中使用的 statsforecast,用于经典时间序列模型如 ARIMA、ETS 等。他们拥有整套用于时间序列预测的开源库(mlforecast 用于基于机器学习的预测,hierarchicalforecast 用于层次数据预测的调和,utilsforecast 提供一些预测工具,datasetsforecast 提供一些现成数据集,以及 TimeGPT,他们的时间序列基础模型)。

既然我们已经学会了如何使用 statsforecast,那么扩展到 neuralforecast 将会很容易,因为这两个库保持相似的 API、结构和工作方式。neuralforecast 通过易于使用的 API 提供了经典和前沿的深度学习模型,这使其成为本章实践部分的理想选择。

NeuralForecast 被设计为提供直观且灵活的 API,能与现代数据科学工作流程无缝集成。该包包含了多个著名模型的实现,每个模型都针对时间序列预测的不同方面。

通用参数和配置

类似于statsforecastneuralforecast也期望输入数据具有特定形式:

neuralforecast包中的大多数模型共享一组控制以下方面的公共参数:

实践者提示

参数 stat_exog_listhist_exog_listfutr_exog_list 仅适用于支持它们的模型。请务必检查您要使用的模型的文档,以确定是否支持这些参数。有些模型支持全部三个,有些只支持 futr_exog_list,等等。模型的完整列表及其可用参数可在此处找到:https://nixtlaverse.nixtla.io/neuralforecast/docs/capabilities/overview.html

此外,如果您有一些特征只有历史数据,则将它们放入 hist_exog_list。如果您有一些特征同时拥有历史和未来数据,则将它们同时放入 hist_exog_listfutr_exog_list

除了这些通用模型参数外,neuralforecast 还有一个核心类 NeuralForecast,它协调训练过程(就像我们在 statsforecast 中有 StatsForecast 一样)。与 statsforecast 类似,这里我们定义需要预测的模型列表等。我们来看看该类中的一些参数:

如果 ds 是日期时间列,则 freq 可以是表示重复频率的字符串(如 'D' 表示天,'H' 表示小时等)或表示默认单位(通常为天)倍数的整数,用于确定每个日期之间的间隔。如果 ds 是数值列,则 freq 也应为数值列,指示值之间的固定数值增量。

涉及 neuralforecast 的典型工作流程如下所示:

from neuralforecast import NeuralForecast
from neuralforecast.models import LSTM
horizon = 12
models = [LSTM(h=horizon,
               max_steps=500,
               scaler_type='standard',
               encoder_hidden_size=64,
               decoder_hidden_size=64,),
          ]
nf = NeuralForecast(models=models, freq='M')
nf.fit(df=Y_df)
Y_hat_df = nf.predict()

“自动”模型

neuralforecast 包的一个突出特性是包含了“自动”模型。这些模型自动化了超参数调优和模型选择的过程,简化了用户的工作流程。通过利用自动化机器学习AutoML)的技术,这些模型能够根据数据集自适应其架构和设置,显著减少了模型配置中所需的手动工作。它们定义了智能的默认范围,因此即使你没有声明任何要调优的范围,它们也会使用默认范围并对模型进行调优。更多信息可以在此查看:https://nixtlaverse.nixtla.io/neuralforecast/models.html

外生特征

NeuralForecast 还可以轻松地将外生变量纳入预测过程(取决于模型的能力)。外生特征是可以影响目标变量的外部影响因素,对于提高预测精度至关重要,尤其是当这些外部因素对结果有显著影响时。neuralforecast 包中的许多模型可以整合这些特征,通过考虑时间序列数据本身可能不存在的额外信息来优化预测。

例如,将节假日效应、天气条件或经济指标作为外生变量纳入,可以提供纯历史数据无法提供的关键见解。这一特征在 NBEATSx、NHITS 和 TSMixerx 等模型中尤为有用,这些模型能够对历史和外生未来输入之间的复杂交互进行建模。通过有效处理外生特征,NeuralForecast 增强了模型在外部因素起关键作用的现实场景中准确预测的能力。要检查哪些模型可以处理外生信息,请参考网站上的文档:https://nixtlaverse.nixtla.io/neuralforecast/docs/capabilities/overview.html

现在,闲话少说,让我们开始列表中的第一个模型。

神经基扩展分析用于可解释时间序列预测(N-BEATS)

第一个使用了DL(我们不能称之为DL,因为它本质上是DL和经典统计学的混合)某些组件并在该领域引起轰动的模型,是2018年赢得M4竞赛(单变量)的模型。这是当时优步的Slawek Smyl提出的一个模型,是指数平滑和RNN的弗兰肯斯坦式混合,被称为ES-RNN延伸阅读 中链接了一个使用GPU加速的更新、更快的实现)。这使得Makridakis等人提出了一个论点:“混合方法和方法的组合是前进的方向。”N-BEATS 模型的创建者旨在挑战这一结论,设计了一个纯DL架构用于时间序列预测。当他们创建了一个在M4竞赛中击败所有其他方法的模型时(尽管他们没有及时发表以参加竞赛),他们成功了。这是一个非常独特的架构,从信号处理中汲取了大量灵感。让我们更深入地了解这个架构。

参考文献核实

Makridakis等人的研究论文和Slawek Smyl的博客文章分别在参考文献部分引用为12

在继续解释之前,我们需要建立一些背景和术语。他们解决的核心问题是单变量预测,这意味着它与指数平滑和ARIMA等经典方法类似,只使用时间序列的历史来生成预测。模型中不包含引入其他协变量的规定。模型会看到一个历史窗口,并被要求预测接下来的几个时间步。历史窗口被称为回溯期,未来的时间步称为预测期

N-BEATS 的架构

N-BEATS 架构在几个方面与当时的现有架构不同:

让我们看看架构并深入了解:

图 16.1 – N-BEATS 架构

图 16.1:N-BEATS 架构

我们可以看到三列矩形块,每一列都是另一列的分解视图。让我们从最左侧(最细粒度视图)开始,然后逐步向上,构建出整个架构。顶部有一个代表性的时间序列,它具有一个回溯窗口和一个预测周期。

N-BEATS 中的基本学习单元是 block。每个块 l 接收一个大小为回溯周期的输入 $x_l$,并生成两个输出:一个预测 $\hat{y}_l$ 和一个回溯预测 $\hat{x}_l$。回溯预测是该块对回溯窗口的最佳拟合,反映了该堆栈如何使用学到的函数预测回溯窗口。块输入首先由包含四个标准全连接层(带偏置项和非线性激活)的堆栈处理,转换为隐藏表示 hl。随后,两个独立的线性层(无偏置或非线性激活)将其转换为论文所称的回溯预测和预测扩展系数,$\theta_l^b$ 和 $\theta_l^f$。

块的最后部分使用一组基层($g_l^b$ 和 $g_l^f$)将这些扩展系数映射到输出。稍后我们将更详细地讨论基层,但现在只需理解它们将扩展系数转换为所需的输出($\hat{y}_l$ 和$\hat{x}_l$)。

堆栈

现在,让我们将抽象层次向上移动一层,来到图16.1中间一列。它显示了一个stack中不同模块是如何排列的。一个栈中的所有模块共享相同种类的基础层,因此被分组为一个栈。正如我们之前所见,每个模块有两个输出:$\hat{y}_l$和$\hat{x}_l$。这些模块以残差方式排列,每个模块逐步处理和清理时间序列。模块l的输入是$x_l = x_{l-1} - \hat{x}_{l-1}$。在每一步中,该模块生成的回测(backcast)从该模块的输入中减去,然后再传递到下一层。一个栈中所有模块的所有预测输出相加,形成栈预测

$$\hat{y}^s = \sum_l \hat{y}_l^s$$

堆栈中最后一个块的残差反向预测是堆栈残差xs)。

整体架构

有了这些,我们可以移动到图16.1最右边一列,它显示了架构的顶层视图。我们看到每个堆栈有两个输出——堆栈预测(ys)和堆栈残差(xs)。可以有N个堆栈组成N-BEATS模型。每个堆栈串联在一起,对于任意堆栈(s),前一个堆栈的堆栈残差(xs-1)作为输入,该堆栈生成两个输出:堆栈预测(ys)和堆栈残差(xs)。最后,N-BEATS预测$\hat{y}$是所有堆栈预测的加和:

$$\hat{y} = \sum_{s=1}^{N} \hat{y}^s$$

既然我们已经理解了模型的作用,需要回到一个之前留待后面讨论的点——基函数

免责声明

这里的解释主要是为了帮助理解,所以可能会对一些数学概念一笔带过。如需更严谨的论述,请参考相关数学书籍或文章。例如,进一步阅读部分的函数作为向量空间,以及函数空间https://cns.gatech.edu/~predrag/courses/PHYS-6124-12/StGoChap2.pdf)。

基函数与可解释性

要理解什么是基函数,我们需要理解线性代数中的一个概念。我们在第11章《深度学习入门》中讨论了向量空间,并给出了向量和向量空间的几何解释。我们讨论了向量是如何成为n维向量空间中的一个点。那是在常规欧几里得空间(Rn)中讨论的,它用于表示物理空间。欧几里得空间定义了一个原点和一组标准正交基。标准正交基是单位向量(模=1),且彼此正交(直观理解,夹角90度)。因此,向量$A = \begin{bmatrix} 5 \\ 2 \end{bmatrix}$可以写成$5\hat{i} + 2\hat{j}$,其中$\hat{i}$和$\hat{j}$是标准正交基。你可能从高中就记得这些。

现在,数学中有一个分支将函数视为向量空间中的一个点(此时我们称之为函数空间)。这是因为,所有向量空间需要满足的数学条件(如可加性、结合性等)在考虑函数而非点时仍然成立。为了更好地理解,考虑一个函数f(x) = 2x + 4x2。我们可以将这个函数视为以xx2为基的函数空间中的一个向量。系数2和4可以改变以得到不同的函数;这些系数可以是任何实数,从-$\infty$到+$\infty$。所有能以xx2为基的函数构成的空间就是函数空间,该空间中的每个函数都可以定义为基函数的线性组合。我们可以使用任意函数的基,这给了我们很大的灵活性。从机器学习的角度来看,在这个函数空间中搜索最佳函数,自动意味着我们限制了函数搜索范围,使其具有由基函数定义的某些性质。

回到N-BEATS,我们讨论了扩张系数 $\theta^b$ 和 $\theta^f$,它们通过一组基层($g_l^b$ 和 $g_l^f$)映射到输出。基层也可以被视为基函数,因为我们知道层本质上是一个将其输入映射到输出的函数。因此,通过学习扩张系数,我们实质上是在寻找能够表示输出的最佳函数,但该函数受限于我们选择的基函数。

N-BEATS有两种运行模式:通用模式和可解释模式。N-BEATS论文表明,在这两种模式下,N-BEATS都成功击败了M4竞赛中的最佳模型。通用模式是指我们没有使用任何基函数来约束函数搜索。我们也可以将其视为将基函数设置为恒等函数。因此,在这种模式下,我们让模型通过基系数的线性投影完全学习函数。这种模式缺乏人类可解释性,因为我们不清楚不同函数是如何学习的,以及每个堆栈代表什么。

但是,如果我们有固定的基函数来约束函数空间,我们就可以引入更多的可解释性。例如,如果我们有一个基函数将输出约束为表示堆栈中所有块的趋势,那么我们可以说该堆栈的预测输出代表趋势分量。同样,如果我们有另一个基函数将输出约束为表示堆栈中所有块的季节性,那么我们可以说该堆栈的预测输出代表季节性。

这正是论文所提出的。他们定义了捕获趋势和季节性的特定基函数,包含这样的块使最终预测更具可解释性,因为它提供了分解。趋势基函数是一个小次数 p 的多项式。因此,只要 p 较小(如1、2或3),它就会迫使预测输出模仿趋势分量。对于季节性基函数,作者选择了傅里叶基(类似于我们在第6章《时间序列预测的特征工程》中看到的)。这迫使预测输出成为这些模拟季节性的正弦基函数的函数。换句话说,模型学习将这些正弦波与不同的系数组合,以尽可能好地重建季节性模式。

为了更深入地理解这些基函数及其结构,我在“扩展阅读”部分链接了一个 Kaggle Notebook,其中清晰解释了趋势和季节性基函数。该Notebook还有一个额外部分,可视化了前几个季节性基函数。结合原始论文,这些额外阅读材料将有助于巩固你的理解。

N-BEATS并非设计为全局模型,但在全局设置中表现良好。M4竞赛包含一组不相关的时间序列,N-BEATS模型经过训练,使其暴露于所有这些序列,并学习一个通用函数来预测数据集中的每个时间序列。这与集成多个具有不同回溯窗口的N-BEATS模型一起,构成了M4竞赛的成功公式。

参考文献核实

Boris Oreshkin等人的研究论文(N-BEATS)在参考文献部分被引用为 3

使用N-BEATS进行预测

N-BEATS,以及我们在本章中将探讨的许多其他专门架构,已在NIXTLA的NeuralForecast包中实现。首先,让我们看看该实现的初始化参数。

NeuralForecast中的 NBEATS 类有很多参数,但以下是最重要的:

还有其他几个参数,但这些不太重要。完整的参数列表及其描述可以在 https://nixtlaverse.nixtla.io/neuralforecast/models.nbeats.html 找到。

由于该模型的优势在于预测稍长的时间跨度,我们可以通过设置预测步长参数 h = 48 来一次性进行48步预测。

笔记本提示

训练 N-BEATS 的完整代码可以在 Chapter16 文件夹中的 01-NBEATS_NeuralForecast.ipynb 笔记本中找到。

解读 N-BEATS 预测

N-BEATS,如果我们以可解释模型运行,还能通过将预测分解为趋势和季节性来提供更多可解释性。要获得可解释的输出,我们可以调用 decompose 函数。我们必须确保在初始参数中包含趋势和季节性分量的堆栈类型:stack_types = ['trend','seasonality']

model_interpretable = model_untuned.models[0]
dataset, *_ = TimeSeriesDataset.from_df(df = training_df, id_col='LCLid',time_col='timestamp',target_col='energy_consumption')
y_hat = model_interpretable.decompose(dataset=dataset)

这将返回一个 array,从中可以访问趋势和季节性,例如 y_hat =[0,1]。趋势或季节性的顺序取决于你在 stack_types 中包含它们的方式,默认顺序是 ['seasonality','trend'],即季节性为 y_hat =[0,1],趋势为 y_hat =[0,1]

让我们看看其中一个家庭预测是如何分解的:

图16.2 – N-BEATS(可解释)的分解预测

图16.2:N-BEATS(可解释)的分解预测

尽管N-BEATS取得了成功,但它仍然是一个单变量模型。除了历史数据外,它无法接收任何外部信息。这对于M4竞赛来说没有问题,因为其中所有时间序列也是单变量的。然而,许多现实世界的时间序列问题都附带有额外的解释变量(或称外生变量)。我们来看看N-BEATS的一个微小修改,使其能够处理外生变量。

带外生变量的可解释时间序列预测的神经基础扩展分析(N-BEATSx)

Olivares等人提出了N-BEATS模型的扩展,使其兼容外生变量。整体结构与N-BEATS相同(包含块、栈和残差连接,如图16.1所示),因此我们将只关注N-BEATSx模型提出的关键差异和新增内容。

参考文献核实

Olivares等人(N-BEATSx)的研究论文在参考文献部分被引用为4

处理外生变量

在N-BEATS中,块的输入是回溯窗口yb。但在这里,块的输入包括回溯窗口yb以及外生变量数组x。这些外生变量可以分为两类:时变型和静态型。静态变量通过静态特征编码器进行编码,该编码器只是一个单层全连接网络,将静态信息编码为用户指定的维度。然后,编码后的静态信息、时变外生变量和回溯窗口被拼接起来,形成块的输入,使得块l的隐藏状态表示hl不再是N-BEATS中的FC(yb),而是FC([yb; x]),其中[;]表示拼接。这样,外生信息在每一步与残差拼接后,成为每个块输入的一部分。

外生块

除此之外,论文还提出了一种新的块——外生块。外生块接收拼接后的回溯窗口和外生变量(与其他块一样)作为输入,并产生后向预测和前向预测:

$$\hat{y}_l^{exog} = \sum_{i=0}^{N_x} x_l^i \theta_l^{exog}$$

这里,Nx是外生特征的数量。

这里,我们可以看到外生预测是外生变量的线性组合,该线性组合的权重由扩展系数学习得到,$\theta^{exog}$。论文将这种配置称为可解释外生模块,因为通过使用扩展权重,我们可以定义每个外生变量的重要性,甚至可以找出预测中恰好由某个外生变量贡献的部分。

N-BEATSx也有一个通用版本(不可解释)的外生模块。在这个模块中,外生变量通过一个编码器,该编码器学习一个上下文向量Cl,并使用以下公式生成预测:

$$\hat{y}^{exog}_{l} = \sum_{i=0}^{N_x} C^{i}_{l} \theta^{exog}_{l}$$

他们提出了两种编码器:时序卷积网络TCN)和WaveNet(一种类似于TCN但通过扩张来扩大感受野的网络)。延伸阅读部分提供了资源,如果你想了解更多关于WaveNet——一种起源于声音领域的架构——的信息。

N-BEATSx也在NIXTLA neuralforecast中实现,但在此写作时,它还不能处理分类数据。因此,我们需要将分类特征编码为数值表示(如我们在第10章全局预测模型中所做的那样)之后再使用neuralforecast

该研究论文还表明,N-BEATSx在电价预测方面显著优于N-BEATS、ES-RNN和其他基准模型。

延续N-BEATS的传统,我们现在将讨论另一种架构修改,使其适用于长期预测。

用于时间序列预测的神经层次插值(N-HiTS)

尽管深度学习在时间序列预测方面已有大量工作,但很少有人关注长期预测。尽管最近取得了进展,但长期预测仍然是一个挑战,原因有两个:

基于注意力的方法(Transformer)和类似N-BEATS的方法在内存和计算成本方面关于预测范围呈二次方缩放。

作者声称 N-HiTS 大幅降低了长序列预测的计算成本,同时在大量多变量预测数据集上,与现有基于 Transformer 的架构相比,准确率提升了 25%。

参考文献核实

Challu 等关于 N-HiTS 的研究论文在 参考文献 部分的第 5 节中被引用。

N-HiTS 的架构

N-HiTS 可视为 N-BEATS 的变体,因为两者共享大部分架构。图 16.1 显示了 N-BEATS 的架构,同样适用于 N-HiTS。N-HiTS 也采用残差方式堆叠块,区别仅在于所使用的块类型。例如,它没有提供可解释块,所有块都是通用的。N-BEATS 尝试将信号分解为不同模式(趋势、季节性等),而 N-HiTS 尝试将信号分解为多个频率并分别进行预测。

为了实现这一点,提出了几个关键改进:

多速率数据采样

N-HiTS 在全连接块之前引入子采样层,使得每个块的输入分辨率不同。这类似于用不同分辨率平滑信号,使得每个块关注不同分辨率下的模式——例如,一个块每天查看输入,另一个块每周查看输出,依此类推。这样一来,当不同块关注不同分辨率时,模型能够预测这些分辨率下的模式。这显著减少了内存占用和计算量,因为我们不再查看回溯窗口的所有 H 步,而是查看更短的序列(如 H/2、H/4 等)。

N-HiTS 通过在回溯窗口上使用核大小为 kl 的最大池化或平均池化层来实现这一点。池化操作类似于卷积操作,但使用的函数是不可学习的。在 第12章 深度学习构建块用于时间序列 中,我们学习了卷积、核、步长等概念。卷积使用训练中从数据学习的权重,而池化操作使用不可学习的固定函数来聚合核感受野内的数据。这些函数的常见例子包括最大值、平均值、求和等。N-HiTS 使用 MaxPool1dAvgPool1d(在 PyTorch 术语中)以及不同块的不同核大小。每个池化操作还具有等于核大小的步长,从而产生非重叠窗口,在这些窗口上进行聚合操作。为了回顾,我们看看 kernel=2stride=2 的最大池化是什么样的:

图16.3 – 一维最大池化 – 核=2, 步幅=2

图16.3:一维最大池化——核=2, 步幅=2

因此,更大的核大小往往会从输入中切掉更多高频(或小时间尺度)成分。这样,该块被迫专注于更大尺度的模式。论文称此为多速率信号采样

分层插值

在标准的多步预测设置中,模型必须预测H个时间步。随着H变大,计算需求增加,并导致模型所需的表达能力爆炸。

训练一个具有如此大表达能力的模型而不发生过拟合,本身就是一项挑战。为了解决这些问题,N-HiTS提出了一种称为时间插值(的技术(不是简单地在两个已知时间点之间插值,而是架构特有的东西)。

经过池化的输入(我们在上一节中看到的)与通常的机制一起进入块,生成扩展系数,最终转换为预测输出。但在这里,N-HiTS没有将扩展系数的维度设置为H,而是设置为rl × H,其中rl表达能力比率。这个参数本质上降低了预测输出维度,从而控制了我们在前一段讨论的问题。为了恢复原始采样率并预测预测范围内的所有H个点,我们可以使用插值函数。插值函数有很多选择——线性、最近邻、三次等。所有这些选项都可以轻松地在PyTorch中使用interpolate函数实现。

输入采样和输出插值的同步

除了通过池化提出输入采样和输出插值外,N-HiTS还提出了以特定方式在不同块中排列它们。作者认为,只有当表达能力比率以与多速率采样同步的方式分布在各个块中时,分层插值才能正确进行。靠近输入的块应具有较小的表达能力比率rl和较大的核大小kl。这意味着靠近输入的块将生成更大分辨率模式(由于激进的插值),同时被迫查看激进子采样的输入信号。论文提出了指数递增的表达能力比率,从初始块移动到最后一个块,以处理广泛的频带。官方N-HiTS实现使用以下公式设置表达能力比率和池化核:

pooling_sizes = np.exp2(
    np.round(np.linspace(0.49, np.log2(prediction_length / 2), n_stacks))
)
pooling_sizes = [int(x) for x in pooling_sizes[::-1]]
downsample_frequencies = [
    min(prediction_length, int(np.power(x, 1.5))) for x in pooling_sizes
]

我们也可以提供显式的pooling_sizesdownsampling_fequencies来反映时间序列的已知周期(周季节性、月季节性等)。N-BEATS的核心原则(一个块从信号中移除其捕获的效果并传递给下一个块)在此同样使用,以便在每个级别,块捕获的模式或频率在传递给下一个块之前从输入信号中移除。最终,最终预测是所有单个块预测的总和。

使用N-HiTS进行预测

N-HiTS在NIXTLA预测中实现。我们可以使用与NBEATS相同的框架,并扩展它来训练N-HiTS于我们的数据。更棒的是,该实现支持外生变量,方式与N-BEATSx处理外生变量相同(尽管没有外生块)。首先,让我们看一下实现的初始化参数。

neuralforecast 中的 NHITS 类具有以下参数:

笔记本提示

训练 N-HiTS 的完整代码可以在 Chapter16 文件夹的 02-NHiTS_NeuralForecast.ipynb 笔记本中找到。

现在,让我们将注意力转向 Transformer 模型的一些改进,使其更适合时间序列预测。

Autoformer

最近,Transformer 模型在捕获长期模式方面表现出优于标准 RNN 的性能。其中一个主要因素是,为 Transformer 提供动力的自注意力机制可以减少相关序列信息在用于预测之前需要保持的长度。换句话说,在 RNN 中,如果 12 步前的时间步包含重要信息,该信息必须经过 12 次更新存储在 RNN 中才能用于预测。但在 Transformer 的自注意力机制中,由于结构缺乏递归性,模型可以自由地在滞后 12 步和当前步之间直接创建捷径。

但相同的自注意力机制也是我们无法将 vanilla Transformer 扩展到长序列的原因。在上一节中,我们讨论了长期预测之所以具有挑战性,有两个原因:真正捕获变化所需的表现力和计算复杂度。自注意力机制具有二次计算复杂度,这导致了第二个原因。

研究界已经认识到这一挑战,并通过许多技术(如下采样、低秩近似、稀疏注意力等)致力于设计高效的 Transformer。有关这些技术的详细说明,请参阅《进一步阅读》部分中的链接《高效 Transformer:综述》。

Autoformer 是另一种专为长期预测设计的模型。Autoformer 发明了一种新型注意力机制,并将其与时间序列分解的各个方面相结合。让我们来看看 Autoformer 的特殊之处。

Autoformer 模型的架构

Autoformer 模型是对 Transformer 的改进。以下是其主要贡献:

参考文献核实

Wu 等人关于 Autoformer 的研究论文在参考文献部分以9引用。

统一输入表示(Uniform Input Representation)

RNN 通过其循环结构捕获时间序列模式,因此它们只需要序列本身;不需要时间戳信息来提取模式。然而,Transformer 中的自注意力是通过在集合中执行的逐点操作完成的(集合中顺序无关紧要)。通常,我们包含位置编码来捕获序列的顺序。与其使用位置编码,我们可以使用更丰富的信息,例如分层时间戳信息(如周、月、年等)。这正是作者通过统一输入表示提出的。

统一输入表示使用三种类型的嵌入来捕获时间序列的历史、时间序列的值序列以及全局时间戳信息。时间序列的值序列由标准的 d_model 维位置嵌入捕获。

统一输入表示使用一个一维卷积层,其卷积核大小为kernel=3和步长为stride=1,将历史数据(标量或一维)投影为d_model维的嵌入。这被称为值嵌入

全局时间戳信息通过一个可学习的嵌入层嵌入为d_model维,词汇量有限,其机制与将分类变量嵌入固定大小向量相同(第15章,《全局深度学习预测模型的策略》)。这被称为时间嵌入

现在,我们有三个相同维度的嵌入d_model,只需将它们相加即可得到统一输入表示。

生成式解码器

标准Transformer模型推理的方式是每次解码一个token。这种自回归过程耗时且每一步重复大量计算。为了解决这个问题,Autoformer模型采用了一种更具生成性的方式,即在前向传播中一次性生成整个预测区间。

在NLP中,使用特殊token (START) 启动动态解码过程是一种流行技巧。Autoformer模型没有为此选择特殊token,而是从输入序列中选取一个样本,例如输出窗口之前的一个较早片段。例如,假设输入窗口为t1tw,我们将从输入中采样一个长度为C的序列,即tw-ctw,并将该序列作为解码器的起始序列。为了使模型在一次前向传播中预测整个区间,我们可以扩展解码器输入张量,使其长度为C + H,其中H是预测区间的长度。前C个token填入输入样本序列,其余部分填充为零——即$X^{t}_{de} = \operatorname{Concat}(X^{t}_{token}, X^{t}_{0})$。这只是目标值。虽然$X^{t}_{0}$在预测区间填充了零,但这只是针对目标值。其他信息,如全局时间戳,包含在$X^{t}_{0}$中。还采用了充分的注意力矩阵掩码,使得每个位置不会关注未来位置,从而保持预测的自回归性质。

现在,让我们看看时间序列分解架构。

分解架构

我们之前在第3章《分析与可视化时间序列数据》中看到了分解的思想,甚至在本章(N-BEATS)中也看到过。Autoformer成功地将Transformer架构改造为深度分解架构:

图16.5 – Autoformer架构

图16.4:Autoformer架构

先理解整体架构再深入细节会更容易。在图16.4中,有标记为自相关序列分解的方框。目前只需知道自相关是一种注意力机制,而序列分解是一个将信号分解为趋势周期成分和季节成分的特定模块。

编码器

有了上一节讨论的抽象层次,让我们理解编码器中发生了什么:

  1. 时间序列的均匀表示 xen 是编码器的输入。输入经过 Auto-Correlation 模块(用于自注意力),其输出为 xac
  2. 将均匀表示 xen 作为残差连接加回到 xac
  3. xac 传递给 Series Decomp 模块,将信号分解为趋势-周期分量 xT 和季节分量 xseas
  4. 丢弃 xT,将 xseas 传递给前馈网络,得到 xFF
  5. xseas 再次作为残差连接加到 xFF 上。
  6. 最后,将结果传递给另一个 Series Decomp 层,再次分解为趋势分量 $x^t_T$ 和季节分量 $x_{seas}$。
  7. 丢弃趋势分量 $x^t_T$,将季节分量 $x_{seas}$ 作为编码器模块的最终输出。
  8. 可以将多个编码器模块堆叠起来,每个模块接收前一个模块的输出。

现在,让我们将注意力转向解码器模块。

解码器

Autoformer 模型通过包含输入序列中的采样窗口,采用了类似 START token 的机制。但并非直接使用该序列,Autoformer 对其进行了特殊处理。Autoformer 将其大部分学习能力用于学习季节性。Transformer 的输出也仅仅是季节性。因此,Autoformer 并非直接包含来自输入序列的完整窗口,而是对信号进行分解,仅将季节性成分包含在 START token 中。让我们一步步来看这个过程:

  1. 如果输入(上下文窗口)是 x,我们使用 Series Decomp 块将其分解为 $x^{init}_{T}$ 和 $x^{init}_{seas}$。
  2. 现在,我们从 $x^{init}_{seas}$ 的末尾采样 C 个时间步,并附加 H 个零,其中 H 是预测范围,从而构造出 xds
  3. 然后,该 xds 用于创建统一表示 xdec
  4. 同时,我们从 $x^{init}_{T}$ 的末尾采样 C 个时间步,并附加 H 个时间步(每个时间步的值为序列均值 (mean(x))),其中 H 是预测范围,从而构造出 xdt

然后,该 xdec 作为解码器的输入。解码器中发生的过程如下:

  1. 输入 xdec 首先通过一个 Auto-Correlation 块(用于自注意力),其输出为 xdac
  2. 统一表示 xdec 作为残差连接加回到 xdac,即 xdac = xdac + xdec
  3. 现在,xdac 通过一个 Series Decomp 块,该块将信号分解为趋势-周期成分 (xdT1) 和季节成分 xdseas
  4. 在解码器中,我们不会丢弃趋势成分,而是将其保存。这是因为我们将把所有趋势成分与 xdt 中的趋势相加,以得到整体趋势部分 (T)。
  5. 来自 Series Decomp 块的季节输出 (xdseas) 以及来自编码器的输出 ($x_{seas}$) 随后被传入另一个 Auto-Correlation 块,在该块中计算解码器序列与编码器序列之间的交叉注意力。设该块的输出为 xcross
  6. 现在,xdseas 作为残差连接加回到 xcross,即 xcross = xcross + xdseas
  7. xcross 再次通过一个 Series Decomp 块,该块将 xcross 分解为两个分量——xdT2xdseas2
  8. xdseas 然后使用 Feed Forward 网络进行变换,得到 xdff,并且 xdseas 通过残差连接加到它上面:xdff = xdff + xdseas
  9. 最后,xdff 再通过另一个 Series Decomp 块,该块将其分解为两个分量——xdT3xdseas3xdseas3 是解码器的最终输出,它捕获了季节性。
  10. 另一个输出是残差趋势 $X_{trend}$,它是解码器所有 Series Decomp 块中提取的趋势分量之和的投影。投影层是一个 Conv1d 层,它将提取的趋势投影到所需的输出维度:$X_{trend} = Conv1d(x_{dT1} + x_{dT2} + x_{dT3})$。
  11. M 个这样的解码器层堆叠在一起,每个层将其输出作为下一层的输入。
  12. 每个解码器层的残差趋势 $X_{trend}$ 被加到趋势初始值 xdt 上,以建模整体趋势分量(T)。
  13. 最后一个解码器层的 xdseas3 被认为是整体季节性分量,并通过线性层投影到所需的输出维度(S)。
  14. 最后,预测或预报结果 Xout = T + S

整个架构设计巧妙,使得时间序列中相对稳定且易于预测的部分(趋势-周期)被移除,而难以捕获的季节性可以很好地建模。

那么,Series Decomp 块是如何分解序列的呢?你可能已经熟悉其机制:AvgPool1d,并带有一些填充以保持与输入相同的尺寸。这相当于在指定核宽度上进行移动平均。

在整个解释过程中,我们一直在讨论 Auto-Correlation 块。现在,让我们理解 Auto-Correlation 块的巧妙之处。

自相关机制

Autoformer 使用自相关机制代替标准的缩放点积注意力。它基于周期性发现子序列相似性,并利用这种相似性来聚合相似的子序列。这一巧妙的机制通过将缩放点积注意力的逐点操作扩展到子序列级别,打破了信息瓶颈。整个机制的初始部分类似于标准注意力过程,我们使用权重矩阵将查询、键和值投影到相同的维度。关键区别在于注意力权重的计算以及它们如何用于计算值。该机制通过两个显著的子机制实现:发现基于周期的依赖性和时间延迟聚合。

基于周期的依赖性

Autoformer 使用自相关作为关键的相似性度量。我们知道,自相关表示给定时间序列 Xt 与其滞后序列之间的相似性。例如,$R_{xx}(\tau)$ 是时间序列 Xt 与 $X_{t-\tau}$ 之间的自相关。Autoformer 将此自相关视为特定滞后的未归一化置信度。因此,从所有 $\tau$ 的列表中,我们选择 k 个最可能的滞后,并使用 softmax 将这些未归一化置信度转换为概率。我们使用这些概率作为权重来聚合相关的子序列(我们将在下一节中讨论这一点)。

自相关计算并非效率最高的操作,Autoformer 提出了一种替代方案以加快计算速度。基于随机过程中的维纳-辛钦定理(这超出了本书的范围,但对于感兴趣的人,我在进一步阅读部分提供了一个链接),自相关也可以使用快速傅里叶变换FFT)进行计算。过程如下所示:

$$S_{xx}(\tau) = \mathcal{F}(X_t) \mathcal{F}^{*}(X_t)$$

这里,$\mathcal{F}$ 表示 FFT,$\mathcal{F}^{*}$ 表示共轭运算(复数的共轭是实部相同、虚部大小相等但符号相反的数。相关数学内容超出了本书的范围)。

这可以很容易地在 PyTorch 中编写如下:

# calculating the FFT of Query and Key
q_fft = torch.fft.rfft(queries.permute(0, 2, 3, 1).contiguous(), dim=-1)
k_fft = torch.fft.rfft(keys.permute(0, 2, 3, 1).contiguous(), dim=-1)
# Multiplying the FFT of Query with Conjugate FFT of Key
res = q_fft * torch.conj(k_fft)

现在,$S_{xx}(\tau)$ 处于频谱域。要将其带回实数域,我们需要进行逆 FFT:

$$R_{xx}(\tau) = \mathcal{F}^{-1}(S_{xx}(\tau))$$

这里,$\mathcal{F}^{-1}$ 表示逆 FFT。在 PyTorch 中,我们可以轻松做到这一点:

corr = torch.fft.irfft(res, dim=-1)

当查询和键相同时,计算的是自注意力;当它们不同时,计算的是交叉注意力。

现在,我们需要做的就是取 corr 中的 top-k 值,并用它们来聚合子序列。

时间延迟聚合

我们已经使用FFT和逆FFT识别出了自相关的主要滞后。举一个更具体的例子,我们一直在使用的数据集(伦敦智能电表数据集)频率为半小时,具有强烈的日周期和周周期。因此,自相关识别可能将48和48*7选为最重要的两个滞后。在标准注意力机制中,我们使用计算出的概率作为权重来聚合值。Autoformer也做了类似的事情,但不同的是,它不将权重应用于点,而是应用于子序列。

Autoformer通过将时间序列按滞后$\tau$进行移位,然后使用该滞后的权重来聚合它们:

$$Auto\text{-}Correlation(Q, K, V) = \sum_{i=1}^{k} Roll(V, \tau_i) \hat{R}_{Q,K}(\tau_i)$$

这里,$\hat{R}_{Q,K}(\tau_i)$是top-k自相关上的softmax概率。

在我们的例子中,可以理解为将序列平移48个时间步,使前一天的时间步与当前天对齐,然后使用48滞后的权重对其进行缩放。接着,处理48*7滞后,将前一周的时间步与当前周对齐,然后使用48*7滞后的权重进行缩放。最终,我们得到日周期和周周期模式的加权混合。由于这些权重由模型学习,我们可以假设不同的块学习关注不同的周期,因此整体上,各个块学习了时间序列的整体模式。

使用Autoformer进行预测

Autoformer已在NIXTLA forecasting中实现。我们可以沿用NBEATS使用的框架,并扩展它来在我们的数据上训练Autoformer。首先,看一下实现的初始化参数。

需要记住的是,Autoformer模型不支持外生变量。它官方支持的额外信息只有全局时间戳(如周、月等)以及节假日信息。技术上我们可以将其扩展到任何类别特征(静态或动态),但目前不支持任何实值信息。

让我们看看实现的初始化参数。

Autoformer类具有以下主要参数:

笔记本提示

训练Autoformer模型的完整代码可以在03-Autoformer_NeuralForecast.ipynb文件夹中的Chapter16笔记本中找到。

让我们换一个话题,看看一组简单的线性模型,它们是为了在长期时间序列预测LTSF)中挑战Transformer而提出的。

LTSF-Linear模型族

关于Transformer是否适合预测问题,流行的Transformer论文是否没有使用强大的基线来展示其优越性,对顺序不敏感的注意力机制可能不是处理强顺序时间序列的最佳方式等等,一直存在很多争论。对于长期时间序列预测,由于它更依赖于强趋势和季节性的提取,这种批评更为明显。2023年,Ailing Zeng等人决定对Transformer模型进行测试,并使用5个多变量数据集进行了广泛研究,将他们提出的一组简单线性模型与五个Transformer模型(FEDFormer、Autoformer、Informer、Pyraformer和LogTrans)进行了对比。令人惊讶的是,他们提出的简单线性模型轻松击败了所有Transformer模型。

参考文献核实

Ailing Zeng 等人的研究论文以及不同的 Transformer 模型,FEDFormer、Autoformer、Informer、Pyraformer 和 LogTrans,在参考文献部分分别引用为1416981517

作者提出的 LTSF 模型系列中有三个模型:

  1. Linear
  2. D-Linear
  3. N-Linear

这些模型非常简单,以至于它们超越了 Transformer 模型几乎令人尴尬。但当你更深入地了解它们后,你可能会欣赏模型中内置的简单而有效的归纳偏置。让我们逐一来看。

Linear

顾名思义,这是一个简单的线性模型。它接收上下文窗口并应用一个线性层来预测预测区间。它还将不同的时间序列视为独立的通道,并对每个通道应用不同的线性层。在 PyTorch 中,我们只需要为每个通道提供一个 nn.Linear 层:

# Declare nn.Linear for each channel
layers = nn.ModuleList([nn.Linear(context_window, forecast_horizon) for _ in range(n_timeseries)])
## Forward Method ##
# Now use these layers once you get the input (Batch, Context Length, Channel)
forecast = [layers[i](input[:,:,i]) for i in range(n_timeseries)]

这个简单得令人尴尬的模型能够超越一些 Transformer 模型,如 Informer、LogTrans 等。

D-Linear

D-Linear 在简单线性模型的基础上注入了分解先验。我们在 第3章 中看到了如何将时间序列分解为趋势、季节性和残差。D-Linear 正是这样做的,它使用移动平均(窗口或核大小是超参数)将输入时间序列 x 分解为趋势 t(移动平均)和其余部分 r(季节性+残差)。然后,它分别对 tr 应用独立的线性层,最后将它们加在一起得到最终的预测。让我们看一个简化的 PyTorch 实现:

# Declare nn.Linear for each channel, trend and seasonality separately
trend_layers = nn.ModuleList([nn.Linear(context_window, forecast_horizon) for _ in range(n_timeseries)])
seasonality_layers = nn.ModuleList([nn.Linear(context_window, forecast_horizon) for _ in range(n_timeseries)])
## Forward Method ##
# Now use these layers once you get the input (Batch, Context Length, Channel)
# series_decomp is a function extracting trend using moving aveages
trend, seasonality = series_decomp(input)
trend_forecast = [trend_layers[i]( trend[:,:,i]) for i in range(n_timeseries)]
seasonality_forecast = [seasonality_layers[i]( seasonality [:,:,i]) for i in range(n_timeseries)]
forecast = [trend_forecast[i] + seasonality_forecast[i] for i in range(n_timeseries)]

模型中的分解先验帮助其始终优于简单线性模型,并且在研究中几乎所有使用的数据集上都优于所有Transformer模型。

N-Linear

作者还提出了另一个模型,对线性模型进行了另一个非常简单的修改。该修改旨在处理时间序列数据中固有的分布偏移。在N-Linear中,我们只需提取输入上下文的最后一个值,并将其从整个序列中减去(作为一种归一化),然后使用线性层进行预测。现在,一旦得到线性层的输出,我们就将之前减去的最后一个值加回去。在PyTorch中,一个简单的实现如下所示:

# Declare nn.Linear for each channel
layers = nn.ModuleList([nn.Linear(context_window, forecast_horizon) for _ in range(n_timeseries)])
## Forward Method ##
# Extract the last value once you get the input (Batch, Context Length, Channel)
# Get the last value of time series
last_value = sample_data[:,-1:,:]
# Normalize the time series
norm_ts = sample_data - last_value
# Use the linear layers
output = [layers[i](norm_ts[:,:,i]) for i in range(n_timeseries)]
# Add back the last value
forecast = [o + last_value[:,:,i] for i, o in enumerate(output)]

与研究中其他Transformer模型相比,N-Linear模型也表现得相当好。在研究所涉及的大多数数据集中,N-Linear或D-Linear成为表现最佳的模型,这很能说明问题。

本文揭示了我们在使用Transformer模型进行时间序列预测(尤其是多变量时间序列问题)时存在的一些主要缺陷。Transformer的典型输入形式为(Batch x Time steps x Embedding)。预测多变量时间序列最常见的方法是将一个时间步中的所有时间序列或其他特征作为嵌入传递。这导致看似不相关的值嵌入到单个令牌中,并在注意力机制(其本身不具备强有序性)中混合在一起。这会导致“混乱”的表示,从而使Transformer可能难以从数据中提炼出真正的模式。

本文影响如此之大,以至于包括PatchTST和iTransformer在内的许多较新模型(我们将在本章后面看到)都将这些模型作为基准,并显示出它们比这些模型表现更好。这强调了需要将强大而简单的方法保留为强基线,以免被任何算法的“炫酷”所误导。

现在让我们看看如何也能使用这些简单的线性模型并获得良好的长期预测。

使用LTSF-Linear系列进行预测

NLinear和DLinear在NIXTLA预测中实现,使用的框架与我们在先前模型中看到的相同。

让我们看看实现的初始化参数。

DLinear类与许多其他模型具有相似的参数。一些突出的主要参数如下:

NLinear类没有额外参数,因为它只是一个从输入窗口到输出窗口的映射。

笔记本提示

用于训练D-Linear模型的完整代码可在04-DLinear_NeuralForecast.ipynb笔记本中找到,而N-Linear模型的代码可在05-NLinear_NeuralForecast.ipynb笔记本中找到,这两个笔记本都位于Chapter16文件夹中。

实践者提示

关于Transformer是否更适用于时间序列预测的争论尚无定论,因为Transformer正在不断被修改以适应时间序列预测。可能总有一些数据集,使用基于Transformer的模型会比其他类别的模型表现更好。作为实践者,我们应该能够暂时搁置怀疑,尝试不同类别的模型,看看哪一种最适合我们的用例。毕竟,我们只关心我们试图预测的数据集。

现在,让我们看看Transformer如何被修改以用于时间序列,这种修改借鉴了LTSF-Linear论文的见解,并表明它可以胜过我们刚才看到的简单线性模型。

补丁时间序列Transformer(PatchTST)

2021年,Alexey Dosovitskiy等人提出了Vision Transformer,将Transformer架构(在自然语言处理中取得巨大成功)引入视觉领域。虽然并非首个引入补丁机制的,但他们以一种对视觉非常有效的方式应用了它。该设计将图像分割成多个补丁,并按顺序将每个补丁输入Transformer。

参考文献核实

Alexey Dosovitskiy等人关于Vision Transformer的论文以及Yuqi Nie等人关于PatchTST的论文分别在参考文献部分的1213中引用。

快进到2023年,同样的补丁设计被应用于时间序列预测。Yuqi Nie等人提出了补丁时间序列TransformerPatchTST),将补丁设计用于时间序列。他们的动机是更复杂的Transformer设计(如Autoformer和Informer)在时间序列预测上明显效果不佳。

2023年,Zheng等人通过将许多Transformer模型与一个简单的线性模型进行比较,发现该线性模型在常见基准上优于大多数Transformer模型。该论文的一个关键见解是,将时间序列逐点应用于Transformer架构无法捕捉时间序列数据中的局部信息和强顺序性。因此,作者提出了一种更简单的替代方案,其性能优于线性模型,并解决了在不增加内存和计算需求的情况下将长上下文窗口引入Transformer的问题。

PatchTST模型的架构

PatchTST模型是对Transformer的改进。以下是其主要贡献:

让我们更详细地了解一下这些内容。

分块(Patching)

在本章前面,我们看到了Transformer在时间序列预测方面的一些改编。所有这些改编都集中在使注意力机制适应时间序列预测和更长的上下文窗口。但它们都采用了逐点的方式使用注意力。让我们通过一个图表来更清楚地说明这一点,并引入分块的概念。

图16.5:分块与非分块的时间序列输入到Transformer

图16.5中,我们以一个包含8个时间步的时间序列为例。在左侧,我们可以看到我们讨论过的其他Transformer架构是如何处理时间序列的。它们使用某种机制(例如AutoFormer中的统一表示)将每个时间点转换为k维嵌入,然后逐个点地输入到Transformer架构中。每个点的注意力机制是通过查看上下文窗口中的所有其他点来计算的。

PatchTST论文声称,这种逐点注意力机制无法有效捕捉局部性,因此提出将时间序列划分为分块(patches),并将这些分块输入到Transformer中。分块本质上就是将时间序列转换为更短的时间序列,其过程与本书前面介绍的滑动窗口操作非常相似(几乎相同)。主要区别在于,这种分块是在我们从更长的时间序列中采样出一个窗口之后进行的。

分块通常由几个参数定义:

固定这两个参数后,长度为L的时间序列将产生$N = ((L - P) / S) + 2$个补丁。这里,我们还在原始序列末尾填充重复的最后一个值,以确保每个补丁大小相同。

图16.5中,我们展示了长度为$L = 8$的时间序列的补丁过程,其中$P = 4$,且$S = 2$。使用刚才看到的公式,我们可以计算出$N = 4$。我们还可以看到,最后一个值8在末尾被重复作为填充,以使最后一个补丁的长度也为4。

现在,每个补丁都被视为某种嵌入,并传入Transformer架构进行处理。通过这种输入补丁方式,对于给定上下文长度$L$,输入到Transformer的token数量大约减少到$L / S$。这意味着计算复杂度和内存使用量也减少了$S$倍。这使得模型能够在相同硬件约束下处理更长的上下文窗口,从而可能增强模型的预测性能。

现在,让我们看看通道独立性。

通道独立性

多元时间序列可以看作是多通道信号。Transformer的输入可以是单通道或多通道。大多数其他基于Transformer的能够进行多元预测的模型采用的方法是将通道混合在一起处理。换句话说,输入token从所有时间序列中获取信息并将其投影到共享的嵌入空间,混合信息。但其他更简单的方法分别处理每个通道,PatchTST的作者将这种独立性引入了Transformer。

在实践中,这非常简单。让我们通过一个例子来理解。考虑一个包含$M$个时间序列的数据集,使其成为多元时间序列。因此,PatchTST的输入将是$B \times M \times C$,其中$B$是批量大小,$C$是上下文窗口的长度。补丁化后,它变为$B \times M \times N \times P$,其中$N$是补丁数量,$P$是补丁长度。现在,为了以通道独立的方式处理这个多变量信号,我们只需重塑张量,使得M个时间序列中的每一个都成为批次中的另一个样本,即$\mathbb{B} \times N \times P$,其中$\mathbb{B} = B \times M$。

虽然这种独立性为模型带来了一些理想的特性,但也意味着不同时间序列之间的任何交互都被忽略,因为它们被视为完全独立。模型仍然在全局模型范式下训练,并将从跨学习中受益,但不同时间序列之间的任何显式交互(例如两个时间序列一起变化)都不会被捕获。

除了这些主要组件外,架构与标准Transformer架构非常相似。现在,让我们看看如何使用PatchTST进行实际预测。

使用PatchTST进行预测

PatchTST 在 NIXTLA forecasting 中实现。之前使用的同一框架也可以在这里与

让我们看看实现的初始化参数。

PatchTST 类有以下主要参数:

正则化参数:参数:

现在,让我们看看另一个基于Transformer的模型,它借鉴了PatchTST的创新并将其彻底颠覆以取得良好效果,性能超越了LTSF-Linear模型。

iTransformer

我们已经详细讨论了Transformer架构在处理多元时间序列方面的不足,即对局部性的低效捕获、与顺序无关的注意力机制混淆了各时间步的信息等等。2024年,Yong Liu等人对这个问题的看法略有不同,他们称之为“一种极端的补丁化”。

iTransformer的架构

他们提出,并非Transformer架构对时间序列预测无效,而是其使用方式不当。作者建议我们翻转Transformer架构的输入,使得注意力不再应用于时间步,而是应用于变量或时间序列上的不同序列/特征。图16.6清晰地展示了这一差异。

图16.6:Transformer与iTransformer的差异

在标准Transformer中,我们使用输入为(Batch × Time steps × Embeddings (features)),注意力应用于时间步,最后逐位置前馈网络将不同特征混合为变量混合表示。但当输入翻转为(Batch × Embeddings (features) × Timesteps)时,注意力在变量之间计算,逐位置前馈网络混合时间,而变量保持分离,形成变量未混合表示。

这种“翻转”还带来了一些其他好处。既然注意力不再跨时间计算,我们就可以包含非常大的上下文窗口,且计算和内存开销很小(注意计算和内存复杂度来自注意力机制的 O(N2))。实际上,论文建议将整个时间序列历史作为上下文窗口。另一方面,我们需要注意模型中包含的特征或并发时间序列的数量。

一个典型的Transformer架构包含以下主要组件:

在反转版本中,我们已经看到注意力在变量之间应用,并且前馈网络FFN)学习回顾窗口的可泛化表示,用于最终的预测。层归一化在反转版本中也表现良好。在标准Transformer中,层归一化通常用于对每个时间步的多变量表示进行归一化。但在反转版本中,我们分别对每个变量在时间维度上进行归一化。这类似于我们在N-Linear模型中进行的归一化,并且已被证明在非平稳时间序列问题上效果良好。

参考文献核实

Yong Liu 等人关于 iTransformers 的研究论文在参考文献部分被引用为18

使用 iTransformer 进行预测

iTransformer 在 NIXTLA forecasting 中实现。以前使用的相同框架也可以在这里与 iTransformer 一起使用。

iTransformer 类有以下主要参数:

笔记本提示

训练 iTransformer 模型的完整代码可以在 Chapter16 文件夹中的 07-iTransformer_NeuralForecast.ipynb 笔记本中找到。

现在,我们再来看一个非常成功的架构,它经过精心设计,能够充分利用全局上下文中的各种信息。

时序融合变换器(Temporal Fusion Transformer,TFT)

TFT是一个从零开始就经过深思熟虑设计的模型,旨在最有效地利用全局建模上下文中的各种不同类型的信息——静态变量和动态变量。TFT还将可解释性置于所有设计决策的核心。其结果是一个高性能、可解释且全局化的深度学习模型。

参考文献核实

Lim等人关于TFT的研究论文在参考文献部分中列为10

乍一看,这个模型的架构看起来很复杂且令人生畏。但一旦你层层剖析,它其实相当简单且巧妙。我们将一次只介绍一个抽象层次,让您逐步理解完整的模型。在此过程中,会有许多黑盒环节需要您暂时接受,但别担心——随着我们深入探讨,每个环节都会一一揭开。

TFT的架构

让我们在开始之前先建立一些符号和设定。我们有一个包含I个独立时间序列的数据集,每个实体i都有一些静态变量(si)。所有实体的所有静态变量的集合可以用S表示。我们还有一个长度为k的上下文窗口。此外,我们还有时变变量,这些变量有一个区别——对于某些变量,我们没有未来数据(未知),而对于其他变量,我们知道未来(已知)。我们将上下文窗口输入中的所有时变信息(上下文窗口、已知和未知的时变变量)记为xt-kxt。未来的已知时变变量用$x_{t+1} \ldots x_{t+T}$表示,其中$\tau$是预测范围。有了这些符号,我们就可以看第一个抽象层次了:

图16.6 – TFT – 高层概述

图16.7:TFT——高层概述

这里有很多内容需要解析。我们先从静态变量S开始。首先,静态变量通过一个变量选择网络(Variable Selection Network,VSN)。VSN进行实例级特征选择,并对输入进行一些非线性处理。这个处理后的输入被送入一组静态协变量编码器(Static Covariate Encoders,SEs)。SE模块旨在以一种有原则的方式整合静态元数据。

如果你跟随图16.6中SE模块的箭头,你会看到静态协变量在架构中的三个(四个不同的输出)不同位置被使用。当我们讨论这些位置时,会看到它们是如何使用的。但所有这些不同的位置可能都在关注静态信息的不同方面。为了使模型具有这种灵活性,经过处理和变量选择的输出被送入四个不同的门控残差网络(Gated Residual Networks,GRNs),这些网络又生成四个输出——csceccch。我们稍后会解释什么是GRN,但现在只需理解它是一个具有残差连接的非线性处理模块,如果需要,可以绕过非线性处理。

过去的输入,过去的输入,xt-k……xt,以及未来的已知输入局部增强LE)Seq2Seq层。我们可以将LE视为将局部上下文和时间顺序编码到每个时间步嵌入中的一种方式。这类似于原始Transformer中的位置编码。我们也可以在Autoformer模型中用于将历史编码为统一表示的Conv1d层中看到类似的尝试。稍后我们将了解LE内部发生了什么,但现在只需理解它捕捉了以其他观测变量和静态信息为条件的局部上下文。我们将该模块的输出称为局部编码上下文向量($\phi_{t-k} \ldots \phi_t$和

术语、记号以及主要模块的分组与原始论文中不尽相同。我对其进行了调整,使其更易理解和接受。

现在,这些LE上下文向量被送入时间融合解码器TFD)。TFD以类似Transformer模型的方式应用多头自注意力的轻微变体,并产生解码表示($\psi_{t-k} \ldots \psi_{t+T}$)。最后,该解码表示经过门控线性单元GLU)和一个加和与归一化模块,该模块将LE上下文向量作为残差连接添加。

GLU是一种帮助模型决定需要允许多少信息流过的单元。我们可以将其视为一种学习到的信息节流阀,广泛应用于自然语言处理NLP)架构中。其公式非常简单:

$$GLU(X) = (X * W + b) \otimes \sigma (X * V + c)$$

这里,WV是可学习的权重矩阵,bc是可学习的偏置,$\sigma$是激活函数,$\otimes$是哈达玛积运算符(逐元素乘法)。

加和与归一化模块与原始Transformer中的相同;我们在第14章《时间序列的注意力与Transformer》中讨论过这一点。

现在,作为最终步骤,我们有一个Dense层(带偏置的线性层),将Add & Norm模块的输出投影到期望的输出维度。

至此,我们应该在抽象层次上下降一层。

局部增强Seq2Seq层

让我们层层深入,探究LE Seq2Seq层内部发生了什么。首先来看一张图:

图16.7 – TFT – LE Seq2Seq层

图16.8:TFT—LE Seq2Seq层

LE采用Seq2Seq架构来捕获局部上下文。过程从处理后的过去输入开始。LSTM编码器接收这些过去输入,xt-k……xt。来自静态协变量编码器的ch cc作为LSTM的初始隐藏状态。编码器每次处理一个时间步,生成每个时间步的隐藏状态,Ht-k……Ht。最后的隐藏状态(上下文向量)现在传递到LSTM解码器,解码器处理已知的未来输入,$x_{t+1} \ldots x_{t+T}$,并生成每个未来时间步的隐藏状态,$H_{t+1} \ldots H_{t+T}$。最后,所有这些隐藏状态通过一个带有LSTM处理之前残差连接的GLU + AddNorm块。输出是LE上下文向量($\phi_{t-k} \ldots \phi_t$和

现在,让我们来看下一个模块:TFD。

时间融合解码器

让我们用另一张图来开始这个讨论:

图16.8 – 时间融合Transformer – 时间融合解码器

图16.9:时间融合Transformer——时间融合解码器

来自过去输入和已知未来输入的LE上下文向量被拼接成一个单一的LE上下文向量。现在,这可以被视为Transformer范式中的位置编码令牌。TFD所做的第一件事是使用静态协变量编码器创建的静态信息ce来丰富这些编码。该静态信息与嵌入拼接。使用位置级GRN来丰富嵌入。现在,这些丰富后的嵌入被用作Masked Interpretable Multi-Head Attention块的查询、键和值。

论文认为Masked Interpretable Multi-Head Attention块学习跨时间步的长程依赖。局部依赖已被LE Seq2Seq层在嵌入中捕获,但逐点的长程依赖由Masked Interpretable Multi-Head Attention捕获。该块还增强了架构的可解释性。过程中生成的注意力权重给我们一些指示,表明过程中涉及的主要时间步。然而,多头注意力在可解释性方面有一个缺点。

在vanilla多头注意力中,我们对值使用独立的投影权重,这意味着每个头的值不同,因此注意力权重不易解释。

TFT通过采用一个共享权重矩阵来将值投影到注意力维度,从而克服了这一限制。即使使用共享的值投影权重,由于每个头有独立的查询和键投影权重,每个头仍能学习不同的时间模式。除此之外,TFT还使用掩码来确保未来信息不被用于操作。我们在第14章《时间序列的注意力和Transformer》中讨论过这种因果掩码。通过这两个修改,TFT将此层命名为Masked Interpretable Multi-Head Attention

至此,是时候打开我们一直在使用的最后一个、也是粒度最细的抽象层级了。

门控残差网络

我们已经讨论门控残差网络(GRN)一段时间了;到目前为止,我们只是从表面理解它。让我们了解一下GRN内部发生了什么——它是TFT最基本的构建模块之一。

让我们看一下GRN的示意图,以便更好地理解它:

图16.9 – TFT – GRN(左)和VSN(右)

图16.10:TFT—GRN(左)和VSN(右)

GRN接收两个输入:主输入 a 和外部上下文 c。上下文 c 是一个可选输入,如果不存在则视为零。首先,输入 ac 分别通过独立的全连接层和随后的激活函数——指数线性单元ELU)(https://pytorch.org/docs/stable/generated/torch.nn.ELU.html)进行变换。

现在,变换后的 ac 输入相加,然后使用另一个 Dense 层再次变换。最后,通过一个 GLU+Add & Norm 层,该层带有来自原始 a 的残差连接。这种结构融合了足够的非线性以学习输入之间的复杂交互,但同时通过残差连接让模型忽略这些非线性。因此,这样的模块允许模型根据数据向上或向下缩放所需的计算量。

变量选择网络

TFT的最后一个构建模块是VSN。VSN使TFT能够进行实例级变量选择。大多数真实世界的时间序列数据集包含许多预测能力不强的变量,因此能够自动选择具有预测能力的变量有助于模型提取相关模式。图16.9(右)展示了这个VSN。

这些额外变量可以是分类变量或连续变量。TFT使用实体嵌入将分类特征转换为我们期望维度的数值向量(dmodel)。我们在第15章《全球深度学习预测模型的策略》中讨论过这一点。连续特征被独立地线性变换到相同维度 dmodel。这给出了变换后的输入 $\xi_t^{(1)} \ldots \xi_t^{(m)}$,其中 m 是特征数量,t 是时间步。我们可以将所有嵌入连接起来(展平它们),该展平表示可以表示为 $\epsilon_t$。

现在,有两个并行流处理这些嵌入——一个用于嵌入的非线性处理,另一个用于特征选择。每个嵌入都由独立的GRN处理(但所有时间步共享),以得到非线性处理后的嵌入 $\xi_t^{(1)} \ldots \xi_t^{(m)}$。在另一个流中,VSN处理展平表示 $\epsilon_t$,连同可选的上下文信息 c,并通过一个带有softmax激活的GRN进行处理。这给出了一个权重 vt,它是一个长度为 m 的向量。该 vt 现在用于所有非线性处理后的特征嵌入 $\xi_t^{(1)} \ldots \xi_t^{(m)}$ 的加权和,计算如下:

$$\tilde{\xi}_t = \sum_{j=1}^{m} v_t^{(j)} \xi_t^{(j)}$$

使用TFT进行预测

TFT 实现在NIXTLA forecasting中。我们可以使用与NBEATS相同的框架,并将其扩展以在我们的数据上训练TFT。此外,NIXTLA支持外生变量,与N-BEATSx处理外生变量的方式相同。首先,让我们看一下实现的初始化参数。

NIXTLA中的TFT类具有以下主要参数:

笔记本提示

训练TFT的完整代码可以在08-TFT_NeuralForecast.ipynb文件夹的Chapter16笔记本中找到。

解释TFT

TFT从与N-BEATS略有不同的角度来处理可解释性。N-BEATS提供分解后的输出以实现可解释性,而TFT则让我们了解模型如何解释其使用的变量。由于VSN的存在,我们可以直接获得特征权重。与基于树模型的特征重要性类似,TFT提供了类似的分数。由于自注意力层,注意力权重也可以被解释,以帮助我们理解哪些时间步在注意力机制中具有足够大的权重。

PyTorch Forecasting通过执行几个步骤来实现这一点。首先,我们使用mode="raw"函数获取原始预测中的predict。然后,我们在interpret_output函数中使用这些原始预测。interpret_output函数中有一个名为reduction的参数,它决定了如何跨不同实例聚合权重。我们知道TFT在VSN中执行实例级特征选择,并且注意力也是实例级执行的。'mean'是查看全局可解释性的一个不错选择:

raw_predictions, x = best_model.predict(val_dataloader, mode="raw", return_x=True)
interpretation = best_model.interpret_output(raw_predictions, reduction="sum")

interpretation 变量是一个字典,包含模型不同方面的权重,例如 attentionstatic_variablesencoder_variablesdecoder_variables。PyTorch Forecasting 还为我们提供了一种轻松可视化这些重要性的方式:

best_model.plot_interpretation(interpretation)

这将生成四个图:

图16.10 – 解读TFT

图16.11: 解读TFT

我们还可以查看每个实例,并对我们做出的每个预测绘制类似的可视化图。我们只需使用 reduction="none",然后自行绘图。随附的笔记本探讨了如何做到这一点以及更多内容。

现在,让我们换一个方向,看看一些证明简单 MLP 也能够匹配甚至超越基于 Transformer 的模型的模型。

TSMixer

当基于 Transformer 的模型正势如破竹地推进时,一条平行的研究轨迹开始使用 多层感知机MLP)代替 Transformer 作为关键学习单元。这一趋势始于2021年,当时 MLP-Mixer 表明,仅使用 MLP 就能在视觉问题上达到最先进的性能,取代了卷积神经网络。于是,类似的以 MLP 为关键学习组件的混合架构开始在各个领域涌现。2023年,Google 的 Si-An Chen 等人将混合 MLP 引入了时间序列预测。

参考文献核实

Si-An 等人关于 TSMixer 的研究论文在 参考文献 部分被引用为 19

TSMixer 模型的架构

TSMixer 确实从 Transformer 模型中汲取了灵感,但试图用 MLP 复制类似的过程。让我们使用 图16.10 来理解它们的异同。

图16.12:Transformer与TSMixer对比

如果你观察Transformer块,可以看到它有一个跨时间步的多头注意力机制,通过注意力将时间步“混合”在一起。然后这些输出被传递到位置前馈网络,将不同特征“混合”在一起。受此启发,TSMixer也在其Mixer块中包含了时间混合(Time-Mixing)和特征混合(Feature-Mixing)组件。此外,还有一个时间投影层(Temporal Projection),它接收Mixer块的输出并将其投影到输出空间。

我们逐一解释。图16.11展示了整体架构。

图16.13:TSMixer架构

输入(一个多元时间序列)被送入N个Mixer层,这些层顺序处理数据,最终Mixer层的输出被送入时间投影层,该层将学习到的表示转换为实际预测。尽管该图及论文中提到了“特征”,但这并非本书一直讨论的特征含义。此处,“特征”指的是多变量设置中的其他时间序列。

现在,我们深入Mixer层,查看块内的时间混合和特征混合。

Mixer层

图16.14:TSMixer—Mixer块

输入的形式为(批量大小×特征×时间步),首先通过时间混合块。输入首先转置为(批量大小×时间步×特征)的形式,以便时间混合MLP中的权重混合时间步。接着,这个“时间混合”后的输出被传递到特征混合MLP,该MLP利用其权重混合不同特征,从而得到最终的学习表示。在中间添加了批量归一化层和残差连接,使模型更鲁棒,并学习更深、更平滑的连接。

给定输入矩阵 $X \in \mathbb{R}^{\{L \times C\}}$,时间混合的数学表示为:

$$Time \ Mixing(X) = 2DNorm\left(X + Drop\left(\sigma\left(FC_{\{L \to L(X)\}}\right)\right)\right)$$

特征混合实际上是一个两层MLP:第一层映射到隐藏维度 Hinner,第二层从 Hinner 映射到输出维度 H。若未明确指定,输出维度默认为原始特征数(或时间序列数)C

$$U = Drop\left(\sigma\left(FC_{\{C \to H_{inner}\}}\right)\right)$$

$$Feature \ Mixing \ (X) = 2dNorm\left(X + Drop\left(FC_{\{H_{inner} \to H\}}(U)\right)\right)$$

因此,整个混合器层可以表示为:

$$Mix_{\{C \to H\}} = Feature \ Mixing_{\{C \to H\}}\left(Time \ Mixing_{\{L \to L\}}(X)\right)$$

现在,此输出通过时间投影层传递以获得预测。

时间投影层

图16.15:TSMixer——时间投影层

时间投影层只不过是一个应用于时间域的全连接层。这与我们之前看到的简单线性模型相同,在该模型中,我们将全连接层应用于输入上下文以获得预测。TSMixer不是将该层应用于输入,而是将其应用于混合器层的“混合”输出。

上一层的输出形式为(批量大小 x 时间步 x 特征)。将其转置为(批量大小 x 特征 x 时间步),然后通过全连接层,该层将输入投影为(批量大小 x 特征 x 预测视界),以获得最终预测。

给定 $O_k \in \mathbb{R}^{\{L \times H\}}$ 作为第 k 个混合器层的输出和预测视界 T

$$Temporal \ Projection(O_k) = FC_{\{H \times L \to C \times T\}}$$

但我们如何包含额外的特征呢?许多时间序列问题具有静态特征和动态(面向未来)特征,这为问题增加了相当多的信息。我们目前讨论的架构不允许包含这些特征。因此,作者提出了一个微小的调整来包含这些额外信息,即TSMixerx。

TSMixerx——带辅助信息的TSMixer

沿用之前的符号约定,考虑输入时间序列(或时间序列集合)$X \in \mathbb{R}^{L \times C}$。现在,我们有一些历史特征 $\hat{X} \in \mathbb{R}^{L \times c_X}$、一些未来特征 $Z \in \mathbb{R}^{T \times C_Z}$ 以及静态特征 $S \in \mathbb{R}^{1 \times C_S}$。为了有效包含所有这些额外信息,作者定义了另一个学习单元,称为条件特征混合层,并以其使用方式整合所有信息。

条件特征混合CFM)层与特征混合层几乎完全相同,除了

数学上,它可以表示为:

$$V = FC_{\{C_S \to H\}}(Expand(S))$$

$$Conditional\ Feature\ Mixing(X, S) = FC_{\{C+H \to H\}}(X \oplus V)$$

其中$\oplus$表示拼接,表示拼接,Expand表示在所有时间步上重复静态信息。

现在,我们来看CFM层如何在整体TSMixerx架构中使用。

图16.16:TSMixerx——使用外生变量的架构

首先,我们有X和$\hat{X}$,它们有,它们有L个时间步,即上下文窗口的长度。因此,我们将两者拼接并使用简单的时间投影层将组合张量投影到T是预测区间的长度。这也是未来特征的长度,Z。现在,我们使用CFM层将其与静态信息结合,该层将它们投影到隐藏维度,H。形式上,这一步表示为:

$$X' = CFM_{C+C_x \to H}(FC_{L \to T}(X \oplus \hat{X}), S)$$

现在,我们希望条件性地混合未来特征Z以及静态信息,以及静态信息S。因此,我们使用CFM层来实现,并将组合信息投影到隐藏维度,H

$$Z' = CFM_{C_Z \to H}(Z, S)$$

此时,我们得到了 $X'$ 和 $Z'$,两者均处于 $T \times H$ 维度。因此,我们使用另一个 CFM 层,在 $S$ 条件下进一步混合这些特征。这样我们就得到了第一个特征混合的潜在表示 $O_1$。

$$O_1 = CFM_{2H \to H}(X' \oplus Z', S)$$

现在,这个潜在表示被传递到后续的 $K - 1$ 个 CFM 层(类似于常规 TSMixer 架构),其中 $K$ 是 Mixer 层的总数,最终得到 $O_k$,即最终的潜在表示。共有 $K - 1$ 层,因为第一个 Mixer 层已经定义,且仅输入维度与其余层不同。

$$O_k = CFM_{H \to H}(O_{k-1}, S), \forall k = 2, ..., K$$

现在,我们可以使用一个简单的线性层将该输出投影到所需的输出维度。如果是针对单个时间序列的点预测,可将其投影到 $T \times 1$。若我们要预测 M 个时间序列,则可将其投影到 $T \times M$。

使用 TSMixer 和 TSMixerx 进行预测

TSMixer 在 NIXTLA 预测库中实现,使用的框架与我们在前述模型中看到的相同。

让我们看看实现的初始化参数。

TSMixer 类有以下主要参数:

与 NBEATX 类似,有一个TSMixerx类可以接受外生信息。要使用外生信息进行预测,你需要将适当的信息填入以下参数:

笔记本提示

训练 TSMixer 模型的完整代码可以在 Chapter16 文件夹中的 09-TSMixer_NeuralForecast.ipynb 笔记本中找到。

现在让我们再看一种基于 MLP 的架构,它已被证明性能优于我们之前看到的 PatchTST 和线性模型系列。

时间序列密集编码器(TiDE)

我们在本章前面看到,线性模型系列的性能优于许多 Transformer 模型。2023 年,Google 的 Das 等人提出了一种模型,将这一思想扩展到非线性领域。他们认为,当未来与过去之间的依赖关系存在固有的非线性时,线性模型将表现不佳。协变量的加入加剧了这一问题。

参考文献核实

Das等人的研究论文在参考文献部分被引用为20

因此,他们引入了一种简单高效的基于多层感知机MLP)的架构,用于长期时间序列预测。该模型本质上使用密集MLP对时间序列的过去以及协变量进行编码,然后将这一潜在表示解码为预测。该模型假设通道独立性(类似于PatchTST),并将多元问题中的不同相关时间序列视为单独的时间序列。

TiDE模型的架构

该架构有两个主要组成部分——编码器和解码器。但在整个架构中,一个称为残差块的学习组件被重复使用。我们先来看残差块。

残差块

残差块是一个带有ReLU激活函数和后续线性投影的MLP,通过残差连接实现。图16.14展示了一个残差块。

图16.17:TiDE:残差块

我们通过设置隐藏维度和输出维度来定义该层。第一层Dense将输入变换为隐藏维度,然后对输出应用ReLU非线性激活。之后,该输出被线性投影到输出维度,并在其上叠加一个丢弃层。然后,通过使用另一个线性投影将输入投影到输出维度,将残差连接添加到输出。最后,输出通过层归一化处理。

设$X \in \mathbb{R}^f$为该块的输入,h为隐藏维度,o为输出维度。那么,残差块可以表示为:

$$O \in \mathbb{R}^o = LayerNorm\left(FC_{f \to o}(X) + Dropout\left(FC_{h \to o}\left(ReLU\left(FC_{f \to h}(X)\right)\right)\right)\right)$$

让我们建立一些符号以帮助后续解释。数据集中有N个时间序列,L是回顾窗口的长度,H是预测的长度。因此,第i个时间序列的回顾可以表示为$y_{1:L}^{(i)}$,其预测为$y_{L+1:L+H}^{(i)}$。在时间$t$处的r维动态协变量由$x_t^{(i)} \in \mathbb{R}^r$表示。第i个时间序列的静态特征为$a^{(i)} \in \mathbb{R}^s$。

现在,我们来看图16.15中的更大架构。

图16.18:TiDE:整体架构

编码器

编码器的任务是将回看窗口和相应的协变量映射为稠密的潜在表示。第一步是对动态协变量 $x \in \mathbb{R}^r$ 进行线性投影,投影至 $\hat{x} \in \mathbb{R}^r$,其中 $\tilde{r}$(称为时间宽度)远小于 r。我们使用残差块进行此投影。

$$\tilde{x}_t^{(i)} = ResidualBlock(x_t^{(i)})$$

从编程的角度(B 为批次大小),如果动态协变量的输入维度为 $(B \times L \times r)$,则将其投影至 $(B \times L \times \tilde{r})$。

这样做的目的是,当我们展平时间序列及其协变量再送入编码器时,得到的张量维度不会爆炸。这就引出了下一步:展平张量并拼接它们。展平和拼接操作大致如下:

  1. 回看窗口:$B \times L \times 1 \to B \times L$
  2. 动态协变量:$B \times L + H \times \tilde{r} \to B \times (L + H) \cdot \tilde{r}$
  3. 静态信息:$B \times S$
  4. 拼接后的表示:$B \times (L + (L + H) \cdot \tilde{r} + S)$

现在,该拼接后的表示被送入一组共 ne 个残差块,以编码为稠密的潜在表示。

$$e^{(i)} = Encoder(y_{1:l}^{(i)}; \tilde{x}_{1:L+H}^{(i)}; a^{(i)})$$

从编程角度来看,维度从 $B \times (L + (L + H) \cdot \tilde{r} + S)$ 变换到 $B \times H$,其中 H 是潜在表示的隐藏大小。

现在我们有了潜在表示,来看如何从中解码出预测结果。

解码器

与编码器类似,解码器也分为两个步骤。第一步,我们使用 nd 个残差块堆叠,将潜在表示解码为维数为 $p \cdot H$ 的解码向量,其中 $p$ 是解码器输出维度。该解码向量被重塑为 $p \times H$ 维向量。

$$g^{(i)} \in \mathbb{R}^{p \cdot H} = Decoder(e^{(i)})$$

$$D^{(i)} \in \mathbb{R}^{p \times H} = Reshape(g^{(i)})$$

现在,我们使用时间解码器将该解码向量转换为预测值。时间解码器只是一个残差块,其输入为拼接后的解码向量 $D^{(i)}$ 和编码后的未来外生向量 $\tilde{x}_{L+1:L+H}^{(i)}$。作者认为,这种残差连接使得某些未来协变量能够以更强的方式影响预测。例如,在零售预测问题中,如果某个未来协变量是节假日,那么你希望该变量对预测有强烈影响。

这种残差连接有助于模型在需要时启用该“高速公路”。

$$\hat{y}_{L+t}^{(i)} = TemporalDecoder(d_t^{(i)}; \tilde{x}_{L+t}^{(i)}) \ \forall t \in [H]$$

最后,我们添加一个全局残差连接,将回溯窗口线性映射到预测 $\hat{y}_{L+1:L+H}^{(i)}$,经过线性映射到正确维度后。这确保了本章前面看到的线性模型成为 TiDE 模型的子类。

使用 TiDE 进行预测

TiDE 在 NIXTLA 预测中实现,使用与先前模型相同的框架。

让我们看看实现的初始化参数。

TIDE 类有以下主要参数:

此外,TIDE 可以处理外生信息,这些信息可以通过以下参数包含:

我们已经介绍了几种流行的时间序列预测专用架构,但这绝不是完整的列表。市面上还有许多模型架构和技术。我在延伸阅读部分列出了几个,供您参考。

恭喜您完成了本书中可能最困难、最密集的一章。给自己一点掌声,放松一下。

小结

我们通过回顾几种时间序列预测专用架构,终于结束了深度学习用于时间序列的旅程。我们理解了为什么为时间序列和预测设计专用架构是有意义的,并继续了解了不同模型的工作原理,例如N-BEATSN-BEATSxN-HiTSAutoformerTFTPatchTSTTiDETSMixer。除了介绍架构和背后的理论,我们还研究了如何使用NIXTLA的neuralforecast在真实数据集上应用这些模型。我们永远不知道哪个模型更适合我们的数据集,但作为实践者,我们需要培养指导实验的直觉。了解这些模型在幕后如何工作对于培养这种直觉至关重要,并将帮助我们更高效地进行实验。

至此,本书的这一部分告一段落。现在,您应该对将深度学习应用于时间序列预测问题更加得心应手了。

在下一章中,让我们看看预测中的另一个重要主题——概率预测。

参考文献

以下是本章中使用的参考文献列表:

  1. Spyros Makridakis, Evangelos Spiliotis, and Vassilios Assimakopoulos. (2020). The M4 Competition: 100,000 time series and 61 forecasting methods. International Journal of Forecasting, Volume 36, Issue 1. Pages 54–74. https://doi.org/10.1016/j.ijforecast.2019.04.014.
  2. Slawek Smyl. (2018). M4 Forecasting Competition: Introducing a New Hybrid ES-RNN Model. https://www.uber.com/blog/m4-forecasting-competition/.
  3. Boris N. Oreshkin, Dmitri Carpov, Nicolas Chapados, and Yoshua Bengio. (2020). N-BEATS: Neural basis expansion analysis for interpretable time series forecasting. 8th International Conference on Learning Representations, (ICLR). https://openreview.net/forum?id=r1ecqn4YwB.
  4. Kin G. Olivares and Cristian Challu and Grzegorz Marcjasz and R. Weron and A. Dubrawski. (2022). Neural basis expansion analysis with exogenous variables: Forecasting electricity prices with NBEATSx. International Journal of Forecasting, 2022. https://www.sciencedirect.com/science/article/pii/S0169207022000413.
  5. Cristian Challu, Kin G. Olivares, Boris N. Oreshkin, Federico Garza, Max Mergenthaler-Canseco 和 Artur Dubrawski. (2022). N-HiTS: Neural Hierarchical Interpolation for Time Series Forecasting. arXiv 预印本 arXiv: Arxiv-2201.12886. https://arxiv.org/abs/2201.12886..
  6. Vaswani, Ashish, Shazeer, Noam, Parmar, Niki, Uszkoreit, Jakob, Jones, Llion, Gomez, Aidan N, Kaiser, Lukasz 和 Polosukhin, Illia. (2017). Attention is All you Need. Advances in Neural Information Processing Systems.https://papers.nips.cc/paper/2017/hash/3f5ee243547dee91fbd053c1c4a845aa-Abstract.html..
  7. Haoyi Zhou, Shanghang Zhang, Jieqi Peng, Shuai Zhang, Jianxin Li, Hui Xiong 和 Wancai Zhang. (2021). Informer: Beyond Efficient Transformer for Long Sequence Time-Series Forecasting. 第三十五届 {AAAI} 人工智能大会, {AAAI} 2021. https://ojs.aaai.org/index.php/AAAI/article/view/17325..
  8. Bryan Lim, Sercan Ö. Arik, Nicolas Loeff 和 Tomas Pfister. (2019). Temporal Fusion Transformers for Interpretable Multi-horizon Time Series Forecasting. International Journal of Forecasting, 第 37 卷, 第 4 期, 2021 年, 第 1,748–1,764 页. https://www.sciencedirect.com/science/article/pii/S0169207021000637..
  9. Bryan Lim, Sercan Ö. Arik, Nicolas Loeff 和 Tomas Pfister. (2019). Temporal Fusion Transformers for Interpretable Multi-horizon Time Series Forecasting. International Journal of Forecasting, 第 37 卷, 第 4 期, 2021 年, 第 1,748–1,764 页. https://www.sciencedirect.com/science/article/pii/S0169207021000637..
  10. Alexey Dosovitskiy, Lucas Beyer, Alexander Kolesnikov, Dirk Weissenborn, Xiaohua Zhai, Thomas Unterthiner, Mostafa Dehghani, Matthias Minderer, Georg Heigold, Sylvain Gelly, Jakob Uszkoreit 和 Neil Houlsby. (2021). An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale. 第 9 届国际学习表征大会, ICLR 2021. https://openreview.net/forum?id=YicbFdNTTy..
  11. Yuqi Nie, Nam H. Nguyen, Phanwadee Sinthong 和 J. Kalagnanam. (2022). A Time Series is Worth 64 Words: Long-term Forecasting with Transformers. 第 10 届国际学习表征大会, ICLR 2022. https://openreview.net/forum?id=Jbdc0vTOcol..
  12. Ailing Zeng 和 Mu-Hwa Chen, L. Zhang, 和 Qiang Xu. (2023). Are Transformers Effective for Time Series Forecasting? AAAI 人工智能大会.https://ojs.aaai.org/index.php/AAAI/article/view/26317..
  13. Liu, Shizhan 和 Yu, Hang 和 Liao, Cong 和 Li, Jianguo 和 Lin, Weiyao 和 Liu, Alex X 和 Dustdar, Schahram. (2022). Pyraformer: Low-Complexity Pyramidal Attention for Long-Range Time Series Modeling and Forecasting. 国际学习表征大会. https://openreview.net/pdf?id=0EXmFzUn5I..
  14. Zhou, Tian 和 Ma, Ziqing 和 Wen, Qingsong 和 Wang, Xue 和 Sun, Liang 和 Jin, Rong. (2022). {FEDformer}: Frequency enhanced decomposed transformer for long-term series forecasting. Proc. 39th 国际机器学习大会 (ICML 2022).https://proceedings.mlr.press/v162/zhou22g.html..
  15. Shiyang Li, Xiaoyong Jin, Yao Xuan, Xiyou Zhou, Wenhu Chen, Yu-Xiang Wang 和 Xifeng Yan. (2019). Enhancing the locality and breaking the memory bottle neck of transformer on time series forecasting. Advances in Neural Information Processing Systems. https://proceedings.neurips.cc/paper_files/paper/2019/file/6775a0635c302542da2c32aa19d86be0-Paper.pdf..
  16. Yong Liu, Tengge Hu, Haoran Zhang, Haixu Wu, Shiyu Wang, Lintao Ma 和 Mingsheng Long. (2024). iTransformer: Inverted Transformers Are Effective for Time Series Forecasting.12.12th 国际学习表征大会, ICLR 2024.https://openreview.net/forum?id=JePfAI8fah..
  17. Si-An Chen、Chun-Liang Li、Sercan O Arik、Nathanael Christian Yoder 和 Tomas Pfister。(2023)。TSMixer: An All-MLP Architecture for Time Series Forecasting。Transactions on Machine Learning Research。. Transactions on Machine Learning Research。https://openreview.net/forum?id=wbpxTuXgm0.
  18. Abhimanyu Das、Weihao Kong、Andrew Leach、Shaan Mathur、Rajat Sen 和 Rose Yu。(2023)。Long-term Forecasting with TiDE: Time-series Dense Encoder。Transactions on Machine Learning Research。. Transactions on Machine Learning Research。https://openreview.net/forum?id=pCbC3aQB5W.

延伸阅读

你可以查看以下资源进行拓展阅读: