Il y a une méthode, et c’est elle qu’on attend — pas une liste de causes possibles.
Le test qui oriente tout : surapprendre un tout petit lot
On prend dix exemples et on entraîne dessus, sans régularisation ni augmentation. Un réseau correct doit atteindre une perte quasi nulle en quelques centaines d’itérations : il lui suffit de mémoriser dix cas.
- Il y arrive : le code et le flux de données fonctionnent. Le problème est dans les hyperparamètres, la capacité, ou la quantité de données.
- Il n’y arrive pas : il y a un défaut, et chercher un meilleur taux d’apprentissage est une perte de temps.
Ce test coûte deux minutes et élimine la moitié des causes possibles. Le proposer d’emblée est le meilleur signal qu’on puisse donner sur cette question.
Si le réseau ne peut pas surapprendre dix exemples
Les défauts, dans l’ordre de fréquence réelle :
- Les gradients n’arrivent pas. On a oublié de remettre les gradients à zéro, ou d’appeler le pas de l’optimiseur, ou une partie du graphe est détachée. On le vérifie en journalisant la norme du gradient par couche : si elle vaut zéro quelque part, on a trouvé.
- La perte ne correspond pas au problème. Un softmax appliqué deux fois, des probabilités passées à une perte qui attend des logits, des dimensions qui se propagent silencieusement par diffusion, une perte multi-étiquettes utilisée pour un problème exclusif.
- Les étiquettes sont désalignées. Un mélange appliqué aux entrées et pas aux étiquettes, un décalage d’indice, des classes numérotées à partir de 1. Le réseau essaie d’apprendre du bruit pur, et il n’y parvient pas — c’est la seule bonne nouvelle de ce cas.
- Les entrées sont dégénérées. Non normalisées, tout à zéro, valeurs manquantes converties en NaN. Il faut regarder un lot : afficher les tenseurs, leurs minimum, maximum, moyenne, et vérifier qu’une image ressemble à une image.
- Le taux d’apprentissage est absurde, à 10 ou à 1e-9.
Le repère utile pour savoir si le réseau a commencé à apprendre : sur une classification à n classes équilibrées, la perte initiale doit valoir environ le logarithme de n — 2,30 pour dix classes. Une perte de départ très différente signale un problème d’initialisation ou de perte, avant même la première mise à jour.
Si le réseau surapprend dix exemples mais stagne sur tout le jeu
- Taux d’apprentissage trop grand — la perte oscille — ou trop petit — elle descend imperceptiblement. Un balayage de taux d’apprentissage tranche en quelques minutes.
- Capacité insuffisante : la perte se bloque à un palier élevé alors que rien ne diverge.
- Régularisation trop forte : dropout excessif, décroissance des poids trop élevée, augmentation trop agressive qui détruit le signal.
- Gradient qui disparaît dans un réseau profond sans connexions résiduelles ni normalisation.
- Données trop bruitées ou étiquettes incohérentes — auquel cas le palier atteint est le plafond réel du problème, et il faut le dire plutôt que de continuer à régler.
Et le réflexe de méthode qui vaut pour tout le sujet : changer une chose à la fois, et fixer les germes aléatoires. Sans reproductibilité, on ne peut pas savoir si une amélioration vient de la modification ou du hasard du tirage.