Analyse des courbes
Graphique
Une fois les données exportées en csv, vous pouvez opter pour la librairie Seaborn pour afficher vos résultats.
Convention :
Associer toutes les courbes d’un même run à une même couleur
Codage : trait continu pour le Train / trait pointillé pour la Validation
Nous vous proposons un script qui charge plusieurs csv et crée le graphique associé.
Voici le code d’appel ci-dessous ainsi que les fichiers csv de cet exemple.
import os
import glob
folder = r"C:\log\test1"
csv_files = glob.glob(os.path.join(folder, "*.csv"))
plot_loss_acc_runs(csv_files)
On peut afficher seulement les n premières epochs en écrivant : plot_loss_acc_runs(csv_files,n).
Terminologie
En apprentissage automatique, le terme généralisation désigne la capacité d’un modèle à produire des prédictions correctes sur des données non observées durant l’entraînement.
En apprentissage automatique, le terme surapprentissage (overfitting) désigne la situation où un modèle s’ajuste excessivement aux données d’entraînement, au point de mémoriser leurs détails et leurs imperfections, ce qui finit par dégrader ses performances sur des données nouvelles.
L’écart de performance du modèle entre le set de train et le set de validation s’appelle le gap.
Lorsque le gap est important, on dit de manière équivalente :
Que le modèle surapprend / qu’il y a surapprentissage
Que le modèle généralise mal / ne parvient pas à généraliser
Que le modèle mémorise les données d’entraînement
Que le modèle manque de capacité de généralisation
Que le modèle ne s’adapte pas à des données nouvelles
Lorsque le gap est faible, on dit de manière équivalente :
Que le modèle généralise correctement
Que le modèle présente une bonne capacité de généralisation
Que le modèle n’est pas en surapprentissage
Que le modèle s’adapte bien à des données nouvelles
La régularisation regroupe l’ensemble des techniques visant à empêcher l’overfitting ceci afin d’améliorer la capacité de généralisation du réseau.
Voici quelques techniques que vous rencontrerez souvent :
Dropout : désactive aléatoirement des neurones pendant l’entraînement. Cela empêche le réseau de trop dépendre de certains neurones
Early Stopping : on arrête l’entraînement avant que le modèle ne surapprenne
Data Augmentation : on enrichit artificiellement les données en entrée
Batch Normalization : on normalise les activations dans le réseau
Label Smoothing : on “adoucit” les labels (ex : 1 → 0.9) pour empêcher le modèle d’être trop confiant
Noise Injection : on injecte du bruit aux poids du réseau pour forcer le modèle à être plus robuste
Model capacity reduction : réduire la capacité du modèle, en diminuant son nombre de couches, de features ou de neurones par couche
Approche inadéquate
L’approche à éviter
Monsieur X décide d’afficher sur le même graphique les courbes de Loss/train associées à différents learning rates (LR).
Sa conclusion erronée est : « plus on augmente le LR, mieux l’entraînement se passe ». En effet, de son point de vue, il a constaté :
Plus le LR est important, plus la Loss diminue fortement
Plus le LR est important, meilleure est la Loss finale
Où est le problème ?
Examiner uniquement une courbe de Loss/train sans avoir en parallèle l’information de la courbe de loss/validation associée est dangereux. En effet, la courbe de loss/validation est la seule courbe permettant de savoir si le modèle apprend réellement. En effet, les optimiseurs modernes sont efficaces et arrivent très souvent à diminuer la valeur de Loss/train. Par contre la courbe de Loss/validation, c’est une autre histoire…
Voici des exemples de cas pathologiques détectables en comparant à la fois les courbes de Loss/train et de Loss/validation :
Loss/train ↓↓↓ et Loss/validation ↓ puis ↑ : overfitting (surapprentissage)
Loss/train ↓↓↓ et Loss/validation stagne dès le début : underfitting (le modèle n’apprend rien)
Une bonne généralisation du modèle est associée à deux courbes de train et validation qui ont un comportement similaire :
Loss/train ↓↓ et Loss/validation ↓↓
Il peut exister un gap, cela est normal. Cependant, plus le gap est faible, meilleure sera la généralisation.
Rôle de l’Accuracy
Les deux courbes Loss/train et Loss/validation permettent de déterminer si le réseau :
apprend : les deux courbes doivent ↓↓ en parallèle
apprend correctement : présence d’un gap faible
Mais ces considérations sont surtout importantes en début d’apprentissage. En effet, la Loss est une fonction mathématique optimisée durant l’entraînement, mais elle ne correspond pas directement à un objectif métier, ainsi :
un modèle peut présenter une Loss très faible, proche de 0, tout en ayant une Accuracy moyenne
un autre modèle peut avoir une Loss relativement élevée tout en affichant une excellente Accuracy
Pour départager plusieurs entrainements, on retient celui qui obtient la meilleure Accuracy/validation.
De plus, l'Accuracy est une mesure :
facile à comprendre
bornée entre 0 et 100 %
Note
Lorsque l’on essaye d’améliorer l’apprentissage en modifiant les hyperparamètres, on peut alors prendre d’autres critères que le best accuracy. En effet, on peut choisir une configuration ayant 2 points de moins sur l’accuracy mais qui offre en contrepartie un gap beaucoup plus faible. On peut aussi préférer des hyperparamètres qui offrent des courbes d’apprentissage peu bruitées même si le best accuracy est un peu plus faible.
Loss et Accuracy
Nous examinons donc 4 courbes par apprentissage :
Loss/train et Loss/validation qui permettent de détecter un surapprentissage
Accuracy/train et Accuracy/validation qui permettent d’évaluer la performance réelle du réseau
Les courbes de Loss sont décroissantes et tendent vers 0. Ls courbes d”Accuracy sont croissantes et tendent vers 1. Elles ont donc des comportements opposés !
Cependant, l’examen des quatre courbes en parallèle permet d’avoir plus d’informations :
Sur-apprentissage : il quasi automatique qu’un surapprentissage apparaissant sur les courbes de Loss soit confirmé par un surapprentissage apparaissant sur les courbes d'Accuracy.
Sous-apprentissage : les deux courbes de Loss peuvent diminuer correctement, alors que les courbes d'Accuracy stagnent.
Avertissement
Une courbe de Loss qui diminue n’implique pas forcément une Accuracy qui augmente.
Exemple
Ici, nous sommes dans un cas d’école : la courbe de Loss/train décroit quasiment vers 0 alors que la courbe de Loss/validation augmente. Le conclusion est sans appel, le modèle surapprend : il mémorise les données d’entraînement, mais généralise mal sur de nouvelles images. Nous remarquons que ce diagnostic est confirmé sur le graphique de l'Accuracy.
Avez-vous remarqué que :
La courbe d'Accuracy/validation s’est améliorée en passant de 3% à 28%
Alors que dans le même temps, la courbe de Loss/validation s’est dégradée en doublant de valeur !
Cela peut sembler contradictoire et pourtant non ! En pratique, cela peut se produire lorsque les probabilités des prédictions incorrectes se dégradent. Dans ce cas, les facteurs en \(-log(p_i)\) issues des prédictions erronées se cumulent et font augmenter la Loss/validation, même si, dans le même temps, la courbe d'Accuracy/validation s’est améliorée.
Le nombre d’epochs
Si vous avez travaillé sur des jeux de données comme MNIST ou CIFAR-10, vous avez sans doute constaté qu’une dizaine epochs est suffisant pour atteindre d’excellentes performances, parfois autour de 98 % d’accuracy. Ces jeux de données sont pratiques, car ils permettent de réaliser un entraînement complet en quelques minutes, mais ils donnent aussi, indirectement, une vision biaisée de la réalité :
Seules quelques epochs semblent nécessaires pour entraîner un modèle
Quel que soit le réseau choisi ou ses hyperparamètres, tout finit par converger
En pratique, en dehors de ces tutoriels pour débutants, l’apprentissage nécessite aux alentours de 100 epochs. Pour des architectures plus profondes, il n’est pas rare de monter jusqu’à 300 epochs. Ainsi, il ne faut pas porter de jugement hâtif sur les performances d’un réseau à partir de quelques epochs. En poursuivant l’apprentissage, beaucoup de choses peuvent encore évoluer !
Les problèmes d’under
Underfitting/undertraining
Symptômes : Accuracy/train ou Loss/train qui stagnent dès le début
Causes possibles :
modèle trop simple : underfitting
apprentissage trop lent dû à un learning rate trop faible ou à un nombre d’epochs insuffisant : undertraining
Il est généralement difficile de distinguer ces deux cas uniquement à partir des symptômes observés.
Que faire :
Augmenter la capacité (plus de features, plus de blocs) pour traiter un underfitting potentiel
Augmenter le learning rate (dans des limites stables)
Entraîner plus longtemps
Réduire la régularisation pour traiter un undertraining
Vérifier l’intégrité des données.
Les problèmes d’over
Overfitting
Symptômes :
Loss/train ↓ de façon continue alors que Loss/validation ↔ ou ↑
ET/OU Accuracy/train ↑ de façon continue alors que Accuracy/validation ↔ ou ↓
Overconfidence
Le modèle n’améliore plus sa capacité de génératlisation, il augmente seulement les probabilités associées aux prédictions déjà correctes (ex 60% ➝ 90%).
Symptômes : Loss/train ↓ et Accuracy/train ↔
Pour réduire l’overfitting ou l’overconfidence, on utilise les mêmes techniques de régularisation : Label smoothing, Data augmentation…
Overshoot
Symptômes : montée rapide de l'Accuracy/train suivie d’un effondrement
Cause possible : LR trop élevé, scheduler mal configuré
Training instability
Symptômes : courbes chaotiques, fortes oscillations
Cause possible : optimisation instable, absence de BatchNorm, LR trop fort…