DĂ©rivation automatique
En mathématique et en calcul formel, la dérivation automatique (DA), également appelé dérivation algorithmique, dérivation formelle[1] - [2], ou auto-dérivation est un ensemble de techniques d'évaluation de la dérivée d'une fonction par un programme informatique.
Généralités
La dĂ©rivation automatique exploite le fait que chaque programme informatique, aussi compliquĂ© soit-il, exĂ©cute une sĂ©quence d'opĂ©rations arithmĂ©tiques Ă©lĂ©mentaires (addition, soustraction, multiplication, division, etc.) et des fonctions Ă©lĂ©mentaires (exp, log,sin, cos, etc.). En appliquant de façon rĂ©pĂ©tĂ©e la rĂšgle de dĂ©rivation des fonctions composĂ©es (rĂšgle de la chaĂźne) Ă ces opĂ©rations, les dĂ©rivĂ©es d'ordre arbitraire peuvent ĂȘtre calculĂ©es automatiquement et avec autant de prĂ©cision que souhaitĂ©e. De plus calculer la dĂ©rivation automatique de la fonction ne modifie son temps de calcul qu'au plus d'un petit facteur constant, rendant ces techniques trĂšs efficaces en pratique.

La dérivation automatique est distincte de la dérivation symbolique et de la dérivation numérique (méthode des différences finies). La dérivation symbolique peut conduire à un code inefficace et se heurte à la difficulté de convertir un programme informatique en une seule expression, tandis que la dérivation numérique peut introduire des erreurs d'arrondi lors de la discrétisation et de l'annulation. Ces deux méthodes classiques ont par ailleurs des problÚmes lors du calcul de dérivées d'ordre plus élevées, car la complexité et/ou les erreurs augmentent. Enfin, ces deux méthodes sont lentes pour calculer les dérivées partielles d'une fonction lorsque cette derniÚre dépend de nombreuses variables, comme cela est nécessaire pour les algorithmes d'optimisation par descente de gradient. La dérivation automatique résout tous ces problÚmes.
La rĂšgle de la chaĂźne : accumulation avant et arriĂšre
La dérivation automatique repose fondamentalement sur la décomposition des dérivées fournie par la rÚgle de la chaßne. Pour la composition simple
la rĂšgle de la chaĂźne donne alors:
Habituellement, deux modes de DA distincts sont présentés, l'accumulation directe (ou mode avant) et l'accumulation inverse (ou mode inverse). L'accumulation directe spécifie que l'on parcourt la rÚgle de la chaßne de l'intérieur vers l'extérieur (c'est-à -dire le premier calcul et puis et enfin ), tandis que l'accumulation inverse a la traversée de l'extérieur vers l'intérieur (premier calcul et puis et enfin ). Plus succinctement,
- l'accumulation directe calcule la relation récursive: avec , et,
- l'accumulation inverse calcule la relation récursive: avec .
Accumulation directe

Lors d'une DA par accumulation directe, on fixe d'abord le variable indépendante par rapport à laquelle la dérivation est effectuée et on calcule la dérivée de chaque sous-expression récursivement. Dans un calcul papier-crayon, cela implique de substituer à plusieurs reprises la dérivée de la fonction intérieure dans la rÚgle de chaßne :
Cela peut ĂȘtre gĂ©nĂ©ralisĂ© Ă plusieurs variables en considĂ©rant le produit de matrices Jacobiennes. Par rapport Ă l'accumulation inverse, l'accumulation directe est naturelle et facile Ă mettre en Ćuvre car le flux d'information des dĂ©rivĂ©es coĂŻncide avec l'ordre d'Ă©valuation. Chaque variable w est augmentĂ©e de sa dĂ©rivĂ©e áș (stockĂ©e sous forme de valeur numĂ©rique et non d'expression symbolique),
comme indiqué par le point. Les dérivées sont ensuite calculées de façon synchronisée lors des étapes d'évaluation du programme et combinées avec les autres dérivées via la rÚgle de chaßne. à titre d'exemple, considérons la fonction:
Pour plus de clartĂ©, les sous-expressions individuelles ont Ă©tĂ© Ă©tiquetĂ©es avec les variables wi. Le choix de la variable indĂ©pendante Ă laquelle la diffĂ©renciation est effectuĂ©e affecte les valeurs initiales de áș1 et áș2. Si l'on s'intĂ©resse Ă la dĂ©rivĂ©e de cette fonction par rapport Ă x1, les valeurs de dĂ©part doivent ĂȘtre dĂ©finies par:
Une fois les valeurs de départ ainsi définies, les valeurs se propagent à l'aide de la rÚgle de chaßne comme indiqué. La figure 2 montre une représentation picturale de ce processus sous forme de graphique de calcul.
Pour calculer le gradient de la fonction de cet exemple, il est nécessaire de calculer les dérivées de f par rapport à x1 et x2, un parcours supplémentaire est effectué sur le graphique de calcul avec les es valeurs de départ .
La complexité informatique du calcul de DA lors d'un parcours de l'accumulation directe est proportionnelle à la complexité du code d'origine.
L'accumulation directe est plus efficace que l'accumulation inverse pour les fonctions f : Rn â Rm avec m â« n puisque seul n parcours sont nĂ©cessaires, par rapport Ă m parcours pour l'accumulation inverse.
Accumulation inverse

