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.
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.
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 : 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.
À 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 facteur1 − 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.
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 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
NaNindique 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.
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 :