Y at-il la mise en œuvre du travail en mode inverse différenciation automatique pour Haskell?

StackOverflow https://stackoverflow.com/questions/2744973

  •  02-10-2019
  •  | 
  •  

Question

La mise en œuvre liée à la plus proche de Haskell, je l'ai vu est le mode avance à http://hackage.haskell.org/packages/archive/fad/1.0/doc/html/Numeric-FAD.html .

Le plus proche recherche dans ce domaine connexe semble être en mode inverse pour une autre langue fonctionnelle liée au schéma http://www.bcl.hamilton.ie/~qobi/stalingrad/ .

Je vois le mode inverse dans Haskell comme une sorte de Saint Graal pour beaucoup de tâches, avec l'espoir qu'il pourrait utiliser le parallélisme de données imbriquée de Haskell pour obtenir une belle accélération dans l'optimisation numérique lourde.

Était-ce utile?

La solution

En réponse à cette question, je l'ai envoyé un package nommé ad Hackage pour la manutention inverser mode différentiation automatique en Haskell.

En interne, elle tire parti d'une astuce du Kansas Lava de Andy Gill pour observer le partage dans la bande qu'il enregistre à des fins de propagation de retour, et utilise le niveau de type image de marque pour éviter les sensibilités confusion.

J'ai essayé de garder l'API relativement proche de celle de Barak Pearlmutter et paquet de mode de Jeffrey Mark Siskind, mais je ne pouvais pas résister à faire quelques tweaks mineurs ici et là pour la généralité.

Je dois encore passer et terminer les combinateurs à la mode inappliquées restants, figure une belle façon de construire une tour AD inverse mode, validate que je ne l'ai pas bousiller mon souvenir de calcul de base, et de fournir une belle API pour utiliser cette approche pour obtenir des points de contrôle en mode inverse locaux dans un mode autre avant programme AD, mais je suis très heureux avec la façon dont les choses ont progressé jusqu'ici.

Autres conseils

Nous avons un tas d'implémentations en avant le mode AD (j'ai même une dans ma bibliothèque monoids!), Mais le mode inverse AD pour tous Haskell semble être intraitable.

Malheureusement, tout Pearlmutter et Siskind donnent une traduction pour un calcul lambda, il ne correspond pas à quelque chose que vous pouvez faire pour lambdas Haskell arbitraires, vous ne recevez pas les bonnes propriétés d'introspection et compte tenu de la façon dont la forme des types changement dans la traduction que vous ne recevez pas quelque chose qui est susceptible d'être emballé dans une monade, flèche, ou une autre structure de contrôle.

J'ai eu un aller à elle par une série d'échanges de courriels avec Pearlmutter, mais finalement le mieux que je pouvais obtenir était une solution AD mode inverse pour un petit EDSL dans Haskell, et non une solution pour Haskell lui-même.

Pas que je sache. Je sais que certains Haskell gens sont intéressé par la différenciation automatique, mais quelques recherches rapides a trouvé un peu plus court apartés mentionnant le mode inverse; Je vous attends déjà trouvé le même matériel que je l'ai fait.

Je note également que le paquet fad et projet Stalingrad vous avez trouvé sont en fait le travail du même href="http://cobweb.ecn.purdue.edu/~qobi/" rel="nofollow noreferrer"> personnes , et au moins le professeur Pearlmutter a posté à haskell-café liste de diffusion . Vous pouvez envisager de le contacter directement sur son travail -. Il est possible qu'il a quelque chose en cours, ou frappé de sérieux obstacles tout en essayant de mettre en œuvre inverse en mode AD

Désolé je ne pouvais pas tourner quoi que ce soit plus utile; si quelqu'un d'autre veut creuser plus loin, au moins les liens ci-dessus sont un point de départ.

Je pense que l'avant est la voie à suivre dans Haskell. Vous ne devriez pas être en mesure de le faire en mode inverse sur les fonctions arbitraires, comme Edward a fait remarquer. Mais vous avez répondu que vous devriez être en mesure de le faire sur certaines fonctions limitées. Et dit les contraintes peuvent facilement conduire en mode avant. Par exemple. si vous avez une fonction:

foo :: Num a => a -> a -> a

Ensuite, vous pouvez instancier a avec un type différentiables, et foo ainsi Différencier en mode avant.

Voir la bibliothèque sur Hackage pour le mode en avant très élégante différenciation automatique . Il pourrait ne pas être tout à fait clair comment l'utiliser dans un premier temps. Lisez le livre à ce sujet, Belle Différenciation par Conal Elliott.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top