“Une chaîne de votants — chacun pèse les indices, puis transmet son estimation.”
Un neurone, une décision
L'unité atomique est le neurone. Il prend quelques nombres en entrée, multiplie chacun par un poids, ajoute une constante (le biais), et compresse le résultat à travers une fonction non linéaire. Sortie : un nombre. C'est tout. Il ne se passe rien de biologique.
Si l'on voit les entrées comme des indices et les poids comme l'importance accordée à chaque indice, un neurone est un minuscule isoloir. « Cette photo montre-t-elle une moustache ? une oreille pointue ? du poil ? — oui, oui, oui — sortie : score élevé pour chat. »
Pourquoi des couches, et pourquoi « profond »
Une seule couche de neurones ne peut apprendre que des distinctions linéaires — « ce point est-il au-dessus ou en dessous de la ligne ? » Empiler deux couches et on peut apprendre des courbes. En empiler dix et on peut apprendre n'importe quoi, avec suffisamment de données. C'est, formellement, le « théorème d'approximation universelle ».
L'astuce intéressante est ce qui se passe à l'intérieur des réseaux profonds : chaque couche apprend une caractéristique légèrement plus abstraite que celle du dessous. Dans les réseaux de vision, la première couche détecte les contours, la deuxième les coins et les textures, la cinquième les yeux et les roues, la dixième les visages et les voitures. Personne n'a programmé cette hiérarchie — elle émerge de l'objectif d'entraînement.
La compression non linéaire
Entre chaque paire de couches, une petite fonction non linéaire est appliquée à chaque sortie. Les plus courantes : ReLU (« si négatif, sortir zéro ; sinon, conserver »), GELU, sigmoïde, tanh. Sans elle, empiler des couches ne sert à rien — tout le réseau s'effondrerait mathématiquement en une seule couche.
La non-linéarité est la raison pour laquelle les réseaux profonds peuvent modéliser des courbes, des formes et des décisions qu'une seule couche ne peut pas. C'est un petit détail qui accomplit un travail structurel énorme.
Comment un réseau calcule vraiment
En pratique, on ne calcule jamais un neurone à la fois. Toute une couche est une grande multiplication matricielle : vecteur d'entrée fois matrice de poids, plus vecteur de biais, application de la non-linéarité, vecteur de sortie. La couche suivante prend cette sortie et fait de même. Tout le réseau n'est qu'une chaîne de multiplications matricielles entrelacées de non-linéarités.
C'est pourquoi les GPU importent tant. Les GPU ont été construits pour les graphismes — et les graphismes, c'est des multiplications matricielles. Ils se sont révélés être le matériel parfait pour quelque chose pour lequel personne ne les avait conçus. Tout l'essor de l'IA repose sur cette heureuse coïncidence.
# forward pass, two layers, in 5 lines
h1 = relu(x @ W1 + b1) # input -> hidden
y = h1 @ W2 + b2 # hidden -> output
# x: input vector
# W1, W2: weight matrices
# b1, b2: bias vectors
# relu: max(0, ...) applied elementwise
La rétropropagation, en un paragraphe
Entraîner un réseau signifie ajuster chaque matrice de poids et chaque vecteur de biais pour que la perte diminue. Pour savoir dans quel sens les ajuster, il faut le gradient de la perte par rapport à chaque paramètre. Le calculer naïvement est hors de portée — il peut y avoir des centaines de milliards de paramètres. La rétropropagation est l'astuce qui les calcule tous en une seule passe arrière, en appliquant la règle de dérivation en chaîne couche par couche. Elle s'exécute à peu près dans le même temps que la passe avant.
La rétropropagation a été la clé qui a rendu les réseaux profonds pratiques. Les maths sont les mêmes depuis 1986 ; la raison pour laquelle on l'utilise aujourd'hui et pas en 1986, c'est que les GPU nous permettent de l'exécuter sur des réseaux un million de fois plus grands.
Mais alors — où est la partie langage ?
Tout ce qui précède est générique. Un réseau de neurones pour les photos de chats et un réseau pour le texte se ressemblent à ce niveau : multiplications matricielles et non-linéarités. Ce qui rend l'un bon avec les images et l'autre bon avec le langage, c'est (a) ce qu'on lui soumet en entrée et (b) comment les couches sont câblées. Nous rencontrons le câblage propre au langage — plongements et attention — aux chapitres 4 et 5.
En une ligne chacun
- Un neurone est une somme pondérée suivie d'une compression non linéaire. C'est l'atome entier.
- Les couches empilent des neurones ; la profondeur permet au réseau d'apprendre une hiérarchie d'abstraction sans qu'on le lui demande.
- Tout le calcul est des multiplications matricielles entrelacées de non-linéarités — c'est pourquoi les GPU ont triomphé.
- La rétropropagation est la façon de calculer efficacement les gradients sur des centaines de milliards de paramètres.
Où aller ensuite