Blog

Part 8 : L’apprentissage des algorithmes avec « Gradient Descent »

Cet article fait partie d’une série d’articles qui vous permettra de comprendre étape par étape comment fonctionne l’intelligence artificielle et plus particulièrement les réseaux de neurones et aujourd’hui plus particulièrement la technique du gradient descent.

Je vous invite à lire, si vous ne l’avez pas déjà fait, les articles précédents :

Part 1 : Les réseaux de neurones artificielles

Part 2 : Comment fonctionne le Perceptron

Part 3 : Comment les réseaux de neurones prennent des décisions

Part 4 : Qu’appelle t-on apprentissage automatique

Part 5 : Les réseaux de neurones : la fonction d’activation sigmoide

Part 6 : L’architecture des réseaux de neurones

Part 7 : Comment un réseau de neurones mesure et apprend de ces erreurs


Bon, maintenant, pour les deux prochains articles, nous allons oublier tout ce que nous savons sur la fonction de coût que nous avons étudié dans l’article précédent. Nous allons plutôt imaginer que l’on nous a simplement donné une fonction à plusieurs inconnues et nous souhaitons minimiser cette fonction (c’est à dire approximer le 0).

Nous allons pour cela développer une technique appelée “Gradient Descent” (Descente en dégradé en français) qui peut être utilisée pour résoudre des problèmes de classification. Ensuite, une fois après avoir compris cela, nous pourrons à nouveau revenir à une fonction plus spécifique pour les besoins d’apprentissage des réseaux de neurones.

Ok, supposons que nous essayions de minimiser une fonction C(v).

Les variables v sont à valeurs réelles v=v1,v2…

Vous pouvez remarquer que j’utilise intentionnellement v en lieu et place de b et w (biases and weights) pour mettre en avant le fait que cela pourrait être n’importe quelle fonction.
Afin de minimiser C(v), je vous propose de visualiser C comme une fonction de 2 variables, que nous appellerons v1 et v2 :

valley

 

Ce que nous souhaitons est de trouver le point où C est à son minimum global. Maintenant, bien sûr, pour la fonction ci-dessus, nous pouvons facilement à l’oeil nu trouver son minimum. Dans ce sens, la fonction visualisée est très simple.

gradient_descent

Une fonction générique C, peut être beaucoup plus compliquée si elle contient plus de variables. Et ce ne sera pas toujours possible de simplement visualiser le minimum.

Une façon d’attaquer le problème est d’utiliser l’algèbre linéaire pour trouver le minimum.

Nous pouvons calculer les dérivées et ensuite essayer de les utiliser afin de trouver les positions où C est un extrême? Avec de la chance, cela peut marcher pour des fonctions simples, comme par exemple, si C est une fonction d’une ou deux variables. (Gardons, tout de même, à l’esprit que les réseaux de neurones ont généralement beaucoup de variables à manipuler.)

Le plus gros réseau de neurones connu a une fonction de coût qui dépend de milliards de poids et de seuils.

Donc, on peut aisément conclure que l’approche identifiée pour l’instant ne fonctionne pas. Essayons de reprendre notre problème au départ et utilisons une métaphore.

Considérons notre fonction comme une vallée. Regardez à nouveau le schéma ci-dessus et ça ne devrait pas être trop difficile.

mountain-descent

Imaginons maintenant une balle roulant dans le fond de la vallée.

Notre expérience nous permet d’imaginer la suite, la balle après s’être balancé de haut en bas finira, petit à petit par s’arrêter au fond et donc au point le plus bas, le fameux minimum que nous recherchons.

Peut-être devrions-nous exploiter ce concept pour trouver le minimum de notre fonction? Essayons de choisir un point aléatoire de départ pour une “balle imaginaire”, et ensuite simulons le mouvement de la balle qui descend dans le fond de la vallée. Nous pourrions effectuer cette simulation simplement grâce aux dérivées partielles de C. Ces dérivées nous permettraient de savoir tout ce que nous avons besoin de savoir sur la forme géométrique de la vallée, et ainsi comment la balle va se déplacer.

