← Tous les articles

Entraînement et optimisation Prototype

Comment la descente de gradient entraîne un modèle

Dans l’article précédent, nous avons construit un outil : le gradient. À une position donnée, il indique la direction dans laquelle une fonction augmente le plus vite, localement.

Pour entraîner un modèle, nous voulons réduire une fonction qui mesure ses erreurs. Il semblerait donc qu'il suffise de suivre la direction opposée.

Mais dans quel espace nous déplaçons-nous ? De combien faut-il avancer ? Et comment savoir si nous approchons d’une bonne solution ?

Construisons la descente de gradient à partir d’un modèle très simple.

Un modèle avec deux paramètres et une fonction de loss

Nous disposons de quelques observations : pour chaque entrée xix_i, une valeur yiy_i est connue.

Notre modèle est une droite :

y^i=axi+b\hat y_i=ax_i+\bias{b}

Ses paramètres sont la pente a\coefOne{a} et l’ordonnée à l’origine b\bias{b}. Les changer déplace la droite et modifie ses prédictions.

Pour mesurer la qualité de ces prédictions, nous calculons la moyenne des erreurs au carré :

L(a,b)=1N∑i=1N(y^i−yi)2L(\coefOne{a},\bias{b})=\frac{1}{N}\sum_{i=1}^{N}(\hat y_i-y_i)^2

Cette fonction s’appelle une fonction de coût, ou loss. Chaque couple (a,b)(\coefOne{a},\bias{b}) correspond à une droite et à une valeur de loss.

Notre objectif est de trouver des paramètres qui rendent cette valeur aussi petite que possible.

EXPÉRIENCE 01 / 06

Relier la droite au paysage

-2-1012-10-50510xy
L (MSE)710abParamètres (a, b)Axes : ±3 · échelle de loss fixe
y^=−1x+3\hat y=\coefOne{-1}x+\bias{3}
L (MSE)
22.756

Il faut bien distinguer ces deux espaces. Sur le graphique des données, nous déplaçons une droite. Sur la carte de loss, nous déplaçons un point représentant les paramètres de cette droite.

Choisir un point de départ

Commençons avec une première valeur de a\coefOne{a} et de b\bias{b}. La droite est peut-être mauvaise : ce n’est pas un problème, nous allons la modifier.

Dans cette régression linéaire, nous pouvons partir de zéro ou d’un autre couple. Une initialisation aléatoire est également possible, mais elle n’est pas nécessaire ici. Dans les réseaux de neurones, l’initialisation joue d’autres rôles, que nous laisserons de côté pour l’instant.

Une fois notre position choisie, nous calculons le gradient de la loss :

∇L(a,b)=[∂L∂a∂L∂b]\gGrad{\nabla} L(\coefOne{a},\bias{b})= \begin{bmatrix} \dfrac{\partial L}{\partial \coefOne{a}}\\[4pt] \dfrac{\partial L}{\partial \bias{b}} \end{bmatrix}

Il indique dans quelle direction la loss augmente le plus vite près de notre position. Nous voulons la réduire : nous prenons donc la direction opposée.

ANIMATION 02 / 06

Du gradient au déplacement

-2-1012-10-50510xy
Itération 0

En pause

L1030abAxes : ±4 · échelle de hauteur fixe
∇L−∇LFlèches tangentes × 0,12

Gradient à la position actuelle

at+1=−1−0.1×(−12.24)\coefOne{a_{t+1}}=\coefOne{-1}-\gStep{0.1}\times(\coefOne{-12.24})
bt+1=3−0.1×(4)\bias{b_{t+1}}=\bias{3}-\gStep{0.1}\times(\bias{4})
a
-1
b
3
L
22.756
‖∇L‖
12.877

Une direction ne suffit pas

Nous savons maintenant dans quel sens aller. Mais combien faut-il avancer ?

Un déplacement trop petit risque de nous faire progresser très lentement. Un déplacement trop grand peut nous envoyer de l’autre côté de la vallée, là où la loss est plus élevée.

Nous introduisons donc un coefficient : le taux d’apprentissage, généralement appelé learning rate. Nous le noterons α\gStep{\alpha}.

La mise à jour des paramètres devient :

θt+1=θt−α∇L(θt)\boldsymbol\theta_{t+1} =\boldsymbol\theta_t-\gStep{\alpha}\gGrad{\nabla} L(\boldsymbol\theta_t)

où θ=(a,b)\boldsymbol\theta=(\coefOne{a},\bias{b}) et tt désigne l'indice de l’itération.

Pour notre droite, cela donne :

