Per quanto riguarda la differenziazione automatica, la trasformazione del codice sorgente (STC) è più efficiente del sovraccarico dell'operatore (OO)?


12

Stiamo lavorando su un modello bayesiano per un processo spazio-temporale e stiamo utilizzando un campionatore No-U-Turn (NUTS) che richiede un modello per la probabilità di log e il suo gradiente rispetto ai parametri del modello. Più sinteticamente, abbiamo una funzione di probabilità logaritmica piuttosto complicata , che coinvolge distribuzioni statistiche, prodotti di kronecker, esponenziali, rapporti, istruzioni if-else ecc. Diversi pacchetti ( MCMC di Stan e Julia ) usano l'operatore di sovraccarico (per quanto ne so) per ottenere automaticamente il gradiente.f:RnR

Se fossimo in grado di creare la nostra funzione di gradiente, magari utilizzando uno strumento di auto-diff di trasformazione del codice sorgente, otterremmo prestazioni migliori o OO è altrettanto buono o migliore?

Risposte:


9

La trasformazione da fonte a fonte è considerata lo standard di riferimento in termini di prestazioni. Gli approcci OO sembrano essere quasi altrettanto buoni, in quanto ci sono più pacchetti OO là fuori e le prestazioni non sono menzionate come un inconveniente significativo. Se trovi una libreria OO che ti piace per la lingua in cui stai lavorando, la utilizzerei prima e poi scoprirò se hai assolutamente bisogno di una trasformazione da fonte a fonte e se esiste uno strumento che soddisfa le tue esigenze. Il costo tipico di un derivato generato dalla differenziazione automatica è circa tre o cinque volte quello di una valutazione della funzione, per mettere le cose nel contesto.

Ci sono più pacchetti OO là fuori perché è più semplice implementare strumenti di differenziazione automatica usando il sovraccarico dell'operatore piuttosto che usare la traduzione da fonte a fonte. L'implementazione di un traduttore da sorgente a fonte equivale alla scrittura di un compilatore: il codice sorgente deve essere analizzato e tokenizzato, quindi le regole di trasformazione devono essere applicate all'albero delle espressioni risultante. Il libro di Andreas Griewank, Evaluating Derivatives: Principles and Techniques of Algorithmic Differiation, Second Edition, approfondisce ulteriormente i compromessi.


Grazie Geoff, questo aiuta molto, in particolare la tua stima dei costi tipici.
Matthew Emmett,

1

Per il calcolo del gradiente, si utilizza la modalità inversa di AD. Ciò richiede in entrambi i casi la creazione di uno stack di operandi, la versione OO deve anche creare uno stack di operazioni, che deve essere interpretato nell'attraversamento inverso del codice. Il codice trasformato di origine scrive le operazioni in ordine inverso come codice sorgente aggiuntivo che viene compilato. Il sovraccarico per avere l'interprete delle operazioni nel codice può essere significativo. Esistono confronti tra il codice generato da Tapenade e Adol-C che emerge a favore di Tapenade.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.