LSTM Validation MSE 总是低于 Train MSE

数据挖掘 时间序列 喀拉斯 预报 lstm
2022-03-11 08:25:46

我正在尝试训练 LSTM 网络以进一步预测时间步长。我有一个查询列表,当前问题基于其中一个。

验证损失(使用 mse)总是低于火车损失(mse),我知道我不合适,因此泛化非常糟糕。

所以至少过拟合一段时间,网络会带来什么变化。下面是相同的代码。

learning_rate = 0.001 n_neurons = [150, 80, 60, 40, 25, 10] dropout = 0.2

def fit_lstm(train, n_lag, n_seq, n_batch, nb_epoch, n_neurons, dropout=dropout, reset_state=False): # reshape training into [samples, timesteps, features]... X, y = train[:, :n_lag], train[:, n_lag:] X = X.reshape(X.shape[0], 1, X.shape[1]) # design network.. model = Sequential() model.add(LSTM(n_neurons[5], batch_input_shape=(n_batch, X.shape[1], X.shape[2]), dropout_U=dropout, stateful=True, return_sequences=True)) model.add(LSTM(n_neurons[5], batch_input_shape=(n_batch, X.shape[1], X.shape[2]), dropout_U=dropout, stateful=True, return_sequences=True)) model.add(LSTM(n_neurons[5], batch_input_shape=(n_batch, X.shape[1], X.shape[2]), stateful=True, return_sequences=False)) model.add(Dense(y.shape[1], activation='tanh')) tic = time.time() model.compile(optimizer=adam, loss='mse') #, metrics=[mean_absolute_percentage_error] # fit network.. loss, val_loss = list(), list() for i in range(nb_epoch): print('Running Epoch ==> %s' %i)
history = model.fit(X, y, nb_epoch=1, batch_size=n_batch, validation_split=0.1, callbacks=[early_stop,reduce_lr], verbose=2, shuffle=False) loss.append(history.history['loss']) val_loss.append(history.history['val_loss']) model.reset_states() ## clears the state... toc = time.time() print('====='*10) print('Total computation time to train the Model : %0.2f' %((toc - tic) * 100) + ' secs')
return model, loss, val_loss

任何帮助都将是非常可观的。

提前致谢。

1个回答

首先要检查您的目标是否在 [-1, 1] 范围内,因为您有一个“tanh”作为输出函数。您还应该分析目标的分布(True 类)。

然后,我建议的第一步是尝试过度拟合您的模型。使模型“足够复杂”并过度拟合初始数据集的一小部分(可能是 20%?)。

如果您的模型没有过拟合,则有两种可能性:

  1. 模型架构不适合此任务(可能是 lstm)或模型不够复杂
  2. 您的数据不适用于预测任务。

如果您的模型过拟合(好迹象):

  1. 在增加样本(训练集)的大小时尝试增加模型的复杂性。不要使用任何 dropout 或正则化并增加层数而不是单元/层数。