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.
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.
Choisissez une réponse et votre degré de certitude.
Répondez pour débloquer le labo.
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.
À 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.
Télécharger le notebook (.ipynb). Ouvrez-le dans Jupyter ou importez-le dans Google Colab ; il télécharge lui-même les données manquantes.
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.
Cela vous a-t-il aidé ?
Merci ! Cela nous aide à nous améliorer.
Aller plus loin dans l’Atlas
Articles de l’encyclopédie sur les notions de cette leçon :