• Aucun résultat trouvé

Diff´erentiation automatique

Int´egrer et diff´erentier des fonctions

6.6 Diff´erentiation automatique

. (6.99)  L’´evaluation de gradients, au cœur de certaines des m´ethodes d’optimisation les plus efficaces, est consid´er´ee plus en d´etail dans la section qui suit, dans le cas particulier important o`u la fonction `a diff´erentier est ´evalu´ee par un code num´erique.

6.6 Diff´erentiation automatique

Supposons la valeur num´erique de f(x0) calcul´ee par un code num´erique, dont les variables d’entr´ee incluent les ´el´ements de x0. Le premier probl`eme consid´er´e dans cette section est l’´evaluation num´erique du gradient de f(·) en x0, c’est `a dire de ∂ f ∂ x(x0) =          ∂ f ∂ x1(x0) ∂ f ∂ x2(x0) .. . ∂ f ∂ xn(x0)          , (6.100)

via l’utilisation d’un code num´erique d´eduit de celui ´evaluant f(x0).

Nous commenc¸ons par une description des probl`emes rencontr´es quand on uti-lise des diff´erences finies, avant de d´ecrire deux approches pour mettre en œuvre la diff´erentiation automatique [71, 84, 222, 93, 190, 173, 85]. Ces approches per-mettent d’´eviter toute erreur de m´ethode dans l’´evaluation de gradients (ce qui n’´elimine pas les erreurs d’arrondi, bien sˆur). La premi`ere de ces approches peut conduire `a une diminution drastique du volume de calcul, tandis que la seconde est simple `a mettre en œuvre via la surcharge d’op´erateurs.

6.6.1 Inconv´enients de l’approximation par diff´erences finies

Remplac¸ons les d´eriv´ees partielles dans (6.100) par des diff´erences finies, pour obtenir soit ∂ f ∂ xi (x0)≈ f(x0+ e i δ xi)− f (x0) δ xi , i= 1,··· ,n, (6.101) o`u eiest la i-`eme colonne de In, soit

∂ f

∂ xi(x0)≈ f(x0+ e

iδ xi)− f (x0− eiδ xi) 2δ xi

, i= 1,··· ,n. (6.102) L’erreur de m´ethode est en O(δ x2

i) pour (6.102), au lieu de O(δ xi) pour (6.101). De plus, (6.102) n’introduit pas de distorsion de phase contrairement `a (6.101) (penser au cas o`u f(x) est une fonction trigonom´etrique). Par contre, (6.102) requiert plus de calculs que (6.101).

Rappelons qu’on ne peut pas faire tendre δ xivers z´ero, car ceci entraˆınerait le calcul de la diff´erence de nombres r´eels infinit´esimalement proches, un d´esastre avec des nombres `a virgule flottante. Il faut donc trouver un compromis entre les erreurs d’arrondi et de m´ethode en gardant des δ xi finis (et pas n´ecessairement ´egaux). Un bon r´eglage de chacun des δ xiest difficile, et peut n´ecessiter des essais et des erreurs. Mˆeme si l’on suppose que des δ xi appropri´es ont d´ej`a ´et´e trouv´es, une ´evaluation approch´ee du gradient de f(·) en x0 requiert dim x+ 1 ´evaluations de f(·) avec (6.101) et 2 · dimx ´evaluations de f (·) avec (6.102). Ceci peut s’av´erer difficile si la dimension de x est tr`es grande (comme en traitement d’images ou en optimisation de formes) ou si de nombreuses ´evaluations de gradient doivent ˆetre effectu´ees (comme en optimisation).

La diff´erentiation automatique n’implique, quant `a elle, aucune erreur de m´ethode et peut spectaculairement r´eduire la charge de calcul.

6.6.2 Id´ee de base de la diff´erentiation automatique

La fonction f(·) est ´evalu´ee par un programme (le code direct). Nous supposons que f(x) telle qu’elle est mise en œuvre dans le code direct est diff´erentiable par rapport `a x. Le code direct ne peut donc pas contenir une instruction comme

if (x6= 1) then f(x):= x, else f(x):= 1. (6.103) Cette instruction n’a pas grand sens, mais des variantes plus difficiles `a d´etecter peuvent se tapir dans le code direct. Nous distinguerons deux types de variables :

