避免在少量数据上使用大型 LSTM 网络进行过度拟合

数据挖掘 喀拉斯 lstm
2022-03-02 23:49:37

我在这里从 AI.SE 转发这个问题,因为我认为这可能对 AI.SE 来说是题外话......

1. 背景

我正在研究健康监测技术,并在C-MAPSS 数据集上进行练习。目标是在给定传感器测量系列的情况下预测发动机的剩余使用寿命 (RUL)。有大量关于 C-MAPSS 数据集的文献,包括经典(非 DL)ML 技术和基于 DL 的方法。几年前,基于 LSTM 的网络显示出可喜的结果(参见Long Short-Term Memory Network for Remaining Useful Life estimation, Zheng et al , 2017),我正在尝试重现这些结果。

C-MAPSS 数据集包含少量数据。例如,FD001 子集只有 100 个运行至故障系列。当我对其进行预处理以获得固定长度的时间序列时,我可以获得多达 20 000 个框架序列。在上面提到的使用 LSTM 的文章中,他们使用了两个隐藏的 LSTM 层,每个层有 64 个单元,两个全连接层,每个层有 8 个神经元(约 55 000 个参数)。

2.问题

LSTMs 引入了大量的参数,因此在训练这样的网络时可能会遇到过拟合。我可以使用 L1 或 L2 正则化,dropouts,网络对于数据集来说仍然很大。保持相同的架构,我在验证集中达不到论文中的分数和 RMSE,过拟合总是在这里。

然而,有效的一件事是减少 LSTM 层的单元数量。预期,每层只有 24 个单元而不是 64 个,网络的参数要少得多(~9000),并且不会出现过度拟合。分数和 RMSE 比论文中的要差一些,但这是迄今为止我能得到的最好的。尽管这些结果对我来说很好,但我很好奇论文的作者如何避免在他们的 LSTM(64,64) 网络上过度拟合。

3. 问题

LSTM 很棒,但它们引入了很多参数,阻碍了对小数据集的正确学习:我想知道是否有任何方法可以解决这个特定问题。您对如何避免在小型数据集上使用基于 LSTM 的网络过度拟合有什么建议吗?

4.信息

我在下面提供有关我的网络和结果的更多信息:

网络架构

model = keras.models.Sequential([
    keras.layers.LSTM(24, return_sequences=True, kernel_regularizer=keras.regularizers.l1(0.01),
                      input_shape=input_shape),
    keras.layers.Dropout(0.2),
    keras.layers.LSTM(24, return_sequences=False, kernel_regularizer=keras.regularizers.l1(0.01)),
    keras.layers.Dropout(0.2),
    keras.layers.Dense(8, activation='relu', kernel_regularizer=keras.regularizers.l2()),
    keras.layers.Dropout(0.2),
    keras.layers.Dense(8, activation='relu', kernel_regularizer=keras.regularizers.l2(), bias_regularizer=keras.regularizers.l2()),
    keras.layers.Dense(1, activation='relu')
])

分数(验证集)

  • 论文:分数 = 16.14;均方根误差 = 338
  • 我的 LSTM(64, 64):分数 = 26.47;RMSE = 3585(过拟合)
  • 我的 LSTM(24, 24):分数 = 16.82;均方根误差 = 515

编辑:@hH1sG0n3 提出的解决方案的结果

  • LSTM(64, 64) recurrent_dropout=0.3: 分数 = 16.36; 均方根误差 = 545
2个回答

您可能需要检查几个您似乎没有在上面的代码中测试的超参数:

  • 梯度裁剪:训练期间对权重的大量更新可能导致数值溢出或下溢,通常称为“梯度爆炸”。
# configure your optimizer with gradient norm clipping
opt = SGD(lr=0.01, momentum=0.9, clipnorm=1.0)
  • Recurent dropout:应用于 LSTM 层单元的循环输入信号的 Dropout。
keras.layers.LSTM(24, kernel_regularizer=keras.regularizers.l1(0.01), ..., recurrent_dropout=0.3)
  • 有状态的:从论文中是否清楚模型是否在每次训练迭代中保持其状态。您也可以对此进行试验。
keras.layers.LSTM(24, kernel_regularizer=keras.regularizers.l1(0.01), ..., stateful=True)

因此,问题询问如何防止过度拟合,特别是对于小数据集。

显然,我的第一个直觉是减少层数(例如,删除第二个 LSTM 层),但这显然会改变模型的整体架构,使其层数比论文中描述的模型少。

其他特别明显的建议是进行某种形式的数据增强,以使用您当前拥有的数据集人为地增加样本数量。

您是否还对数据进行了任何预处理(即缩放数值等)?如果没有,这也可能有所帮助。