2010-07-04 5 views
8

Je tente d'implémenter automatic differentiation pour un package de statistiques Python (la formulation du problème est similaire aux formulations de problèmes d'optimisation). Le graphique de calcul est généré en utilisant la surcharge d'opérateur et les fonctions d'usine pour des opérations comme sum(), exp(), etc. J'ai mis en place une différenciation automatique pour le gradient en utilisant l'accumulation inverse. Cependant, j'ai trouvé que la mise en œuvre de la différenciation automatique pour la dérivée seconde (la Hesse) était beaucoup plus difficile. Je sais comment faire les calculs individuels du 2e gradient partiel, mais j'ai eu du mal à trouver une façon intelligente de parcourir le graphique et de faire les accumulations. Est-ce que quelqu'un sait de bons articles qui donnent des algorithmes pour la différenciation automatique de la dérivée seconde ou des bibliothèques open source qui implémentent la même chose que je peux essayer d'apprendre?Implémentation de la différenciation automatique pour la dérivée seconde: algorithme pour parcourir le graphe de calcul?

+1

"Hors sujet" mon pied (en commentant le seul SOer qui a voté de cette façon) - tout est sur la programmation, quoi d'autre pourrait "traverser le calcul graphique "être sur ?? (Bien que je ne comprenne pas pourquoi @John ne peut pas faire la dérivée 2ème en appliquant deux fois sa fonctionnalité dérivée première, c'est peut-être parce que je ne sais pas ce qu'est un "Hessian" [sauf un soldat d'origine allemande se battre pour les Britanniques en 1776! -)]]). –

+0

Pour répondre à votre question, différencier deux fois est non-trivial en raison des interactions entre les variables. Si votre fonction est un scalaire (avec n entrées), la dérivée première est une longueur de vecteur n, la dérivée seconde est une matrice de n^2, la dérivée de troisième est n^3 etc. Pour la dérivée première, vous devez remonter 1 chemin de la variable dépendante indépendante par terme, pour la deuxième dérivée, vous devez parcourir deux chemins différents. J'étais/était un peu inquiet que ce soit hors sujet, mais je ne sais pas quel meilleur forum pour cette question est; ce n'est certainement pas une chose de débordement mathématique. –

+0

La différenciation automatique est-elle absolument nécessaire?Chaque fois que je l'ai considéré, j'ai trouvé que différencier manuellement l'algorithme à la main pour être plus simple, mais encore une fois, mes Hessiens ont généralement été assez simples (comme la diagonale, ou calculable par une formule analytique). –

Répondre

1

D'abord, vous devez décider si vous vouloir o calculer un Hessian clairsemé ou quelque chose de plus près d'un Hessian complètement dense.

Si ce que vous voulez est clairsemé, il existe actuellement deux façons de le faire. Utilisant uniquement le graphique de calcul d'une manière intelligente, un balayage inverse du graphe de calcul, vous pouvez calculer la matrice hessienne en utilisant l'algorithme de edge_pushing:

http://www.tandfonline.com/doi/full/10.1080/10556788.2011.580098

Ou vous pouvez essayer des techniques de coloration graphique pour compacter votre matrice hessienne en une matrice de colonnes moins, puis utilisez l'accumulation inverse pour calculer chaque colonne

http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.66.2603

Si ce que vous voulez est un hessois dense (rare dans la pratique), alors votre probablement mieux de calculer une colonne du hessien à un temps en utilisant l'accumulation inverse (recherche de BRUCE CHRISTIANSON et accumulation inverse)

+0

C'est très intéressant. Avez-vous une version pdf du premier article? –

-1

La méthode habituelle pour approcher le hessien en 3 dimensions est le BFGS

Le procédé L-BFGS est similaire.

Here Vous pouvez trouver le code source du L-BFGS (qui calcule le Hessian comme résultat intermédiaire pour résoudre les ODE) dans plusieurs langages (C#, C++, VBA, etc.) mais pas en python. Je pense que ce n'est pas facile à traduire.

Si vous allez traduire le alg d'une autre langue, accorder une attention particulière aux erreurs numériques et faire une analyse de sensibilité (vous devrez calculer l'inverse de la matrice hessienne)

Questions connexes