Module 6 — Initialisation des poids et gradients qui disparaissent
Le module 4 laissait entrevoir un problème : si le gradient d'un poids profond est un produit de dérivées locales, ce produit peut s'effondrer vers zéro ou diverger. Ce module traite ce problème et l'ensemble des réponses qui, entre 2010 et 2015, ont rendu les réseaux vraiment profonds entraînables.
L'initialisation n'est pas un détail
Deux choix naïfs échouent, et pour des raisons instructives.
Initialiser tous les poids à zéro rend tous les neurones d'une couche identiques : ils reçoivent le même gradient, se mettent à jour de la même façon, et restent indiscernables pour toujours. La couche entière se comporte comme un neurone unique. Il faut briser la symétrie, et c'est le rôle de l'aléatoire.
Initialiser avec des valeurs trop grandes ou trop petites produit une dérive de l'échelle des activations d'une couche à l'autre. Si la variance des sorties est multipliée par un facteur légèrement supérieur à 1 à chaque couche, elle explose au bout de vingt couches ; légèrement inférieur, elle s'annule. Dans les deux cas l'entraînement est perdu avant d'avoir commencé.
L'objectif est donc précis : maintenir la variance des activations à peu près constante à travers les couches. Deux formules y répondent selon l'activation employée.
L'initialisation de Xavier, ou Glorot, convient aux activations symétriques comme tanh :
L'initialisation de He convient à la ReLU :
La différence vient d'un raisonnement simple : la ReLU annule la moitié de ses entrées, donc divise environ par deux la variance de sortie. Le facteur 2 compense exactement cette perte. C'est pourquoi utiliser Xavier avec des ReLU dans un réseau profond conduit à une extinction progressive du signal.
En pratique, les bibliothèques appliquent déjà le bon défaut — kaiming_uniform_ dans PyTorch pour les couches linéaires. Le sujet devient visible quand on écrit une initialisation personnalisée, ou quand un réseau profond refuse de démarrer.
Le gradient évanescent
Reprenons la formule du module 4. En remontant les couches, l'erreur est multipliée à chaque étape par et par les poids. Avec une sigmoïde, la dérivée ne dépasse jamais 0,25. Sur dix couches, le gradient de la première couche est donc atténué au maximum par .
Les premières couches ne reçoivent plus aucun signal exploitable. Elles restent à leur valeur d'initialisation, tandis que seules les dernières apprennent. Voilà pourquoi, malgré le théorème d'universalité, les réseaux profonds étaient réputés inentraînables jusqu'aux années 2000 : le problème n'était pas théorique, il était numérique.
Quatre réponses, toutes déjà rencontrées ou à venir :
- la ReLU, dont la dérivée vaut exactement 1 du côté positif, donc n'atténue rien ;
- l'initialisation adaptée, qui empêche la dérive d'échelle ;
- la normalisation par lots ou par couche, objet du module suivant ;
- les connexions résiduelles, qui sont la réponse la plus radicale.
Les connexions résiduelles
Introduites par ResNet en 2015, elles consistent à ajouter l'entrée d'un bloc à sa sortie :
L'effet sur le gradient est direct et vaut d'être vu. La dérivée de cette somme par rapport à vaut : le terme crée un chemin direct par lequel le gradient remonte sans atténuation, quelle que soit la profondeur. Le réseau n'apprend plus la transformation complète mais seulement l'écart à l'identité, ce qui est à la fois plus facile et plus stable.
C'est cette idée qui a permis de passer de quelques dizaines de couches à plus de cent, et elle est présente dans presque toutes les architectures modernes — transformeurs compris.
Le gradient explosif
Le problème symétrique existe : lorsque les facteurs sont supérieurs à 1, le gradient croît exponentiellement. Les symptômes sont sans ambiguïté — une perte qui devient NaN, ou des poids qui divergent en quelques itérations. Les réseaux récurrents du cours 11 y sont particulièrement exposés.
La parade est simple et efficace : l'écrêtage du gradient, qui borne sa norme avant la mise à jour.
torch.nn.utils.clip_grad_norm_(modele.parameters(), max_norm=1.0)
La direction du gradient est conservée, seule son amplitude est plafonnée. C'est une précaution peu coûteuse qu'il est raisonnable d'activer par défaut sur les architectures récurrentes ou les entraînements instables.
Face à un réseau qui n'apprend pas, inspectez la norme des gradients par couche avant toute autre chose. Des normes qui décroissent fortement en remontant vers l'entrée signalent l'évanescence : vérifiez l'activation, l'initialisation, et envisagez des connexions résiduelles. Des normes qui explosent appellent l'écrêtage et un taux d'apprentissage plus faible. Cette mesure prend quelques lignes de code et remplace des heures de tâtonnement.
En résumé
- Initialiser à zéro empêche de briser la symétrie ; une échelle mal choisie fait dériver la variance des activations couche après couche.
- Xavier pour les activations symétriques, He pour la ReLU, dont le facteur 2 compense la moitié des entrées annulées.
- Le gradient évanescent vient du produit de dérivées inférieures à 1 — au plus 0,25 pour la sigmoïde ; ReLU, initialisation, normalisation et connexions résiduelles y répondent.
- Le terme d'une connexion résiduelle crée un chemin direct pour le gradient ; à l'inverse, le gradient explosif se traite par écrêtage de la norme.
Module suivant : la régularisation, pour empêcher un réseau désormais entraînable de simplement mémoriser ses données.