La Diferenciación Automática (también conocida como AD) es una familia de métodos que se utilizan para evaluar la derivada de una función codificada. Estos métodos son mucho más precisos que las diferencias finitas, ya que son teóricamente exactos en ausencia de error de redondeo en coma flotante.
Sin embargo, la AD es sutilmente diferente de la diferenciación simbólica. La diferencia clave aquí es que los sistemas de álgebra computacional (como Mathematica) devolverán una función que puede ser evaluada para una derivada. En muchas implementaciones de la diferenciación automática, sin embargo, la derivada se calcula como un efecto secundario de la evaluación de la función original.
Hay varias formas de aplicar la AD, que se describen con bastante detalle en la página de la wikipedia.
https://en.wikipedia.org/wiki/Automatic_differentiation
Método de aplicación simple
Quizá el método más sencillo de implementar AD sea el uso de "números duales" y la sobrecarga de operadores. La idea clave es introducir un nuevo tipo de número escalar, denominado número dual. El número dual aumenta el álgebra de los números reales sustituyendo cada número por $x$ con $x + x' \epsilon$ donde $\epsilon$ tiene la propiedad $\epsilon^2 = 0$ .
A partir de aquí, se puede definir el álgebra de los números duales como cabría esperar:
\begin{align} (u+u'\epsilon) + (v + v'\epsilon) &= (u+v) + (u' + v')\epsilon \\ (u+u'\epsilon) - (v + v'\epsilon) &= (u-v) + (u' - v')\epsilon \\ (u+u'\epsilon) * (v+v'\epsilon) &= (uv) + (uv' + vu')\epsilon \\ (u + u'\epsilon) / (v+v'\epsilon) &= (u/v) + \frac{u'v - uv'}{v^2}\epsilon \end{align}
Consulte la página de la wikipedia para conocer las extensiones de esta función a otras ( $\sin$ , $\cos$ , $\exp$ , ...)
El lector avispado se dará cuenta de que el $\epsilon$ del resultado de cualquier operación entre números duales implementa la regla de la cadena para esa operación. Gracias a ello, cualquier secuencia de operaciones (es decir, una función codificada) calculará simultáneamente el valor de la función y su derivada. La única pérdida de precisión en la que se incurre con este método son los errores de redondeo en coma flotante (por lo que sigue siendo necesario utilizar algoritmos numéricamente estables).
Por el lado del software, la carga principal es la implementación de una clase Dual Number y sobrecargar cualquier operador/función que se desee utilizar. Además, cualquier función que desee diferenciar debe ser (en lenguaje C++) templada en el tipo de entrada. Por ejemplo, en lugar de:
double f(double x) { ... }
escribirías
template<typename T>
T f(T x) {...}
Si lo hace, podrá reutilizar el mismo código para realizar llamadas a funciones normales o a funciones AD.
Código de ejemplo
Aquí tienes un enlace a mi implementación en C++ del método que utilizo en mi biblioteca de elementos finitos. El código es libre de tomar/usar/modificar si lo deseas. Tendrás que quitar la cabecera no estándar y las líneas de apertura/cierre del espacio de nombres, pero no debería tener ninguna dependencia con el resto de la librería.
https://github.com/tjolsen/YAFEL/blob/master/include/utils/DualNumber.hpp
Reflexiones finales
Las ideas aquí descritas pueden generalizarse a entradas/salidas con valores vectoriales. De este modo, se pueden calcular los jacobianos sin tener que derivar cuál debe ser cada derivada parcial. Dependiendo de la dimensión de las entradas y salidas, otros métodos que el método del Número Dual descrito aquí pueden ser más eficientes, por lo que vale la pena leer sobre ello con más detalle.
0 votos
Sí, creo que es lo mismo que la diferenciación simbólica, como en Mathematica y Maple, por ejemplo.
0 votos
Mi respuesta cubre razonablemente bien el "cómo funciona" (o más exactamente, cómo puede funcionar), creo, pero omití la parte de "dónde puede aplicarse" porque se estaba alargando. La respuesta corta es: "en cualquier sitio donde tengas una función y quieras su derivada". Es un método bastante general y sencillo, así que no deberías encontrar demasiados obstáculos cuando lo utilices.
0 votos
Ya que pregunta por las aplicaciones: Aquí tienes una pregunta en la que mi respuesta sugiere aplicar la diferenciación automática al cálculo de los cumulantes de modelos de valoración de opciones con funciones características conocidas. Estos últimos son a menudo necesarios para la calibración para encontrar límites de integración, ... quant.stackexchange.com/questions/22446 .