6 votos

¿Cómo funciona la diferenciación algorítmica y dónde puede aplicarse?

El título lo dice todo, pero permítanme que lo amplíe. La diferenciación algorítmica parece ser un método que permite a un programa / compilador determinar cuál es la derivada de una función. Imagino que es una gran herramienta para cosas como la optimización, ya que muchos de estos algoritmos funcionan mejor si conocemos la función de coste y su derivada.

Sé que la diferenciación algorítmica no es lo mismo que la diferenciación numérica, ya que la derivada no es exacta. Pero, ¿es entonces lo mismo que la diferenciación simbólica, tal y como se implementa, por ejemplo, en SymPy, Matlab o Mathematica?

En segundo lugar, ¿dónde puede utilizarse realmente en finanzas cuantitativas? He mencionado la optimización, así que me viene a la mente la calibración. Las griegas también son una aplicación natural, ya que se trata de derivados por definición, pero ¿cómo funciona eso en el caso de Montecarlo? ¿Existen otras aplicaciones?

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 .

8voto

Norene Bult Puntos 41

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

Gracias, es una gran respuesta. Todavía estoy esperando que alguien más proporcione una lista de posibles aplicaciones, pero como usted ha dicho esto es probablemente sólo una lista de "en todas partes tiene un derivado".

1 votos

La técnica es especialmente popular en la comunidad de optimización, ya que es extremadamente fácil aplicar métodos similares a los de Newton para minimizar/encontrar root cuando se dispone de una herramienta de este tipo. Además, se utiliza en cálculos de elementos finitos no lineales, ya que el cálculo de tangentes en este contexto suele ser difícil y propenso a errores. En realidad, se trata de problemas de optimización que tienen un significado físico (por ejemplo, resolver problemas de valores límite de mecánica de sólidos equivale a minimizar un funcional de energía). Parece que se utiliza menos en problemas lineales, ya que el cálculo de tangentes suele ser sencillo.

Finanhelp.com

FinanHelp es una comunidad para personas con conocimientos de economía y finanzas, o quiere aprender. Puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X