Evitar el sobreajuste con una gran red LSTM en una pequeña cantidad de datos
Estoy volviendo a publicar esta pregunta de AI.SE aquí, ya que creo que tal vez estaba fuera de tema para AI.SE ...
1. Contexto
Estoy estudiando técnicas de monitorización de la salud y practico con el conjunto de datos C-MAPSS . El objetivo es predecir la vida útil restante (RUL) de una serie de mediciones de sensor dada por un motor. Existe una amplia literatura sobre el conjunto de datos de C-MAPSS, que incluye tanto las técnicas clásicas (no DL) de AA como los enfoques basados en DL. Hace unos años, las redes basadas en LSTM mostraron resultados prometedores (consulte la estimación de la red de memoria a corto plazo para la vida útil restante, Zheng et al , 2017 ), y estoy tratando de reproducir estos resultados.
El conjunto de datos de C-MAPSS contiene una pequeña cantidad de datos. El subconjunto FD001 tiene, por ejemplo, solo 100 series de ejecución hasta fallar. Cuando lo proceso previamente para obtener series de tiempo de longitud fija, puedo obtener hasta ~ 20 000 series enmarcadas. En el artículo mencionado anteriormente utilizando LSTM, utilizan dos capas LSTM ocultas con 64 unidades cada una y dos capas completamente conectadas con 8 neuronas cada una (~ 55 000 parámetros).
2. Problema
Los LSTM inducen una gran cantidad de parámetros, por lo que se puede encontrar un sobreajuste al entrenar dicha red. Puedo usar la regularización L1 o L2, abandonos, la red seguirá estando muy sobredimensionada con respecto al conjunto de datos. Manteniendo la misma arquitectura, no puedo alcanzar los puntajes y RMSE en el documento en el conjunto de validación, y el sobreajuste siempre está aquí.
Sin embargo, una cosa que funciona es reducir el número de unidades de las capas LSTM. Como era de esperar, con solo 24 unidades en lugar de 64 por capa, la red tiene muchos menos parámetros (~ 9000) y no presenta sobreajuste. Los puntajes y RMSE son un poco peores que los del documento, pero es lo mejor que puedo obtener hasta ahora. Aunque estos resultados están bien para mí, tengo curiosidad por saber cómo fue posible para los autores del artículo evitar el sobreajuste en su red LSTM (64,64).
3. Pregunta
Los LSTM son geniales, pero inducen muchos parámetros que dificultan un aprendizaje correcto en conjuntos de datos pequeños: me pregunto si existe algún método para abordar este problema específico. ¿Tiene algún consejo sobre cómo evitar el sobreajuste con una red basada en LSTM en un pequeño conjunto de datos?
4. Infos
A continuación proporciono más información sobre mi red y los resultados:
Red de arquitectura
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')
])
Puntuaciones (conjunto de validación)
- Papel: Puntuación = 16,14; RMSE = 338
- Mi LSTM (64, 64): Puntuación = 26,47; RMSE = 3585 (sobreajustes)
- Mi LSTM (24, 24): Puntaje = 16.82; RMSE = 515
Editar: Resultados de la solución propuesta por @ hH1sG0n3
- LSTM (64, 64) con
recurrent_dropout=0.3
: Puntuación = 16,36; RMSE = 545
Respuestas
Es posible que desee verificar un par de hiperparámetros que parece que no está probando en su código anterior:
- Recorte de degradado: las grandes actualizaciones de los pesos durante el entrenamiento pueden causar un desbordamiento o subdesbordamiento numérico, a menudo denominado "gradientes explosivos".
# configure your optimizer with gradient norm clipping
opt = SGD(lr=0.01, momentum=0.9, clipnorm=1.0)
- Abandono recurrente: Abandono que se aplica a la señal de entrada recurrente de las unidades de la capa LSTM.
keras.layers.LSTM(24, kernel_regularizer=keras.regularizers.l1(0.01), ..., recurrent_dropout=0.3)
- Con estado: el documento muestra claramente si el modelo conserva su estado con cada iteración de entrenamiento. También puedes experimentar con esto.
keras.layers.LSTM(24, kernel_regularizer=keras.regularizers.l1(0.01), ..., stateful=True)
Entonces, la pregunta es cómo prevenir el sobreajuste, particularmente con un pequeño conjunto de datos.
Obviamente, mi primera intuición dice reducir el número de capas (por ejemplo, eliminar la segunda capa LSTM, por ejemplo), pero esto obviamente cambiaría la arquitectura general del modelo, de modo que tiene menos capas que el modelo descrito en el documento.
Otra sugerencia particularmente obvia es hacer algún tipo de aumento de datos para aumentar artificialmente el número de muestras utilizando el conjunto de datos que tiene actualmente.
¿Ha aplicado también algún procesamiento previo a los datos (es decir, valores numéricos escalados, etc.)? Si no, esto también podría ayudar.