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)
../_images/seaborn.png

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).

../_images/lr.png

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

../_images/result1.png

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…