我在这里重新发布这个问题来自AI.SE,因为我认为这可能是AI.SE的话题.
我正在学习健康监测技术,我在数据集上练习.目标是预测发动机的剩余使用寿命(RUL)给定传感器系列。关于C数据集,有广泛的文献,包括经典的(非DL) ML技术和基于DL的方法.几年前,基于LSTM的网络展示了有希望的结果(参见长期短期记忆网络,剩余寿命估算,郑等人,2017年),我正在尝试复制这些结果。
contains数据集包含的数据量很小.例如,FD001子集只有100个运行到失败系列。当我对它进行预处理以得到固定长度的时间序列时,我可以得到大约20000帧序列。在本文中,他们使用了两个隐藏的LSTM层,每个64个单元,两个完全连接的层,每个层有8个神经元(~55000个参数)。
LSTMs会产生大量的参数,因此在训练这样的网络时可能会遇到过拟合。我可以使用L1或L2正则化,退出,对于数据集来说,网络仍然会很大程度上过大。保持相同的架构,我无法达到论文中的分数和RMSE在验证集,而且过度拟合总是在这里。
然而,有一件事情是可行的,就是减少LSTM层的单位数量。预期,只要24单位,而不是每层64单位,网络的参数(~9000)要少得多,而且没有过拟合。分数和RMSE比报纸上的要差一些,但这是我目前所能得到的最好成绩。虽然这些结果对我来说很好,但我很好奇这篇文章的作者如何能够避免在他们的LSTM(64,64)网络上过度拟合。
LSTM是很棒的,但是它们产生了许多参数,阻碍了对小数据集的正确学习:我想知道是否有任何方法来解决这个特定的问题。对于如何避免在小型数据集上使用基于LSTM的网络,您有什么建议吗?
我在这里提供更多关于我的网络和结果的信息:
网络体系结构
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')
])
分数(验证集)
编辑:@h-H1-sG0n3提出的解决方案的结果
recurrent_dropout=0.3
:LSTM(64,64):得分为16.36;RMSE = 545发布于 2020-08-19 12:39:26
您可能需要检查以下代码中似乎没有测试的几个超参数:
# configure your optimizer with gradient norm clipping
opt = SGD(lr=0.01, momentum=0.9, clipnorm=1.0)
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)
发布于 2020-08-19 10:51:01
因此,问题是如何防止过度拟合,特别是一个小的数据集。
显然,我的第一直觉说要减少层数(例如移除第二层LSTM层),但这显然会改变模型的总体架构,使得它的层数比本文描述的模型少。
其他特别明显的建议是进行某种形式的数据增强,使用当前的数据集人为地增加样本的数量。
您是否也对数据(例如,缩放的数值等)应用了任何预处理?如果没有,这也会有所帮助。
https://datascience.stackexchange.com/questions/80495
复制相似问题