No estoy seguro si esta pregunta pertenece aquí, pero está estrechamente relacionada con los métodos de gradiente en la optimización, que parece estar en el tema aquí. De todos modos, siéntase libre de migrar si cree que alguna otra comunidad tiene una mejor experiencia en el tema.
En resumen, estoy buscando un ejemplo paso a paso de diferenciación automática en modo inverso . No hay mucha literatura sobre el tema y las implementaciones existentes (como la de TensorFlow ) son difíciles de entender sin conocer la teoría detrás de esto. Por lo tanto estaría muy agradecido si alguien podría mostrar en detalle lo que pase en , la forma en que procesamos y lo que sacamos de la gráfica computacional.
Un par de preguntas con las que tengo más dificultades:
- semillas : ¿por qué las necesitamos?
- reglas de diferenciación inversa : sé cómo hacer una diferenciación hacia adelante, pero ¿cómo vamos hacia atrás? Por ejemplo, en el ejemplo de esta sección , ¿cómo sabemos que ?
- ¿trabajamos solo con símbolos o pasamos valores reales ? Por ejemplo, en el mismo ejemplo , ¿son y símbolos o valores?¯ w i
Respuestas:
Digamos que tenemos la expresión y queremos encontrar derivados y . El modo inverso AD divide esta tarea en 2 partes, a saber, pases hacia adelante y hacia atrás.z= x1X2+ pecado( x1) rezreX1 rezreX2
Pase adelantado
Primero, descomponemos nuestra expresión compleja en un conjunto de primitivas, es decir, expresiones que consisten en, a lo sumo, llamada de función única. Tenga en cuenta que también cambio el nombre de las variables de entrada y salida por coherencia, aunque no es necesario:
La ventaja de esta representación es que las reglas de diferenciación para cada expresión separada ya son conocidas. Por ejemplo, sabemos que la derivada de es , y entonces . Usaremos este hecho en el paso inverso a continuación.pecado cos rew4 4rew1= cos( w1)
Esencialmente, el pase directo consiste en evaluar cada una de estas expresiones y guardar los resultados. Digamos que nuestras entradas son: y . Entonces tenemos:X1= 2 X2= 3
Pase reverso
Aquí es donde comienza la magia, y comienza con la regla de la cadena . En su forma básica, la regla de la cadena establece que si tiene una variable que depende de que, a su vez, depende de , entonces:t ( u ( v ) ) tu v
o, si depende de través de varias rutas / variables , por ejemplo:t v tuyo
entonces (ver prueba aquí ):
En términos de gráfico de expresión, si tenemos un nodo final y nodos de entrada , y la ruta de a pasa por los nodos intermedios (es decir, donde ), podemos encontrar derivadas comoz wi z wi wp z=g(wp) wp=f(wi) dzdwi
En otras palabras, para calcular la derivada de la variable de salida wrt cualquier variable intermedia o de entrada , solo necesitamos conocer las derivadas de sus padres y la fórmula para calcular la derivada de la expresión primitiva .z wi wp=f(wi)
El pase inverso comienza al final (es decir, ) y se propaga hacia atrás a todas las dependencias. Aquí tenemos (expresión para "semilla"):dzdz
Eso puede leerse como "el cambio en da como resultado exactamente el mismo cambio en ", lo cual es bastante obvio.z z
Entonces sabemos que y así:z=w5
De la definición y las reglas de derivadas parciales, encontramos que . Así:w3=w1w2 dw3dw2=w1
Lo cual, como ya sabemos por pase adelantado, es:
Finalmente, contribuye a través de y . Una vez más, a partir de las reglas de derivadas parciales, sabemos que y . Así:w1 z w3 w4 dw3dw1=w2 dw4dw1=cos(w1)
Y de nuevo, dadas las entradas conocidas, podemos calcularlo:
Como y son solo alias para y , obtenemos nuestra respuesta:w1 w2 x1 x2
¡Y eso es!
Esta descripción se refiere solo a entradas escalares, es decir, números, pero de hecho también se puede aplicar a matrices multidimensionales como vectores y matrices. Dos cosas que uno debe tener en cuenta al diferenciar expresiones con tales objetos:
El poder de la diferenciación automática es que puede manejar estructuras complicadas de lenguajes de programación como condiciones y bucles. Sin embargo, si todo lo que necesita son expresiones algebraicas y tiene un marco lo suficientemente bueno como para trabajar con representaciones simbólicas, es posible construir expresiones completamente simbólicas. De hecho, en este ejemplo podríamos producir la expresión y calcular esta derivada para cualquier entrada que queramos.dzdw1=w2+cos(w1)=x2+cos(x1)
fuente