La rétropropagation est une technique de machine learning essentielle à l'optimisation des réseaux neuronaux artificiels. Elle facilite l'utilisation d'algorithmes de descente de gradient pour mettre à jour les poids du réseau, ce qui permet aux modèles d'apprentissage profond, qui sous-tendent l'intelligence artificielle moderne, d’« apprendre ».
Forme abrégée de « propagation de l'erreur en sens inverse », la rétropropagation est une méthode élégante pour calculer comment les modifications apportées aux poids ou aux biais d'un réseau neuronal affectent la précision des prédictions du modèle. Elle est essentielle à l'utilisation de l'apprentissage supervisé, de l'apprentissage semi-supervisé ou de l'apprentissage auto-supervisé pour former les réseaux neuronaux.
Bien que des équivalents et des prédécesseurs de la rétropropagation aient été proposés dans divers contextes depuis les années 1960, David E. Rumelhart, Geoffrey Hinton et Ronald J. Williams ont été les premiers à publier l'algorithme d'apprentissage formel. Leur article de 1986, « Learning representations by back-propagating errors », a fourni la dérivation de l'algorithme de rétropropagation tel qu'il est utilisé et compris dans un contexte moderne de machine learning.
La logique de la rétropropagation repose sur le fait que les couches de neurones dans les réseaux neuronaux artificiels sont essentiellement une série de fonctions mathématiques imbriquées. Au cours de l'entraînement, ces équations interconnectées sont insérées dans une autre fonction : une « fonction de perte » qui mesure la différence (ou « perte ») entre la sortie souhaitée (ou « vérité terrain ») pour une entrée donnée et la sortie réelle du réseau neuronal.
Nous pouvons donc utiliser la « règle de la chaîne », un principe de calcul datant du 17e siècle, pour déterminer la contribution de chaque neurone à la perte globale. Ce faisant, il devient possible de calculer l’impact des modifications apportées à toute variable (poids ou biais) dans les équations que représentent ces neurones.
Mathématiquement, la rétropropagation travaille à rebours à partir de la sortie pour calculer efficacement le « gradient » de la fonction de perte : un vecteur de dérivées pour chaque équation du réseau. Ce gradient indique aux algorithmes d'optimisation, tels que la « descente de gradient », quelles équations ajuster et dans quelle direction pour réduire les pertes.
Ces trois processus imbriqués : une fonction de perte qui suit l'erreur du modèle sur diverses entrées, la rétropropagation de cette erreur pour comprendre comment chaque partie du réseau y contribue, et les algorithmes de descente de gradient qui ajustent les poids du modèle en conséquence, constituent la manière dont les modèles d'apprentissage profond « apprennent ». En tant que telle, la rétropropagation est fondamentale pour la formation des modèles de réseaux neuronaux, qu'il s'agisse des perceptrons multicouches les plus simples ou des architectures complexes de réseaux neuronaux profonds utilisées dans l'IA générative.
Newsletter sectorielle
Restez au fait des tendances les plus étonnantes du secteur dans le domaine de l’IA, de l’automatisation, des données et bien d’autres avec la newsletter Think. Consultez la déclaration de confidentialité d’IBM.
Lire la Déclaration de confidentialité d’IBM.
Vous recevrez votre abonnement en anglais. Vous trouverez un lien de désabonnement dans chaque newsletter. Vous pouvez gérer vos abonnements ou vous désabonner ici. Consultez la Déclaration de confidentialité d’IBM pour plus d’informations.
Le processus de rétropropagation étant fondamental pour la formation des réseaux neuronaux, une explication utile nécessite une bonne compréhension de la manière dont les réseaux neuronaux font des prédictions.
Il est particulièrement important de comprendre le rôle et le contexte des « poids » et des « biais », qui sont les paramètres ajustables du modèle optimisés via la rétropropagation et la descente de gradient.
Les réseaux neuronaux visent à imiter grossièrement la structure du cerveau humain. Ils sont constitués de nombreux nœuds (ou neurones) interconnectés, disposés en couches. Les réseaux neuronaux établissent des prédictions après que les données d'entrée ont effectué un « passage avant » à travers l’ensemble du réseau.
Les neurones de la « couche d'entrée » reçoivent les données d'entrée, souvent sous forme d’un plongement vectoriel, chaque neurone recevant une caractéristique individuelle du vecteur d'entrée. Par exemple, un modèle qui traite des images en niveaux de gris de 10x10 pixels aura typiquement 100 neurones dans sa couche d'entrée, chaque neurone correspondant à un pixel individuel. Les réseaux neuronaux nécessitent donc généralement des entrées de taille fixe, bien que des techniques comme le pooling ou la normalisation puissent apporter une certaine flexibilité.
Dans un réseau neuronal à propagation avant standard, chaque neurone de la couche d'entrée est connecté à chacun des neurones de la couche suivante, eux-mêmes connectés aux neurones de la couche suivante, et ainsi de suite jusqu’à la couche de sortie, où sont réalisées les prédictions finales. Les couches intermédiaires entre la couche d'entrée et la couche de sortie, appelées couches cachées, sont les lieux principaux où se déroule l’« apprentissage ».
Bien que certaines architectures spécialisées, comme les modèles mélange d’experts ou les réseaux neuronaux convolutionnels, apportent des variations ou des ajouts à cette organisation simple, tous les réseaux neuronaux reposent sur cette structure de base.
Même si chaque neurone reçoit des informations de tous les nœuds de la couche précédente, ces informations n’ont pas toutes la même importance. Chaque connexion entre deux neurones se voit attribuer un « poids », un multiplicateur qui augmente ou diminue la contribution d’un neurone à un autre dans la couche suivante.
De plus, chaque neurone peut également se voir attribuer un « biais », une valeur constante ajoutée à la somme des entrées pondérées issues de la couche précédente.
Le but ultime de la rétropropagation et de la descente de gradient est de déterminer les poids et biais qui permettront d’obtenir les meilleures prédictions du modèle. Les neurones correspondant à des caractéristiques des données fortement corrélées avec des prédictions précises se voient attribuer des poids plus élevés, tandis que d’autres connexions peuvent avoir des poids proches de zéro.
Les réseaux neuronaux profonds modernes, souvent composés de dizaines de couches cachées avec de nombreux neurones, peuvent comprendre des milliers, voire des millions, et dans le cas des plus grands modèles de langage (LLM), des milliards de paramètres ajustables.
Chaque neurone est configuré pour effectuer une opération mathématique, appelée « fonction d'activation », sur la somme des entrées pondérées qu'il reçoit des nœuds de la couche précédente. Les fonctions d'activation introduisent une « non-linéarité », permettant ainsi au modèle de capturer des modèles complexes dans les données d'entrée et de générer des gradients qui peuvent être optimisés. L'utilisation exclusive de fonctions d'activation linéaires réduit essentiellement le réseau neuronal à un modèle de régression linéaire.
Fonctions d'activation courantes dans les réseaux neuronaux :
Prenons l'exemple d'une unité cachée hypothétique z, avec une fonction d'activation tanh et un terme de biais t, dans la deuxième couche d'un réseau neuronal avec trois nœuds d'entrée, a, b et c, dans sa couche d'entrée. Chacune des connexions entre les nœuds d'entrée et le nœud z a un poids unique w.Nous pouvons décrire la valeur de sortie que le nœud z transmettra aux neurones de la couche suivante à l'aide de l'équation simplifiée : z = tanh(waz*a + wbz*b + wcz*c + t).
Le neurone z est connecté aux neurones de la couche suivante. Cette équation pour z fait donc partie des fonctions d'activation de la couche suivante et, par extension, de toutes les fonctions d'activation des neurones des couches suivantes.
Comme nous l’expliquerons dans les sections suivantes, la rétropropagation est un algorithme remarquablement rapide et efficace pour démêler l'immense réseau de variables et d'équations interconnectées d'un réseau neuronal.
Pour illustrer l'efficacité de la rétropropagation, Michael Nielsen la compare, dans son manuel en ligne « Neural Networks and Deep Learning », à une approche alternative simple et intuitive pour calculer le gradient de la fonction de perte d'un réseau neuronal.
Comme l’explique Nielsen, il est possible d’estimer facilement l’impact des changements sur un poids spécifique, wj, en effectuant une passage avant avec deux valeurs légèrement différentes de wj, tout en gardant les autres paramètres inchangés, puis en comparant les pertes résultantes de chaque passage. En formalisant ce processus à l’aide d’une simple équation et en implémentant quelques lignes de code en Python, vous pouvez automatiser ce calcul pour chaque poids du réseau.
Mais imaginez maintenant qu’il y ait 1 million de poids dans votre modèle, ce qui serait relativement modeste pour un modèle d’apprentissage profond moderne. Pour calculer l’ensemble du gradient, il vous faudrait effectuer 1 000 001 passages avant dans le réseau : un pour établir une base de référence, puis un autre pour évaluer les changements apportés à chacun des millions de poids.
La rétropropagation peut atteindre le même objectif en 2 passages : un passage avant et un passage arrière.
Pour simplifier l'explication du fonctionnement de la rétropropagation, il est utile de passer en revue quelques concepts mathématiques fondamentaux.
La règle de la chaîne est essentielle pour calculer les dérivées des fonctions d'activation dans les réseaux neuronaux, lesquels sont constitués des sorties des fonctions d'activation d'autres neurones dans les couches précédentes.
Bien que la logique de la rétropropagation soit relativement simple, les mathématiques et la notation peuvent rapidement devenir complexes, notamment pour ceux qui ne sont pas familiers avec le calcul différentiel.
En partant à rebours depuis la sortie du modèle, la rétropropagation applique la « règle de la chaîne » pour calculer l'influence des modifications de chaque paramètre du réseau neuronal sur l'erreur globale des prédictions du modèle.
D'un point de vue abstrait, l'objectif de la rétropropagation est d'entraîner un réseau neuronal à améliorer ses prédictions grâce à l'apprentissage supervisé. Plus fondamentalement, la rétropropagation vise à déterminer comment ajuster les poids et les biais du modèle afin de minimiser l'erreur mesurée par une « fonction de perte » .
D'un point de vue technique, le but de la rétropropagation est de calculer le gradient de la fonction de perte par rapport à chacun des paramètres individuels du réseau neuronal. En termes plus simples, la rétropropagation utilise la règle de la chaîne pour mesurer la vitesse à laquelle la perte varie en fonction d'une modification d'un poids (ou d'un biais) spécifique dans le réseau.
En règle générale, la formation des réseaux neuronaux par rétropropagation suit les étapes suivantes :
Les réseaux neuronaux produisent des prédictions par propagation avant. La propagation avant est essentiellement une longue série d'équations imbriquées, où les sorties des fonctions d'activation d'une couche de neurones servent d'entrées aux fonctions d'activation des neurones de la couche suivante.
L'entraînement du modèle commence généralement par une initialisation aléatoire des poids et des biais. Les hyperparamètres du modèle, tels que le nombre de couches cachées, le nombre de nœuds dans chaque couche et les fonctions d'activation pour certains neurones spécifiques, sont configurés manuellement et ne sont pas soumis à l'entraînement.
Lors de chaque passage avant, une entrée est échantillonnée à partir de l'ensemble de données d'entraînement. Les nœuds de la couche d'entrée reçoivent le vecteur d'entrée et transmettent chacun leur valeur – multipliée par un poids initial aléatoire – aux nœuds de la première couche cachée. Les unités cachées prennent la somme pondérée de ces valeurs de sortie comme entrée d'une fonction d'activation, dont la valeur de sortie (pondérée par un poids initial aléatoire) sert d'entrée aux neurones de la couche suivante. Ce processus se poursuit jusqu'à la couche de sortie, où une prédiction finale est effectuée.
Prenons l'exemple simplifié d'un réseau neuronal qui classe les entrées dans l'une des cinq catégories :
Dans un réseau bien entraîné, ce modèle produira systématiquement une probabilité élevée pour la classification correcte, et des probabilités faibles pour les autres classifications incorrectes. Cependant, ce réseau neuronal n'est pas encore entraîné. À ce stade, ses poids et biais ont des valeurs initiales aléatoires, donc ses prédictions sont généralement inexactes.
Après chaque passage avant, une « fonction de perte » mesure la différence (ou « perte ») entre la sortie prédite par le modèle pour une entrée donnée et les prédictions correctes (ou « vérité terrain ») pour cette entrée. En d'autres termes, elle mesure la différence entre la sortie réelle du modèle et la sortie souhaitée.
Dans l'apprentissage supervisé, qui utilise des données étiquetées, la vérité terrain est fournie par des annotations manuelles. Dans l'apprentissage auto-supervisé, qui masque ou transforme des parties d'échantillons de données non étiquetées et reconstruit le modèle pour la tâche, l'échantillon original sert de vérité de base.
L'objectif de cette fonction de perte est de quantifier l'inexactitude de manière à refléter correctement à la fois la nature et l'ampleur de l'erreur de sortie du modèle pour chaque entrée. Différentes formules mathématiques de perte sont mieux adaptées à des tâches spécifiques : par exemple, les variantes de l'erreur quadratique moyenne conviennent bien aux problèmes de régression, tandis que les variantes de la perte d'entropie croisée sont plus adaptées à la classification.
Étant donné que la fonction de perte prend la sortie d’un réseau neuronal comme entrée, et que cette sortie est une fonction composite comprenant de nombreuses fonctions d’activation imbriquées de neurones individuels, la différenciation de la fonction de perte implique la différenciation de l’ensemble du réseau. Pour ce faire, la rétropropagation utilise la règle de la chaîne.
« Fonction de perte », « fonction de coût » ou « fonction d'erreur » ?
Il convient de noter que dans certains contextes, les termes fonction de coût ou fonction d'erreur sont utilisés à la place de fonction de perte, avec « coût » ou « erreur » remplaçant « perte ».
Bien que certains ouvrages de machine learning attribuent des nuances distinctes à chacun de ces termes, ils sont généralement interchangeables.1 Une fonction objective est un terme plus large pour désigner toute fonction d'évaluation que l'on souhaite minimiser ou maximiser. Les termes fonction de perte, fonction de coût ou fonction d'erreur se réfèrent spécifiquement aux fonctions que nous souhaitons minimiser.
En partant de la dernière couche, un « passage arrière » différencie la fonction de perte pour calculer la contribution de chaque paramètre individuel du réseau à l'erreur globale pour une entrée unique.
Pour revenir à notre exemple précédent de modèle de classificateur, nous commencerons par les 5 neurones de la dernière couche, que nous appellerons couche L. La valeur softmax de chaque neurone de sortie représente la probabilité (sur 1) qu'une entrée appartienne à sa catégorie. Dans un modèle parfaitement entraîné, le neurone représentant la bonne classification aurait une valeur de sortie proche de 1, tandis que les autres neurones auraient des valeurs proches de 0.
Pour l'instant, nous nous concentrerons sur l'unité de sortie représentant la prédiction correcte, que nous appelleronl Lc. La fonction d'activation de Lc est une fonction composite qui contient les nombreuses fonctions d'activation imbriquées de l'ensemble du réseau neuronal, de la couche d'entrée à la couche de sortie. La minimisation de la fonction de perte implique de procéder à des ajustements dans l'ensemble du réseau afin de rapprocher la sortie de la fonction d'activation de Lc de 1.
Pour ce faire, nous devons savoir comment tout changement dans les couches précédentes modifiera la sortie de Lc . En d'autres termes, nous devons trouver les dérivées partielles de la fonction d'activation de Lc .
La sortie de la fonction d'activation de Lc dépend des contributions qu'elle reçoit des neurones de l'avant-dernière couche, que nous appellerons couche L-1. Une façon de modifier la sortie de Lc consiste à ajuster les poids entre les neurones de L-1 et Lc. En calculant la dérivée partielle de chaque poids de L-1 par rapport aux autres, nous pouvons voir comment l'augmentation ou la diminution de chacun d'eux rapprochera (ou éloignera) la sortie de Lc de 1.
Cependant, ce n'est pas la seule façon de modifier la sortie de Lc. Les contributions que Lc reçoit des neurones de L-1 sont déterminées non seulement par les pondérations appliquées aux valeurs de sortie de L-1, mais aussi par les valeurs de sortie elles-mêmes (avant pondération). Les valeurs de sortie des neurones de L-1, à leur tour, sont influencées par les poids appliqués aux entrées qu'ils reçoivent de L-2.Nous pouvons donc différencier les fonctions d'activation en L-1 pour trouver les dérivées partielles des poids appliqués aux contributions de L-2. Ces dérivées partielles nous montrent comment toute modification d'un poids en L-2 affectera les sorties en L-1, ce qui affectera ensuite la valeur de sortie de Lc et, par conséquent, la fonction de perte.
Selon la même logique, nous pourrions également influencer les valeurs de sortie que les neurones de L-1 reçoivent des neurones de L-2 en ajustant les contributions que les neurones de L-2 reçoivent des neurones de L-3. Nous trouvons donc les dérivées partielles dans L-3, et ainsi de suite, en répétant ce processus de manière récurrente jusqu'à ce que nous ayons atteint la couche d'entrée. Lorsque nous avons terminé, nous disposons du gradient de la fonction de perte : un vecteur de sa dérivée partielle pour chaque paramètre de poids et de biais dans le réseau.
Nous avons maintenant effectué un passage avant et un passage arrière pour un exemple d'entraînement. Cependant, notre objectif est d'entraîner le modèle à bien se généraliser à de nouvelles entrées. Pour ce faire, il faut s'entraîner sur un grand nombre d'échantillons qui reflètent la diversité et la gamme des entrées sur lesquelles le modèle sera chargé de faire des prédictions après l'entraînement.
Maintenant que nous disposons des gradients de la fonction de perte par rapport à chaque paramètre de poids et de biais dans le réseau, nous pouvons minimiser la fonction de perte (et donc optimiser le modèle) en utilisant la descente de gradient pour mettre à jour les paramètres du modèle.
Descendre le gradient de la fonction de perte diminue la perte. Étant donné que le gradient calculé lors de la rétropropagation contient les dérivées partielles de chaque paramètre du modèle, nous savons dans quelle direction « avancer » chacun de nos paramètres pour réduire la perte.
Chaque étape reflète l’« apprentissage » du modèle à partir de ses données d’entraînement. Notre objectif est de mettre à jour les poids de manière itérative jusqu’à ce que nous ayons atteint le gradient minimum. L’objectif des algorithmes de descente de gradient est de trouver les ajustements de paramètres spécifiques qui nous feront descendre le gradient de manière la plus efficace possible.
La taille de chaque étape est un hyperparamètre ajustable, appelé taux d’apprentissage. Le choix du bon taux d’apprentissage est crucial pour un entraînement à la fois efficace et efficient.
Rappelons que les fonctions d’activation d’un réseau de neurones sont non linéaires. Certains gradients peuvent avoir une forme approximativement en U : avancer dans une direction fait descendre le gradient, mais continuer dans cette direction peut finir par remonter le gradient.
Un faible taux d’apprentissage garantit que nous avançons toujours dans la bonne direction, mais le calcul de nombreux ajustements devient long et coûteux en termes de ressources de calcul. Un taux d’apprentissage élevé est plus efficace sur le plan computationnel, mais risque de dépasser le minimum du gradient.
Un autre facteur à considérer dans la descente de gradient est la fréquence de mise à jour des poids. Une option consiste à calculer les gradients pour chaque exemple du jeu de données d’entraînement, puis à prendre une moyenne de ces gradients pour mettre à jour les paramètres. Le processus est répété de manière itérative au cours de plusieurs époques d’entraînement jusqu’à ce que le taux d’erreur se stabilise. Cette méthode s’appelle la descente de gradient par lots.
Lorsque le jeu de données d’entraînement est très grand, comme c’est souvent le cas dans l’apprentissage profond, la descente de gradient par lots entraîne des temps de traitement très longs. Le calcul des gradients pour des millions d’exemples à chaque itération devient inefficace. Dans la descente de gradient stochastique (SGD), chaque époque utilise un seul exemple d’entraînement à chaque étape. Bien que la perte puisse fluctuer d’une époque à l’autre, elle converge rapidement vers le minimum à travers de nombreuses mises à jour.
La descente de gradient par mini-lots représente une approche intermédiaire. Les exemples d’entraînement sont échantillonnés de manière aléatoire en lots de taille fixe, et leurs gradients sont ensuite calculés et moyennés ensemble. Cela atténue les besoins en mémoire de la descente de gradient par lots tout en réduisant l’instabilité relative de la SGD.
Entraînez, validez, réglez et déployez une IA générative, des modèles de fondation et des capacités de machine learning avec IBM watsonx.ai, un studio d’entreprise nouvelle génération pour les générateurs d’IA. Créez des applications d’IA en peu de temps et avec moins de données.
Mettez l’IA au service de votre entreprise en vous appuyant sur l’expertise de pointe d’IBM dans le domaine de l’IA et sur son portefeuille de solutions.
Réinventez les workflows et les opérations critiques en ajoutant l’IA pour optimiser les expériences, la prise de décision et la valeur métier en temps réel.
¹ « Deep Learning », Goodfellow et al, MIT Press, 2016.
IBM web domains
ibm.com, ibm.org, ibm-zcouncil.com, insights-on-business.com, jazz.net, mobilebusinessinsights.com, promontory.com, proveit.com, ptech.org, s81c.com, securityintelligence.com, skillsbuild.org, softlayer.com, storagecommunity.org, think-exchange.com, thoughtsoncloud.com, alphaevents.webcasts.com, ibm-cloud.github.io, ibmbigdatahub.com, bluemix.net, mybluemix.net, ibm.net, ibmcloud.com, galasa.dev, blueworkslive.com, swiss-quantum.ch, blueworkslive.com, cloudant.com, ibm.ie, ibm.fr, ibm.com.br, ibm.co, ibm.ca, community.watsonanalytics.com, datapower.com, skills.yourlearning.ibm.com, bluewolf.com, carbondesignsystem.com, openliberty.io