Wir arbeiten an einem Bayes'schen Modell für einen Raum-Zeit-Prozess und verwenden einen No-U-Turn-Sampler (NUTS), für den ein Modell für die Log-Wahrscheinlichkeit und den Gradienten in Bezug auf die Modellparameter erforderlich ist. Um es kurz zu machen, wir haben eine ziemlich komplizierte log-Wahrscheinlichkeitsfunktion , die statistische Verteilungen, kronecker-Produkte, Exponentiale, Verhältnisse, if-else-Aussagen usw. umfasst und die wir bereitstellen müssen und die Steigung zu NUTS hat. Einige Pakete ( Stan und Julias MCMC ) verwenden nach meinem besten Wissen das Überladen von Operatoren, um den Gradienten automatisch zu ermitteln.
Wenn wir in der Lage wären, eine eigene Verlaufsfunktion zu erstellen, möglicherweise mithilfe eines automatischen Diff-Tools für die Quellcodetransformation, würden wir eine bessere Leistung erzielen, oder wäre OO genauso gut oder besser?
quelle
Für die Gradientenberechnung verwenden Sie den umgekehrten Modus von AD. Dies erfordert in beiden Fällen den Aufbau eines Operandenstapels, in der OO-Version muss auch ein Operationsstapel aufgebaut werden, der im Reverse Traversal des Codes interpretiert werden muss. Quelltransformierter Code schreibt die Operationen in umgekehrter Reihenfolge als zusätzlichen kompilierten Quellcode aus. Der Aufwand, den Operations-Interpreter im Code zu haben, kann erheblich sein. Es gibt Vergleiche zwischen von Tapenade erzeugtem Code und Adol-C, die zugunsten von Tapenade herauskommen.
quelle