14.4. Algorithme de vérification « GradientTest »

14.4.1. Description

Cet algorithme permet de vérifier la qualité du gradient d’un opérateur, en calculant un résidu dont les propriétés théoriques sont connues. Plusieurs formules de résidu sont disponibles. Le test est applicable à un opérateur quelconque, d’évolution \mathcal{D} comme d’observation \mathcal{H}..

Pour toutes les formules, avec \mathbf{x} le point courant de vérification, on prend \mathbf{dx}_0=Normal(0,\mathbf{x}) et \mathbf{dx}=\alpha_0*\mathbf{dx}_0 avec \alpha_0 un paramètre utilisateur de mise à l’échelle de l’amplitude initiale, par défaut à 1. F est l’opérateur ou le code de calcul (qui est ici donné par l’utilisateur à l’aide de la commande de l’opérateur d’observation « ObservationOperator »).

14.4.1.1. Résidu « Taylor »

On observe le résidu issu du développement de Taylor de la fonction F, normalisé par la valeur au point nominal :

R(\alpha) = \frac{|| F(\mathbf{x}+\alpha*\mathbf{dx}) - F(\mathbf{x}) - \alpha * \nabla_xF(\mathbf{dx}) ||}{|| F(\mathbf{x}) ||}

Si le résidu décroît et que la décroissance se fait en \alpha^2 selon \alpha, cela signifie que le gradient est bien calculé jusqu’à la précision d’arrêt de la décroissance quadratique, et que F n’est pas linéaire.

Si le résidu décroît et que la décroissance se fait en \alpha selon \alpha, jusqu’à un certain seuil après lequel le résidu est faible et constant, cela signifie que F est linéaire et que le résidu décroît à partir de l’erreur faite dans le calcul du terme \nabla_xF.

14.4.1.2. Résidu « TaylorOnNorm »

On observe le résidu issu du développement de Taylor de la fonction F, rapporté au paramètre \alpha au carré :

R(\alpha) = \frac{|| F(\mathbf{x}+\alpha*\mathbf{dx}) - F(\mathbf{x}) - \alpha * \nabla_xF(\mathbf{dx}) ||}{\alpha^2}

C’est un résidu essentiellement similaire au critère classique de Taylor décrit précédemment, mais son comportement peut différer selon les propriétés numériques des calculs de ses différents termes.

Si le résidu est constant jusqu’à un certain seuil et croissant ensuite, cela signifie que le gradient est bien calculé jusqu’à cette précision d’arrêt, et que F n’est pas linéaire.

Si le résidu est systématiquement croissant en partant d’une valeur faible par rapport à ||F(\mathbf{x})||, cela signifie que F est (quasi-)linéaire et que le calcul du gradient est correct jusqu’au moment où le résidu est de l’ordre de grandeur de ||F(\mathbf{x})||.

14.4.1.3. Résidu « Norm »

On observe le résidu, qui est basé sur une approximation du gradient :

R(\alpha) = \frac{|| F(\mathbf{x}+\alpha*\mathbf{dx}) - F(\mathbf{x}) ||}{\alpha}

qui doit rester constant jusqu’à ce que l’on atteigne la précision du calcul.

14.4.2. Quelques propriétés notables des méthodes implémentées

Pour compléter la description on synthétise ici quelques propriétés notables, des méthodes de l’algorithme ou de leurs implémentations. Ces propriétés peuvent avoir une influence sur la manière de l’utiliser ou sur ses performances de calcul. Pour de plus amples renseignements, on se reportera aux références plus complètes indiquées à la fin du descriptif de cet algorithme.

  • Les méthodes proposées par cet algorithme requièrent la dérivation de la fonction objectif ou de l’un des opérateurs. Il nécessite que l’un au moins des opérateurs d’observation ou d’évolution soit différentiable voire les deux, et cela implique un coût supplémentaire dans le cas où les dérivées sont calculées numériquement par de multiples évaluations.

  • Les méthodes proposées par cet algorithme ne présentent pas de parallélisme interne, mais utilisent la dérivation numérique d’opérateur(s) qui est, elle, parallélisable. L’interaction potentielle, entre le parallélisme de la dérivation numérique, et le parallélisme éventuellement présent dans les opérateurs d’observation ou d’évolution intégrant les codes de l’utilisateur, doit donc être soigneusement réglée.

