Training from scratch

Cette page présente la mise en œuvre d’un entraînement complet d’un réseau CNN de petite taille comme si nous découvrions un nouveau problème et que nous cherchions à optimiser le réseau.

La méthode

Nous allons vous présenter une méthode en plusieurs étapes afin d’optimiser les performances d’un réseau. Un premier problème se pose rapidement : il existe de nombreux critères, et tous sont importants.

Pour clarifier les choses, pour chaque étape, on va :

  • choisir 1 ou 2 critères principaux

Mais aussi !

  • ignorer certains critères

  • définir des critères éliminatoires

  • lister des critères annexes

Cela représente toute la difficulté de l’apprentissage, c’est un art, pas une science exacte. Ainsi, parfois vous serez contrarié car :

  • Une configuration qui vous semblait idéale en tout point va être disqualifiée par un seul critère

  • Un critère qui était primordial à une étape devient accessoire à une autre, voir ignoré

  • Lorsque deux situations sont similaires par rapport aux critères principaux, ce sont les critères annexes qui discriment !

  • Lorsque qu’il faut faire un choix parmi des critères annexes, soyons honnête, la décision est empirique

Phase 1 : Setup

Les données

On peut dire que 80% des problèmes viennent de cette étape. À vérifier :

  • labels corrects

  • train / val bien séparés

  • normalisation correcte

  • Si peu d’images par classe => Data Augmentation à activer immédiatement

  • pas d’augmentation sur le set de validation

Choix d’un optimiseur

Nous vous proposons :

  • torch.optim.SGD( model.parameters(), lr=0.1, momentum=0.9, weight_decay=1e-4 )

  • torch.optim.Adam( model.parameters(), lr=1e-3 )

Ne pas considérer qu’Adam est meilleur que SGD ! Ce sont deux très bons optimiseurs. Chacun a ses avantages, voici comment faire votre choix :

  • Adam converge souvent plus vite, mais l’accuracy peut être moindre

  • SGD généralise souvent mieux, accuracy meilleure, mais nécessite plus d’epochs

Si vous êtes sur CPU, Adam peut réduire le temps d’apprentissage. Il n’y a aucun critère à ce niveau, l’un ou l’autre conviennent.

Phase 2 : Optimisation du LR

>>> Toujours régler le LR avant le reste <<<

Il s’agit du paramètre le plus critique de l’optimisation. Nous allons tester plusieurs valeurs pour le learning rate et sélectionner la plus prometteuse.

  • Critère éliminatoire : overshoot, underfitting, undertraining

  • Critère principal : la loss/train

    • recherche d’une courbe de loss/train qui ↓

    • le plus vite sur les premières epochs (10-20 epochs)

    • sans oscillations (pas de dents de scie)

    • avec un plateau final équivalent à ses concurrentes (à qqe % près)

  • Critère ignoré : overfitting (il y en aura)

  • Critères annexes : meilleur d’accuracy/train, moins d’overconfidence, moins de gap sur le train…

Ainsi, on examine en priorité les courbes de loss/train car leurs pentes respectives sont directement liées au LR :

  • Loss/train diverge : learning rate trop haut

  • Loss/train chaotique mais convergente : learning rate légèrement trop élevé

  • Loss/train ↓ : courbe à conserver

  • Loss/train ↓ trop lentement ou atteint un plateau trop tôt : learning rate trop faible

A ce stade, nous rappelons que le surapprentissage est toléré car l’objectif principal reste l’efficacité de l’optimisation.

Pour un batch size classique de 32 ou 64, voici les valeurs de LR usuelles :

Pour SGD :

  • Exploration initiale : [ 1e-1, 3e-2, 1e-2, 3e-3 ]

  • Affinage : on prend la meilleure valeur et on affine 3e-2 → [ 2e-2, 3e-2, 5e-2]

Pour Adam, l’espace pertinent est beaucoup plus resserré que pour SGD :

  • Exploration initiale : [3e-4, 1e-3, 3e-3 ]

  • Affinage : pour 1e-3 → [ 5e-4, 1e-3, 2e-3], pour 3e-4 → [ 1e-4, 3e-4, 5e-4 ]

Phase 3 : Amélioration du modèle

