Trouver le bas d’une vallée à pied
La descente de gradient est une méthode qui cherche le minimum d’une fonction en faisant de petits pas dans le sens où elle descend. Elle sert à régler un modèle pour que son erreur soit la plus faible possible.
C’est comme marcher dans le brouillard : on ne voit pas le fond, mais on sent de quel côté le sol penche.
À la fin de cette leçon
Remarque
Je peux minimiser une fonction avec des pas de descente de gradient et dire quand arrêter.
Mots clés
| Mot | Ce que ça veut dire |
|---|---|
| Minimum | le point où la fonction est la plus basse |
| Descente de gradient | une suite de pas opposés au gradient |
| Taux d’apprentissage | la taille de chaque pas, un nombre choisi |
| Itération | un tour de la boucle de descente |
| Divergence | quand les pas s’éloignent du minimum au lieu de s’en approcher |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Chaque pas retire un morceau de la dérivée
La règle tient en une ligne : le nouveau x vaut l’ancien x, moins le taux fois la dérivée. Si la pente est positive, on recule. Si elle est négative, on avance.
Le taux d’apprentissage règle la taille du pas. Plus la pente est forte, plus le pas est long, et il raccourcit en approchant du fond.
Exemple : cinq pas de descente
| Pas | x avant | Dérivée 2(x - 3) | x après |
|---|---|---|---|
| 1 | 0 | -6 | 0,6 |
| 2 | 0,6 | -4,8 | 1,08 |
| 3 | 1,08 | -3,84 | 1,464 |
| 4 | 1,464 | -3,072 | 1,7712 |
| 5 | 1,7712 | -2,4576 | 2,017 |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Écrire le programme de descente dans le labo
docker exec jupyter sh -c "printf 'x = 0.0\nfor i in range(5):\n x = x - 0.1 * 2 * (x - 3)\n print(i + 1, round(x, 4))\n' > descente.py"Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Lancer cinq pas de descente
docker exec jupyter python3 descente.pyAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
On s’arrête quand la pente est presque nulle
Une descente ne tombe jamais exactement sur le minimum. On choisit donc un critère d’arrêt : la dérivée est plus petite qu’un seuil, comme 0,001.
On ajoute aussi un nombre maximal d’itérations. Sans cette limite, un programme qui ne converge pas tournerait sans fin.
Une descente avec un critère d’arrêt
# Descendre vers le minimum de (x - 3) au carré.
def derivee(x):
return 2 * (x - 3)
x = 0.0
taux = 0.1
pas = 0
while abs(derivee(x)) > 0.001 and pas < 1000:
x = x - taux * derivee(x)
pas = pas + 1
print("pas :", pas)
print("x :", round(x, 3))
# Mettez taux à 0.5, puis relancez : combien de pas faut-il ?
Un pas trop grand fait diverger la descente
Un taux trop grand dépasse le minimum et tombe de l’autre côté, plus haut qu’avant. Le pas suivant dépasse encore plus loin. Les valeurs de x grandissent : c’est la divergence.
Avec un taux de 1,1 sur la même fonction, le programme saute de part et d’autre de 3 en s’éloignant.
Écrire la descente au taux 1,1
docker exec jupyter sh -c "printf 'x = 0.0\nfor i in range(5):\n x = x - 1.1 * 2 * (x - 3)\n print(i + 1, round(x, 4))\n' > trop_grand.py"Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Voir la descente diverger
docker exec jupyter python3 trop_grand.pyAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Une erreur fréquente
Attention
Beaucoup pensent qu’un taux plus grand fait toujours aller plus vite. C’est vrai jusqu’à un seuil. Au-delà, chaque pas dépasse le minimum et la descente s’éloigne. Commencez petit, comme 0,1, et agrandissez tant que l’erreur baisse.
Pour aller plus loin
Dans le terminal, éditez trop_grand.py : essayez des taux de 0,9, 1,0 et 1,01. Notez à partir de quel taux x cesse de se rapprocher de 3.
La leçon suivante utilise cette descente pour ajuster une droite à des points.