Aller au contenu
Kudos AI
Read in English
Réseaux de neurones

Qu’est-ce qu’un réseau de neurones ?

Les couches comme transformations paramétrées, la passe avant, et pourquoi profondeur et non-linéarité ne sont pas optionnelles : une preuve qu’aucune couche linéaire seule ne peut calculer le XOR, et un réseau à deux couches qui y parvient, entièrement déroulé à la main.

8 min de lectureKudos AI

Prérequis : La régression linéaire à partir des premiers principes

Trois couches linéaires empilées s’effondrant à l’écran en une seule, puis refusant de s’effondrer dès qu’une non-linéarité est glissée entre elles.

Un réseau de neurones n’est pas un modèle du cerveau. C’est une chaîne de transformations simples et réglables, empilées de sorte que chacune opère sur la sortie de la précédente. Chollet est net sur la terminologie : le nom renvoie à la neurobiologie, et il indique deux noms qui auraient tout aussi bien pu être choisis, apprentissage de représentations en couches et apprentissage de représentations hiérarchiques. Le « profond » de l’apprentissage profond n’est pas une prétention à la profondeur de compréhension - il désigne le nombre de couches empilées les unes sur les autres.

Cet article construit l’objet depuis la base : ce qu’est une couche, pourquoi une non-linéarité entre couches est mathématiquement nécessaire plutôt que décorative, et ce que la profondeur achète réellement. L’argument central est réglé par une preuve et un exemple assez petit pour être vérifié sur papier.

A. Une couche est une transformation paramétrée

Une couche dense prend un vecteur, le multiplie par une matrice, ajoute un biais et applique une fonction élément par élément :

a=g(Wx+b).\mathbf{a} = g(W\mathbf{x} + \mathbf{b}) .

Trois pièces :

  • WW et b\mathbf{b} sont les poids de la couche - les nombres ajustés pendant l’entraînement. Tout ce que le réseau sait vit là.
  • gg est la fonction d’activation, appliquée à chaque composante indépendamment.
  • x\mathbf{x} est ce que la couche précédente a produit.

Un réseau est une pile de ces couches. Selon le cadrage de Chollet, chaque couche apprend une représentation des données, et la profondeur désigne des couches successives de représentations de plus en plus utiles, toutes apprises automatiquement par exposition aux données d’entraînement plutôt que conçues à la main. C’est le contraste avec ce qu’il appelle l’apprentissage superficiel, qui extrait une ou deux couches de représentation - disons un histogramme de pixels suivi d’une règle de classification - et exige qu’un humain décide de ces caractéristiques.

B. Pourquoi la fonction d’activation n’est pas optionnelle

Supposons que nous supprimions gg et empilions deux couches purement linéaires :

h=W(1)x,y=W(2)h=W(2)(W(1)x)=(W(2)W(1))x.\mathbf{h} = W^{(1)}\mathbf{x}, \qquad \mathbf{y} = W^{(2)}\mathbf{h} = W^{(2)}\left(W^{(1)}\mathbf{x}\right) = \left(W^{(2)}W^{(1)}\right)\mathbf{x} .

La multiplication matricielle est associative : les deux matrices s’effondrent en une seule. Concrètement, avec

W(1)=[2003],W(2)=[1101],W^{(1)} = \begin{bmatrix}2 & 0\\ 0 & 3\end{bmatrix},\qquad W^{(2)} = \begin{bmatrix}1 & 1\\ 0 & 1\end{bmatrix},

la composition vaut

W(2)W(1)=[2303],W^{(2)}W^{(1)} = \begin{bmatrix}2 & 3\\ 0 & 3\end{bmatrix},

une seule couche. Ajoutez-en cent autres, linéaires : c’est toujours une seule couche. La profondeur sans non-linéarité n’achète rien du tout - non pas un modèle légèrement plus faible, mais exactement le même ensemble de fonctions représentables.

L’activation la plus courante est la ReLU, g(z)=max⁡(0,z)g(z) = \max(0, z), qui laisse passer les valeurs positives inchangées et rabat les négatives à zéro. Ce n’est guère plus qu’un pli, et ce pli suffit.

La figure utilise un autre réseau à deux couches, sans biais. À son entrée de départ, les deux unités sont actives et le réseau coïncide avec sa réduction linéaire ; faites glisser la première entrée ou la seconde entrée jusqu’à éteindre une unité, et la ReLU se sépare de la réduction.

Interactif : l’effondrement, et ce qui l’empêche

Retirez la nonlinéarité et la coupe devient une droite.

Pré-activations
0.700, 1.000
Sortie
-0.150
La couche réduite dit
-0.150
Unités éteintes
0
Écart à l’affinité
0.150

