让我以比特币的每日价格预测为例(我实际上并没有使用比特币,但它的时间性质很适合解释我的问题)。
假设我有一个数据集,其中包含比特币最近 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]