C'è qualche implementazione funzionante di modalità di differenziazione automatica inversione per Haskell?

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

  •  02-10-2019
  •  | 
  •  

Domanda

L'implementazione più vicino-correlata in Haskell che ho visto è la modalità in avanti a http://hackage.haskell.org/packages/archive/fad/1.0/doc/html/Numeric-FAD.html .

La ricerca relazionati più vicino sembra essere la modalità inversa per un altro linguaggio funzionale relative al regime a http://www.bcl.hamilton.ie/~qobi/stalingrad/ .

Vedo modalità inversa in Haskell come una specie di Santo Graal per un sacco di compiti, con la speranza che si potrebbe utilizzare il parallelismo annidato dati di Haskell per ottenere un bel aumento di velocità nella ottimizzazione numerica pesante.

È stato utile?

Soluzione

In risposta a questa domanda, ho caricato un pacchetto chiamato annuncio per Hackage per la gestione reverse-mode differenziazione automatica in Haskell.

Internamente, sfrutta un trucco da Andy Gill Kansas Lava per osservare la condivisione nel nastro registra per scopi indietro di propagazione, e il livello di impieghi tipo di branding per evitare di confondere sensibilità.

ho lì cercato di mantenere l'API relativamente vicino a quello di Barak Pearlmutter e il pacchetto moda di Jeffrey Mark Siskind, ma non ho potuto resistere a fare un paio di piccoli ritocchi qui e per la generalità.

Ho ancora bisogno di passare attraverso e finire i restanti combinatori fad non implementati, a capire un bel modo per costruire una torre AD reverse-mode, validate che non rovinare il mio ricordo del calcolo di base, e di fornire un bel API per l'utilizzo di questo metodo per ottenere posti di blocco modalità inversa locali in un programma di modalità aD altrimenti in avanti, ma sono abbastanza contento di come le cose sono progredite finora.

Altri suggerimenti

Abbiamo un sacco di implementazioni modalità Ad avanti (ho anche avere uno nella mia biblioteca monoidi!), Ma la modalità inversa dC per tutti Haskell sembra essere intrattabile.

Purtroppo, mentre Pearlmutter e Siskind dare una traduzione per un lambda calcolo, non la mappa in qualcosa che si può fare per arbitrari lambda Haskell, non si ottiene le proprietà di introspezione a destra e dato il modo in cui la forma del cambiamento tipi nella traduzione non si ottiene qualcosa che è suscettibile di essere confezionato in una monade, una freccia o altra struttura di controllo.

Ho avuto un andare a esso tramite una serie di scambi e-mail Pearlmutter, ma alla fine la meglio sono stato in grado di ottenere era una soluzione inversa modalità AD per un piccolo EDSL in Haskell, e non una soluzione per Haskell sé.

Non che io sappia. So che alcuni Haskell gente sono interessa di differenziazione automatica, ma alcuni pratica scavo pensa poco più brevi asides citano la modalità inversa; Mi aspetto che già trovato lo stesso materiale che ho fatto.

Ho anche notare che il pacchetto fad e progetto Stalingrado avete trovato sono infatti opera dello stesso due persone , e che almeno il Prof. Pearlmutter ha scritto sul Haskell-caffetteria mailing list. Si può prendere in considerazione gli contattando direttamente sul suo lavoro -. È possibile che ha qualcosa in corso, o colpire seri ostacoli durante il tentativo di implementare reverse-mode AD

Ci dispiace non ho potuto alzare qualcosa di più utile; se qualcun altro vuole scavare ulteriormente, almeno i link qui sopra sono un punto di partenza.

Credo che in avanti è la strada da percorrere in Haskell. Non si dovrebbe essere in grado di fare la modalità retromarcia sulle funzioni arbitrarie, come Edward ha sottolineato. Ma hai risposto che si dovrebbe essere in grado di farlo su alcune funzioni vincolate. E detti vincoli possono portare facilmente alla modalità avanti. Per esempio. se si dispone di una funzione:

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

Quindi è possibile creare un'istanza a con un tipo differenziabile, e foo quindi differenziare in modalità di avanzamento.

Vedere le href="http://hackage.haskell.org/package/vector-space" rel="nofollow noreferrer"> vettore spazio-biblioteca su Hackage per molto elegante modo di andata differenziazione automatica . Potrebbe non essere del tutto chiaro come usarlo in un primo momento. Leggere il giornale su di esso, Bella Differenziazione di Conal Elliott.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top