原文:
towardsdatascience.com/n-beats-the-first-interpretable-deep-learning-model-that-worked-for-time-series-forecasting-06920daadac2
https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/a9d2fff56869d37a6000457fdc11d6d4.png
N-BEATS 的架构(图片来自Oreshkin 等人)。
时间序列预测一直是深度学习和 Transformer 没有超越其他模型的唯一领域。
观察 Makridakis M-竞赛,获胜方案总是依赖于统计模型。直到 M4 竞赛,获胜方案要么是纯统计模型,要么是机器学习和统计模型的混合。纯机器学习方法几乎没有超越竞赛基准。
这种情况在 2020 年Oreshkin 等人发表的一篇论文中发生了变化。作者们发布了 N-BEATS,这是一种有前途的纯深度学习方法。该模型击败了 M4 竞赛的获胜方案。这是第一个超越成熟统计方法的纯深度学习方法。
N-BEATS 代表NeuralBasisExpansionAnalysis forInterpretableTimeSeries。
在这篇文章中,我将介绍 N-BEATS 背后的架构。但不要害怕,深入探讨将会易于理解。我还将向您展示我们如何使深度学习方法可解释。然而,仅仅理解 N-BEATS 的工作原理是不够的。因此,我将向您展示如何轻松地在 Python 中实现 N-BEATS 模型,并调整其超参数。
在查看其架构之前,让我们先理解 N-BEATS 的核心思想。
N-BEATS 的核心功能在于神经基函数展开。
基函数展开是一种增强数据的方法。我们扩展特征集以能够建模非线性关系。听起来很抽象,对吧?
基函数展开是如何工作的?例如,我们有一个问题,我们的目标值y与特征x之间存在某种关系。我们希望使用线性模型来表示y和x之间的关系。在 1 维空间中,这将导致线性关系(下图中左边的图)。
然而,特征和目标可能不会显示线性关系,从而导致模型无用。我们有什么办法吗?
是的,我们可以扩展特征集。让我们将原始特征的二次值添加到特征集中,得到[x, x²]。这样,我们就从 1 维空间移动到了 2 维空间,因为我们现在有两个特征而不是一个。我们现在可以在 2 维空间中拟合一个线性模型,得到一个二次多项式模型(下图中右边的图)。
https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/493cc0a61f096f801b5017b0baee6cc2.pnghttps://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/a4e3b5d67f9acc71dbfa2bdbf1e19c0e.png
一维空间中的线性回归(左侧)与二维空间中的线性回归(右侧)相比。通过基函数展开,我们可以更好地将我们的模型拟合到数据上(图片由作者提供)。
这就是基函数展开的全部内容。我们通过添加基于原始特征的新特征来扩展我们的特征集。在这种情况下,我们使用了二次多项式展开。我们将每个原始特征的二次值添加到特征集中。
最常见的基函数展开方法是多项式基函数展开。然而,还有许多其他方法,例如分箱、分段线性样条、自然三次样条、对数或平方。
N-BEATS 模型决定使用哪种基函数展开。在训练过程中,模型试图找到最佳的基函数展开方法来拟合数据。我们让模型来做这项工作。这就是为什么它被称为“神经基函数展开”。
N-BEATS 是如何详细工作的?
N-BEATS 模型的架构如下:
https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/a9d2fff56869d37a6000457fdc11d6d4.png
N-BEATS 的架构(图片来自 Oreshkin 等人)。
这里发生了很多事情,图片可能让人感到不知所措。但是,N-BEATS 的理念非常简单。
我们可以观察到两个要点。
首先,模型将时间序列分为回溯期和预测期。模型使用回溯期进行预测。回溯期的长度通常比预测期长。最佳倍数通常在两到六之间。
其次,N-BEATS 模型(右侧的黄色矩形)由分层堆叠组成。每个堆叠,反过来,由分层模块组成。
每个模块都有一个分叉结构(左侧的蓝色矩形)。模块中的一个分支产生一个回溯,另一个分支从某些模块输入数据中产生一个预测。预测包含对未见值的预测。相比之下,回溯显示了模型对输入数据的拟合情况。
我们是如何从输入中获取回溯和预测的?首先,模型将输入通过一个具有四层的全连接神经网络传递。MLP 产生回溯和预测的展开系数,theta。这些展开系数流入两个分支,一个用于回溯,一个用于预测。在每个分支中,我们执行基函数展开。在这里,实际的 "神经基函数展开"发生了。
如上图所示,N-BEATS 在一个堆叠中连接了各种块。因为每个块都返回一个回溯和预测,所以发生两件事。首先,模型将每个块的局部预测相加以产生堆叠的预测。其次,模型从块的输入中移除块的回溯。因此,每个块只接收前一个块的残差。这样,模型只传递前一个块未捕获的信息给下一个块。因此,每个块试图逼近输入信号的某一部分,专注于局部模式。
然后,N-BEATS 分层堆叠了各种堆叠。就像堆叠中的块一样,除了第一个堆叠外,每个堆叠都是在前一个堆叠的残差上训练的。这样,每个堆叠学习了一个之前未被捕获的全局模式。最终的预测是堆叠预测的总和,提供了一个层次分解。
如我们所见,N-BEATS 应用了双残差堆叠方法。回溯和预测产生了向后和向前的残差。块和堆叠的分层架构导致了这些残差的堆叠。通过双残差堆叠,N-BEATS 可以重新创建统计模型的机制。
N-BEATS 的优势
与其他深度学习方法相比,N-BEATS 使我们能够构建非常深的 NNs,并具有可解释的结果。此外,训练速度更快。该模型不包含任何循环或自注意力层。其双残差堆叠促进了更流畅的梯度反向传播。
与经典的时间序列预测方法相比,我们不需要进行任何特征工程。我们不需要识别时间序列特有的特征,如季节性和趋势。N-BEATS 为我们做到了这一点。这使得模型易于使用,我们可以快速开始。
此外,该模型具备零样本迁移学习的能力。
深度学习架构如何才能具有可解释性?
好吧,我上面描述的 N-BEATS 的通用版本是不可解释的。模型可以学习的基于函数的基础和网络的深度没有任何限制。我们不知道模型学习了什么,以及这些是否是时间序列特有的组件,比如趋势。
我们如何获得可解释性?
我们使用了一个技巧。我们限制了模型的深度以及模型可以学习的基于函数的基础。
例如,我们经常在时间序列预测中使用趋势和季节性。
我们可以迫使模型只学习这两个特征。首先,我们通过仅使用两个堆叠来限制模型的深度。第一个堆叠学习趋势,第二个堆叠学习季节性。
我们可以通过提取每个堆叠的局部预测来解释模型的结果。
第二,我们必须迫使模型只学习趋势和季节性。我们必须引入一个特定问题的归纳偏差。我们通过将基函数扩展函数设置为特定的函数形式来实现这一点。为此,我们将每个块中的最后一层替换为一个函数。我们使用多项式基函数来确定趋势,并使用傅里叶基函数来确定季节性。
https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/cbac92dbf87071c001581021bf7b31ff.png
N-BEATS 通用版本(左)和 N-BEATS 可解释版本(右)的通用架构(图片由作者提供)。
使用 N-BEATS 进行预测的示例
现在我们已经了解了 N-BEATS 的工作原理,让我们将模型应用于一个预测任务。
我们将预测德国未来两周的电力批发价格。数据由Ember提供,在"欧洲电力批发价格数据集下,根据 CC-BY-4.0 许可。我们将使用 Nixtla 的neuralforecast库中的 N-BEATS 实现。这个库使我们能够非常容易地应用 N-BEATS。
https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/babe88ecdb82aee2e9e6a86e7bb1aaae.png
德国电力批发价格(图片由作者提供,数据由Ember提供)。
请注意,我并不是试图得到尽可能准确的预测,而是展示我们如何应用 N-BEATS。
好的。让我们开始吧。
让我们导入所需的库和数据集。