Les deux couches se multiplient en la seule ligne [-0.050, -0.050], de sorte que sans nonlinéarité trois couches ou trente expriment exactement ce qu’une seule exprime : l’écart à l’affinité vaut 2e-16, soit zéro à la précision machine. Remettez ReLU et il vaut 0.150. Mais regardez où vous êtes. Les deux unités sont allumées, le redresseur ne fait donc rien ici, et le réseau renvoie -0.150 tandis que sa forme réduite renvoie -0.150 : le même nombre. C’est vrai aussi à l’entrée (1, 2) de la leçon. La profondeur n’achète pas une courbe. Elle achète des RÉGIONS, dont chacune reste une application affine, et les brisures de la coupe sont là où une pré-activation traverse zéro. Franchissez-en une et les deux réponses se séparent. Une note de comptage tant que la couche est sous les yeux : une couche dense de quatre entrées vers trois sorties contient 15 paramètres, et non 12. C’est le vecteur de biais que l’on oublie.

C. Une fonction qu’aucune couche seule ne peut calculer

Pour montrer que le pli compte, il nous faut une tâche qu’un modèle linéaire ne peut prouvablement pas accomplir. Le XOR est la tâche standard : deux entrées binaires, sortie 11 quand elles diffèrent.

x1x_1x2x_2XOR
000
011
101
110

Affirmation. Aucune fonction de la forme y=w1x1+w2x2+by = w_1x_1 + w_2x_2 + b ne reproduit cette table.

Preuve. Supposons qu’il en existe une. Prenons les lignes tour à tour :

  • (0,0)↦0(0,0) \mapsto 0 impose b=0b = 0.
  • (1,0)↦1(1,0) \mapsto 1 impose w1+b=1w_1 + b = 1, donc w1=1w_1 = 1.
  • (0,1)↦1(0,1) \mapsto 1 impose w2+b=1w_2 + b = 1, donc w2=1w_2 = 1.
  • (1,1)↦0(1,1) \mapsto 0 impose w1+w2+b=0w_1 + w_2 + b = 0.

En substituant les trois premières dans la quatrième on obtient 1+1+0=21 + 1 + 0 = 2, alors qu’il fallait 00. La contradiction est inévitable : de tels w1,w2,bw_1, w_2, b n’existent pas. ■\blacksquare

Géométriquement, un modèle linéaire ne peut découper l’espace d’entrée que par une unique frontière droite, et les deux classes du XOR siègent sur des diagonales opposées - aucune droite ne les sépare.

D. Deux couches, déroulées à la main

Ajoutons maintenant une couche cachée de deux unités ReLU. Les poids ci-dessous sont choisis, non entraînés, de sorte que chaque nombre soit vérifiable :

W(1)=[1111],b(1)=[0−1],W(2)=[1−2],b(2)=0.W^{(1)} = \begin{bmatrix}1 & 1\\ 1 & 1\end{bmatrix},\quad \mathbf{b}^{(1)} = \begin{bmatrix}0\\ -1\end{bmatrix},\quad W^{(2)} = \begin{bmatrix}1 & -2\end{bmatrix},\quad b^{(2)} = 0 .

Les deux unités cachées calculent x1+x2x_1 + x_2 ; elles ne diffèrent que par leur biais, si bien que la première s’active dès que la somme est positive et la seconde seulement quand la somme atteint 22. La couche de sortie soustrait deux fois la seconde de la première.

Prenons x=(1,1)\mathbf{x} = (1,1) pas à pas :

z(1)=W(1)x+b(1)=[1+1+01+1−1]=[21],\mathbf{z}^{(1)} = W^{(1)}\mathbf{x} + \mathbf{b}^{(1)} = \begin{bmatrix}1+1+0\\ 1+1-1\end{bmatrix} = \begin{bmatrix}2\\ 1\end{bmatrix}, a(1)=max⁡(0,z(1))=[21],y=1(2)+(−2)(1)=0.✓\mathbf{a}^{(1)} = \max(0, \mathbf{z}^{(1)}) = \begin{bmatrix}2\\ 1\end{bmatrix}, \qquad y = 1(2) + (-2)(1) = 0 . \checkmark

Les quatre entrées :

x\mathbf{x}z(1)\mathbf{z}^{(1)}a(1)\mathbf{a}^{(1)}yyXOR
(0,0)(0,0)(0,−1)(0, -1)(0,0)(0, 0)000
(0,1)(0,1)(1,0)(1, 0)(1,0)(1, 0)111
(1,0)(1,0)(1,0)(1, 0)(1,0)(1, 0)111
(1,1)(1,1)(2,1)(2, 1)(2,1)(2, 1)000

Exact sur les quatre lignes.

Observez la première ligne. La pré-activation de la seconde unité vaut −1-1, et la ReLU la rabat à 00. Ce rabattement est l’unique source de la puissance supplémentaire du réseau : c’est le seul endroit où la composition cesse d’être linéaire. Retirez-le - posez a(1)=z(1)\mathbf{a}^{(1)} = \mathbf{z}^{(1)} - et l’effondrement de la section B s’applique à nouveau, si bien que le réseau redeviendrait incapable de calculer le XOR.

Python