En résumé, on va essayer d’écrire l’équation de la théorie de Newton de déplacement d’une balle, en considérant les effets de friction et de gravité, etc.. En réalité, nous n’allons pas reproduire strictement l’analogie d’une balle qui roule et se balance, notre objectif est surtout de trouver et d’isoler le point le plus bas : le minimum. Du coup, plutôt que de se prendre la tête avec les lois physiques, posons nous la question : si nous étions Dieu pour une journée, et que nous soyons capable d’arrêter les lois de la physique, en dictant à notre balle comment elle doit rouler, quelle loi choisirons-nous afin que la balle s’arrête directement tout de suite au fond de la vallée, plutôt que de rebondir de droite et de gauche, de haut en bas quelquefois avant de stabiliser dans le fond?

mlst_0402

 

Pour simplifier la question de façon plus précise, imaginons d’abord ce qu’il se passe lorsque nous déplaçons la balle d’un petit delta Δv1 dans la direction v1, et d’un petit delta Δv2 dans la direction v2. La forme mathématique serait la suivante :

Capture

Vu que nous souhaitons que notre balle descende, nous cherchons à identifier un changement tel que le delta C “ΔC” soit négatif (Si il est négatif, c’est que la nouvelle position est plus basse que la précédente, nous allons donc vers le fond de la courbe). Ainsi, L’objectif étant d’identifier Δv1 et Δv2 tel que ΔC soit négatif.

Avant d’aller plus loin, définissons Δv comme étant le vecteur des changements dans v,

Capture3

ou T représente l’opération de transposition (transpose en anglais), effectuant une rotation des lignes du vecteur en colonnes.

Nous définirons également, le gradient de C étant le vecteur des dérivées partielles ∇C formé de la façon suivante :

Capture1

Dans un moment, nous allons réécrire ΔC en fonction de ΔV et le gradient ∇C.

Avant d’en arriver là, je voudrais clarifier quelque chose qui parfois peut paraître difficile à comprendre à propos du “gradient” (dégradé en français).

Lorsqu’on entend parler de la notation ∇C pour la première fois, on peut se demander comment on doit traduire le symbole ∇. Qu’est ce qu’il signifie exactement? En fait, il est parfaitement correct de le considérer comme un simple objet mathématique. ∇C est juste le symbole représentant le vecteur des dégradés (gradient).

L’expression présentée ci-dessus peut donc être simplifiée de la manière suivante :

Capture4

Cette équation permet de plus facilement comprendre pourquoi ∇C est appelé le vecteur des dégradés. ∇C permet de transcrire comment les changements de V influent sur les changements dans C. Mais ce qui est surtout intéressant dans cette équation est que ça nous permettra de choisir Δv afin d’avoir un ΔC négatif.

 

Conclusion

Le principe du “Gradient Descent” est complexe et long à expliquer. C’est pour cette raison que ce sujet sera séparé en plusieurs articles. Dans le prochain nous irons encore plus loin afin d’expliquer la méthode de “Descente des dégradés”. Nous étudierons également le “learning rate” (Taux d’apprentissage).

Cet article fait partie d’une série d’articles qui vous permettra de comprendre étape par étape comment fonctionne l’intelligence artificielle et plus particulièrement les réseaux de neurones.

Je vous invite à lire, si vous ne l’avez pas déjà fait, les articles précédents :

Part 1 : Les réseaux de neurones artificielles

Part 2 : Comment fonctionne le Perceptron

Part 3 : Comment les réseaux de neurones prennent des décisions

Part 4 : Qu’appelle t-on apprentissage automatique

Part 5 : Les réseaux de neurones : la fonction d’activation sigmoide

Part 6 : L’architecture des réseaux de neurones

Part 7 : Comment un réseau de neurones mesure et apprend de ces erreurs