Éviter le surajustement avec un grand réseau LSTM sur une petite quantité de données
Je republie cette question d'AI.SE ici car je pense que c'était peut-être hors sujet pour AI.SE ...
1. Contexte
J'étudie les techniques de surveillance de la santé et je pratique sur l' ensemble de données C-MAPSS . L'objectif est de prédire la durée de vie utile restante (RUL) d'une série de mesures de capteurs données par un moteur. Il existe une large littérature sur l'ensemble de données C-MAPSS, y compris les techniques ML classiques (non DL) et les approches basées sur DL. Il y a quelques années, les réseaux basés sur le LSTM ont montré des résultats prometteurs (voir Long Short-Term Memory Network for Remaining Useful Life estimation, Zheng et al , 2017 ), et j'essaie de reproduire ces résultats.
L'ensemble de données C-MAPSS contient une faible quantité de données. Le sous-ensemble FD001 n'a par exemple que 100 séries de fonctionnement en échec. Lorsque je le pré-traite pour obtenir des séries chronologiques de longueur fixe, je peux obtenir jusqu'à 20 000 séries encadrées. Dans l'article mentionné ci-dessus utilisant LSTM, ils utilisent deux couches LSTM cachées avec 64 unités chacune, et deux couches entièrement connectées avec 8 neurones chacune (~ 55 000 paramètres).
2. Problème
Les LSTM induisent un grand nombre de paramètres, donc un surajustement peut être rencontré lors de la formation d'un tel réseau. Je peux utiliser la régularisation L1 ou L2, les abandons, le net sera encore largement surdimensionné par rapport à l'ensemble de données. En gardant la même architecture, je ne peux pas atteindre les scores et RMSE dans le papier dans le jeu de validation, et le surajustement est toujours là.
Cependant, une chose qui fonctionne est de réduire le nombre d'unités des couches LSTM. Comme prévu, avec seulement 24 unités au lieu de 64 par couche, le réseau a beaucoup moins de paramètres (~ 9000), et il ne présente aucun surajustement. Les scores et RMSE sont un peu pires que ceux du journal, mais c'est le meilleur que je puisse faire jusqu'à présent. Bien que ces résultats me conviennent, je suis curieux de savoir comment les auteurs de l'article ont pu éviter le surajustement sur leur filet LSTM (64,64).
3. Question
Les LSTM sont excellents, mais ils induisent de nombreux paramètres qui entravent un apprentissage correct sur un petit jeu de données: je me demande s'il existe une méthode pour résoudre ce problème spécifique. Auriez-vous des conseils sur la façon d'éviter le surajustement avec un réseau LSTM sur un petit ensemble de données?
4. Infos
Je fournis ci-dessous plus d'infos sur mon net et mes résultats:
Architecture de réseau
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')
])
Scores (ensemble de validation)
- Papier: score = 16,14; RMSE = 338
- Mon LSTM (64, 64): score = 26,47; RMSE = 3585 (sur-ajustement)
- Mon LSTM (24, 24): score = 16,82; RMSE = 515
Edit: Résultats pour la solution proposée par @ hH1sG0n3
- LSTM (64, 64) avec
recurrent_dropout=0.3
: Score = 16,36; RMSE = 545
Réponses
Vous pouvez vérifier quelques hyperparamètres qu'il semble que vous ne testez pas dans votre code ci-dessus:
- Découpage de dégradé: des mises à jour importantes des pondérations pendant l'entraînement peuvent entraîner un dépassement numérique ou un dépassement inférieur souvent appelé «éclatement des dégradés».
# configure your optimizer with gradient norm clipping
opt = SGD(lr=0.01, momentum=0.9, clipnorm=1.0)
- Abandon récurrent: Abandon appliqué au signal d'entrée récurrent des unités de la couche LSTM.
keras.layers.LSTM(24, kernel_regularizer=keras.regularizers.l1(0.01), ..., recurrent_dropout=0.3)
- Stateful: Le document indique-t-il clairement si le modèle conserve son état à chaque itération d'apprentissage. Vous pouvez également expérimenter cela.
keras.layers.LSTM(24, kernel_regularizer=keras.regularizers.l1(0.01), ..., stateful=True)
Ainsi, la question se pose sur la manière d'éviter le surajustement, avec en particulier un petit ensemble de données.
Évidemment, ma première intuition dit de réduire le nombre de couches (par exemple supprimer la deuxième couche LSTM, par exemple), mais cela changerait évidemment l'architecture globale du modèle, de sorte qu'il comporte moins de couches que le modèle décrit dans l'article.
Une autre suggestion particulièrement évidente est de faire une forme d'augmentation des données, pour augmenter artificiellement le nombre d'échantillons en utilisant l'ensemble de données dont vous disposez actuellement.
Avez-vous également appliqué un prétraitement aux données (c'est-à-dire des valeurs numériques mises à l'échelle, etc.)? Sinon, cela pourrait également aider.