— les variables ind´ependantes (les entr´ees du code direct), qui incluent les com-posantes de x,

— the variables d´ependantes (`a calculer par le code direct), qui incluent f(x). Toutes ces variables sont plac´ees dans un vecteur d’´etat v, une aide conceptuelle qui ne sera pas stock´ee en tant que telle dans l’ordinateur. Quand x prend la va-leur num´erique x0, l’une des variables d´ependantes a pour valeur f(x0) `a la fin de l’ex´ecution du code direct.

Pour simplifier, supposons tout d’abord que le code direct soit une suite lin´eaire de N instructions d’affectation, sans boucle ou branchement conditionnel. La k-`eme instruction d’affectation modifie la µ(k)-`eme composante de v selon

En g´en´eral, φkne d´epend que de quelques composantes de v. D´efinissons Ikcomme l’ensemble des indices de ces composantes et remplac¸ons (6.104) par une version plus d´etaill´ee

vµ(k):= φk({vi| i ∈ Ik}). (6.105) Exemple 6.11.Si la 5`emeinstruction d’affectation est

v4:= v1+v2v3;

alors µ(5) = 4, φ5(v) = v1+ v2v3et Ik={1,2,3}.  Globalement, la k-`eme instruction d’affectation se traduit par

v := ΦΦΦk(v), (6.106) o`u ΦΦΦkne change aucune des composantes de v, sauf la µ(k)-`eme qui est modifi´ee selon (6.105).

Remarque 6.10.L’expression (6.106) ne doit pas ˆetre confondue avec une ´equation `a r´esoudre par rapport `a v...  Soit vkl’´etat du code direct apr`es l’ex´ecution de la k-`eme instruction d’affecta-tion. Il satisfait

vk= ΦΦΦk(vk−1), k= 1,··· ,N. (6.107) C’est l’´equation d’´etat d’un syst`eme dynamique `a temps discret. Les ´equations d’´etat trouvent de nombreuses applications, en chimie, en m´ecanique, en automa-tique et en traitement du signal, par exemple. (Voir le chapitre 12 pour des exemples d’´equations d’´etat `a temps continu.) Le rˆole du temps discret est tenu ici par le pas-sage d’une instruction d’affectation `a la suivante. L’´etat final vN est obtenu `a partir de l’´etat initial v0par composition de fonctions, puisque

vN= ΦΦΦN◦ ΦΦΦN−1◦ ··· ◦ ΦΦΦ1(v0). (6.108) L’´etat initial v0contient notamment la valeur x0de x, et l’´etat final vNla valeur de

f(x0).

La r`egle de diff´erentiation en chaˆıne appliqu´ee `a (6.107) et (6.108) se traduit par

∂ f ∂ x(x0) =∂ v T 0 ∂ x ·∂ ΦΦΦ T 1 ∂ v (v0)· ... ·∂ ΦΦΦ T N ∂ v (vN−1∂ f ∂ vN (x0). (6.109) Pour aider `a m´emoriser (6.109), remarquons que, comme ΦΦΦk(vk−1) = vk, l’´equation

∂ vT

∂ v = I (6.110) permet de faire disparaˆıtre tous les termes interm´ediaires du membre de droite de (6.109), ce qui laisse la mˆeme expression que dans le membre de gauche.

Posons ∂ vT0 ∂ x = C, (6.111) ∂ ΦΦΦTk ∂ v (vk−1) = Ak (6.112) et ∂ f ∂ vN (x0) = b. (6.113) L’´equation (6.109) devient alors

∂ f

∂ x(x0) = CA1···ANb, (6.114) et l’´evaluation du gradient de f(·) en x0se r´esume au calcul de ce produit de ma-trices et de vecteur. Choisissons, de fac¸on arbitraire, de stocker la valeur de x0dans les n premi`eres composantes de v0, de sorte que

C=

I 0  . (6.115) De fac¸on tout aussi arbitraire, stockons la valeur de f(x0) dans la derni`ere compo-sante de vN, de sorte que

f(x0) = bTvN, (6.116) avec

b=

0 ··· 0 1 T

. (6.117) Reste `a voir comment ´evaluer les matrices Aiet comment ordonner les calculs dans (6.114).