2010-07-04 17 views
8

Estoy intentando implementar automatic differentiation para un paquete de estadísticas de Python (la formulación del problema es similar a las formulaciones de problemas de optimización).Implementando la diferenciación automática para la 2da derivada: algoritmo para atravesar el gráfico computacional?

El gráfico computacional se genera utilizando la sobrecarga del operador y las funciones de fábrica para operaciones como sum(), exp(), etc. He implementado la diferenciación automática para el gradiente utilizando la acumulación inversa. Sin embargo, he encontrado que implementar la diferenciación automática para la segunda derivada (Hessian) es mucho más difícil. Sé cómo hacer los 2dos cálculos de gradientes parciales individuales, pero he tenido problemas para encontrar una forma inteligente de recorrer el gráfico y hacer las acumulaciones. ¿Alguien sabe de buenos artículos que dan algoritmos para la diferenciación automática para la segunda derivada o bibliotecas de código abierto que implementan la misma que puedo intentar aprender?

+1

"fuera del tema" mi pie (comentando al único SOer que votó de esa manera) - esto es todo sobre programación, ¿qué otra cosa podría "atravesar la computación gráfico "¿se trata ?! (Aunque no entiendo por qué @John no puede hacer la segunda derivada simplemente aplicando su funcionalidad de primera derivada dos veces, eso puede deberse a que no sé qué es un "Hessian" [[excepto un soldado nacido en Alemania] luchando por los británicos en 1776! -)]]). –

+0

Para responder a su pregunta, diferenciar dos veces no es trivial debido a las interacciones entre variables. Si su función es un escalar (con n entradas), la 1ª derivada es una longitud vectorial n, la 2da derivada es una matriz n^2, la 3ª derivada es n^3, etc. Para la primera derivada, debe viajar 1 ruta de variable dependiente independiente por término, para la segunda derivada debe recorrer dos rutas diferentes. Me preocupaba/estaba un poco preocupado de que fuera tema, pero no sé cuál es el mejor foro para esta pregunta; Definitivamente no es una cuestión de desbordamiento matemático. –

+0

¿Es absolutamente necesaria la diferenciación automática?Cada vez que lo he considerado, descubrí que diferenciar manualmente el algoritmo a mano es más sencillo, pero, una vez más, mis Hessians generalmente han sido bastante simples (como diagonales o computables mediante una fórmula analítica). –

Respuesta

1

En primer lugar debe decidir si quiero o calcular un Hessian escaso o algo más cercano a un Hessian completamente denso.

Si disperso es lo que desea, actualmente hay dos formas competitivas de hacerlo. Sólo usando la gráfica computacional de una manera inteligente, un barrido inverso de la gráfica computacional puede calcular la matriz de Hesse utilizando el algoritmo edge_pushing:

http://www.tandfonline.com/doi/full/10.1080/10556788.2011.580098

O puede probar con técnicas de coloración gráfico para compactar su matriz de Hesse en una matriz de menos columnas, a continuación, utilizar la acumulación inversa para calcular cada columna

http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.66.2603

Si lo que desea es una de Hesse densa (poco común en la práctica), entonces su probablemente mejor de cálculo de una columna de la Hesse en un tiempo usando la acumulación inversa (búsqueda de BRUCE CHRISTIANSON y acumulación inversa)

+0

Eso es bastante interesante. ¿Tienes una versión en pdf del primer artículo? –

-1

El método usual para aproximar la Hessian en 3 dimensiones es la BFGS

El método L-BFGS es similar.

Here puede encontrar el código fuente para L-BFGS (que calcula el Hessian como un resultado intermedio para resolver ODE) en varios idiomas (C#, C++, VBA, etc.) aunque no en python. Creo que no es fácil de traducir.

Si se va a traducir el ALG de otro idioma, prestar especial atención a los errores numéricos y realizar análisis de sensibilidad (que necesita para calcular la inversa de la matriz de Hesse)

Cuestiones relacionadas