14.4.3. Commandes requises et optionnelles

Les commandes générales requises, disponibles en édition dans l’interface graphique ou textuelle, sont les suivantes :

CheckingPoint

Vecteur. La variable désigne le vecteur utilisé comme l’état autour duquel réaliser le test requis, noté \mathbf{x}, similaire à l’ébauche \mathbf{x}^b. Sa valeur est définie comme un objet de type « Vector » ou « VectorSerie ». Sa disponibilité en sortie est conditionnée par le booléen « Stored » associé en entrée.

ObservationOperator

Opérateur. La variable désigne l’opérateur d’observation, usuellement noté H, qui transforme les paramètres d’entrée \mathbf{x} en résultats \mathbf{y} qui sont à comparer aux observations \mathbf{y}^o. Sa valeur est définie comme un objet de type « Function » ou de type « Matrix ». Dans le cas du type « Function », différentes formes fonctionnelles peuvent être utilisées, comme décrit dans la section Conditions requises pour les fonctions décrivant un opérateur. Si un contrôle U est inclus dans le modèle d’observation, l’opérateur doit être appliqué à une paire (X,U).

Les commandes optionnelles générales, disponibles en édition dans l’interface graphique ou textuelle, sont indiquées dans la Liste des commandes et mots-clés pour un cas de vérification. De plus, les paramètres de la commande « AlgorithmParameters » permettent d’indiquer les options particulières, décrites ci-après, de l’algorithme. On se reportera à la Description des options d’un algorithme par « AlgorithmParameters » pour le bon usage de cette commande.

Les options sont les suivantes :

AmplitudeOfInitialDirection

Valeur réelle. Cette clé indique la mise à l’échelle de la perturbation initiale construite comme un vecteur utilisé pour la dérivée directionnelle autour du point nominal de vérification. La valeur par défaut est de 1, ce qui signifie qu’il n’y a aucune mise à l’échelle. Il est utile de modifier cette valeur, et en particulier de la diminuer dans le cas où les perturbations les plus grandes sortent du domaine de définition de la fonction.

Exemple : {"AmplitudeOfInitialDirection":0.5}

AmplitudeOfTangentPerturbation

Valeur réelle. Cette clé indique l’amplitude numérique relative de la perturbation utilisée pour estimer la valeur tangente de l’opérateur au point d’évaluation, i.e. sa dérivée directionnelle. Le défaut conservatif est de 1.e-2 i.e. 1%, et il est fortement recommandé de l’adapter aux besoins pour des problèmes réels, en diminuant sa valeur de plusieurs ordres de grandeur.

Exemple : {"AmplitudeOfTangentPerturbation":1.e-2}

EpsilonMinimumExponent

Valeur entière. Cette clé indique la valeur de l’exposant minimal du coefficient en puissance de 10 qui doit être utilisé pour faire décroître le multiplicateur de l’incrément. La valeur par défaut est de -8, et elle doit être négative entre 0 et -20. Par exemple, la valeur par défaut conduit à calculer le résidu de la formule avec un incrément fixe multiplié par 1.e0 jusqu’à 1.e-8.

Exemple : {"EpsilonMinimumExponent":-12}

InitialDirection

Vecteur. Cette clé indique la direction vectorielle utilisée pour la dérivée directionnelle autour du point nominal de vérification. Cela doit être un vecteur de la même taille que celle du point de vérification. Si elle n’est pas spécifiée, la direction par défaut est une perturbation vectorielle autour de zéro de la même taille que le point de vérification.