Optimisation de l’architecture

La tendance est la suivante :

  • réseau trop petit → underfit

  • réseau trop grand → overfit

Bien que l’architecture choisie soit simple, nous avons déjà plusieurs options pour la faire évoluer. Vous pouvez en choisir 1 dans la liste :

  • Nombre de blocs Conv2D : 2, 3 ou 4

  • La largeur des features : 64/128/256 → 32-64-128 (plus léger) ou 48/96/192

  • Retirer le downsampling (MaxPool) du premier bloc convolutionnel

  • MLP bicouche en sortie : FC(256, 128) + ReLU + nn.Linear(128, num_classes)

Critères :

  • Critère 1 : Pic de accuracy/validation

  • Critère 2 : si critère 1 équivalent - loss/valid la plus faible mais avec un pic de accuracy/valid amélioré

  • Critère 3 : En cas de performances comparables : stabilité des courbes

Régularisation

La régularisation vise à contraindre le modèle pour qu’il apprenne des règles plus simples, plus robustes, et mieux généralisables.

À introduire uniquement en présence de surapprentissage (overfit)

Options :

  • Data augmentation (si non fait)

  • Ajout de couches dropout après les couches FC

  • label smoothing [0, 0, 1, 0, 0] → [0.01, 0.01, 0.96, 0.01, 0.01]

Critères :

  • Critère 1 : Réduction du surapprentissage

  • Critère 2 : Maintien du pic de validation accuracy

  • Critère 3 : Stabilité et cohérence des courbes

Si la technique n’apporte pas de gain, on peut la retirer.

Test de BatchNorm

BatchNorm améliore la stabilité et la vitesse d’apprentissage. Elle est particulièrement utile si l’entraînement est instable, mais peut aussi apporter un gain même lorsque les courbes semblent propres.

  • A insérer après les couches conv : Conv2D → BatchNorm → ReLU

Critères :

  • Critère n°1 : stabilité de l’apprentissage

  • Critère n°2 : à stabilité équivalente, vitesse de convergence

  • Critère n°3 : validation accuracy (maintenue ou améliorée)

Si la technique n’apporte pas de gain, on peut la retirer.

Phase 4 : Micro-optimisation

Test d’un autre optimiseur - optionnel

Etape à considérer si tout le reste est sain : données propres, LR correct pour l’optimiseur courant, architecture raisonnable, entraînement stable.

Les autres options :

  • SGD + momentum → meilleur à long terme

  • Adam → plus rapide à converger

  • AdamW → meilleure régularisation

Il faut donc refaire les 2 étapes d’optimisation du LR

Critères :

  • Critère n°1 : meilleur pic de accuracy/validation

  • Critère n°2 : stabilité et régularité des courbes

  • Critère n°3 : vitesse de convergence

Options de l’optimiseur

Il peut être judicieux d’optimiser les options de l’optimiseur. Le faire plus tôt serait inapproprié.

Critères :

  • Critère n°1 : Gain marginal en validation accuracy, quelques %

  • Critère n°2 : Stabilité de l’apprentissage

  • Critère n°3 : Cohérence entre loss et accuracy : loss ↓ et accuracy ↑

Scheduler

L’objectif d’un scheduler est de moduler le learning rate entre le début et la fin de l’apprentissage. Un scheduler ne corrige pas un mauvais learning rate initial : celui-ci doit être correctement réglé au préalable.

L’utilisation d’un scheduler permet souvent de gagner quelques points de performance, ce qui peut être décisif, par exemple, pour passer de 95% à 98% d’accuracy.

En contrepartie, l’entraînement est généralement plus long, car le nombre d’epochs doit être augmenté afin de tirer pleinement parti de la décroissance du learning rate.

Critères :

  • Critère n°1 : amélioration du pic de validation accuracy

  • Critère n°2 : améliorer convergence sur les dernières epochs

  • Critère n°3 : coût en temps d’entraînement - nombre d’epochs supplémentaires

Phase 5 : Test (optionnel)

Après avoir terminé, si vous voulez respecter le protocole standard, il faut tester votre modèle et calculer l’accuracy sur le dataset de Test que nous n’avons jamais utilisé jusqu’à maintenant.