at+1=at−α∂L∂a(at,bt),bt+1=bt−α∂L∂b(at,bt)\begin{aligned} \coefOne{a}_{t+1}&=\coefOne{a}_t-\gStep{\alpha}\frac{\partial L}{\partial \coefOne{a}}(\coefOne{a}_t,\bias{b}_t),\\[4pt] \bias{b}_{t+1}&=\bias{b}_t-\gStep{\alpha}\frac{\partial L}{\partial \bias{b}}(\coefOne{a}_t,\bias{b}_t) \end{aligned}

Les deux dérivées sont calculées avec les mêmes anciens paramètres. Nous mettons ensuite les deux paramètres à jour ensemble.

Le learning rate n’est pas la longueur du pas. Il multiplie le gradient :

∥Δθt∥=α∥∇L(θt)∥\|\Delta\boldsymbol\theta_t\| =\gStep{\alpha}\|\gGrad{\nabla} L(\boldsymbol\theta_t)\|

À learning rate constant, un gradient plus grand produit donc un déplacement plus grand. Et lorsque le gradient diminue à l’approche d’un minimum, les pas diminuent aussi.

Certaines méthodes font varier le taux d’apprentissage au cours de l’entraînement. Nous les laisserons de côté dans cet article.

Répéter jusqu’à améliorer le modèle

Nous pouvons maintenant décrire une itération complète :

  1. Calculer les prédictions avec les paramètres actuels.
  2. Calculer la loss et son gradient.
  3. Modifier les paramètres dans le sens opposé du gradient.
  4. Recommencer avec les nouveaux paramètres.

À chaque étape, la droite change. Avec un learning rate adapté à ce problème, la loss diminue et les paramètres s’approchent du minimum.

Nous avons donc donné au modèle une façon de mesurer ses erreurs et une règle pour modifier ses paramètres.

EXPÉRIENCE 03 / 06

Visualiser l'entrainement

-2-1012-10-50510xy
Itération 0

En pause

L103.39980abAxes : ±4 · cadrage automatique
012.525058LItération
a
-1
b
3
L
22.756
‖∇L‖
12.877

Trop petit, adapté, trop grand

Pour isoler l’effet du learning rate, quittons un instant notre régression et prenons une fonction encore plus simple :

L(θ)=θ2L(\gOne{\theta})=\gOne{\theta}^2

Pour cette fonction, le gradient vaut 2θ2\gOne{\theta}.

À chaque étape, nous prenons donc notre position actuelle et lui retirons ce gradient multiplié par le learning rate :

θt+1=θt−α×2θt\theta_{t+1}=\theta_t-\gStep{\alpha}\times 2\theta_t

Par exemple, si nous partons de θt=2\theta_t=2 avec un learning rate de α=0,1\gStep{\alpha}=0{,}1, le gradient vaut 44. Nous retirons donc 0,1×4=0,40{,}1\times4=0{,}4 à notre position :

θt+1=2−0,4=1,6\theta_{t+1}=2-0{,}4=1{,}6

Nous nous sommes rapprochés du minimum, situé en zéro. À l’étape suivante, nous recalculons le gradient à cette nouvelle position, puis nous recommençons.

Cette expression permet de voir exactement ce que produit le learning rate.

Avec une petite valeur, nous réduisons un peu θ\gOne{\theta} à chaque étape. La loss diminue, mais il faut beaucoup d’itérations pour se rapprocher de zéro.

Avec une valeur adaptée, nous avançons plus vite. Selon la valeur choisie, nous pouvons même passer alternativement de chaque côté du minimum tout en nous en rapprochant : osciller ne signifie pas forcément diverger.

Avec un learning rate trop grand, nous dépassons le minimum et nous retrouvons de plus en plus loin de l’autre côté. La loss augmente : l’optimisation diverge.

EXPÉRIENCE 04 / 06

L'impact du Learning Rate sur la convergence

Itération 0

En pause

À l’itération 0 · même départ θ₀ = 2
αθLoss
0.0124
0.224
1.0524

Le curseur règle α pour le troisième essai. Une trajectoire hors cadre continue d’être calculée ; les trois essais avancent ensemble jusqu’à 200 itérations. Les graphiques gardent leurs échelles fixes.

α = 0.01

Lθ−55
θ
2
L
4

α = 0.2

Lθ−55
θ
2
L
4

α = 1.05

Lθ−55
θ
2
L
4
07.51522.5300200LItération
α = 0.01α = 0.2α = 1.05

Pour cette fonction précise, la convergence vers zéro a lieu lorsque 0<α<10<\gStep{\alpha}<1. À α=1\gStep{\alpha}=1, nous alternons entre deux positions opposées sans nous rapprocher du minimum, sauf si nous sommes déjà en zéro.

