如何使用输出作为新输入来优化训练深度学习模型

数据挖掘 喀拉斯 时间序列 lstm
2022-02-24 05:23:08

我正在尝试训练一个网络来预测未来。我当前的设置使用 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。

我认为当我可以进一步降低预测误差时,长期预测结果会变得更好。

有谁知道如何提高该算法的性能?

1个回答

我要提出的第一点(鉴于您将“lstm”指定为标签的一部分,您可能已经意识到这一点),您应该为此目的使用长期短期记忆网络。

鉴于您正在处理时间序列数据,使用常规神经网络的风险在于,当时间序列不是这种情况时,它会将所有观察结果视为独立的。

我认为网络不应该使用完全正确的输入序列及其正确的输出进行训练,而是应该根据自己的预测而不是完全正确的输入进行训练。

这有点滑坡,因为必须假设您使用的是实际输出。该模型可能被错误地训练为相信预测值(通常不会产生正确的输出)在这种情况下确实如此,这会扭曲您的结果。该模型仅与输入的数据一样好 - 如果数据错误,那么结果也会如此。

一般来说,您的错误读数看起来相当不错,尽管我不熟悉您的数据或模型。

如果您想生成虚拟数据,一种可能性是使用各种引导模拟。例如,假设您的时间序列具有 10% 的平均值和 20% 的波动率。然后,您选择根据这两个读数生成一个随机时间序列。然后可以对这些数据进一步训练神经网络,并可能提高准确性。

但是,我会谨慎地将不准确的输入与正确的输出混合在一起——因为这可能会扭曲您的结果。