{"id":407,"date":"2022-04-12T09:55:23","date_gmt":"2022-04-12T07:55:23","guid":{"rendered":"https:\/\/naupacte.com\/?p=407"},"modified":"2023-04-29T14:20:19","modified_gmt":"2023-04-29T12:20:19","slug":"automatic-differentiation","status":"publish","type":"post","link":"https:\/\/naupacte.com\/index.php\/2022\/04\/12\/automatic-differentiation\/","title":{"rendered":"Qu&#8217;est-ce que la diff\u00e9rentiation automatique?"},"content":{"rendered":"\n<p>Les mod\u00e8les math\u00e9matiques de la physique regorgent de gradients, divergences, laplaciens, rotationnels, qui sont des d\u00e9riv\u00e9es en espace. On y trouve aussi des d\u00e9riv\u00e9es en temps pour les probl\u00e8mes instationnaires. La d\u00e9rivation est omnipr\u00e9sente.<\/p>\n\n\n\n<p>Ce dont nous allons parler maintenant est plus g\u00e9n\u00e9ral et vise jusqu&#8217;\u00e0 <strong>la d\u00e9rivation des mod\u00e8les eux-m\u00eames par rapport \u00e0 des variables diverses<\/strong>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Motivation<\/h2>\n\n\n\n<p>Une telle d\u00e9rivation intervient d\u00e8s l\u2019\u00e9tablissement des \u00e9quations lorsque celles-ci d\u00e9rivent d\u2019un potentiel, ou bien pour leur r\u00e9solution bas\u00e9e sur les informations donn\u00e9es par le jacobien: le mod\u00e8le est lin\u00e9aris\u00e9.<\/p>\n\n\n\n<p>Au-del\u00e0 de la r\u00e9solution de l\u2019\u00e9quation, l\u2019optimisation des param\u00e8tres en vue d\u2019un crit\u00e8re sur la solution tirera profit de la connaissance des d\u00e9riv\u00e9es de celle-ci par rapport \u00e0 ceux-l\u00e0, appel\u00e9s encore sensibilit\u00e9 de la solution par rapport aux param\u00e8tres.<\/p>\n\n\n\n<p class=\"has-light-gray-background-color has-background has-small-font-size\">Entrons dans les d\u00e9tails bien connus des sp\u00e9cialistes de l\u2019optimisation. Pour l\u2019optimisation d\u2019ordre 1, on observe que seule la variation efficace vis-\u00e0-vis du crit\u00e8re compte, c\u2019est-\u00e0-dire la contraction de la variation de la solution avec le gradient du crit\u00e8re par rapport \u00e0 la solution. Mais la variation de la solution r\u00e9sulte de la r\u00e9solution d\u2019un syst\u00e8me lin\u00e9aire que l\u2019on peut choisir de transposer math\u00e9matiquement sur le gradient du crit\u00e8re. C\u2019est la m\u00e9thode adjointe, plus performante d\u00e8s que le nombre de crit\u00e8res \u00e0 optimiser est inf\u00e9rieur au nombre de param\u00e8tres de d\u00e9rivation\u2026 En optimisation d\u2019ordre sup\u00e9rieur, la combinaison de l\u2019adjoint et des sensibilit\u00e9s sera utile.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Des m\u00e9thodes tr\u00e8s diff\u00e9rentes<\/h2>\n\n\n\n<p>Qu\u2019il s\u2019agisse de variables inconnues ou de donn\u00e9es, une fois discr\u00e9tis\u00e9es, le probl\u00e8me consiste \u00e0 d\u00e9river une formule math\u00e9matique par rapport \u00e0 une liste de ses entr\u00e9es de calcul. Partant d\u2019un code de calcul produisant le r\u00e9sultat de la formule math\u00e9matique \u00e0 d\u00e9river, il existe trois m\u00e9thodes pour d\u00e9velopper le code fournissant la d\u00e9riv\u00e9e.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">1. Diff\u00e9rence finie<\/h3>\n\n\n\n<p>C\u2019est la plus simple des m\u00e9thodes: elle consiste \u00e0 r\u00e9utiliser le code original en faisant varier l\u00e9g\u00e8rement le param\u00e8tre d\u2019entr\u00e9e consid\u00e9r\u00e9 et \u00e0 faire la diff\u00e9rence entre les deux r\u00e9sultats, que l\u2019on divise par l\u2019\u00e9cart de param\u00e8tre. Avec un deuxi\u00e8me calcul pris en une valeur avec l\u2019\u00e9cart oppos\u00e9, on obtient un r\u00e9sultat pr\u00e9cis non plus au premier ordre mais au second.<\/p>\n\n\n\n<p>H\u00e9las les math\u00e9matiques sont contredites par l\u2019informatique dont les arrondis vont emp\u00eacher les diff\u00e9rences de se montrer pr\u00e9cises, car les d\u00e9cimales en jeu seront de plus en plus faibles mais toujours relatives \u00e0 la m\u00eame valeur centrale. La pr\u00e9cision est donc n\u00e9cessairement limit\u00e9e. De plus, le choix de l\u2019\u00e9cart -le fameux epsilon- pourra parfois n\u2019\u00eatre jamais satisfaisant si la quantit\u00e9 \u00e0 d\u00e9river est une somme dont les termes sont d\u2019ordre de grandeur diff\u00e9rent sans relation avec l\u2019ordre de grandeur de leurs variations\u2026 Le petit terme de variation importante sera \u00e9cras\u00e9 et la d\u00e9riv\u00e9e perdra sa pertinence.<\/p>\n\n\n\n<h5 class=\"has-text-align-center wp-block-heading\">La m\u00e9thode semi-analytique<\/h5>\n\n\n\n<p class=\"has-light-gray-background-color has-background\">Lorsque la solution provient de la r\u00e9solution d\u2019un syst\u00e8me lin\u00e9aire, plut\u00f4t que de faire la diff\u00e9rence entre les solutions, il est pr\u00e9f\u00e9rable de la faire sur les seconds membres et de r\u00e9soudre le syst\u00e8me correspondant. C\u2019est plus rapide et plus performant. Il faut bien s\u00fbr soit avoir une matrice constante soit \u00eatre arriv\u00e9 \u00e0 convergence dans le cas lin\u00e9aris\u00e9 d&#8217;un algorithme de Newton. Voil\u00e0 ce que dit l&#8217;analyse: on peut reporter la d\u00e9rivation sur le second membre. Si celui-ci est calcul\u00e9 par diff\u00e9rence finie, la m\u00e9thode est dite semi-analytique.<\/p>\n\n\n\n<p class=\"has-light-gray-background-color has-background\">Encore faut-il  que le code ne soit plus tout-\u00e0-fait une bo\u00eete noire: il faut acc\u00e9der au r\u00e9sultat du second membre avant la r\u00e9solution du syst\u00e8me lin\u00e9aire. On reste donc \u00e0 haut-niveau. La m\u00e9thode de calcul de sensibilit\u00e9 dite semi-analytique est propos\u00e9e par certains \u00e9diteurs.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">2. La diff\u00e9rentiation de code ligne-\u00e0-ligne (algorithmique)<\/h3>\n\n\n\n<p>C\u2019est th\u00e9oriquement le plus simple d\u2019usage, gr\u00e2ce aux outils de diff\u00e9rentiation automatique de code: on fournit le code, dont on pr\u00e9cise la sortie et l\u2019entr\u00e9e, et l\u2019outil g\u00e9n\u00e8re le code calculant la d\u00e9riv\u00e9e. Pour cela, ligne apr\u00e8s ligne, l\u2019outil \u00e9crit le code contenant valeur et d\u00e9riv\u00e9e \u2013 car on sait d\u00e9river les fonctions de base \u2013 par cha\u00eenage direct ou inverse (adjoint). D\u2019abord r\u00e9serv\u00e9 au Fortran pour son absence de pointeurs, la m\u00e9thode a \u00e9t\u00e9 \u00e9tendue au C++ par d\u2019autres outils qui ont tir\u00e9 profit de la surcharge d\u2019op\u00e9rateurs du langage pour minimiser la r\u00e9-ing\u00e9nierie du code original. Les op\u00e9rations sont en effet surcharg\u00e9es pour produire valeur et cha\u00eenage de d\u00e9riv\u00e9e au lieu de la valeur seule.<\/p>\n\n\n\n<p>La m\u00e9thode de diff\u00e9rentiation algorithmique a tout son int\u00e9r\u00eat dans le cas de codes h\u00e9rit\u00e9s complexes car, s\u2019appuyant sur les m\u00eames calculs, elle \u00e9vite le d\u00e9bogage d\u2019un code nouveau. Elle demande n\u00e9anmoins une assistance humaine experte pour \u00eatre op\u00e9rationnelle et efficace.<\/p>\n\n\n\n<p class=\"has-light-gray-background-color has-background\">Le principe de la m\u00e9thode semi-analytique doit absolument \u00eatre employ\u00e9 pour \u00e9viter la d\u00e9rivation ligne-\u00e0-ligne de la r\u00e9solution du syst\u00e8me lin\u00e9aire. Voil\u00e0 un exemple d&#8217;assistance humaine indispensable.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">3. D\u00e9rivation symbolique de la formule<\/h3>\n\n\n\n<p>Dans l\u2019id\u00e9al, on voudrait d\u00e9river symboliquement la formule et coder son calcul. Le faire \u00e0 la main conduit \u00e0 s\u2019octroyer un temps de d\u00e9veloppement qu\u2019on s\u2019interdisait, tandis que passer par un logiciel de calcul formel a quelques inconv\u00e9nients majeurs.<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>D\u2019une part, il est difficile d\u2019exprimer la formule quand elle s\u2019appuie sur des concepts complexes comme les \u00e9l\u00e9ments finis et les maillages.<\/li><li>D\u2019autre part, le r\u00e9sultat d\u00e9velopp\u00e9 perd la structure tensorielle dont elle est issue et ne donne pas les performances optimales. L\u2019optimisation de la g\u00e9n\u00e9ration de code par ces outils repose en effet sur l\u2019identification de la r\u00e9p\u00e9tition d\u2019op\u00e9rations de base comme les multiplications et les sommes de variables scalaires, alors qu\u2019il y a mieux \u00e0 faire, alg\u00e9briquement parlant.<\/li><\/ul>\n\n\n\n<p>Selon les auteurs de la journ\u00e9e <a href=\"https:\/\/calcul.math.cnrs.fr\/2019-01-journee-algorithmic-differentiation.html\" target=\"_blank\" rel=\"noreferrer noopener\">Algorithmic Differentiation Workshop<\/a> organis\u00e9e par le Groupe de Recherche GDR-Calcul du CNRS le 24 janvier 2019 \u00e0 Paris, cela peut conduire \u00e0 une explosion de la complexit\u00e9 des expressions.<\/p>\n\n\n\n<p>C&#8217;est donc un d\u00e9fi&#8230;<\/p>\n\n\n\n<div class=\"wp-block-buttons is-layout-flex wp-block-buttons-is-layout-flex\">\n<div class=\"wp-block-button is-style-outline is-style-outline--1\"><a class=\"wp-block-button__link\" href=\"https:\/\/naupacte.com\/index.php\/tensor-algebra-embedded-language-for-numerical-simulation\/automatic-differentiation-and-computing\/\">La d\u00e9rivation avec Navpactos<\/a><\/div>\n<\/div>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Les mod\u00e8les math\u00e9matiques de la physique regorgent de gradients, divergences, laplaciens, rotationnels, qui sont des d\u00e9riv\u00e9es en espace. On y trouve aussi des d\u00e9riv\u00e9es en temps pour les probl\u00e8mes instationnaires. La d\u00e9rivation est omnipr\u00e9sente. Ce dont nous allons parler maintenant est plus g\u00e9n\u00e9ral et vise jusqu&#8217;\u00e0 la d\u00e9rivation des mod\u00e8les eux-m\u00eames par rapport \u00e0 des variables diverses. Motivation Une telle d\u00e9rivation intervient d\u00e8s l\u2019\u00e9tablissement des \u00e9quations lorsque celles-ci d\u00e9rivent d\u2019un potentiel, ou bien pour leur r\u00e9solution bas\u00e9e sur les informations donn\u00e9es par le jacobien: le mod\u00e8le est lin\u00e9aris\u00e9. Au-del\u00e0 de la r\u00e9solution de l\u2019\u00e9quation, l\u2019optimisation des param\u00e8tres en vue d\u2019un crit\u00e8re sur la solution tirera profit de la connaissance des d\u00e9riv\u00e9es de celle-ci par rapport \u00e0 ceux-l\u00e0, appel\u00e9s encore sensibilit\u00e9 de la solution par rapport aux param\u00e8tres. Entrons dans les d\u00e9tails bien connus des sp\u00e9cialistes de l\u2019optimisation. Pour l\u2019optimisation d\u2019ordre 1, on observe que seule la variation efficace vis-\u00e0-vis du crit\u00e8re compte, c\u2019est-\u00e0-dire la contraction de la variation de la solution avec le gradient du crit\u00e8re par rapport \u00e0 la solution. Mais la variation de la solution r\u00e9sulte de la r\u00e9solution d\u2019un syst\u00e8me lin\u00e9aire que l\u2019on peut choisir de transposer math\u00e9matiquement sur le gradient du crit\u00e8re. C\u2019est la m\u00e9thode adjointe, plus performante d\u00e8s que le nombre de crit\u00e8res \u00e0 optimiser est inf\u00e9rieur au nombre de param\u00e8tres de d\u00e9rivation\u2026 En optimisation d\u2019ordre sup\u00e9rieur, la combinaison de l\u2019adjoint et des sensibilit\u00e9s sera utile. Des m\u00e9thodes tr\u00e8s diff\u00e9rentes Qu\u2019il s\u2019agisse de variables inconnues ou de donn\u00e9es, une fois discr\u00e9tis\u00e9es, le probl\u00e8me consiste \u00e0 d\u00e9river une formule math\u00e9matique par rapport \u00e0 une liste de ses entr\u00e9es de calcul. Partant d\u2019un code de calcul produisant le r\u00e9sultat de la formule math\u00e9matique \u00e0 d\u00e9river, il existe trois m\u00e9thodes pour d\u00e9velopper le code fournissant la d\u00e9riv\u00e9e. 1. Diff\u00e9rence finie C\u2019est la plus simple des m\u00e9thodes: elle consiste \u00e0 r\u00e9utiliser le code original en faisant varier l\u00e9g\u00e8rement le param\u00e8tre d\u2019entr\u00e9e consid\u00e9r\u00e9 et \u00e0 faire la diff\u00e9rence entre les deux r\u00e9sultats, que l\u2019on divise par l\u2019\u00e9cart de param\u00e8tre. Avec un deuxi\u00e8me calcul pris en une valeur avec l\u2019\u00e9cart oppos\u00e9, on obtient un r\u00e9sultat pr\u00e9cis non plus au premier ordre mais au second. H\u00e9las les math\u00e9matiques sont contredites par l\u2019informatique dont les arrondis vont emp\u00eacher les diff\u00e9rences de se montrer pr\u00e9cises, car les d\u00e9cimales en jeu seront de plus en plus faibles mais toujours relatives \u00e0 la m\u00eame valeur centrale. La pr\u00e9cision est donc n\u00e9cessairement limit\u00e9e. De plus, le choix de l\u2019\u00e9cart -le fameux epsilon- pourra parfois n\u2019\u00eatre jamais satisfaisant si la quantit\u00e9 \u00e0 d\u00e9river est une somme dont les termes sont d\u2019ordre de grandeur diff\u00e9rent sans relation avec l\u2019ordre de grandeur de leurs variations\u2026 Le petit terme de variation importante sera \u00e9cras\u00e9 et la d\u00e9riv\u00e9e perdra sa pertinence. La m\u00e9thode semi-analytique Lorsque la solution provient de la r\u00e9solution d\u2019un syst\u00e8me lin\u00e9aire, plut\u00f4t que de faire la diff\u00e9rence entre les solutions, il est pr\u00e9f\u00e9rable de la faire sur les seconds membres et de r\u00e9soudre le syst\u00e8me correspondant. C\u2019est plus rapide et plus performant. Il faut bien s\u00fbr soit avoir une matrice constante soit \u00eatre arriv\u00e9 \u00e0 convergence dans le cas lin\u00e9aris\u00e9 d&#8217;un algorithme de Newton. Voil\u00e0 ce que dit l&#8217;analyse: on peut reporter la d\u00e9rivation sur le second membre. Si celui-ci est calcul\u00e9 par diff\u00e9rence finie, la m\u00e9thode est dite semi-analytique. Encore faut-il que le code ne soit plus tout-\u00e0-fait une bo\u00eete noire: il faut acc\u00e9der au r\u00e9sultat du second membre avant la r\u00e9solution du syst\u00e8me lin\u00e9aire. On reste donc \u00e0 haut-niveau. La m\u00e9thode de calcul de sensibilit\u00e9 dite semi-analytique est propos\u00e9e par certains \u00e9diteurs. 2. La diff\u00e9rentiation de code ligne-\u00e0-ligne (algorithmique) C\u2019est th\u00e9oriquement le plus simple d\u2019usage, gr\u00e2ce aux outils de diff\u00e9rentiation automatique de code: on fournit le code, dont on pr\u00e9cise la sortie et l\u2019entr\u00e9e, et l\u2019outil g\u00e9n\u00e8re le code calculant la d\u00e9riv\u00e9e. Pour cela, ligne apr\u00e8s ligne, l\u2019outil \u00e9crit le code contenant valeur et d\u00e9riv\u00e9e \u2013 car on sait d\u00e9river les fonctions de base \u2013 par cha\u00eenage direct ou inverse (adjoint). D\u2019abord r\u00e9serv\u00e9 au Fortran pour son absence de pointeurs, la m\u00e9thode a \u00e9t\u00e9 \u00e9tendue au C++ par d\u2019autres outils qui ont tir\u00e9 profit de la surcharge d\u2019op\u00e9rateurs du langage pour minimiser la r\u00e9-ing\u00e9nierie du code original. Les op\u00e9rations sont en effet surcharg\u00e9es pour produire valeur et cha\u00eenage de d\u00e9riv\u00e9e au lieu de la valeur seule. La m\u00e9thode de diff\u00e9rentiation algorithmique a tout son int\u00e9r\u00eat dans le cas de codes h\u00e9rit\u00e9s complexes car, s\u2019appuyant sur les m\u00eames calculs, elle \u00e9vite le d\u00e9bogage d\u2019un code nouveau. Elle demande n\u00e9anmoins une assistance humaine experte pour \u00eatre op\u00e9rationnelle et efficace. Le principe de la m\u00e9thode semi-analytique doit absolument \u00eatre employ\u00e9 pour \u00e9viter la d\u00e9rivation ligne-\u00e0-ligne de la r\u00e9solution du syst\u00e8me lin\u00e9aire. Voil\u00e0 un exemple d&#8217;assistance humaine indispensable. 3. D\u00e9rivation symbolique de la formule Dans l\u2019id\u00e9al, on voudrait d\u00e9river symboliquement la formule et coder son calcul. Le faire \u00e0 la main conduit \u00e0 s\u2019octroyer un temps de d\u00e9veloppement qu\u2019on s\u2019interdisait, tandis que passer par un logiciel de calcul formel a quelques inconv\u00e9nients majeurs. D\u2019une part, il est difficile d\u2019exprimer la formule quand elle s\u2019appuie sur des concepts complexes comme les \u00e9l\u00e9ments finis et les maillages. D\u2019autre part, le r\u00e9sultat d\u00e9velopp\u00e9 perd la structure tensorielle dont elle est issue et ne donne pas les performances optimales. L\u2019optimisation de la g\u00e9n\u00e9ration de code par ces outils repose en effet sur l\u2019identification de la r\u00e9p\u00e9tition d\u2019op\u00e9rations de base comme les multiplications et les sommes de variables scalaires, alors qu\u2019il y a mieux \u00e0 faire, alg\u00e9briquement parlant. Selon les auteurs de la journ\u00e9e Algorithmic Differentiation Workshop organis\u00e9e par le Groupe de Recherche GDR-Calcul du CNRS le 24 janvier 2019 \u00e0 Paris, cela peut conduire \u00e0 une explosion de la complexit\u00e9 des expressions. C&#8217;est donc un d\u00e9fi&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[49],"tags":[],"class_list":["post-407","post","type-post","status-publish","format-standard","hentry","category-langage-simulation-numerique"],"_links":{"self":[{"href":"https:\/\/naupacte.com\/index.php\/wp-json\/wp\/v2\/posts\/407","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/naupacte.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/naupacte.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/naupacte.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/naupacte.com\/index.php\/wp-json\/wp\/v2\/comments?post=407"}],"version-history":[{"count":7,"href":"https:\/\/naupacte.com\/index.php\/wp-json\/wp\/v2\/posts\/407\/revisions"}],"predecessor-version":[{"id":467,"href":"https:\/\/naupacte.com\/index.php\/wp-json\/wp\/v2\/posts\/407\/revisions\/467"}],"wp:attachment":[{"href":"https:\/\/naupacte.com\/index.php\/wp-json\/wp\/v2\/media?parent=407"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/naupacte.com\/index.php\/wp-json\/wp\/v2\/categories?post=407"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/naupacte.com\/index.php\/wp-json\/wp\/v2\/tags?post=407"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}