Ces nombres dépendent de la fonction. Si nous multiplions la loss par un coefficient, nous multiplions aussi le gradient : un learning rate auparavant raisonnable peut alors devenir trop grand.

Il n’existe donc pas une valeur universelle de learning rate qui conviendrait à tous les paysages.

Pourquoi la forme du paysage compte

Revenons à plusieurs paramètres. Certaines vallées sont larges, d’autres très étroites. La loss peut varier fortement selon un axe et beaucoup moins selon un autre.

Un même learning rate doit alors composer avec ces deux situations. Des pas suffisamment petits pour rester stables dans la direction raide peuvent faire progresser lentement dans la direction plus plate.

La trajectoire peut zigzaguer dans la vallée au lieu de se diriger efficacement vers le fond.

EXPÉRIENCE 05 / 06

Une vallée étroite

L=θ12+θ22L=\gOne{\theta_1}^2+\gTwo{\theta_2}^2
L137.81250θ₁θ₂Axes : ±2.5 · cadrage automatique
θ₁
2
θ₂
2
L
8
L=θ12+20θ22L=\gOne{\theta_1}^2+20\gTwo{\theta_2}^2
L137.81250θ₁θ₂Axes : ±2.5 · cadrage automatique
θ₁
2
θ₂
2
L
84
Itération 0

En pause

Tous les paysages ne sont pas des bols

La loss de notre régression linéaire est convexe : elle ne contient pas de minimum local moins bon qu’un autre. Pour les données utilisées ici, elle possède un minimum unique.

Mais d’autres fonctions présentent plusieurs vallées. Un minimum local est plus bas que les positions suffisamment proches. Un minimum global est au moins aussi bas que toutes les positions du domaine.

La descente de gradient ne voit pas le paysage entier. Elle utilise l’information disponible à sa position actuelle. Selon le point de départ et le learning rate, elle peut donc aboutir dans des vallées différentes.

EXPÉRIENCE 06 / 06

L'impact du point de départ

Lθ−2.52.5
Itération 0

En pause

L(θ)=(θ2−1)2+0.2θL(\gOne{\theta})=(\gOne{\theta}^2-1)^2+0.2\gOne{\theta}
-0.55.7512027LItération
θ
-0.5
L
0.4625
‖∇L‖
1.7

Un faible learning rate peut faire rester la trajectoire dans une vallée locale, tandis que des pas plus grands peuvent parfois l’envoyer dans une autre. Mais augmenter le learning rate ne garantit ni de sortir de cette vallée, ni de trouver une meilleure solution.

Surtout, si nous sommes exactement à un minimum local, le gradient est nul. La mise à jour ne produit aucun mouvement, quel que soit le learning rate fini. Un grand learning rate peut changer la vallée atteinte pendant le trajet ; il ne crée pas un déplacement à partir d’un gradient nul.

Il faut donc distinguer deux problèmes : avancer trop lentement et aboutir dans un minimum local. Ils peuvent se combiner, mais ils ne sont pas équivalents.

Quand arrêter ?

Dans une animation, nous voyons le point approcher du fond de la vallée. Dans un entraînement réel, nous devons choisir un critère d’arrêt.

Nous pouvons fixer un nombre maximal d’itérations, surveiller si la loss s’améliore encore ou regarder si le gradient devient suffisamment petit.

Un petit gradient ne prouve cependant pas que nous avons trouvé le minimum global. Il peut aussi apparaître près d’un minimum local, d’un point selle ou dans une région très plate.

Et pour un modèle de machine learning, réduire l’erreur sur les données d’entraînement ne suffit pas : nous voulons aussi que le modèle fonctionne sur des données nouvelles. Cette question demande une évaluation séparée.

Une règle simple, beaucoup de prolongements

La descente de gradient repose sur une idée courte : calculer comment l’erreur varie localement, déplacer les paramètres dans le sens opposé, puis recommencer.

Le learning rate règle l’amplitude de cette correction. Trop petit, il peut ralentir fortement l’apprentissage. Trop grand, il peut rendre les mises à jour instables. Et sur un paysage non convexe, le point de départ et les déplacements peuvent changer la vallée atteinte.

Dans notre exemple, nous pouvons calculer le gradient directement. Pour un réseau de neurones, la backpropagation permet de le calculer efficacement à travers les différentes opérations du modèle.

Nous pouvons également améliorer la règle de déplacement : utiliser des lots de données, accumuler une forme d’élan ou adapter les corrections selon les paramètres. C’est là qu’interviennent SGD, Momentum et Adam.

Mais leur point de départ reste celui que nous venons de construire : une fonction qui mesure les erreurs, un gradient qui décrit leurs variations locales et des paramètres que nous corrigeons, étape après étape.