Estamos trabajando en un modelo bayesiano para un proceso de espacio-tiempo, y estamos utilizando un muestreador sin giro en U (NUTS) que requiere un modelo para la probabilidad logarítmica y su gradiente con respecto a los parámetros del modelo. Más sucintamente, tenemos una función de probabilidad logarítmica bastante complicada , que involucra distribuciones estadísticas, productos kronecker, exponenciales, proporciones, declaraciones if-else, etc., y necesitamos proporcionarla y su gradiente a NUTS. Varios paquetes ( MCMC de Stan y Julia ) utilizan la sobrecarga del operador (que yo sepa) para obtener el gradiente automáticamente.
Si pudiéramos crear nuestra propia función de degradado, tal vez utilizando una herramienta de auto-diferencia de transformación de código fuente, ¿obtendríamos un mejor rendimiento, o es OO tan bueno o mejor?
fuente
Para el cálculo de gradiente, utiliza el modo inverso de AD. Esto requiere en ambos casos construir una pila de operandos, la versión OO también necesita construir una pila de operaciones, que debe interpretarse en el recorrido inverso del código. El código fuente transformado escribe las operaciones de orden inverso como código fuente adicional que se compila. La sobrecarga para tener el intérprete de operaciones en el código puede ser significativa. Hay comparaciones de código generado por Tapenade y Adol-C que salen a favor de Tapenade.
fuente