Du neurone au réseau multi-couches
Empiler des neurones pour résoudre XOR, puis approcher presque n'importe quelle fonction.
Au chapitre 4, on a démontré qu’un perceptron seul ne peut pas réaliser XOR : aucune droite ne sépare les points où XOR vaut de ceux où il vaut . Mais on a aussi remarqué quelque chose. XOR s’écrit comme une combinaison de fonctions qui, elles, sont séparables : .
Ce chapitre transforme cette remarque en méthode générale. On va brancher des neurones sur la sortie d’autres neurones, résoudre XOR à la main, comprendre quelles formes de frontières ce branchement permet de dessiner, puis découvrir jusqu’où l’idée nous mène : presque toutes les fonctions.
Résoudre XOR à la main
L’analogie des deux assistants
Imagine qu’on t’interdit de répondre directement à la question « les deux entrées sont-elles différentes ? ». En revanche, tu as le droit de poser deux questions plus simples à deux assistants, puis de combiner leurs réponses.
- Premier assistant : « au moins une entrée vaut-elle ? » C’est la fonction OR.
- Deuxième assistant : « est-il faux que les deux entrées valent ? » C’est la fonction NAND.
Réfléchis un instant. Quand exactement une entrée vaut , le premier assistant répond oui (il y en a bien au moins une) et le deuxième aussi (les deux ne valent pas ensemble). Quand les deux valent , le premier répond non. Quand les deux valent , le deuxième répond non. Les deux assistants ne disent oui en même temps que dans le cas « exactement une entrée à », qui est précisément XOR. Il te suffit donc de répondre oui quand tes deux assistants disent oui : un simple ET.
La couche cachée
Chaque assistant est un perceptron. On les place dans une couche cachée Couche cachée Couche intermédiaire d'un réseau de neurones, située entre la couche d'entrée et la couche de sortie. Ses neurones ne reçoivent ni les données brutes ni ne produisent la prédiction finale, ils calculent des représentations intermédiaires. Un réseau « profond » a plusieurs couches cachées. : une couche intermédiaire dont les sorties ne sont pas la réponse finale, mais des questions intermédiaires que la couche suivante va combiner. Le réseau obtenu, qui empile une ou plusieurs couches cachées entre l’entrée et la sortie, s’appelle un perceptron multicouches Perceptron multicouches Réseau de neurones organisé en couches successives (entrée, une ou plusieurs couches cachées, sortie), où chaque neurone applique une combinaison affine suivie d'une fonction d'activation. En empilant des neurones, il dépasse la limite du perceptron simple et réalise des fonctions non linéairement séparables comme XOR. Source : Rumelhart, Hinton & Williams, 1986 .
On reprend la convention de seuil du chapitre 4 : la fonction de Heaviside vaut si son argument est positif ou nul, et sinon. La couche cachée calcule deux valeurs et :
Cette équation se lit : vaut dès que , c’est-à-dire dès qu’au moins une des deux entrées vaut .
Celle-ci se lit : vaut tant que , donc partout sauf quand les deux entrées valent en même temps.
Le neurone de sortie calcule enfin le ET logique de et :
Il ne vaut que si , c’est-à-dire seulement si et valent tous les deux . Trois perceptrons, organisés en deux couches, réalisent donc XOR : ce qu’un perceptron isolé ne pouvait pas faire.
Construis-le toi-même
Les deux neurones cachés sont câblés en OR et NAND. À toi de régler le neurone de sortie (ses poids , sur , , et son biais ) pour obtenir un ET, et de voir la table de vérité passer au vert.
Construire XOR avec une couche cachée
Trois choses à observer en jouant :
- Tant que la sortie n’est pas un vrai ET, au moins une des quatre lignes reste rouge. Le bouton « Révéler la solution (AND) » pose et .
- La colonne XOR (la cible) et la colonne (ce que calcule ton réseau) ne coïncident sur les quatre lignes que lorsque la sortie réalise exactement le ET de OR et NAND.
- Les deux neurones cachés ont transformé le problème : dans les nouvelles coordonnées , XOR est devenu linéairement séparable, alors qu’il ne l’était pas dans les coordonnées .
Ce que des couches permettent de dessiner
L’analogie des clôtures
Un neurone seul, c’est une clôture droite posée dans un champ : d’un côté les bêtes, de l’autre rien. Avec une seule clôture, tu ne peux délimiter qu’un demi-champ. Mais avec plusieurs clôtures droites, et la règle « une bête est enfermée seulement si elle est du bon côté de toutes les clôtures à la fois », tu encercles une parcelle dont tu choisis la forme.
Du demi-plan à la courbe
Formalisons. La frontière de décision Frontière de décision Lieu des points de l'espace d'entrée où le modèle bascule d'une classe à l'autre, c'est-à-dire où sa sortie change. Pour un neurone seul c'est un hyperplan ; pour un réseau multi-couches elle peut devenir polygonale, puis courbe. Source : Bishop, 2006 d’un neurone est l’hyperplan où sa sortie bascule. Un neurone seul partage donc le plan en deux demi-plans. Une couche de neurones suivie d’un neurone de sortie qui calcule leur ET garde uniquement les points situés du bon côté des frontières simultanément : l’intersection de demi-plans, c’est-à-dire une région convexe (un polygone). En ajoutant une couche de plus, on peut réunir plusieurs de ces régions convexes, et obtenir des formes quelconques, y compris non convexes.
Composer une frontière de décision
Région = intersection de k demi-plans. Un neurone caché trace une droite ; le ET logique de la couche de sortie ne garde que les points situés du bon côté des k droites à la fois.
Augmente k : le polygone circonscrit se rapproche du cercle. Avec assez de neurones, la frontière devient une courbe quelconque.
Trois choses à observer en jouant :
- Avec , la frontière est une simple droite, exactement comme un perceptron. Avec , c’est une bande. À partir de , c’est un polygone fermé.
- Plus tu ajoutes de neurones cachés, plus le polygone a de côtés et plus il épouse le cercle. La frontière passe de linéaire à polygonale, puis tend vers une courbe.
- Chaque neurone caché n’apporte qu’une seule droite. C’est leur combinaison par la couche suivante qui crée la richesse des formes.
La notation matricielle
Écrire la somme pondérée de chaque neurone séparément devient vite illisible dès qu’une couche en compte des centaines. La matrice du chapitre 2 résout ce problème : elle empile toutes les sommes pondérées d’une couche en une seule opération.
Pour une couche qui reçoit un vecteur d’entrée et produit neurones, on rassemble les poids dans une matrice et les biais dans un vecteur . La couche calcule alors :
Cette équation se lit : on multiplie le vecteur d’entrée par la matrice de poids , on ajoute le vecteur de biais , puis on applique la fonction d’activation à chaque composante du résultat. Chaque ligne de est le vecteur de poids d’un neurone de la couche, et chaque composante de son biais. Une seule ligne d’algèbre remplace ainsi sommes pondérées écrites à la main.
Le perceptron multicouches comme composition
Un réseau profond empile ces couches : la sortie de l’une devient l’entrée de la suivante. Avec couches, le réseau calcule
C’est une composition de fonctions : on applique une couche, puis une autre au résultat de la première, et ainsi de suite. Or cette composition n’a d’intérêt que parce qu’une activation non linéaire est intercalée entre chaque couche. Sans elle, composer plusieurs couches linéaires donnerait encore une fonction linéaire (on l’a vu au chapitre 3), et tout l’empilement s’effondrerait en une seule couche. C’est exactement l’alternance « couche linéaire, puis activation non linéaire » qui donne au réseau son pouvoir expressif Pouvoir expressif Étendue des fonctions qu'un modèle peut représenter en faisant varier ses paramètres. Un perceptron simple n'exprime que des séparations linéaires ; ajouter des couches cachées élargit le pouvoir expressif jusqu'à pouvoir approcher n'importe quelle fonction continue. Source : Goodfellow, Bengio & Courville, 2016 .
Jusqu’où peut-on aller ? Le théorème d’approximation universelle
L’intuition des bosses
Prends une fonction d’activation en forme de marche douce, comme la sigmoïde du chapitre 3. La différence de deux sigmoïdes légèrement décalées dessine une bosse : une fonction qui vaut presque zéro partout, sauf sur un petit intervalle où elle forme une butte. En additionnant beaucoup de bosses, placées et dosées comme il faut, tu peux épouser le profil de n’importe quelle courbe continue, comme on approche le relief d’une montagne en empilant des briques de plus en plus fines.
Une couche cachée fait exactement cela : chaque neurone caché fabrique une marche, et le neurone de sortie en fait la somme pondérée. Avec assez de neurones, cette somme approche d’aussi près qu’on veut la fonction cible.
L’énoncé
Exercices papier-crayon
Exercice 1 : vérifier la construction de XOR
Avec , et , calcule , et sur les quatre entrées, et vérifie que reproduit bien XOR.
Exercice 2 : compter les paramètres
On considère un réseau d’architecture : deux entrées, une couche cachée de trois neurones, un neurone de sortie. Combien ce réseau a-t-il de paramètres (poids et biais) au total ?
Exercice 3 : la forme matricielle
Écris, en notation matricielle, les équations d’un réseau à deux entrées, une couche cachée de deux neurones et une sortie (). Précise les dimensions de chaque matrice de poids et de chaque vecteur de biais. La fonction d’activation est notée .
Exercice 4 : profondeur ou largeur ?
Le théorème d’approximation universelle affirme qu’une seule couche cachée suffit pour approcher n’importe quelle fonction continue. Pourquoi, en pratique, construit-on quand même des réseaux profonds (à plusieurs couches cachées) plutôt que de tout mettre dans une seule couche très large ?
En une phrase
Un neurone trace une droite ; empiler des neurones en couches, avec une activation non linéaire intercalée, suffit à dessiner n’importe quelle frontière, et même à approcher presque n’importe quelle fonction.
Quiz
1. Pourquoi un perceptron simple ne peut-il pas réaliser XOR ?
2. Dans la construction à la main de XOR, que calcule le second neurone caché h₂ ?
3. Que représente géométriquement l’intersection de k demi-plans (une couche dont la sortie est un ET) ?
4. Que garantit le théorème d’approximation universelle ?
5. Universel implique-t-il apprenable ?
Vers le chapitre 6 : mesurer l’erreur pour apprendre
On sait maintenant qu’un réseau multi-couches peut tout exprimer. Il reste la vraie question, celle que le théorème d’approximation universelle laisse ouverte : comment régler ses poids sans les poser à la main, comme on vient de le faire pour XOR ?
La première brique de la réponse est de savoir mesurer à quel point le réseau se trompe. Le chapitre 6 introduit le passage avant (le calcul de la sortie, couche après couche) et la fonction de coût, qui chiffre l’écart entre la prédiction et la cible. C’est cette mesure de l’erreur qui, aux chapitres 7 et 8, guidera l’ajustement automatique des poids.
Sources
- Cybenko, G. (1989). « Approximation by superpositions of a sigmoidal function. » Mathematics of Control, Signals and Systems 2(4), 303-314. DOI 10.1007/BF02551274
- Hornik, K., Stinchcombe, M. & White, H. (1989). « Multilayer feedforward networks are universal approximators. » Neural Networks 2(5), 359-366. DOI 10.1016/0893-6080(89)90020-8
- Rumelhart, D. E., Hinton, G. E. & Williams, R. J. (1986). « Learning representations by back-propagating errors. » Nature 323, 533-536. DOI 10.1038/323533a0
- Leshno, M., Lin, V. Y., Pinkus, A. & Schocken, S. (1993). « Multilayer feedforward networks with a nonpolynomial activation function can approximate any function. » Neural Networks 6(6), 861-867. DOI 10.1016/S0893-6080(05)80131-5
- Goodfellow, I., Bengio, Y. & Courville, A. (2016). Deep Learning, chapitre 6. MIT Press. deeplearningbook.org