ML Atlas

Le machine learning en partant de zéro · Leçon 7.1 · 32 sur 33 leçons prêtes · 12 min

Réseaux de neurones : beaucoup d’unités simples

En bref

Un réseau de neurones empile des unités simples qui tracent chacune une droite pliée. Avec plus de neurones cachés, les régions se courbent autour des iris.

Échauffement Deux questions de leçons précédentes. Une minute, sans jamais bloquer la leçon.
De la leçon 5.6 : Quel modèle, quand ? Vrai ou faux : « un modèle dont la moyenne est plus haute de 0,3 point est meilleur ».

Voir la réponse

Bonne réponse : Faux : avec un tel écart, les découpages se partagent presque à égalité

Sur les tumeurs, la SVM obtient 94,2 % et le gradient boosting 93,9 %. La SVM a plus de bonnes réponses sur 10 découpages, le boosting sur 7, et 3 sont à égalité.

De la leçon 5.5 : Machines à vecteurs de support et noyaux Quelles fleurs fixent la frontière d’une SVM linéaire ?

Voir la réponse

Bonne réponse : Les vecteurs de support : fleurs au bord, dans la bande ou au-delà

Les autres fleurs pourraient être retirées sans que la frontière change. Pour C = 100, 4 fleurs sur 70 la tiennent.

La régression logistique de la leçon 5 ne sait tracer qu’une frontière droite. Les arbres ne savent dessiner que des boîtes. Mais si les classes s’enroulent l’une autour de l’autre ? Vous pourriez essayer d’inventer à la main la bonne courbe pour chaque problème – ou bien construire un modèle à partir de pièces si simples que chacune ne sait tracer qu’une droite, et laisser leur combinaison dessiner n’importe quoi. C’est le pari des réseaux de neurones.

Prédisez, puis vérifiez Vous faites passer le nombre de neurones cachés de 2 à 32. Que devient l’exactitude sur le jeu de test ?
Quel est votre degré de certitude ?

Labo interactif

Ce labo interactif fonctionne dans un navigateur avec JavaScript activé. Le texte qui l’entoure décrit ce qu’il montre.

Voir la réponse

Bonne réponse : Elle n’augmente pas, et peut même baisser, alors que l’entraînement s’améliore

Deux neurones donnent 81,3 % au test et 32 neurones 70,7 %, bien que l’exactitude d’entraînement passe de 81,3 % à 94,7 %. Le réseau plus grand s’ajuste aux détails fortuits des 75 fleurs d’entraînement. Deux des trois espèces se chevauchent dans ces deux mesures, donc une séparation parfaite n’existe de toute façon pas.

À vous de jouer

  • Réglez le curseur des neurones cachés sur sa plus petite valeur et cliquez sur Entraîner. Regardez les régions de décision : combien de bords droits voyez-vous ?
  • Augmentez le nombre de neurones cachés et cliquez de nouveau sur « Entraîner ». Regardez les frontières se courber et comparez l’exactitude.
  • Réglez le curseur des neurones cachés sur sa plus grande valeur et entraînez. Les régions commencent-elles à se tordre autour de fleurs isolées ? Demandez-vous si une nouvelle fleur tombant dans une telle poche appartiendrait vraiment à cette espèce.
  • Regardez les fleurs là où deux espèces se chevauchent. Une frontière, quelle qu’elle soit, peut-elle les séparer avec seulement ces deux mesures ?

L’idée en quelques mots

Voyons maintenant ce que vous venez de manipuler, en termes simples.

Un réseau de neurones est fait de petites unités appelées neurones. Chaque neurone fait quelque chose que nous connaissons déjà : il calcule une somme pondérée de ses entrées, ajoute une ordonnée à l’origine (le biais) et fait passer le résultat par une fonction de pliage simple, la fonction d’activation. Un neurone seul, c’est presque une régression logistique ; il peut séparer le plan par une droite.

Les neurones sont rangés en couches. Les entrées (ici, deux mesures d’une fleur) alimentent une couche cachée de neurones, dont chacun trace sa propre droite et indique à quelle distance, et de quel côté, se trouve un point. La couche de sortie combine ces indications en une décision finale. Comme chaque neurone caché plie son signal, leur combinaison produit des frontières avec des angles et des courbes.

