Comment un modèle peut-il savoir dans quel sens modifier ses paramètres pour réduire ses erreurs ?
Avant de parler d’apprentissage, nous devons répondre à une question plus simple : si nous changeons légèrement un paramètre, comment la valeur d’une fonction va-t-elle évoluer ?
Avec un seul paramètre, cette question nous ramène à la pente d’une courbe. Avec deux paramètres, elle nous conduit sur une surface. Avec des millions, le principe reste le même.
Le gradient est l’information qui relie toutes ces situations.
Une courbe, un point, une pente
Imaginons une fonction qui associe une valeur à un paramètre :
Pour l’instant, peu importe ce que représente cette valeur. Nous voulons simplement comprendre comment elle change lorsque nous déplaçons .
Plaçons-nous en . La fonction vaut alors .
Si nous augmentons légèrement , la valeur augmente. Si nous le diminuons légèrement, elle baisse. Mais nous pouvons être plus précis : à quelle vitesse cette valeur change-t-elle autour de notre position ?
La dérivée répond à cette question :
En , elle vaut . Géométriquement, c’est la pente de la tangente à la courbe à cet endroit.
Pour un petit déplacement , nous pouvons donc estimer la variation de la fonction :
Un déplacement de produit ici une augmentation d’environ . Un déplacement de produit une diminution d’environ .
La tangente est une approximation locale de la courbe. Plus nous nous éloignons du point de départ, moins cette approximation a de raisons d’être précise.
Une pente en chaque point
De l’autre côté de la parabole, en , la dérivée vaut . Augmenter fait maintenant diminuer la fonction. Pour monter, nous devons aller vers les valeurs plus négatives.
Le signe de la dérivée nous indique donc le sens de montée. Sa valeur absolue mesure à quel point la fonction varie rapidement, localement.
Et au fond de la parabole ? La dérivée vaut zéro. La tangente est horizontale : pour des déplacements minuscules, le terme de variation du premier ordre est nul. Cela ne signifie pas que la fonction reste constante autour du point.
La dérivée ne connaît que le voisinage
Changeons maintenant de courbe :
Elle monte, redescend, puis remonte. Pourtant, nous pouvons poser exactement la même question en chaque point : que se passe-t-il si nous bougeons légèrement notre paramètre ?
Sa dérivée vaut :
Il n’est pas nécessaire de connaître la forme complète de la courbe pour lire sa pente à une position donnée. C’est aussi la limite de cette information : une pente nous renseigne sur ce qui se passe ici, pas sur ce qui nous attend au loin.
Une information locale
Deux paramètres : la courbe devient une surface
Supposons maintenant que la fonction dépende de deux paramètres :
Une position est désormais un couple . La valeur de la fonction donne la hauteur au-dessus de cette position. Notre courbe devient une surface en forme de bol.
Nous pouvons encore mesurer une pente, mais il faut préciser dans quelle direction nous nous déplaçons.
Commençons par modifier seulement , en gardant fixe. Nous obtenons une coupe de la surface : une courbe dont nous pouvons mesurer la pente.
Cette pente est la dérivée partielle par rapport à :
Puis nous faisons l’inverse : nous gardons fixe et modifions seulement .
Le symbole indique simplement que nous dérivons par rapport à un paramètre tout en maintenant les autres constants.
Une coordonnée à la fois
Assembler les pentes : le gradient
Nous avons maintenant deux informations : le taux de variation selon le premier axe et le taux de variation selon le second.
Nous les réunissons dans un vecteur :
Ce vecteur s’appelle le gradient. Le symbole se lit « nabla » (C’est de ce symbole que vient le nom Nablab.)
À la position de notre surface, il vaut :
Nous pouvons le représenter par une flèche dans le plan des paramètres. Elle combine les deux pentes et pointe dans la direction de plus forte augmentation locale, lorsque nous comparons des déplacements de même longueur.
Le mot « locale » est important ici : nous cherchons la meilleure direction pour un déplacement infinitésimal, pas une destination qui serait forcément la plus haute après un grand saut.
Construire le gradient
Lire une surface sans la 3D
Une carte topographique représente un relief à l’aide de lignes de niveau. Chaque ligne relie des positions situées à la même altitude.
Nous pouvons faire la même chose avec notre fonction : chaque ligne relie des couples pour lesquels a la même valeur.
Dans notre exemple, ces lignes sont des ellipses autour du minimum. Dans cet exemple simplifié, les lignes de niveau sont régulières. Pour d’autres fonctions, elles peuvent avoir des formes plus complexes, comme sur une carte topographique.
Une seule vue 2D suffit alors pour voir notre position, la valeur de la fonction et le gradient.
Et une propriété apparaît : lorsque le gradient est non nul, il est perpendiculaire à la ligne de niveau au point considéré.
Pourquoi perpendiculaire ?
Dans quelle direction monter le plus vite ?
Plaçons-nous sur une ligne de niveau et choisissons une direction de déplacement. Nous pouvons tourner cette direction, mais nous conservons toujours la même longueur de petit pas.
Certaines directions font monter la fonction, d’autres la font descendre. Une direction tangente à la ligne de niveau donne une variation du premier ordre nulle.
Si nous suivions exactement la ligne de niveau, notre hauteur resterait constante. Un petit pas droit dans sa direction tangente ne suit pas parfaitement une ligne courbe : sa variation réelle peut donc être légèrement différente de zéro. Cette différence devient négligeable au premier ordre lorsque le pas diminue.
Choisir une direction
Nous pouvons décomposer une direction en deux parties : une partie tangente à la ligne de niveau et une partie perpendiculaire.
La partie tangente n’apporte aucune augmentation au premier ordre. Pour une longueur de déplacement fixée, lui consacrer une partie du pas réduit donc ce qui reste pour monter. La direction de plus forte montée est entièrement perpendiculaire à la ligne de niveau, du côté où les valeurs augmentent.
Ce que dit le produit scalaire
Nous venons d’observer le phénomène. Une formule permet de le résumer :
La dérivée directionnelle mesure le taux de variation de dans la direction unitaire .
Le produit scalaire peut aussi s’écrire :
où est l’angle entre le gradient et notre direction.
Lorsque les deux sont alignés, : le taux de variation est maximal. Lorsqu’ils sont perpendiculaires, il vaut zéro. Lorsqu’ils pointent en sens opposés, il est minimal : nous descendons le plus vite, localement.
Nous supposons ici la distance euclidienne habituelle dans les coordonnées choisies. Changer l’échelle des paramètres change ce que nous considérons comme des déplacements de même longueur.
Explorer l’angle et le produit scalaire
Trouver le bon angle
Et avec des millions de paramètres ?
Avec un seul paramètre, le gradient n’a qu’une composante : la dérivée.
Avec deux paramètres, il contient deux dérivées partielles. Avec paramètres, il en contient :
Nous ne pouvons plus dessiner le paysage complet, mais nous pouvons toujours calculer comment la fonction réagit à une petite modification de chaque paramètre.
Pour un modèle de machine learning, ces paramètres sont notamment ses poids et ses biais. La fonction mesure ses erreurs. Le gradient rassemble donc les informations nécessaires pour savoir comment ces erreurs évoluent localement lorsque nous changeons les paramètres.
Reste une question : maintenant que nous savons dans quelle direction l’erreur augmente le plus vite, comment utiliser cette information pour la réduire ?
C’est le rôle de la descente de gradient.