ML Atlas

Le machine learning en partant de zéro · Leçon 1.6 · 7 sur 33 leçons prêtes · 10 min

Descente de gradient : apprendre à petits pas

En bref

La descente de gradient trouve de bons paramètres en descendant pas à pas la pente de l’erreur. Le taux d’apprentissage décide entre progrès et explosion.

Échauffement Deux questions de leçons précédentes. Une minute, sans jamais bloquer la leçon.
De la leçon 1.5 : Régression linéaire : ajuster une droite La pente est fixée à zéro. Quelle ordonnée à l’origine donne l’EQM la plus basse ?

Voir la réponse

Bonne réponse : La moyenne de toutes les valeurs cibles

Pour une droite horizontale, l’erreur quadratique est minimale à la moyenne, c’est pourquoi la moyenne est la référence naturelle en régression.

De la leçon 1.4 : Plus proches voisins : le modèle le plus simple Pourquoi standardise-t-on en général les mesures avant kNN ?

Voir la réponse

Bonne réponse : Parce qu’une mesure en grandes unités, comme les grammes, écrase les autres

La distance additionne les écarts des mesures. La masse en milliers de grammes couvre le bec en millimètres : avec quatre mesures, 76,7 % sans mise à l’échelle et 96,1 % après standardisation.

Dans la leçon précédente, une formule nous a donné la meilleure droite d’un seul coup. Mais un réseau de neurones à plusieurs millions de poids n’a pas de telle formule. Comment un ordinateur peut-il trouver de bonnes valeurs pour des millions de boutons de réglage quand personne ne peut lui dire où se trouve le meilleur réglage ? La réponse est d’une simplicité presque gênante : il sent de quel côté ça descend et fait un petit pas. Puis il recommence.

Prédisez, puis vérifiez Quatre taux d’apprentissage (longueurs de pas) au choix : 0,01 ; 0,1 ; 0,8 et 1,1. Lequel donne la perte la plus basse (le nombre qui dit à quel point le modèle se trompe) après 5 pas ?
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 : 0,8

Après 5 pas, la perte vaut 24468 (η = 0,01), 6595 (0,1), 4043 (0,8) et 159823 (1,1) ; le minimum est 3890. À 0,8 le pas est grand mais ne saute pas encore par-dessus la vallée. À 1,1 chaque pas la dépasse si fort que la perte augmente.

À vous de jouer

  • Choisissez un petit taux d’apprentissage et cliquez quelques fois sur Pas. Regardez la droite bouger un peu à chaque pas et la courbe de perte descendre lentement.
  • Cliquez sur Lancer et laissez tourner. La droite finit-elle près de la droite des moindres carrés de la leçon précédente ?
  • Recommencez avec le plus grand taux d’apprentissage et cliquez de nouveau sur « Pas ». Regardez la courbe de perte : au lieu de baisser, elle monte, et la droite oscille dans tous les sens. C’est la divergence.
  • Essayez les taux intermédiaires et trouvez le plus grand qui fait encore baisser la perte régulièrement.

L’idée en quelques mots

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

Imaginez-vous sur le flanc d’une colline dans un épais brouillard. Vous voulez rejoindre la vallée, mais vous ne voyez qu’à un mètre autour de vous. Une stratégie raisonnable : tâter le sol du pied, trouver la direction où la pente descend le plus fort, faire un pas dans cette direction et recommencer. Vous ne voyez jamais tout le paysage, et pourtant, pas à pas, vous descendez.

En apprentissage automatique, le « paysage » est l’erreur du modèle. Chaque couple possible de pente et d’ordonnée à l’origine est une position sur la carte, et l’altitude à cette position est l’erreur quadratique moyenne de la leçon 3. Le fond de la vallée, c’est la meilleure droite. La descente de gradient est la marche dans le brouillard : partir de quelque part, mesurer dans quelle direction l’erreur diminue, déplacer un peu les paramètres dans cette direction, et recommencer jusqu’à ce que l’erreur cesse de baisser.

Pourquoi ça marche

