下篇 | 使用 Transformers 进行概率时间序列预测

在《使用 🤗 Transformers 进行概率时间序列预测》的第一部分里,我们为大家介绍了传统时间序列预测和基于 Transformers 的方法,也一步步准备好了训练所需的数据集并定义了环境、模型、转换和 InstanceSplitter
。本篇内容将包含从数据加载器,到前向传播、训练、推理和展望未来发展等精彩内容。
创建 PyTorch 数据加载器
有了数据,下一步需要创建 PyTorch DataLoaders。它允许我们批量处理成对的 (输入, 输出) 数据,即 (past_values
, future_values
)。
让我们检查第一批:
可以看出,我们没有将 input_ids
和 attention_mask
提供给编码器 (训练 NLP 模型时也是这种情况),而是提供 past_values
,以及 past_observed_mask
、past_time_features
、static_categorical_features
和 static_real_features
几项数据。
解码器的输入包括 future_values
、future_observed_mask
和 future_time_features
。future_values
可以看作等同于 NLP 训练中的 decoder_input_ids
。
我们可以参考 Time Series Transformer 文档 以获得对它们中每一个的详细解释。
前向传播
让我们对刚刚创建的批次执行一次前向传播:
目前,该模型返回了损失值。这是由于解码器会自动将 future_values
向右移动一个位置以获得标签。这允许计算预测结果和标签值之间的误差。
另请注意,解码器使用 Causal Mask 来避免预测未来,因为它需要预测的值在 future_values
张量中。
训练模型
是时候训练模型了!我们将使用标准的 PyTorch 训练循环。
这里我们用到了 🤗 Accelerate 库,它会自动将模型、优化器和数据加载器放置在适当的 device
上。
🤗 Accelerate 文档地址:
https://hf.co/docs/accelerate/index
推理
在推理时,建议使用 generate()
方法进行自回归生成,类似于 NLP 模型。
预测的过程会从测试实例采样器中获得数据。采样器会将数据集的每个时间序列的最后 context_length
那么长时间的数据采样出来,然后输入模型。请注意,这里需要把提前已知的 future_time_features
传递给解码器。
该模型将从预测分布中自回归采样一定数量的值,并将它们传回解码器最终得到预测输出:
该模型输出一个表示结构的张量 (batch_size
, number of samples
, prediction length
)。
下面的输出说明: 对于大小为 64 的批次中的每个示例,我们将获得接下来 24 个月内的 100 个可能的值:
我们将垂直堆叠它们,以获得测试数据集中所有时间序列的预测:
我们可以根据测试集中存在的样本值,根据真实情况评估生成的预测。这里我们使用数据集中的每个时间序列的 MASE 和 sMAPE 指标 (metrics) 来评估:
MASE 文档地址:
https://hf.co/spaces/evaluate-metric/masesMAPE 文档地址:
https://hf.co/spaces/evaluate-metric/smape
我们还可以单独绘制数据集中每个时间序列的结果指标,并观察到其中少数时间序列对最终测试指标的影响很大:
为了根据基本事实测试数据绘制任何时间序列的预测,我们定义了以下辅助绘图函数:
例如:
plot(334)

我们如何与其他模型进行比较?Monash Time Series Repository 有一个测试集 MASE 指标的比较表。我们可以将自己的结果添加到其中作比较:
请注意,我们的模型击败了所有已知的其他模型 (另请参见相应 论文 中的表 2) ,并且我们没有做任何超参数优化。我们仅仅花了 40 个完整训练调参周期来训练 Transformer。
上文对于此数据集的预测方法论文:
https://openreview.net/pdf?id=wEc1mgAjU-
当然,我们应该谦虚。从历史发展的角度来看,现在认为神经网络解决时间序列预测问题是正途,就好比当年的论文得出了 “你需要的就是 XGBoost” 的结论。我们只是很好奇,想看看神经网络能带我们走多远,以及 Transformer 是否会在这个领域发挥作用。这个特定的数据集似乎表明它绝对值得探索。
得出“你需要的就是 XGBoost”结论的论文地址:
https://www.sciencedirect.com/science/article/pii/S0169207021001679
下一步
我们鼓励读者尝试我们的 Jupyter Notebook 和来自 Hugging Face Hub 的其他时间序列数据集,并替换适当的频率和预测长度参数。对于您的数据集,需要将它们转换为 GluonTS 的惯用格式,在他们的 文档 里有非常清晰的说明。我们还准备了一个示例 Notebook,向您展示如何将数据集转换为 🤗 Hugging Face 数据集格式。
Time Series Transformers Notebook:
https://colab.research.google.com/github/huggingface/notebooks/blob/main/examples/time-series-transformers.ipynbHub 中的 Monash Time Series 数据集:
https://hf.co/datasets/monash_tsfGluonTS 阐述数据集格式的文档:
https://ts.gluon.ai/stable/tutorials/forecasting/extended_tutorial.html演示数据集格式转换的 Notebook:
https://github.com/huggingface/notebooks/blob/main/examples/time_series_datasets.ipynb
正如时间序列研究人员所知,人们对“将基于 Transformer 的模型应用于时间序列”问题很感兴趣。传统 vanilla Transformer 只是众多基于注意力 (Attention) 的模型之一,因此需要向库中补充更多模型。
目前没有什么能妨碍我们继续探索对多变量时间序列 (multivariate time series) 进行建模,但是为此需要使用多变量分布头 (multivariate distribution head) 来实例化模型。目前已经支持了对角独立分布 (diagonal independent distributions),后续会增加其他多元分布支持。请继续关注未来的博客文章以及其中的教程。
路线图上的另一件事是时间序列分类。这需要将带有分类头的时间序列模型添加到库中,例如用于异常检测这类任务。
当前的模型会假设日期时间和时间序列值都存在,但在现实中这可能不能完全满足。例如 WOODS 给出的神经科学数据集。因此,我们还需要对当前模型进行泛化,使某些输入在整个流水线中可选。
WOODS 主页:
https://woods-benchmarks.github.io/
最后,NLP/CV 领域从大型预训练模型 中获益匪浅,但据我们所知,时间序列领域并非如此。基于 Transformer 的模型似乎是这一研究方向的必然之选,我们迫不及待地想看看研究人员和从业者会发现哪些突破!
大型预训练模型论文地址:
https://arxiv.org/abs/1810.04805
英文原文: Probabilistic Time Series Forecasting with 🤗 Transformers: https://huggingface.co/blog/time-series-transformers
译者、排版: zhongdongy (阿东)