Pracujemy nad modelem Bayesian dla procesu czasoprzestrzennego i używamy samplera No-U-Turn (NUTS), który wymaga modelu prawdopodobieństwa logarytmicznego i jego gradientu w odniesieniu do parametrów modelu. Mówiąc bardziej zwięźle, mamy dość skomplikowaną funkcję logarytmu prawdopodobieństwa , obejmującą rozkłady statystyczne, produkty Kroneckera, wykładnicze, stosunki, instrukcje if-else itp., I musimy je podać i jego gradient do NUTS. Kilka pakietów ( MCMC Stana i Julii ) wykorzystuje przeciążenie operatora (o ile mi wiadomo), aby automatycznie uzyskać gradient.
Gdybyśmy byli w stanie stworzyć własną funkcję gradientu, być może przy użyciu narzędzia do automatycznego porównywania transformacji kodu źródłowego, czy uzyskalibyśmy lepszą wydajność, czy też OO jest tak samo dobre czy lepsze?
źródło
Do obliczania gradientu używasz odwrotnego trybu AD. Wymaga to w obu przypadkach zbudowania stosu operandów, wersja OO musi także zbudować stos operacji, który należy interpretować w odwrotnej wersji kodu. Kod transformowany źródłowy zapisuje operacje w kolejności odwróconej jako dodatkowy kod źródłowy, który jest kompilowany. Narzut związany z posiadaniem interpretera operacji w kodzie może być znaczny. Istnieją porównania kodu generowanego przez Tapenade i Adol-C, które wychodzą na korzyść Tapenade.
źródło