Imaginez une équipe de guetteurs très simples qui surveillent un champ. Chaque guetteur ne peut dire que « l’intrus est à gauche » ou « à droite » d’une seule clôture droite. Un guetteur seul ne sert pas à grand-chose. Mais une cheffe qui écoute de nombreux guetteurs, avec des clôtures placées à des endroits différents, peut délimiter des zones de presque n’importe quelle forme.

Pourquoi ça marche

Un neurone calcule

sortie = f(w · x + b)

où x est la liste des entrées, w les poids, b l’ordonnée à l’origine et f la fonction d’activation. Sans f, empiler des couches ne servirait à rien : une somme pondérée de sommes pondérées reste une seule somme pondérée, et le réseau entier ne tracerait qu’une seule droite. L’activation, c’est le pli qui reste. Grâce à elle, chaque neurone caché ajoute un coude, et suffisamment de coudes peuvent approcher n’importe quelle frontière raisonnable. Plus de neurones cachés, c’est plus de coudes possibles – plus de souplesse, ce qui, comme l’a montré la leçon 7, est une arme à double tranchant.

Les poids sont appris avec les outils des leçons 4 et 5. Le réseau fait des prédictions, la perte logistique mesure à quel point elles sont fausses, et la descente de gradient pousse chaque poids vers le bas. La seule astuce nouvelle concerne le calcul du gradient pour les poids enfouis au cœur du réseau : un algorithme appelé rétropropagation (backpropagation) applique la règle de dérivation en chaîne à rebours depuis la sortie, couche par couche, et indique à chaque poids dans quelle mesure il a contribué à l’erreur.

L’exemple de cette leçon est le jeu de données Iris : 150 fleurs de trois espèces, 50 de chaque, rendu célèbre par l’article de Ronald Fisher de 1936. Nous prenons deux des quatre mesures, si bien que chaque fleur est un point sur un plan, et le réseau entraîné attribue une espèce prédite à chaque endroit de ce plan.

L’idée est ancienne – Frank Rosenblatt a construit le perceptron, un neurone unique entraînable, en 1958 –, mais les réseaux ne sont devenus dominants que lorsque les données, la puissance de calcul et les astuces d’entraînement ont été suffisantes pour entraîner de nombreuses couches.

Erreur fréquente

« Neurone » fait penser à un cerveau, et cette image induit en erreur. Un neurone artificiel est une somme pondérée avec un pli, pas un modèle de cellule biologique, et un réseau ne comprend pas les fleurs ; il ajuste une fonction à des exemples. L’erreur pratique consiste à croire que plus grand est toujours mieux. Un réseau avec beaucoup de neurones cachés sur un petit jeu de données peut apprendre par cœur exactement comme un arbre profond ou un polynôme de degré élevé. Sa taille doit être choisie avec des données de validation, et son entraînement surveillé pour repérer le même écart entre performance d’entraînement et de test que dans la leçon 7.

Empilez assez de couches, nourrissez-les d’assez de texte, et une tâche de prédiction devient quelque chose qui écrit. Dans la dernière leçon, nous voyons comment un réseau apprend le langage en devinant le mot suivant.

Envie d’aller plus loin ? Le cours de réseaux de neurones commence par un seul neurone (PL).

Quiz

Trois questions pour vérifier vos acquis. Choisissez une réponse ou dépliez la solution sous chaque question. Au clavier : les flèches choisissent, Entrée ou Espace valide.

1. Pourquoi un réseau de neurones a-t-il besoin d’une fonction d’activation ?
Voir la réponse

Bonne réponse : Sans elle, les couches empilées se réduisent à une seule somme pondérée

L’activation plie le signal ; sans plis, les couches n’apportent aucune expressivité de plus qu’un seul modèle linéaire.

2. Que fait l’ajout de neurones cachés ?
Voir la réponse

Bonne réponse : Il ajoute de la souplesse : frontières plus fines, mais aussi un risque accru de surapprentissage

Plus de neurones, c’est plus de coudes possibles, qui peuvent capter une vraie structure ou surapprendre selon les données.

3. Que calcule la rétropropagation ?
Voir la réponse

Bonne réponse : La part de chaque poids dans l’erreur, pour que le gradient l’ajuste

