LSTM:时间序列预测中的多对一和多对多

数据挖掘 机器学习 Python 时间序列 lstm rnn
2021-10-06 05:42:29

我正在尝试使用 LSTM 预测对象随时间推移的轨迹。在我的脑海中,我有三种不同的训练和预测值配置,我想知道这个问题的最佳解决方案可能是什么(我也很感激关于这些方法的见解)。

1)多对一(损失是单个值的MSE)

  • input 是一个序列 n 值,输出是位置的单个值的预测 n+1.
  • 损失函数是预测值与其真实值的MSE(所以,对应position中的值 n+1)。
  • 在线测试期间,一系列 n 值预测一个值 (n+1),并且这个值被连接到前一个序列以预测下一个值 (n+2) 等等。这样,一个完整的轨迹 n+ 值进行计算。

2)多对一(损失是多个值的MSE)

  • 一世np 是一个序列 n 值,输出是位置的单个值的预测 n+1.
  • 为了计算损失函数,应用了之前用于在线测试的相同策略。LSTM 预测一个值,这个值被连接起来,用来预测连续的值次。损失是轨迹中所有预测值及其真实值的 MSE。只有在预测了整个轨迹时才进行反向传播。
  • 在线测试等于前面的情况。

3) 多对多

  • 一世np 是一个序列 n 值,输出是预测 连续值。
  • 损失函数是 预测及其相应的基本事实。
1个回答

选择主要与您的特定任务有关:您需要/想要做什么?

平均而言,多对一(单值)模型的误差较低,因为在您尝试预测的时间越长,输出质量下降得越多。不过,任务有时需要多对一(多个值)。

另一种方法是使用多对一(单值)作为(多值)版本:您将模型训练为(单),然后迭代地使用它来预测多个步骤。我亲自试验了所有这些架构,我不得不说这并不总能提高性能。

根据我的经验,多对多模型具有更好的性能。例如,我必须实现一个非常大的时间序列预测模型(提前 2 步预测)。最好的模型是返回相同的输入序列,但向前移动了两步。看起来该模型在保持预测值与先前输入值更一致方面做得更好。这是一个带有 LSTM 层的 seq2seq RNN。


编辑:

损失并不严格依赖于版本,所讨论的每个损失都可以应用于所提到的任何架构。多个输出的问题是您的模型为预测中的所有步骤分配了相同的重要性。这是您可以通过自定义 MSE 损失解决的问题,其中对未来遥远的预测会被 0-1 范围内的某个因素打折。这样,您的模型将更加重视短程精度。让我知道这是否有帮助。