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 :download:`script ` qui charge plusieurs csv et crée le graphique associé. Voici le code d'appel ci-dessous ainsi que les :download:`fichiers csv ` de cet exemple. .. code-block:: python import os import glob folder = r"C:\log\test1" csv_files = glob.glob(os.path.join(folder, "*.csv")) plot_loss_acc_runs(csv_files) .. image:: seaborn.png :scale: 70% :align: center On peut afficher seulement les *n* premières epochs en écrivant : *plot_loss_acc_runs(csv_files,n)*. Terminologie ============ .. panels:: :column: col-lg-10 p-2 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. .. panels:: :column: col-lg-10 p-2 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. .. panels:: :column: col-lg-10 p-2 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 .. panels:: :column: col-lg-10 p-2 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). .. image:: 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* .. panels:: :column: col-lg-10 p-2 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 .. panels:: :column: col-lg-10 p-2 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. .. warning:: Une courbe de *Loss* qui diminue n’implique pas forcément une *Accuracy* qui augmente. Exemple ------- .. image:: result1.png :align: center 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 :math:`-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...