第一层的 LSTM 单元数

数据挖掘 喀拉斯 时间序列 lstm rnn
2022-02-27 18:42:04

我正在尝试使用 LSTM(与 Keras)来解决时间序列问题。鉴于其先前的值,我想预测时间序列的下一个值。我正在使用 TimeseriesGenerator 创建训练数据,如下所示(设置长度等于 1,表示预测基于先前的值):

generator = TimeseriesGenerator(series, series, length=1, batch_size=10)

对于建模,我使用以下内容:

model = Sequential()

model.add(LSTM(num_units, activation='relu', input_shape=(n_input, n_features)))

model.add(Dense(1))

model.compile(optimizer='adam', loss='mse')

model.fit_generator(generator, steps_per_epoch=len(generator)/n_batch, epochs=50)

预测:

yhat = model.predict(x_input, verbose=0)

当我设置时num_units = 1(在第一层),预测值远低于时间序列中的典型值(时间序列中的典型值为30-50,预测在0.4左右)。但是,当我设置 时num_units = 700,预测值变得非常接近测试值,并且预测似乎过拟合。这是为什么?num_units第一层中的 直观代表什么如果我们的输入数据只是一个数字,那么拥有 700 个单元的层意味着什么?将一个数字映射到 700 个神经元背后的直觉是什么,从中得到什么?一般来说,如果在我们的时间序列中,我们试图从过去的 n 次观察中做出预测,那么第一个 LSTM 层应该有多少个单元?

1个回答

num units是 LSTM 单元表示数据的每个时间步中隐藏单元的数量 - 您可以将其可视化为多层深度的完全连接的层序列,其中每一层还与跨层的内存连接,即使这个类比不是 100% 完美的。num units,然后,是每个层中的单元数。

对于您的特定问题,并且使用length = 1,这将减少到单层-您的模型没有利用 LSTM 的内存功能,因为除了单个时间步之外没有什么要记住的,因为只有一个时间步。

至于为什么它似乎在更高的情况下表现更好num units- 你的模型没有足够的表达能力num units = 1来描述它试图描述的功能 - 有太多的信息只能在一个单元中编码。num units = 700,我很好奇模型在样本外数据上的表现。

您的网络很可能只是过度拟合或记忆您的训练数据,具有如此强大的表达能力。如果您可以验证这种情况正在发生——您会在训练数据上看到非常好的性能,而在样本外数据上的性能很差——那么您需要以某种方式对网络进行正则化。执行此操作的常用方法包括实现提前停止、引入 dropout 层和/或减少层中隐藏单元的数量。

总体而言,如果您对单个实体的时间步长观察不超过一个,我建议您将 LSTM 层更改为简单的全连接层以简化架构。如果您确实或可以获得这些连续观察结果,那么 LSTM 层可能是您的一个很好的解决方案。