Entraîner un réseau
Le chapitre « Une couche cachée » s’est terminé sur un réseau de près de 24 000 poids, que personne ne peut régler à la main. Ce chapitre explique comment un réseau règle lui-même ses poids, à partir d’exemples.
Le même principe qu’au Module 2
La méthode a déjà été présentée dans « Apprendre, c’est descendre la pente ». Elle tient en trois étapes, qu’on répète :
- on mesure l’erreur du modèle sur des exemples dont on connaît la bonne réponse ;
- on cherche dans quel sens modifier chaque paramètre pour que l’erreur diminue ;
- on modifie un peu chaque paramètre dans ce sens.
C’est la descente de gradient. Pour la droite du Module 2, il y avait deux paramètres, et l’erreur formait un paysage qu’on pouvait dessiner. Pour un réseau, les paramètres sont les poids et les biais. Le paysage a alors des milliers de dimensions et on ne peut plus le dessiner, mais la méthode reste la même : mesurer la pente, puis faire un pas vers le bas.
On peut toutefois en dessiner une tranche, en ne faisant varier que deux poids. Contrairement à la cuvette du Module 2, ce paysage a en général plusieurs creux, et le creux où l’on arrive dépend du point de départ. La section « Un réseau qui apprend le XOR » le montre sur un vrai réseau.
Pour un réseau qui classe, l’erreur mesurée est en général la même que celle de la régression logistique. La réduire revient à rendre les bonnes réponses aussi probables que possible : c’est le maximum de vraisemblance (maximum likelihood) présenté au Module 2.
Le problème des couches cachées
La deuxième étape est simple pour un neurone seul. On connaît la bonne réponse, on voit donc directement si sa sortie est trop haute ou trop basse, et on corrige ses poids en conséquence. C’est ce que faisait le perceptron dès 1958.
Dans un réseau, cela ne vaut que pour la couche de sortie. Pour un neurone caché, les exemples ne donnent aucune bonne réponse. Reprenons le réseau du XOR : la table de vérité dit ce que la sortie doit valoir, mais elle ne dit pas que le premier neurone caché doit répondre à la question « au moins une ? ». Quand le réseau se trompe, on ne sait pas quel neurone caché est en cause, ni dans quel sens le corriger.
Ce problème s’appelle l’attribution de la responsabilité (credit assignment en anglais). C’est lui qui a arrêté la recherche sur les réseaux de neurones après 1969 : on savait qu’une couche cachée était nécessaire, et on ne savait pas l’entraîner.
La rétropropagation
La solution consiste à calculer la responsabilité de chaque poids en partant de la sortie et en remontant vers l’entrée. Pour chaque exemple, le calcul se fait en deux temps.
La propagation avant (forward pass). L’exemple entre dans le réseau. Chaque couche calcule ses sorties et les passe à la suivante, jusqu’à la réponse du réseau. On compare cette réponse à la bonne, ce qui donne l’erreur. Les poids sont utilisés, mais pas modifiés.
La rétropropagation. L’erreur repart en sens inverse. Le neurone de sortie reçoit l’erreur entière. Il la répartit entre les neurones cachés qui lui ont envoyé un signal, selon le poids de chaque connexion : un neurone caché relié par un poids élevé a beaucoup contribué à la réponse, et il reçoit donc une grande part de l’erreur. Chaque neurone caché sait alors dans quel sens il aurait dû répondre, et on peut corriger ses poids comme ceux d’un neurone seul.
Une fois la part de chaque poids connue, on modifie tous les poids un peu, dans le sens qui réduit l’erreur. Puis on passe à l’exemple suivant. Le nom complet de la méthode est la rétropropagation du gradient (backpropagation en anglais).
Avec plusieurs couches cachées, le principe ne change pas : l’erreur remonte d’une couche à la précédente, jusqu’à l’entrée.
Pour aller plus loin : ce que calcule la rétropropagation
Un réseau est une suite de calculs emboîtés. La sortie dépend de la couche cachée, qui dépend elle-même des entrées et des poids. La descente de gradient demande, pour chaque poids, la pente de l’erreur par rapport à ce poids, c’est-à-dire une dérivée. Pour des calculs emboîtés, cette dérivée s’obtient par la règle de dérivation en chaîne (chain rule) : on multiplie entre elles les dérivées de chaque étape, de la sortie jusqu’au poids visé.
La rétropropagation est une façon efficace d’appliquer cette règle. En partant de la sortie, elle réutilise les calculs faits pour une couche quand elle traite la couche précédente. Le coût total est à peu près celui de deux propagations avant, quel que soit le nombre de poids. Sans cette économie, il faudrait refaire un calcul complet pour chaque poids, ce qui serait impraticable pour un grand réseau.
Cette méthode exige que chaque étape du calcul ait une dérivée. C’est la raison pour laquelle les neurones utilisent une fonction d’activation lisse comme la sigmoïde, et non le seuil brusque du perceptron d’origine.
Un réseau qui apprend le XOR
L’applet ci-dessous reprend le réseau du XOR, avec ses deux neurones cachés. Les poids de départ sont tirés au hasard. Quand vous lancez l’entraînement, le réseau voit les quatre cas en boucle et corrige ses poids par rétropropagation. Les deux droites sont celles des neurones cachés, comme dans l’applet du chapitre précédent, mais cette fois personne ne les déplace.
- Lancez l’entraînement. Observez les droites se placer et l’erreur descendre.
- Repartez de nouveaux poids de départ, plusieurs fois, avec le bouton « Nouveaux poids ». Le réseau ne trouve pas toujours la même solution, et il lui arrive de rester bloqué avec une erreur élevée, environ une fois sur cinq.
- Changez le taux d’apprentissage. S’il est très petit, l’apprentissage est très lent. S’il est trop grand, l’erreur oscille ou reste élevée, au lieu de descendre.
La deuxième manipulation montre une différence avec la droite du Module 2. Le paysage d’erreur (loss landscape) d’un réseau n’est pas une cuvette unique. Il comporte plusieurs creux, et la descente s’arrête dans celui qu’elle rencontre, qui dépend du point de départ. Pour les grands réseaux, on constate en pratique que la plupart des creux donnent des résultats comparables.
1986
La rétropropagation a été découverte plusieurs fois. Paul Werbos la décrit dans sa thèse en 1974, sans que le résultat soit remarqué. En 1986, David Rumelhart, Geoffrey Hinton et Ronald Williams publient dans la revue Nature un article, « Learning representations by back-propagating errors », qui montre, expériences à l’appui, qu’un réseau entraîné de cette façon construit lui-même des caractéristiques utiles dans ses couches cachées. Dans l’une de ses expériences, un réseau qui apprend des liens de parenté se donne de lui-même des caractéristiques comme la nationalité ou la génération des personnes, une idée que reprend le chapitre « Prédire le mot suivant » du Module 4. C’est cet article qui impose la méthode, et son nom anglais, backpropagation, souvent abrégé en backprop.
La question ouverte en 1969 est alors réglée. Le XOR, que le perceptron ne pouvait pas apprendre, est appris par un réseau à couche cachée. Les réseaux de neurones redeviennent un sujet de recherche actif, sous le nom de connexionnisme. La même année, Rumelhart, James McClelland et leur groupe de recherche publient Parallel Distributed Processing, deux volumes qui présentent cette approche, de ses principes à ses applications en psychologie. L’ouvrage fait connaître le connexionnisme bien au-delà de l’informatique, chez les psychologues, les linguistes et les philosophes.
Ce retour reste limité pendant une vingtaine d’années. Les réseaux de l’époque sont petits, les données rares et les ordinateurs lents. D’autres méthodes progressent plus vite. La plus influente est la machine à vecteurs de support (SVM), présentée au Module 2, dont la forme actuelle date de 1995. Grâce à l’astuce du noyau (kernel trick), elle trace des frontières courbes sans avoir à fabriquer de caractéristiques. Son entraînement a un avantage décisif sur celui d’un réseau : il n’y a qu’un seul creux dans le paysage d’erreur, et on est donc sûr de trouver la meilleure solution, quel que soit le point de départ. La deuxième manipulation de l’applet ci-dessus montre que ce n’est pas le cas pour un réseau. Le boosting et les forêts aléatoires (random forests) complètent cette boîte à outils. Jusqu’au début des années 2010, ces méthodes l’emportent souvent sur les réseaux de neurones, et les grandes conférences du domaine publient peu de travaux sur ces derniers. Le chapitre suivant explique ce qui a changé ensuite.
L’entraînement en pratique
Quelques termes reviennent dans la suite du cours.
- La descente de gradient stochastique (stochastic gradient descent, SGD). Calculer la pente exacte demanderait de passer sur tous les exemples d’entraînement avant chaque pas, soit des millions pour un grand réseau. En pratique, on estime la pente à partir d’un petit groupe d’exemples tirés au hasard, un lot (batch ou mini-batch), de quelques dizaines à quelques milliers d’exemples, et on fait un pas après chaque lot. Cette pente est approximative, un peu différente d’un lot à l’autre, et la descente zigzague, d’où le mot stochastique, qui signifie « au hasard ». Elle est pourtant beaucoup plus rapide, et ce bruit a un avantage inattendu : il aide parfois la descente à sortir d’un creux peu profond, comme celui de la figure plus haut. Des variantes, comme Adam (2014), ajustent en plus la taille des pas pour chaque poids, et ce sont elles qu’on utilise le plus aujourd’hui.
- Une époque (epoch) est un passage complet sur tous les exemples d’entraînement. Un entraînement compte en général plusieurs époques.
- Le taux d’apprentissage (learning rate) règle la taille de chaque correction, comme au Module 2.
Il faut aussi distinguer deux phases dans la vie d’un réseau.
- L’entraînement (training) règle les poids. Il demande beaucoup de calculs, parce qu’il répète l’aller et le retour sur des millions d’exemples. Il est fait une fois.
- L’inférence est l’utilisation du réseau entraîné. Les poids ne changent plus, et seule la propagation avant est exécutée. Elle est faite à chaque utilisation.
Cette distinction reviendra au Module 4 : entraîner un grand modèle de langage (large language model) prend des semaines ou des mois, alors qu’une réponse est produite en quelques secondes.
Un réseau a beaucoup de paramètres, et il est donc très exposé au sur-apprentissage (overfitting). Les remèdes sont ceux de « Généraliser » : un jeu de test (test set), et la régularisation. Pour les réseaux, la régularisation prend trois formes courantes. Le weight decay pénalise les poids trop grands. Le dropout désactive au hasard une partie des neurones à chaque étape de l’entraînement. L’arrêt précoce (early stopping) interrompt l’entraînement quand l’erreur sur des exemples mis de côté cesse de diminuer.
Pour voir le mécanisme en détail
La chaîne 3Blue1Brown, de Grant Sanderson, propose une série de vidéos sur les réseaux de neurones, construite sur l’exemple des chiffres manuscrits. Les explications sont visuelles et progressives. La vidéo ci-dessous porte sur la rétropropagation.
Deux autres vidéos de la série complètent ce chapitre : la première présente la structure d’un réseau, et la deuxième la descente de gradient. Les vidéos sont en anglais.
On sait maintenant entraîner un réseau à une couche cachée. Le chapitre suivant, « L’apprentissage profond », examine ce qu’on gagne à empiler plusieurs couches.