Comprendre facilement la Backpropagation
La Backpropagation, est une technique qui peut sembler compliquĂ©e Ă comprendre mais qui est indispensable pour entraĂźner un rĂ©seau de neurones. Si ce mot te paraĂźt encore obscure, alors dans cet article je vais t’aider pas Ă pas Ă bien le comprendre.
Dans cette article, tu verras :
- A quoi sert la Backpropagation. â
- Les graphes de calcul, qui est le cadre dans lequel on utilise la Backpropagation. â
- L’algorithme Backpropation sur les graphes de calcul pour calculer un gradient. â
Pourquoi utiliser la Backpropagation ?
La Backpropagation sert Ă calculer le gradient d’une fonction. Mais sais-tu pourquoi on a besoin de cette technique pour calculer le gradient ? đ€
Tu devrais dĂ©jĂ savoir que pour entraĂźner un rĂ©seau de neurones, on utilise l’algorithme du gradient. Pour rappel, cette mĂ©thode Ă pour but, Ă partir d’une fonction de variable Ă valeurs rĂ©elles, de trouver une valeur de telle que soit la plus petite possible. Elle consiste Ă construire une suite de paramĂštres , , , telle que :
oĂč est un nombre appelĂ© le coefficient d’apprentissage (« learning rate » en anglais) et oĂč , est le gradient de en .
Ainsi la question est : comment calcule-t-on ce gradient lorsque que est la fonction de coĂ»t d’un rĂ©seau de neurones ?
La mĂ©thode qu’on apprend aux Ă©tudiants Ă l’Ă©cole pour Ă©valuer des gradients est la suivante :
- Calculer les fonctions dérivées partielles.
- Ăvaluer les dĂ©rivĂ©es partielles.
Cette mĂ©thode marche trĂšs bien sur des fonctions simples, mais elle devient trĂšs mauvaise Ă appliquer sur des exemples compliquĂ©s (surtout dans le cas d’un rĂ©seau de neurones), car :
- Calculer les fonctions dérivées partielles est trÚs coûteux si la fonction est compliquée. Et dans un réseau de neurones, la complexité de la fonction est proportionnelle au nombre de couches du réseau.
- Il y a autant de dĂ©rivĂ©es partielles que de paramĂštres. Or dans un rĂ©seau de neurones, il peut y avoir des millions de paramĂštres đŹ.
La Backpropagation est alors une mĂ©thode pour Ă©valuer le gradient de maniĂšre beaucoup moins coĂ»teuses đ.
La diffĂ©rence majeure avec la mĂ©thode prĂ©cĂ©dente est que lorsqu’on Ă©value le gradient, on ne calcule que la valeur de la dĂ©rivĂ©e partielle au point considĂ©rĂ© et non pas la fonction dĂ©rivĂ©e partielle.
Les graphes de calcul
Pour comprendre la Backpropagation, il est nĂ©cessaire de connaĂźtre la notion de graphe de calcul (pas d’inquiĂ©tude ce n’est pas compliquĂ© đ). En effet le graphe de calcul est le cadre gĂ©nĂ©ral pour utiliser la Backpropagation. On pourra d’ailleurs remarquer qu’un rĂ©seau de neurones s’interprĂšte naturellement comme un graphe de calcul.
Qu’est-ce qu’un graphe de calcul ?
Un graphe de calcul est un graphe orientĂ© oĂč les nĆuds sont soit des variables soit des opĂ©rations, et les arĂȘtes indiquent les membres des opĂ©rations. Un tel graphe peut ĂȘtre interprĂ©tĂ© comme une fonction.
Le plus simple pour comprendre est de considĂ©rer un exemple đ. Prenons la fonction de trois variables dĂ©finie par :
oĂč les variables , et sont des nombres rĂ©els. Alors on peut dĂ©composer la fonction en opĂ©rations Ă©lĂ©mentaires Ă savoir :
- Un produit .
- Une somme .
- Un carré .
Ainsi, on peut schématiser la fonction par le graphe de calcul suivant :
L’algorithme Feedforward
Pour Ă©valuer une fonction Ă l’aide du graphe de calcul, on utilise l’algorithme Feedforward. Cet algorithme est trĂšs intuitif : il consiste Ă Ă©valuer le rĂ©sultat de chaque nĆud, et de noter le rĂ©sultat, en parcourant le graphe dans le sens direct.
Par exemple sur la fonction , si on veut l’Ă©valuer en , et , alors l’algorithme s’applique comme suit :
- On commence par noter les valeurs des nĆuds , et .
- Ensuite, on calcule la valeur du nĆud Ă l’aide des valeurs de et . Ce qui donne .
- Puis, on calcule la valeur du nĆud Ă l’aide des valeurs de et . Ce qui donne .
- Enfin, on calcule la valeur du nĆud Ă l’aide de . Ce qui donne .
Sur la figure suivante, note Ă cĂŽtĂ© de chaque nĆud le rĂ©sultat de son Ă©valuation.
Jusqu’ici rien de bien compliquĂ© đ.
Comment calculer un gradient par Feedforward
Je vais t’expliquer comment calculer le gradient avec l’algorithme Feedforward. Tu te dis sĂ»rement « quoi ? Je croyais qu’il fallait utiliser la Backpropagation pour calculer le gradient ! » đ€š. Effectivement, dans un rĂ©seau de neurones on calcule le gradient par Backpropagation. Mais la Backpropagation n’est pas la seule mĂ©thode pour calculer un gradient. On peut aussi le faire lĂ l’aide de Feedforward. Cependant la mĂ©thode Feedforward est inutilisable en pratique sur des fonctions avec beaucoup de variables, comme on le verra.
Pourquoi est-ce je prĂ©sente cette mĂ©thode ? Parce que je trouve cette mĂ©thode plus intuitive et plus facile Ă comprendre que la Backpropagation. Et une fois que tu auras compris cette mĂ©thode, tu comprendras plus facilement la mĂ©thode Backpropagation đ.
La procĂ©dure est la suivante. En parcourant chaque nĆud dans le sens directe, on calcule les deux valeurs suivantes :
- Le rĂ©sultat du nĆud.
- Le gradient du rĂ©sultat du nĆud par rapport aux paramĂštres de la fonction.
Si on prend toujours l’exemple sur la fonction prĂ©cĂ©dent, pour Ă©valuer son gradient en , et , alors l’algorithme se dĂ©roule comme suit :
- On commence par noter la valeur ainsi que son gradient par rapport aux trois variables. Ce qui donne :
On fait pareil pour les nĆuds et . Ce qui donne : - Ensuite, on calcule pour le nĆud sa valeur et son gradient par rapport au trois variables :
- Puis, on passe au nĆud :
- Enfin, pour le nĆud :
Ce qui permet d’en dĂ©duire le gradient :
Le schémas suivant résume les calculs.
VoilĂ , comment calculer un gradient par Feedforwardđ.
Comment calculer le gradient avec la Backpropagation
Tu viens de voir comment calculer un gradient par Feedforward. Mais cette mĂ©thode n’est pas optimale et est plus coĂ»teuse que la Backpropagation. En effet dans la mĂ©thode Feedforward, pour chaque nĆud on doit calculer un gradient, qui est un vecteur de taille Ă©gale au nombre de paramĂštres. Alors que dans Backpropagation, il suffit seulement de calculer la dĂ©rivĂ©e partielle par rapport Ă une seule valeur, ce qui donne un nombre et non pas un vecteur !
L’algorithme Backpropagation se dĂ©roule de la maniĂšre suivante :
- On applique l’algorithme Feedforward pour calculer la valeur de tous les nĆuds (seulement la valeur, et non pas le gradient).
- Ensuite on parcourt les nĆuds dans le sens inverse, pour calculer la dĂ©rivĂ©e partielle de par rapport au nĆud.
Illustrons cette algorithme toujours sur l’exemple prĂ©cĂ©dent.
- On applique l’algorithme Feedforward. Ce qui donne , , , , , .
- Ensuite on parcourt les nĆuds Ă partir de la fin pour calculer la dĂ©rivĂ©e partielle de par rapport au nĆud. Ce qui donne en commençant par , puique :
- Ensuite, passe au nĆud :
- Ensuite on passe aux nĆuds et :
- Enfin on passe aux nĆuds et :
Ainsi on retrouve bien mĂȘmes valeurs qu’avec la mĂ©thode Feedforward đ.
A noter que pour calculer les valeurs des dĂ©rivĂ©es partielles de chaque nĆud, on a besoin des valeurs des nĆuds parents, d’oĂč la nĂ©cessitĂ© de faire Feedforward.
Pour finir, le calcul est illustré par le schémas suivant.
VoilĂ maintenant tu es capable de calculer un gradient Ă l’aide de la Backpropagationđ.
Mot de la fin
Si cette article t’a aidĂ© ou bien si tu as des questions n’hĂ©site pas Ă le dire en commentaire đ.
Concernant son utilisation sur les rĂ©seaux de neurones, il y a une chose Ă savoir. Dans cette prĂ©sentation, j’ai traitĂ© le cas oĂč les rĂ©sultats des nĆuds sont des nombres. Or on peut gĂ©nĂ©raliser au cas oĂč les rĂ©sultats des nĆuds sont des vecteurs (ou mĂȘme des tenseurs). Tout se passe de la mĂȘme maniĂšre, Ă part que les valeurs et les dĂ©rivĂ©es partielles ne sont plus des nombres mais des vecteurs. C’est le cas de l’implĂ©mentation par Tensorflow et PyTorch: chaque nĆud est une couche du rĂ©seau (c-Ă -d une liste de neurones) et les opĂ©rations entre les nĆuds sont des opĂ©rations matricielles.
2 commentaires
Pascal · 27 fĂ©vrier 2023 Ă 19h21
Merci pour ces explications trĂšs pĂ©dagogiques ! Je suis arrivĂ© sur votre site en faisant une recherche sur l’intĂ©rĂȘt de la back propagation par rapport Ă la forward propagation. C’est clair maintenant.
Je pense qu’il y a une petite erreur dans le dessin sur la forward-propagation oĂč le rĂ©sultat final (60, 30, 15) n’est pas celui indiquĂ© dans le texte (120, 60, 30).
Auguste Hoang · 13 mars 2023 Ă 0h29
Bonjour Pascal,
Il y a effectivement une erreur sur le dessin.
Je l’ai corrigĂ©.
Merci beaucoup pour ton commentaire !