了解如何将数据批处理和输入到有状态的 LSTM 中

机器算法验证 时间序列 lstm 张量流 循环神经网络 喀拉斯
2022-04-01 03:31:10

让我以比特币的每日价格预测为例(我实际上并没有使用比特币,但它的时间性质很适合解释我的问题)。

假设我有一个数据集,其中包含比特币最近 101 天的收盘价[p1, p2, p3, ... , p101],其中pX是当天的收盘价X输入将是前 100 天,标签将是[p2, ... , p101]- 输入偏移 1(试图预测第二天的收盘价)。

当我了解有状态 LSTM 的工作原理时,我可以将我的 100 个训练示例分成 4 个序列,每个序列包含 25 个示例。这 4 个中的每一个都将是一个批次 - 因此(batchSize、timeSteps、features)的 LSTM 的输入将是(1、25、1)。

每个时期将由 4 个批次组成。我会首先输入 batch1 = [p1, ... , p25](以及每个时间步的标签[p2, ... , p26]),然后将最终状态作为初始状态传递给处理 batch2 = [p26, ... , p50],依此类推。在处理完所有 4 个批次并且 epoch 完成后,我将重置状态并根据需要重复尽可能多的 epoch。

如果 LSTM 可以使用前 25 天作为输入序列准确预测第二天的价格,那么我想用它来进行每日实时价格预测,而不是每 25 天一次。

现在是第 101 天,我想预测第 102 天,p102. 我会[p77, ... , p101]输入作为输入。然后明天,第 102 天,我想预测p103,所以我喂了[p78, ... , p102]这些批次不再按顺序继续,而是向前移动一天。这样做时我将如何处理 LSTM 的状态?在这些日子中的每一天,我会在前 100 天中以 4 批 25 天的形式喂食,以便在我对明天做出预测之前建立状态吗?

实际上,我正在使用更广泛的数据集解决更复杂的问题。我以为我理解了有状态 LSTM 的工作原理,直到我按照上述顺序批量训练它。然而,我随后决定在完全相同的训练集上将每个输入每批次移动一天。这样做时,模型的准确度远低于训练期间的准确度。

我认为,如果我在 4 批 25 个样本中对 100 个样本进行有状态 LSTM 训练,那么我可以从这 100 个样本中提取任意 25 个样本序列,它会以与训练相同的准确度预测第二天。

编辑

为了让事情更清楚,这里是如何将我的数据批量训练超过 2 个 epoch,然后在训练后进行 3 次每日预测

训练:

Epoch 1 inputs:
[p1, ... , p25]
[p26, ... , p50]
[p51, ... , p75]
[p76, ... , p100]

Reset State

Epoch 2 inputs:
[p1, ... , p25]
[p26, ... , p50]
[p51, ... , p75]
[p76, ... , p100]

预言:

(Reset State?)
(Build up state by processing [p2, ... , p76] in 3 batches of 25?)

Inputs to predict price on p102:
[p77, ... , p101]

(Reset State?)
(Build up state by processing [p3, ... , p77] in 3 batches of 25?)

Inputs to predict price on p103:
[p78, ... , p102]

(Reset State?)
(Build up state by processing [p4, ... , p78] in 3 batches of 25?)

Inputs to predict price on p104:
[p79, ... , p103]
1个回答

关于 LSTM 模型,您将两种不同的东西混为一谈。

批量大小是指在单个反向传播过程中使用了多少输入-输出对。不要将这与用作时间序列预测器的窗口大小相混淆 - 这些是独立的超参数。

解决这个问题的正常方法是选择一个窗口大小(假设是 25,因为这是你建议的)。现在假设我们使用 LSTM 网络来预测第 26 个点,使用前 25 个作为预测器。然后,您将使用前面的 25 个点作为每种情况下的输入,对剩余的每个点 (27-100) 重复该过程。这将为您提供 75 个训练点。

批量大小将决定这些点中有多少被组合在一起以用于反向传播。例如,如果您选择 5 个,您将获得 15 个训练批次(75 个训练点分为 5 个批次)。

请注意,这是非常少量的数据,因此除非您使用非常小的 NNet 或大量的正则化,否则您将面临很大的过度拟合风险。您通常希望进行训练测试拆分,以便能够对模型执行样本外验证,但考虑到您必须处理的数据点很少,这将有点困难。