Exemple : {"InitialDirection":[0.1,0.1,100.,3} pour un espace d’état de dimension 4

NumberOfPrintedDigits

Valeur entière. Cette clé indique le nombre de décimales de précision pour les affichages de valeurs réelles. La valeur par défaut est 5, avec un minimum de 0.

Exemple : {"NumberOfPrintedDigits":5}

ResiduFormula

Nom prédéfini. Cette clé indique la formule de résidu qui doit être utilisée pour le test. Le choix par défaut est « Taylor », et les choix possibles sont « Taylor » (résidu du développement de Taylor normalisé de l’opérateur, qui doit décroître comme le carré de la perturbation), « TaylorOnNorm » (résidu du développement de Taylor rapporté à la perturbation de l’opérateur, qui doit rester constant) et « Norm » (résidu obtenu en prenant la norme du développement de Taylor à l’ordre 0, qui approxime le gradient, et qui doit rester constant).

Exemple : {"ResiduFormula":"Taylor"}

SetSeed

Valeur entière. Cette clé permet de donner un nombre entier pour fixer la graine du générateur aléatoire utilisé dans l’algorithme. Par défaut, la graine est laissée non initialisée, et elle utilise ainsi l’initialisation par défaut de l’ordinateur, qui varie donc à chaque étude. Pour assurer la reproductibilité de résultats impliquant des tirages aléatoires, il est fortement conseillé d’initialiser la graine. Une valeur simple est par exemple 123456789. Il est conseillé de mettre un entier à plus de 6 ou 7 chiffres pour bien initialiser le générateur aléatoire.

Exemple : {"SetSeed":123456789}

StoreSupplementaryCalculations

Liste de noms. Cette liste indique les noms des variables supplémentaires, qui peuvent être disponibles au cours du déroulement ou à la fin de l’algorithme, si elles sont initialement demandées par l’utilisateur. Leur disponibilité implique, potentiellement, des calculs ou du stockage coûteux. La valeur par défaut est donc une liste vide, aucune de ces variables n’étant calculée et stockée par défaut (sauf les variables inconditionnelles). Les noms possibles pour les variables supplémentaires sont dans la liste suivante (la description détaillée de chaque variable nommée est donnée dans la suite de cette documentation par algorithme spécifique, dans la sous-partie « Informations et variables disponibles à la fin de l’algorithme ») : [ « CurrentState », « Residu », « SimulatedObservationAtCurrentState », ].

Exemple : {"StoreSupplementaryCalculations":["CurrentState", "Residu"]}

14.4.4. Informations et variables disponibles à la fin de l’algorithme

En sortie, après exécution de l’algorithme, on dispose d’informations et de variables issues du calcul. La description des Variables et informations disponibles en sortie indique la manière de les obtenir par la méthode nommée get, de la variable « ADD » du post-processing en interface graphique, ou du cas en interface textuelle. Les variables d’entrée, mises à disposition de l’utilisateur en sortie pour faciliter l’écriture des procédures de post-processing, sont décrites dans l”Inventaire des informations potentiellement disponibles en sortie.

Sorties permanentes (non conditionnelles)

Les sorties non conditionnelles de l’algorithme sont les suivantes :

Residu

Liste de valeurs. Chaque élément est la valeur du résidu particulier vérifié lors du déroulement de l’algorithme, selon l’ordre des tests effectués.

Exemple : r = ADD.get("Residu")[:]

Ensemble des sorties à la demande (conditionnelles ou non)

L’ensemble des sorties (conditionnelles ou non) de l’algorithme, classées par ordre alphabétique, est le suivant :

CurrentState

Liste de vecteurs. Chaque élément est un vecteur d’état courant utilisé au cours du déroulement itératif de l’algorithme utilisé.

Exemple : xs = ADD.get("CurrentState")[:]

Residu

Liste de valeurs. Chaque élément est la valeur du résidu particulier vérifié lors du déroulement de l’algorithme, selon l’ordre des tests effectués.

Exemple : r = ADD.get("Residu")[:]

SimulatedObservationAtCurrentState

Liste de vecteurs. Chaque élément est un vecteur d’observation simulé par l’opérateur d’observation à partir de l’état courant, c’est-à-dire dans l’espace des observations.

Exemple : hxs = ADD.get("SimulatedObservationAtCurrentState")[-1]