S'exécute dans votre navigateur. La première exécution télécharge l'environnement Python (~10 Mo), puis il est mis en cache.

E. Ce que la profondeur achète réellement

Chollet en donne l’image la plus claire. Imaginez une feuille de papier rouge et une bleue, empilées puis froissées ensemble en boule. La boule, ce sont vos données d’entrée ; chaque feuille est une classe. La tâche du modèle est de trouver une transformation qui défroisse la boule pour que les deux feuilles redeviennent proprement séparables.

Un réseau profond le fait par incréments : plutôt que de chercher une unique transformation extrêmement compliquée, il décompose le travail en une longue chaîne de transformations élémentaires, chacune étant un mouvement que vos doigts pourraient faire sur la boule de papier. Notre réseau XOR en est la plus petite instance possible - la couche cachée plie l’espace d’entrée de sorte que les deux classes, auparavant inséparables par toute droite, le deviennent par une seule.

C’est pourquoi la profondeur est une ressource réellement différente de la largeur. Toutes deux ajoutent des paramètres, mais la profondeur ajoute de la composition, et c’est la composition qui transforme une chaîne de transformations simples en une transformation compliquée.

La capacité n’est pas la compréhension. Chollet prend soin d’ajouter qu’un tel modèle est essentiellement une courbe de très haute dimension ajustée par descente de gradient, avec assez de paramètres pour pouvoir ajuster presque n’importe quoi - entraînez-le assez longtemps et il finira par mémoriser. La capacité de représenter une fonction n’est pas la capacité de généraliser à partir des données, qui est l’affaire du compromis biais-variance.

F. De la représentation à l’apprentissage

Nous avons choisi les poids du XOR à la main. Les vrais réseaux les découvrent, et le mécanisme est une fonction de perte - que Chollet appelle aussi fonction objectif - qui prend la prédiction du réseau et la cible véritable et calcule un score de distance résumant l’ampleur de l’échec. L’entraînement ajuste les poids pour réduire ce score.

Passer de « voici un score » à « voici comment chacun d’un million de poids doit changer » est le sujet de l’article suivant.

À retenir

  • Une couche est une transformation paramétrée g(Wx+b)g(W\mathbf{x} + \mathbf{b}) ; les poids sont tout ce que le réseau sait.
  • Les couches linéaires empilées s’effondrent en une seule couche linéaire - W(2)W(1)W^{(2)}W^{(1)} n’est qu’une autre matrice - donc une non-linéarité entre elles est mathématiquement nécessaire, non un choix de réglage.
  • Aucune couche linéaire seule ne peut calculer le XOR ; les quatre contraintes imposent 1+1+0=01+1+0 = 0, une contradiction.
  • Une couche cachée de deux unités ReLU calcule le XOR exactement, et la seule étape non linéaire y est un unique rabattement de −1-1 à 00.
  • La profondeur fournit de la composition : une transformation compliquée décomposée en une chaîne de transformations élémentaires - le défroissement d’une variété de données replié, chez Chollet.
  • Avoir assez de capacité pour représenter une fonction n’est pas généraliser à partir des données.

La suite

Nous avons fixé les poids du XOR à la main. Les trouver automatiquement suppose de calculer comment la perte réagit à chaque poids du réseau d’un seul coup, ce que fait exactement La rétropropagation et la descente de gradient.

Références et lectures complémentaires

  • François Chollet, Deep Learning with Python, Manning (2nd edition, MEAP), 2020· Bibliothèque de référence Kudos AI

Les œuvres protégées par le droit d’auteur sont citées à titre de référence uniquement et ne sont pas hébergées ici ; veuillez consulter l’éditeur pour y accéder.

Lecture associée

8 min de lectureRéseaux de neurones

La rétropropagation et la descente de gradient

Comment un réseau de neurones apprend : la perte comme fonction des poids, la descente de gradient, et la rétropropagation comme règle de dérivation en chaîne appliquée à rebours, avec toutes les dérivées partielles d’un petit réseau calculées à la main et vérifiées contre autograd.

Apprentissage profondOptimisationMathématiques
8 min de lectureConstruire un modèle de langue

La tokenisation et les plongements

Comment le texte devient des nombres sur lesquels un modèle peut s’entraîner : construire un vocabulaire, pourquoi le codage par paires d’octets n’a jamais besoin d’un token inconnu, la couche de plongement comme une consultation qui est prouvablement un one-hot fois une matrice, et pourquoi la position doit être réinjectée à la main.

IA générativeTraitement du langage naturelApprentissage profond
8 min de lectureFondements des probabilités

Les probabilités à partir de zéro : le langage de l’incertitude

Construire les probabilités depuis la base : les mondes possibles, l’univers, les deux axiomes fondamentaux, puis les règles d’addition et de multiplication, chacune démontrée plutôt qu’affirmée, avec des exemples numériques résolus.

ProbabilitéMathématiquesIntelligence artificielle
← Retour à tous les articles