我在这里从 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