La direction de plus forte montée d’une fonction est donnée par son gradient – une liste de dérivées, une par paramètre, qui indique de combien l’erreur augmenterait si l’on poussait légèrement ce paramètre vers le haut. Allez dans le sens opposé et l’erreur diminue. Pour chaque paramètre w, un pas s’écrit :

w ← w − η · ∂L/∂w

Ici, L est la perte (l’erreur que l’on minimise), ∂L/∂w indique à quel point la perte réagit à w, et η (la lettre grecque êta) est le taux d’apprentissage, qui fixe la taille du pas. Là où la pente est raide, les pas sont grands ; près du fond, la pente s’adoucit et les pas raccourcissent d’eux-mêmes.

Tout dépend du taux d’apprentissage. S’il est trop petit, chaque pas est minuscule et la marche prend une éternité. S’il est juste, l’erreur baisse vite et se stabilise près du minimum. S’il est trop grand, chaque pas dépasse la vallée et atterrit plus haut sur le versant opposé ; le pas suivant dépasse encore davantage, et l’erreur croît sans limite. C’est ce qu’on appelle la divergence, et c’est la raison la plus courante pour laquelle un entraînement « explose ».

La beauté de la méthode, c’est qu’elle n’a besoin que d’une chose : pouvoir calculer le gradient à la position actuelle. Elle n’a pas besoin d’une formule pour la réponse, et elle fonctionne de la même façon pour deux paramètres que pour deux milliards. C’est pourquoi elle est le moteur de presque tous les réseaux de neurones, y compris les modèles de langage de la leçon 12. En pratique, on estime généralement le gradient sur un petit lot aléatoire d’exemples (mini-batch) plutôt que sur tous, ce qui rend chaque pas moins coûteux et plus bruité, mais fonctionne remarquablement bien.

Erreur fréquente

Quand la perte s’envole soudain ou devient « NaN » (not a number, pas un nombre), les débutants soupçonnent souvent un bug dans leur code. Bien plus souvent, le taux d’apprentissage est tout simplement trop grand. Le remède est de le réduire, pas de réécrire le modèle. L’erreur inverse est moins visible : un taux si petit que la perte baisse encore quand l’entraînement s’arrête, si bien que le modèle paraît moins bon qu’il ne pourrait l’être. Un piège voisin, ce sont des variables à des échelles très différentes – par exemple l’âge en années à côté du revenu en euros –, qui transforment la vallée en un long canyon étroit où aucun taux d’apprentissage unique ne convient à toutes les directions. Normaliser les variables d’abord rend la marche bien plus facile.

Nous avons maintenant les deux moitiés de la recette d’apprentissage : une note et un moyen de l’améliorer. Dans la prochaine leçon, nous les utilisons pour un nouveau type de question – non plus « combien ? », mais « lequel ? ».

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. Qu’indique le gradient à l’algorithme à chaque pas ?
Voir la réponse

Bonne réponse : Dans quelle direction, et avec quelle pente, la perte augmente à la position actuelle

Le gradient pointe vers le haut, donc un pas dans le sens opposé fait baisser la perte, mais il ne décrit que le voisinage du point actuel.

2. La perte grimpe à chaque pas. Quelle est la cause la plus probable ?
Voir la réponse

Bonne réponse : Le taux d’apprentissage est trop grand, si bien que chaque pas dépasse le minimum

Avec un pas trop grand, les paramètres sautent chaque fois par-dessus la vallée vers un point plus haut, et l’erreur augmente.

3. Pourquoi utilise-t-on la descente de gradient pour les réseaux de neurones plutôt qu’une formule exacte ?
Voir la réponse

Bonne réponse : Aucune formule n’existe pour la plupart des modèles, mais le gradient se calcule

La descente de gradient n’a besoin que de la pente de la perte au point actuel, disponible même pour des modèles à plusieurs milliards de paramètres.

