为什么我的 Keras LSTM 模型无法学习训练集上的模式,甚至随着时间的推移变得更糟?

问题描述 投票:0回答:1

我正在尝试将顺序模型(LSTM)拟合到我的数据中。为此,我使用 Keras 库。

简单地说,我的目标是一个统计某个位置每天的人数的计数器。这些功能包括天气数据、公共假期和当前日期。总共有 21 个功能。

我的目标是利用最近3天,以及第二天(总共4天)的数据,包括天气预报,来预测当天的人数。

为了进行比较,我的基线误差约为 10000,并且我已经安装了两个模型,即训练误差约为 5000 的 xgboost 模型和训练误差约为 7000 的密集模型。绝对值并不重要,但我只是提到它们,所以你会有一种感觉并声明,其他模型确实能够拾取这些模式。

我的输入形状是:

X_train_3d.shape
>>> (2918, 4, 21)

第一个元素如下所示:

X_train_3d[0]
>>> array([[2.0130e+03, 1.0000e+00, 1.0000e+00, 1.0000e+00, 9.1000e+00,
        6.9000e+00, 0.0000e+00, 1.9400e+01, 1.0018e+03, 0.0000e+00,
        1.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00,
        1.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00,
        0.0000e+00],
       [2.0130e+03, 1.0000e+00, 2.0000e+00, 2.0000e+00, 7.1000e+00,
        1.8000e+00, 0.0000e+00, 2.0200e+01, 1.0175e+03, 3.0000e+01,
        1.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00,
        0.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00,
        0.0000e+00],
       [2.0130e+03, 1.0000e+00, 3.0000e+00, 3.0000e+00, 1.0600e+01,
        9.0000e-01, 0.0000e+00, 2.3800e+01, 1.0245e+03, 0.0000e+00,
        1.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00,
        0.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00,
        0.0000e+00],
       [2.0130e+03, 1.0000e+00, 4.0000e+00, 4.0000e+00, 9.7000e+00,
        0.0000e+00, 0.0000e+00, 2.5200e+01, 1.0295e+03, 0.0000e+00,
        1.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00,
        0.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00,
        0.0000e+00]])

我的目标形状是:

y_train_3d.shape
>>> (2918, 4, 1)

第一个元素如下所示:

y_train_3d[0]
>>> array([[ 5795.],
       [19494.],
       [24851.],
       [13475.]])

所以形状和内容看起来都像他们应该的那样。

3.模型是我的LSTM模型。我的模型如下:

num_sequence = 4

inputs = Input(shape=(num_sequence, 21))
x = LSTM(32, activation='relu', dropout=0.0, return_sequences=True)(inputs)
outputs = Dense(1, activation='linear')(x)


model = tf.keras.Model(inputs=inputs, outputs=outputs)

optimizer = Adam(learning_rate=0.1)
model.compile(optimizer=optimizer, loss='mse', metrics=[RootMeanSquaredError()])

print(model.summary())

模型总结为:

_________________________________________________________________
 Layer (type)                Output Shape              Param #   
=================================================================

 input_1 (InputLayer)       [(None, 4, 21)]           0         
                                                                 
 lstm_2 (LSTM)              (None, 4, 32)             6912      
                                                                 
 dense_3 (Dense)             (None, 4, 1)              33        
                                                                 
=================================================================
Total params: 6,945
Trainable params: 6,945
Non-trainable params: 0
_________________________________________________________________

我的问题: 如果我使用这个 LSTM 并让它运行 500 个 epoch,首先它似乎真正学习并且训练误差下降,但在 180 个 epoch 后的某个时刻,训练误差再次变得更糟。

Epoch 178/500
92/92 - 0s - loss: 67061724.0000 - root_mean_squared_error: 8189.1221 - val_loss: 73245328.0000 - val_root_mean_squared_error: 8558.3486 - 488ms/epoch - 5ms/step
Epoch 179/500
92/92 - 1s - loss: 63150060.0000 - root_mean_squared_error: 7946.7012 - val_loss: 73750616.0000 - val_root_mean_squared_error: 8587.8184 - 536ms/epoch - 6ms/step
Epoch 180/500
92/92 - 1s - loss: 114693592.0000 - root_mean_squared_error: 10709.5098 - val_loss: 149320688.0000 - val_root_mean_squared_error: 12219.6846 - 661ms/epoch - 7ms/step
Epoch 181/500
92/92 - 1s - loss: 121518424.0000 - root_mean_squared_error: 11023.5391 - val_loss: 125545216.0000 - val_root_mean_squared_error: 11204.6963 - 646ms/epoch - 7ms/step
Epoch 182/500
92/92 - 1s - loss: 115984808.0000 - root_mean_squared_error: 10769.6240 - val_loss: 122884320.0000 - val_root_mean_squared_error: 11085.3203 - 690ms/epoch - 8ms/step

经过 500 个 epoch 后,我对训练集进行了预测并得到了这些结果:

model.predict(X_train_3d)
>>> array([[[22839.49 ],
        [22839.49 ],
        [22839.49 ],
        [22839.49 ]],

       [[26642.746],
        [26642.746],
        [26642.746],
        [26642.746]],

       [[27665.633],
        [27665.633],
        [27665.633],
        [27665.633]],

       ...,

       [[13904.507],
        [13904.507],
        [13904.507],
        [13904.507]],

       [[12234.53 ],
        [12234.53 ],
        [12234.53 ],
        [12234.53 ]],

       [[15874.946],
        [15874.946],
        [15874.946],
        [15874.946]]], dtype=float32)

我对顺序模型相当陌生,因此我可能会错过一些概念来查看这里的错误。 对我来说,一切看起来都很好,因为训练数据具有正确的形状,并且 LSTM 模型给出了正确的输出形状。另外,直到第 180 纪元,模型似乎都在改进和学习,直到突然变得更糟,并且它只是为每个时间步预测相同的值。

正如你所看到的,我在这里也没有故意使用任何正则化,因为我的模型甚至似乎无法很好地拟合训练数据,因此我猜测这更多是一个

high bias
问题,而正则化不是帮忙。

有人能给我一些关于这里发生的事情的直觉吗? 除了一般直觉之外,我的期望是,如果我根本不使用正则化并训练足够长的时间,我应该至少能够过度拟合我的训练数据,这应该会导致

model.predict(X_train_3d)

接近我的

y_train_3d
,例如第一个元素

>>> array([[ 5795.],
       [19494.],
       [24851.],
       [13475.]])

但正如我们所看到的,所有值都相同且相差很远,例如对于第一个元素。我还使用了相同的架构和更大的模型(2 个 LSTM 层)并收到了类似的结果。因此,我的模型太小,无法拾取图案似乎不是问题。

更多比较: 我的 Dense 模型有

Trainable params: 3,329
LSTM 有
Trainable params: 6,945
因此,理论上它应该具有拾取复杂模式并在训练数据上表现良好的能力。

python machine-learning keras deep-learning lstm
1个回答
0
投票

虽然你有很多构建架构的方法,但为了获得更好的模型,我会说进行大量的培训。

开始尝试一些仅 5 到 10 个 epoch 的新模型,并查看结果。 另外,在这个实现中,我会在 LSTM 上做更多的单元,因为它有很多输入特征,比如 64。

简而言之:更少的时代,不同的架构,更多的过滤器

编辑:强烈推荐这个:https://machinelearningmastery.com/how-to-develop-lstm-models-for-time-series-forecasting/

© www.soinside.com 2019 - 2024. All rights reserved.