En ce qui concerne la différenciation automatique, la transformation du code source (STC) est-elle plus efficace que la surcharge d'opérateur (OO)?


12

Nous travaillons sur un modèle bayésien pour un processus spatio-temporel, et utilisons un échantillonneur No-U-Turn (NUTS) qui nécessite un modèle pour la probabilité logarithmique et son gradient par rapport aux paramètres du modèle. Plus succinctement, nous avons une fonction de probabilité de log assez compliquée , impliquant des distributions statistiques, des produits kronecker, des exponentielles, des ratios, des instructions if-else, etc., et nous devons la fournir et son gradient vers NUTS. Plusieurs packages ( MCMC de Stan et Julia ) utilisent la surcharge d'opérateur (au meilleur de ma connaissance) pour obtenir automatiquement le gradient.f:RnR

Si nous pouvions créer notre propre fonction de gradient, peut-être en utilisant un outil d'auto-diff de transformation de code source, obtiendrions-nous de meilleures performances, ou l'OO est-il tout aussi bon ou meilleur?

Réponses:


9

La transformation de source à source est considérée comme l'étalon-or en termes de performances. Les approches OO semblent être presque aussi bonnes, car il y a plus de packages OO et les performances ne sont pas mentionnées comme un inconvénient majeur. Si vous trouvez une bibliothèque OO que vous aimez pour la langue dans laquelle vous travaillez, je l'utiliserais d'abord, puis je déterminerais plus tard si vous avez absolument besoin d'une transformation de source à source, et si un tel outil répondant à vos besoins existe. Le coût typique d'un dérivé généré par différenciation automatique est environ trois à cinq fois celui d'une évaluation de fonction, pour mettre les choses en contexte.

Il existe plus de packages OO, car il est plus facile d'implémenter des outils de différenciation automatique à l'aide de la surcharge de l'opérateur que d'utiliser la traduction de source à source. Implémenter un traducteur de source à source revient à écrire un compilateur: le code source doit être analysé et tokenisé, puis les règles de transformation doivent être appliquées à l'arborescence d'expression résultante. Le livre d'Andreas Griewank, Evaluating Derivatives: Principles and Techniques of Algorithmic Differentiation, Second Edition, donne plus de détails sur les compromis.


Merci Geoff, cela aide beaucoup, en particulier votre estimation des coûts typiques.
Matthew Emmett

1

Pour le calcul du gradient, vous utilisez le mode inverse de AD. Cela nécessite dans les deux cas de construire une pile d'opérandes, la version OO doit également construire une pile d'opérations, qui doit être interprétée dans le sens inverse du code. Le code transformé source écrit les opérations dans l'ordre inverse en tant que code source supplémentaire qui est compilé. La surcharge pour avoir l'interpréteur d'opérations dans le code peut être importante. Il existe des comparaisons du code généré par Tapenade et d'Adol-C qui se prononcent en faveur de Tapenade.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.