使用变压器可以进行时间序列预测吗?

数据挖掘 时间序列 火炬 预测 变压器
2021-09-18 00:53:16

对于我的本科项目,我的任务是制作一个可以预测时间序列数据,特别是电网数据的变压器。我需要采用长度为 N 的单变量时间序列,然后可以预测未来的另一个单变量时间序列 M 步。

我一开始是按照“ Attention is all you need ”论文开始的,但由于这篇论文是针对 NLP 的,所以我不得不进行一些更改。我没有将每个单词嵌入到 d_model 维空间中的随机点,而是使用线性层嵌入数据。我还尝试使用内核大小为 1 的 nn.Conv1d 层进行嵌入,但这些方法无法对数据进行非线性预测,而只能通过数据的平均值预测一条直线。

首先,我认为问题出在变压器的实现上,但即使我在 nn.Transformer 模块中使用 Pytorch 的构建,我也会得到相同的结果。然后我尝试了不同类型的位置编码,例如“Time2Vec”论文,它通过使用不同的正弦函数来近似数据。

我觉得我已经尝试了很多不同的方法来使这个变压器工作但无济于事。所以我的问题是,变压器是否单独用于单变量数据的多步预测。如果是这样,是否有任何文章、论文、存储库等可以成功预测时间序列数据?如果不是,我应该采取哪种方法,看看我是否能让我的变压器工作。

编辑:我发现了问题,显然唯一的问题是我将学习率设置得太高:)

3个回答

我不清楚转换器是否是时间序列预测的最佳工具。归根结底,Transformers 只是一系列带有编码器和解码器的序列到序列模型中的最新款。这意味着变压器将某些东西改变为其他东西。

使用时间序列,您不会将某些内容更改为其他内容,而是尝试找到随时间变化的统计模式,例如这些变化是否相互关联,它们是否遵循趋势、周期等。然后您尝试使用这些统计模式来预测未来的日期。从这个意义上说,时间序列很像回归,其中转换器尝试捕获单词之间的关系,而不仅仅是从左到右的方向(位置编码只是网络的额外信息)。

Transformers 最初是为 NLP 设计的。然而,许多研究表明它们也可以用于时间序列,并且取得了巨大的成功。

让我们看看围绕该特定领域的差异和相似之处以及行业发展。一旦理解了上述几点,改进您的变压器模型以使其适用于时间序列应该会更容易。

  • 与 NLP 中注意力矩阵围绕相邻单词旋转的情况不同,这里的注意力矩阵会延伸到过去,以考虑季节性等趋势。这当然意味着处理更长序列的能力是使转换器适用于时间序列的第一个关键。输入许多有趣的模型来调整 Vaswani 的自我注意过程。

  • 处理长序列是一方面,但也有副作用。由于转换器中使用了 Softmax 激活,现在有太多的非零注意力权重。这可能会稀释实际权重。Softmax 的使用现在变得值得怀疑。输入 α-entmax,一个替代 Softmax 的简单层。无需再用 1000 个时间步分散注意力来分散注意力机制。如有必要,注意力机制可以在 500 时间步后放大(即分配 100% 权重)单个令牌。各种稀疏注意力模型现在是变形金刚(NLP 和时间序列)的趋势。2020 年至少有十几篇关于此类模型的优秀论文发表。Linformer 特别关注时间序列

  • 数据的时间性质是这里的本质。这与翻译一个句子有很大的不同——翻译一个没有太多时间模式的活动。我们也可能遇到多变量问题。除了主要的时间序列,还有移动平均线和各种其他可以考虑建模的数据。https://arxiv.org/abs/2010.02803是一个很好的起点

  • 1-1 点积对时间序列有意义吗?2个数字的点积背后的直觉是什么?稍微扩大视野并在几个时间步长上进行点积不是更有用吗(单词块与单词块的点积)。事实证明这也是正确的,现在有几篇新论文正在利用卷积和传统自注意力的混合来创建有趣的新方法

  • NLP 转换器的所有部分都与时间序列相关吗?特别是 - 范数 - 已知在与回归一起使用时会产生问题

  • 预测单个步骤与预测时间序列所需的更大时间范围。当然,这意味着教师强迫不是一种选择,错误可能会累积。Informer 再次是一个很好的选择 - https://arxiv.org/pdf/2012.07436.pdf

  • 没有 Wikipedia 可以训练时间序列,但一个有趣的实验可能是获取上个世纪世界上所有的股票价格(所有公共数据)并使用类似 MLM 的目标来创建 TS-RoBERTa。也许探针会显示该模型根据其数学分布和时间属性对 TS 嵌入进行平均聚类。也许我们甚至可以在小型训练集上使用迁移学习?

总而言之,变压器可以而且应该针对时间序列问题进行评估。很多时候,它们在没有任何重大架构更改的情况下工作。有时,考虑到 NLP 和时间序列数据之间的内在差异,某些组件确实需要更改。2020 年已经发布了大量的变压器模型,它们非常适合时间序列。Linformer 是一个不错的选择...