La rétropropagation applique la règle de dérivation en chaîne depuis la sortie, à rebours, pour obtenir le gradient de chaque poids.

À retenir

  • Un neurone, c’est une somme pondérée plus une fonction d’activation qui plie le signal.
  • Une couche cachée combine de nombreuses droites simples en frontières courbes.
  • Les poids sont appris par descente de gradient ; la rétropropagation fournit le gradient pour chaque couche.
  • Plus de neurones cachés, c’est plus de souplesse, qu’il faut maîtriser avec des données de validation.

Pour aller plus loin : formule, code, pratique

Les maths

Un neurone calcule a = f(w·x + b), où x contient les entrées, w les poids, b l’ordonnée à l’origine et f l’activation. Une couche cachée de h neurones est la même chose sous forme matricielle : a = f(W₁x + b₁). La couche de sortie calcule ensuite ŷ = softmax(W₂a + b₂).

  • Sans f, les couches s’effondrent : W₂(W₁x + b₁) + b₂ = (W₂W₁)x + (W₂b₁ + b₂), ce qui est une seule application linéaire. C’est l’activation qui rend la profondeur utile.
  • L’entraînement minimise la perte logistique L = −(1/n) Σ log ŷᵢ,yᵢ, où ŷᵢ,yᵢ est la probabilité que le modèle a donnée à la vraie espèce de la fleur i.
  • La rétropropagation est la règle de dérivation en chaîne appliquée de la sortie vers l’arrière : ∂L/∂W₁ = ∂L/∂ŷ · ∂ŷ/∂a · ∂a/∂W₁.
  • La descente de gradient met ensuite à jour chaque poids : w ← w − η · ∂L/∂w, où η est le taux d’apprentissage.
En code (Python)

Un petit réseau sur les données du lab : deux mesures du sépale, la moitié des fleurs pour l’entraînement (75), entrées standardisées, unités tanh, 2 et 32 unités cachées. C’est l’entraîneur de scikit-learn, pas celui du lab :

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.neural_network import MLPClassifier
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler

X, y = load_iris(return_X_y=True)
X = X[:, :2]  # longueur et largeur du sépale, comme dans le lab
X_tr, X_te, y_tr, y_te = train_test_split(X, y, test_size=0.5, stratify=y, random_state=1)
for h in (2, 32):
    net = make_pipeline(StandardScaler(), MLPClassifier(hidden_layer_sizes=(h,), activation="tanh", solver="lbfgs", max_iter=5000, random_state=0))
    net.fit(X_tr, y_tr)
    print(f"{h:2d} hidden units: train {net.score(X_tr, y_tr):.1%}, test {net.score(X_te, y_te):.1%}")

Sortie

 2 hidden units: train 84.0%, test 74.7%
32 hidden units: train 96.0%, test 66.7%

Le motif est celui de la leçon : le plus grand réseau ajuste mieux les fleurs d’entraînement et fait moins bien sur les fleurs de test. L’entraîneur propre au lab (descente de gradient avec moment) donne 81,3 % et 70,7 % sur le jeu de test pour 2 et 32 unités, donc les nombres diffèrent mais pas le motif.

Pour les praticiens
  • Standardisez les entrées avant l’entraînement (soustrayez la moyenne d’entraînement, divisez par l’écart type d’entraînement). Des variables non mises à l’échelle rendent la descente de gradient lente ou instable.
  • Choisissez le nombre d’unités cachées sur des données de validation, pas d’après l’exactitude d’entraînement. Un plus grand réseau ajuste presque toujours mieux le jeu d’entraînement (96,0 % contre 84,0 % ci-dessus).
  • Les petits jeux de données, comme 75 fleurs d’entraînement, se mémorisent facilement. Essayez un réseau plus petit, la décroissance des poids ou l’arrêt précoce avant d’ajouter des unités.
  • Des poids initiaux aléatoires différents donnent des réseaux différents. Pour une comparaison équitable, fixez les graines que vous utilisez, et comparez sur plusieurs d’entre elles.
  • Sur des données en forme de tableau, les arbres à gradient boosté sont souvent une meilleure référence. Essayez-les avant de recourir à un réseau.

Aller plus loin dans l’Atlas

Articles de l’encyclopédie sur les notions de cette leçon :