À retenir

  • La descente de gradient améliore les paramètres en faisant des pas répétés dans le sens opposé au gradient de la perte.
  • Le taux d’apprentissage fixe la taille du pas : trop petit, c’est lent ; trop grand, ça diverge.
  • Une perte qui explose signifie généralement un taux d’apprentissage trop élevé, pas un code cassé.
  • La méthode n’a besoin que du gradient, elle passe donc de deux paramètres à des milliards.

Pour aller plus loin : formule, code, pratique

Les maths

Prenons la droite ŷ = b + w·z, avec la perte L(w, b) = (1/n) · Σ (yᵢ − b − w·zᵢ)². Son gradient est ∂L/∂w = −2 · mean(r · z) et ∂L/∂b = −2 · mean(r), où r = y − ŷ sont les résidus. Un pas s’écrit w ← w − η·∂L/∂w et b ← b − η·∂L/∂b.

Quand la variable est standardisée (mean(z) = 0, mean(z²) = 1), les deux directions n’interfèrent pas. Chaque pas réduit alors la distance au meilleur w et au meilleur b d’un facteur 1 − 2η.

  • 0 < η < 1 : la distance diminue et la perte descend jusqu’au minimum. Plus η est proche de 0,5, plus c’est rapide.
  • η > 1 : le facteur 1 − 2η est inférieur à −1, donc sa valeur absolue dépasse 1, chaque pas dépasse la cible de plus en plus loin, et la perte croît sans limite.
  • Sans standardisation, la plage sûre de η dépend de l’échelle de la variable, donc une seule valeur ne convient plus à toutes les directions.
En code (Python)

La perte du lab après 5 pas depuis w = b = 0, pour quatre taux d’apprentissage, sur l’IMC standardisé (données sur le diabète) :

import numpy as np
from sklearn.datasets import load_diabetes

X, y = load_diabetes(return_X_y=True, as_frame=True, scaled=False)
bmi = X["bmi"].to_numpy()
z = (bmi - bmi.mean()) / bmi.std()  # IMC standardisé, comme dans le lab
mse = lambda w, b: np.mean((y - (b + w * z)) ** 2)
for lr in [0.01, 0.1, 0.8, 1.1]:
    w, b = 0.0, 0.0  # départ à l'origine
    for _ in range(5):  # cinq pas en batch complet
        r = y - (b + w * z)
        w, b = w + lr * 2 * np.mean(r * z), b + lr * 2 * np.mean(r)
    print(f"lr {lr}: loss after 5 steps {mse(w, b):.0f}")
w_best, b_best = np.polyfit(z, y, 1)
print(f"minimum: {mse(w_best, b_best):.0f}")

Sortie

lr 0.01: loss after 5 steps 24468
lr 0.1: loss after 5 steps 6595
lr 0.8: loss after 5 steps 4043
lr 1.1: loss after 5 steps 159823
minimum: 3890

Le minimum, 3890, est l’EQM de la droite des moindres carrés de la leçon 3. À lr = 0.8, le facteur est |1 − 1.6| = 0.6 par pas, ce qui bat 0,9 à lr = 0.1. À lr = 1.1, il vaut 1,2, donc la perte croît.

Pour les praticiens
  • Standardisez les variables numériques avant la descente de gradient. Cela rend la cuvette de la perte ronde et permet à un seul taux d’apprentissage de convenir à toutes les directions.
  • Tracez toujours la perte en fonction du pas. Une baisse régulière est saine. Une hausse ou un NaN indique presque toujours un taux d’apprentissage trop grand : divisez-le par 10 et réessayez.
  • Ne vous arrêtez pas seulement à un nombre de pas fixe. Arrêtez-vous aussi quand la perte ne bouge presque plus, et vérifiez qu’elle s’est vraiment aplatie et qu’elle ne fait pas que ramper.
  • Si vous écrivez un gradient à la main, comparez-le à une estimation par différences finies sur quelques points avant de vous fier à une longue exécution.
  • Quand une forme fermée existe, comme pour la régression linéaire, utilisez-la. La descente de gradient mérite sa place pour les modèles qui n’ont pas de telle formule.

Aller plus loin dans l’Atlas

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