Мы работаем над байесовской моделью для пространственно-временного процесса и используем сэмплер No-U-Turn (NUTS), который требует модель для логарифмической вероятности и ее градиента по отношению к параметрам модели. Более кратко, у нас есть довольно сложная функция логарифмической вероятности , включающая статистические распределения, произведения Кронекера, экспоненты, отношения, операторы if-else и т. Д., И мы должны предоставить ее, и это градиент к NUTS. Несколько пакетов ( MCMC Стэна и Джулии ) используют перегрузку операторов (насколько мне известно) для автоматического получения градиента.
Если бы мы смогли создать нашу собственную функцию градиента, возможно, с помощью инструмента автоматической разницы преобразования исходного кода, мы бы получили более высокую производительность или OO такой же хороший или лучший?
источник
Для вычисления градиента вы используете обратный режим AD. В обоих случаях это требует построения стека операндов, а версия OO также должна создавать стек операций, который должен интерпретироваться при обратном обходе кода. Исходный преобразованный код записывает операции в обратном порядке как дополнительный исходный код, который компилируется. Затраты на использование интерпретатора операций в коде могут быть значительными. Есть сравнения сгенерированного кода Tapenade и Adol-C, которые выступают за Tapenade.
источник