dropout 层可以不影响 LSTM 训练吗?

人工智能 神经网络 喀拉斯 长短期记忆 辍学 正则化
2021-11-12 19:53:22

我正在做一个需要时间序列预测(回归)的项目,我在 Keras/TF-gpu 中使用具有第一个 1D 卷积层的 LSTM 网络,如下所示:

model = Sequential()
model.add(Conv1D(filters=60, activation='relu', input_shape=(x_train.shape[1], len(features_used)), kernel_size=5, padding='causal', strides=1))
model.add(CuDNNLSTM(units=128, return_sequences=True))
model.add(CuDNNLSTM(units=128))
model.add(Dense(units=1))

作为一种效果,我的模型显然是过拟合的: 在此处输入图像描述

所以我决定添加 dropout 层,首先我添加了 0.1、0.3 和最后 0.5 速率的层:

model = Sequential()
model.add(Dropout(0.5))
model.add(Conv1D(filters=60, activation='relu', input_shape=(x_train.shape[1], len(features_used)), kernel_size=5, padding='causal', strides=1))
model.add(Dropout(0.5))
model.add(CuDNNLSTM(units=128, return_sequences=True))
model.add(Dropout(0.5))
model.add(CuDNNLSTM(units=128))
model.add(Dense(units=1))

但是我认为它对网络学习过程没有影响,即使 0.5 是相当大的 dropout 率: 在此处输入图像描述

辍学是否可能对 LSTM 的训练过程几乎没有影响,或者我在这里做错了什么?

[编辑] 添加我的 TS 的图,一般和放大视图。 在此处输入图像描述 在此处输入图像描述

我还想补充一点,当我添加 dropout 层时,训练时间只会增加一点(即从 1540 秒到 1620 秒)。

1个回答

几点:

  1. 您是否首先缩放了数据,例如使用MinMaxScaler这可能是您的损失读数居高不下的原因之一。

  2. 此外,请考虑虽然 Dropout 可用于减少过度拟合,但它不一定是灵丹妙药。

让我们举个例子,使用 LSTM 预测每周酒店取消的波动。

没有 Dropout 的模型

# Generate LSTM network
model = tf.keras.Sequential()
model.add(LSTM(4, input_shape=(1, previous)))
model.add(Dense(1))
model.compile(loss='mean_squared_error', optimizer='adam')
history=model.fit(X_train, Y_train, validation_split=0.2, epochs=20, batch_size=1, verbose=2)

超过 20 个 epoch,该模型在没有 Dropout的情况下实现了0.0267的验证损失。

无辍学损失

带辍学的模型

# Generate LSTM network
model = tf.keras.Sequential()
model.add(LSTM(4, input_shape=(1, previous)))
model.add(Dropout(0.5))
model.add(Dense(1))
model.compile(loss='mean_squared_error', optimizer='adam')
history=model.fit(X_train, Y_train, validation_split=0.2, epochs=20, batch_size=1, verbose=2)

但是,使用 Dropout 为0.0428时,验证损失略高

辍学损失

  1. 确保您已正确指定损失函数。如果您要预测时间序列,那么您很可能会使用区间数据。因此,mean_squared_error是一个合适的损失函数,因为它试图估计预测值和实际值之间的偏差。

作为反例,binary_crossentropy不适合,因为时间序列不是分类集。但是,错误指定损失函数是一个常见错误。因此,您还需要确保使用适当的损失函数,然后从那里开始工作。