Con respecto a la diferenciación automática, ¿es la transformación del código fuente (STC) más eficiente que la sobrecarga del operador (OO)?

12

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.f:RnR

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?

Matthew Emmett
fuente

Respuestas:

9

La transformación de fuente a fuente se considera el estándar de oro en términos de rendimiento. Los enfoques OO parecen ser casi tan buenos, ya que hay más paquetes OO por ahí, y el rendimiento no se menciona como un inconveniente significativo. Si encuentra una biblioteca OO que le gusta para el idioma en el que está trabajando, la usaría primero y luego averiguaría si realmente necesita una transformación de fuente a fuente, y si existe una herramienta que satisfaga sus necesidades. El costo típico de un derivado generado por diferenciación automática es aproximadamente de tres a cinco veces mayor que el de una evaluación de función, para poner las cosas en contexto.

Hay más paquetes OO por ahí porque es más fácil implementar herramientas de diferenciación automática usando la sobrecarga del operador que usar la traducción de fuente a fuente. La implementación de un traductor de fuente a fuente equivale a escribir un compilador: el código fuente debe ser analizado y tokenizado, luego las reglas de transformación deben aplicarse al árbol de expresión resultante. El libro de Andreas Griewank, Evaluación de derivados: principios y técnicas de diferenciación algorítmica, segunda edición, entra en más detalles sobre las compensaciones.

Geoff Oxberry
fuente
Gracias Geoff, esto ayuda mucho, especialmente su estimación de los costos típicos.
Matthew Emmett
1

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.

Lutz Lehmann
fuente