Lors d'une DA par accumulation inverse, la variable dépendante à dériver est fixe et la dérivée est calculée récursivement pour chaque sous-expression . Dans un calcul papier-crayon, la dérivée des fonctions extérieures sont substituées à plusieurs reprises dans la rÚgle de chaßne:
Dans l'accumulation inverse, la quantitĂ© d'intĂ©rĂȘt est l'adjoint, notĂ© avec une barre (wÌ); c'est une dĂ©rivĂ©e d'une variable dĂ©pendante choisie par rapport Ă une sous-expression w:
L'accumulation inverse traverse la rĂšgle de la chaĂźne de l'extĂ©rieur vers l'intĂ©rieur, ou dans le cas du graphique de calcul de la figure 3, de haut en bas. L'exemple de fonction est Ă valeur scalaire, et il n'y a donc qu'une seule graine pour le calcul de la dĂ©rivĂ©e, et un seul parcours du graphe de calcul est nĂ©cessaire pour calculer le gradient (qui a pourtant deux composantes). C'est seulement la moitiĂ© du travail par rapport Ă l'accumulation directe, mais l'accumulation inverse nĂ©cessite le stockage des variables intermĂ©diaires wi ainsi que les instructions qui les ont produites dans une structure de donnĂ©es connue sous le nom de liste de Wengert (ou "bande")[3] - [4], ce qui peut consommer une mĂ©moire importante si le graphe de calcul est volumineux. Cela peut ĂȘtre attĂ©nuĂ© dans une certaine mesure en ne stockant qu'un sous-ensemble des variables intermĂ©diaires, puis en reconstruisant les variables de travail nĂ©cessaires en rĂ©pĂ©tant les Ă©valuations, une technique connue sous le nom de rematĂ©rialisation. Des Points de ContrĂŽle peuvent Ă©galement ĂȘtre utilisĂ©s pour enregistrer les Ă©tats intermĂ©diaires.
Les opĂ©rations pour calculer la dĂ©rivĂ©e en utilisant l'accumulation inverse sont prĂ©sentĂ©es dans le tableau ci-dessous (notez l'ordre inversĂ©): Le graphe de flux des donnĂ©es d'un calcul peut ĂȘtre manipulĂ© pour calculer le gradient de son calcul d'origine. En ajoutant un nĆud adjoint pour chaque nĆud primaire, et en reliant par des liens adjoints parallĂšles aux bords primaires mais circulant dans le sens opposĂ©. Les nĆuds du graphe adjoint reprĂ©sentent la multiplication par les dĂ©rivĂ©es des fonctions calculĂ©es par les nĆuds du primaire. Par exemple, l'addition dans le primaire provoque la sortie dans l'adjoint; la sortie dans le primaire provoque l'ajout dans l'adjoint;[note 1] a unaire fonction y = fâ(x) dans les causes primaires xÌ = Èł fââČ(x) dans l'adjoint; etc.
L'accumulation inverse est plus efficace que l'accumulation directe pour les fonctions f : Rn â Rm avec m âȘ n puisque seuls m parcours sont alors nĂ©cessaires (par rapport Ă n parcours pour l'accumulation directe).
La DA par accumulation inverse a été publiée pour la premiÚre fois en 1976 par Seppo Linnainmaa[5] - [6].
La rétropropagation des erreurs dans les perceptrons multicouches, une technique centrale dans l'apprentissage automatique, est un cas particulier de mode inverse de DA[2].
Au-delĂ de l'accumulation avant et arriĂšre
Les accumulations avant et arriĂšre ne sont que deux façons (extrĂȘmes) de traverser la rĂšgle de la chaĂźne. Le problĂšme du calcul d'un Jacobien complet de f : Rn â Rm avec un nombre minimum d'opĂ©rations arithmĂ©tiques est connu comme le problĂšme d'accumulation optimale du Jacobien, qui est NP-complet[7]. Au cĆur de cette preuve est l'idĂ©e que des dĂ©pendances algĂ©briques peuvent exister entre les dĂ©rivĂ©es partielles locales qui Ă©tiquettent les arĂȘtes du graphe. En particulier, deux Ă©tiquettes (ou plus) peuvent ĂȘtre reconnues comme Ă©gales. La complexitĂ© du problĂšme reste ouverte si l'on suppose que toutes les Ă©tiquettes de bord sont uniques et algĂ©briquement indĂ©pendantes.
DĂ©rivation automatique Ă l'aide de nombres duaux
La dérivation automatique directe est réalisée en augmentant l'algÚbre des nombres réels pour obtenir une nouvelle arithmétique. Une composante supplémentaire est ajouté à chaque nombre pour représenter la dérivée d'une fonction de ce nombre, et tous les opérateurs arithmétiques sont étendus pour l'algÚbre augmentée. L'algÚbre augmentée est l'algÚbre des nombres duaux.
On obtient cette algĂšbre en remplaçant chaque nombre par le nombre , oĂč est un nombre rĂ©el, mais est un nombre abstrait avec la propriĂ©tĂ© (un infinitĂ©simal; voir Analyse infinitĂ©simale fluide). En ajoutant uniquement cela, l'arithmĂ©tique rĂ©guliĂšre donne alors :
et de mĂȘme pour la soustraction et la division. Maintenant, les polynĂŽme peuvent ĂȘtre calculĂ©s dans cette arithmĂ©tique augmentĂ©e. Si , alors
oĂč dĂ©signe la dĂ©rivĂ©e de en ce qui concerne son premier argument, et , (appelĂ© la graine, ou valeur initiale), peut ĂȘtre choisi arbitrairement. Cette nouvelle arithmĂ©tique se compose de couples, Ă©lĂ©ments Ă©crits , avec l'arithmĂ©tique ordinaire sur la premiĂšre composante, et l'arithmĂ©tique de diffĂ©renciation du premier ordre sur la deuxiĂšme composante, comme dĂ©crit ci-dessus. Ătendre les rĂ©sultats ci-dessus sur les polynĂŽmes Ă fonctions analytiques donne une liste de l'arithmĂ©tique de base et de certaines fonctions standard pour la nouvelle arithmĂ©tique:
et en général pour la fonction primitive ,
oĂč et sont les dĂ©rivĂ©s de en ce qui concerne ses premier et deuxiĂšme arguments, respectivement.
Lorsqu'une opĂ©ration arithmĂ©tique binaire de base est appliquĂ©e Ă des arguments mixtes - la paire et le nombre rĂ©el âle nombre rĂ©el est d'abord portĂ© Ă . La dĂ©rivĂ©e d'une fonction au point est maintenant trouvĂ© en calculant en utilisant l'arithmĂ©tique ci-dessus, ce qui donne pour rĂ©sultat .
Arguments et fonctions vectoriels
Les fonctions multivariĂ©es peuvent ĂȘtre gĂ©rĂ©es avec les mĂȘmes mĂ©canismes (et la mĂȘme efficacitĂ©) que les fonctions univariĂ©es en adoptant un opĂ©rateur de dĂ©rivĂ© directionnel. Autrement dit, il suffit de calculer , la dĂ©rivĂ©e directionnelle de Ă dans la direction , et cela peut ĂȘtre calculĂ© comme en utilisant la mĂȘme arithmĂ©tique que ci-dessus. Si tous les Ă©lĂ©ments de sont dĂ©sirĂ©s, alors Ă©valuations de la fonction seront nĂ©cessaires. Notez que dans de nombreuses applications d'optimisation, la dĂ©rivĂ©e directionnelle est effectivement suffisante.
Ordre élevé et variables nombreuses
L'arithmĂ©tique ci-dessus peut ĂȘtre gĂ©nĂ©ralisĂ©e pour calculer les dĂ©rivĂ©es du second ordre (et supĂ©rieures) des fonctions multivariĂ©es. Cependant, les rĂšgles arithmĂ©tiques se compliquent rapidement: la complexitĂ© est quadratique au degrĂ© de dĂ©rivĂ©e le plus Ă©levĂ©. Au lieu de cela, l'algĂšbre tronquĂ©e des PolynĂŽme de Taylor peut ĂȘtre utilisĂ©e. L'arithmĂ©tique rĂ©sultante, dĂ©finie sur des nombres duaux gĂ©nĂ©ralisĂ©s, permet un calcul efficace en utilisant des fonctions comme s'il s'agissait d'un type de donnĂ©es. Une fois que le polynĂŽme de Taylor d'une fonction est connu, les dĂ©rivĂ©es sont facilement extraites.
Implémentation
La DA en mode direct est gĂ©nĂ©ralement implĂ©mentĂ©e par une interprĂ©tation non standard du programme dans lequel les nombres rĂ©els sont remplacĂ©s par des nombres duaux, les constantes sont remplacĂ©es par des nombres doubles avec un coefficient epsilon nul, et les primitives numĂ©riques sont remplacĂ©es pour fonctionner sur des nombres duaux. Cette interprĂ©tation non standard est gĂ©nĂ©ralement mise en Ćuvre Ă l'aide de l'une des deux stratĂ©gies suivantes : transformation du code source ou surcharge de l'opĂ©rateur.
Transformation du code source (TCS)

Le code source d'une fonction est remplacé par un code source généré automatiquement qui comprend des instructions de calcul des dérivées, entrelacés avec les instructions d'origine.
La transformation du code source peut ĂȘtre implĂ©mentĂ© dans tous les langages de programmation, et elle rend Ă©galement plus facile pour le compilateur l'optimisation du temps de compilation. Cependant, la mise en Ćuvre de la DA elle-mĂȘme est plus difficile.
Surcharge d'opérateur (SO)

La surcharge d'opĂ©rateur est une possibilitĂ© lorsque le code source est Ă©crit dans un langage le permettant. Les objets pour les nombres rĂ©els et les opĂ©rations mathĂ©matiques Ă©lĂ©mentaires doivent ĂȘtre surchargĂ©s pour rĂ©pondre Ă l'arithmĂ©tique augmentĂ©e dĂ©crite ci-dessus. Cela ne nĂ©cessite aucun changement dans la forme ou la sĂ©quence des opĂ©rations ni dans le code source d'origine pour que la fonction soit automatiquement diffĂ©renciĂ©e. Mais cela nĂ©cessite souvent des changements dans les types de donnĂ©es de base pour les nombres et les vecteurs afin de supporter la surcharge et implique Ă©galement souvent l'insertion d'opĂ©rations de marquage spĂ©ciales.
La surcharge d'opĂ©rateur pour l'accumulation directe est facile Ă mettre en Ćuvre, mais elle est Ă©galement possible pour l'accumulation inverse. Pour cette derniĂšre cependant, les compilateurs actuels sont en retard dans l'optimisation du code par rapport Ă l'accumulation directe.
La surcharge d'opĂ©rateur, pour l'accumulation avant et arriĂšre, peut ĂȘtre bien adaptĂ©e aux applications oĂč les objets sont des vecteurs de nombres rĂ©els plutĂŽt que des scalaires. En effet, la bande comprend alors des opĂ©rations vectorielles; et cela peut faciliter des implĂ©mentations efficaces sur le plan informatique oĂč chaque opĂ©ration vectorielle effectue de nombreuses opĂ©rations scalaires. Des techniques de dĂ©rivation algorithmique par adjoint vectoriel peuvent ĂȘtre utilisĂ©es, par exemple, pour dĂ©river des valeurs calculĂ©es par simulation Monte-Carlo.
Des exemples d'implémentations de différenciation automatique par surcharge d'opérateurs en C++ sont disponibles dans les bibliothÚques Adepte et Stan.
Notes et références
Notes
- In terms of weight matrices, the adjoint is the transpose. Addition is the covector , since and fanout is the vector since
Références
- Neidinger, « Introduction to Automatic Differentiation and MATLAB Object-Oriented Programming », SIAM Review, vol. 52, no 3,â , p. 545â563 (DOI 10.1137/080743627, lire en ligne)
- Baydin, Pearlmutter, Radul et Siskind, « Automatic differentiation in machine learning: a survey », Journal of Machine Learning Research, vol. 18,â , p. 1â43 (lire en ligne)
- R.E. Wengert, « A simple automatic derivative evaluation program », Comm. ACM, vol. 7, no 8,â , p. 463â464 (DOI 10.1145/355586.364791)
- Bartholomew-Biggs, Brown, Christianson et Dixon, « Automatic differentiation of algorithms », Journal of Computational and Applied Mathematics, vol. 124, nos 1â2,â , p. 171â190 (DOI 10.1016/S0377-0427(00)00422-2, Bibcode 2000JCoAM.124..171B)
- Linnainmaa, « Taylor Expansion of the Accumulated Rounding Error », BIT Numerical Mathematics, vol. 16, no 2,â , p. 146â160 (DOI 10.1007/BF01931367)
- Griewank, « Who Invented the Reverse Mode of Differentiation? », Optimization Stories, Documenta Matematica, vol. Extra Volume ISMP,â , p. 389â400 (lire en ligne)
- Naumann, « Optimal Jacobian accumulation is NP-complete », Mathematical Programming, vol. 112, no 2,â , p. 427â441 (DOI 10.1007/s10107-006-0042-z)
Bibliographie
- Louis B. Rall, Automatic Differentiation: Techniques and Applications, vol. 120, Springer, coll. « Lecture Notes in Computer Science », (ISBN 978-3-540-10861-0)
- Andreas Griewank et Andrea Walther, Evaluating Derivatives: Principles and Techniques of Algorithmic Differentiation, vol. 105, SIAM, coll. « Other Titles in Applied Mathematics », (ISBN 978-0-89871-659-7, lire en ligne)
- Neidinger, « Introduction to Automatic Differentiation and MATLAB Object-Oriented Programming », SIAM Review, vol. 52, no 3,â , p. 545â563 (DOI 10.1137/080743627, lire en ligne, consultĂ© le )
- Uwe Naumann, The Art of Differentiating Computer Programs, SIAM, coll. « Software-Environments-tools », (ISBN 978-1-611972-06-1)
- Marc Henrard, Algorithmic Differentiation in Finance Explained, Palgrave Macmillan, coll. « Financial Engineering Explained », (ISBN 978-3-319-53978-2)
Liens externes
- www.autodiff.org, Un "site d'entrée à tout ce que vous voulez savoir sur la différenciation automatique"
- Différenciation Automatique des Programmes OpenMP ParallÚles
- Différenciation Automatique, ModÚles C++ et Photogrammétrie
- Différenciation Automatique, Approche De Surcharge De L'Opérateur
- Calculez les dérivées analytiques de tout programme Fortran77, Fortran95 ou C via une interface Web Différenciation automatique des programmes Fortran
- Description et exemple de code pour la différenciation automatique en avant dans Scala
- extensions de différenciation automatique finmath-lib, Différenciation automatique pour les variables aléatoires (implémentation Java de la différenciation automatique stochastique).
- Différenciation Algorithmique Adjointe: Calibration et ThéorÚme des Fonctions Implicites
- Article de différenciation automatique basé sur un modÚle C++ et application
- Tangente Dérivés déboguables Source à Source
- , Grecs Exacts du Premier et du Second Ordre par Différenciation Algorithmique
- , Différenciation Algorithmique Adjointe d'une Application Accélérée par GPU
- , Méthodes Adjointes en Finance Informatique Support d'Outils Logiciels pour la Différenciation Algorithmiqueop