我正在尝试训练一个网络来预测未来。我当前的设置使用 5 个时间步长作为过去的输入,每个时间步长由 10 个特征组成,产生一个 [5, 10] 输入矩阵(最初由另一种算法生成)。这些时间步长中的每一个在时间上都是一个 dt 步长。网络输出 1 个输出,再次具有 10 个特征,未来的 dt 步是来自输入的最后一个时间步。此输入替换输入矩阵中最旧的时间步。
使用生成的输入序列以及该序列的一个正确输出来训练网络。对于 100.000 个样本的训练集,MSE 误差减少到大约 1e-4。
使用前面提到的方法执行网络时。由于网络在第一次预测中出错并将其用作输入,从而删除了正确但较旧的输入,因此该解决方案很快就崩溃了。现在,由于以前从未见过的部分不正确的输入序列而产生了更大的错误。下一个时间步,这将变得更糟,依此类推。
我认为网络不应该使用完全正确的输入序列及其正确的输出进行训练,而是应该根据自己的预测而不是完全正确的输入进行训练。我只能想像前面提到的那样训练网络。使用它来创建更多样本,包括它自己的预测错误,并使用该训练集再次训练它。可以重复该过程,直到达到所需的点。
使用 Keras 作为我的深度学习工具箱,是否有更有效的方法仅在单个训练集上进行训练?
编辑
我将为我的问题提供更多背景信息。我试图预测几种类型(方形、三角形和锯齿形)行波的未来状态,以一定的速度向左或向右移动。下图给出了我可以在训练期间使用的随机行波示例。
这些波被 1024 x 位置离散化,y 值。由于它们的维数相对较高,我使用自动编码器创建了一个维度为 10 的潜在空间。下图给出了一个自动编码波的示例,包括输入、编码的潜在空间和解码的输出。
对于 RNN 网络,较低维的潜在空间可以更容易地及时推进。为此,我使用生成算法创建了波浪的五个时间步长。使用自动编码器的编码器将它们编码到它们的潜在空间。现在它们被输入到一个 RNN 中,该 RNN 预测潜在空间的下一个时间步长。该输出被反馈到输入以替换最旧的时间步输入。输出也可以使用自动编码器的解码器进行解码,从而对行波的下一个时间步长进行高维预测。
我已经训练了 RNN 网络,给出了 5 个潜在输入和正确的下一个时间步潜在空间输出的示例,达到了大约 1.5e-4 的 mse。该 RNN 的新预测结果如下图所示。
对于我给网络的大多数输入,第一个预测都非常准确。但是,当我使用它自己的输出作为新输入来继续预测下一个时间步时,误差会增加。下图给出了之前描述的相同波的示例,但现在在预测步骤 20。
对于 RNN,我目前正在使用以下 Keras 设置:
inputLayer = Input(shape = (RNN_numInputs, AE_latentSize))
x = CuDNNLSTM(RNN_units[0], return_sequences=False)(inputLayer)
x = Dropout(0.2)(x)
x = RepeatVector(RNN_numOutputs)(x)
x = CuDNNLSTM(RNN_units[1], return_sequences=True)(x)
x = Dropout(0.2)(x)
x = Conv1D(AE_latentSize, RNN_outputKernelSize, activation='linear', padding = 'same')(x)
rnn = Model(inputLayer, x)
其中 RNN_numInputs 为 5,AE_latentSize 为 10,RNN_units 为 [200, 400],RNN_outputKernelSize 为 3。
我认为当我可以进一步降低预测误差时,长期预测结果会变得更好。
有谁知道如何提高该算法的性能?


