Cómo entender las matemáticas del algoritmo de propagación hacia atrás en redes neuronales

Esta es una de las cosas que me vuelve loco. La “matemática” involucrada en la propagación hacia atrás no es realmente tan profunda (si lo desea, puede comprenderla inmediatamente después de su primer trimestre en la universidad). Solo requiere comprender 3 conceptos simples (que en realidad no son tan difíciles de comprender una vez explicados) y los usa.

Los conceptos son:

  1. Regla de cadena multivariable
  2. Derivados parciales de composición de funciones (es decir, la regla de la cadena de nuevo)
  3. Recursión y reutilización de cosas que ya ha calculado utilizando un bucle for (también conocido como programación dinámica)

en mi opinión, estos conceptos no son tan profundos en comparación con las matemáticas menos útiles pero más interesantes como la definición de los números reales (campo ordenado con la propiedad de límite superior mínimo) o el problema de detención (que hay cosas que los algoritmos no pueden resolver) /calcular). No se deje intimidar por el álgebra (y la pesadilla de notación) y muchas ecuaciones. Realmente no es complicado y se puede explicar en aproximadamente 1 hora (tal vez en 1.5 si necesita revisar qué gradiente y derivadas parciales son, ¡pero no se asuste, es realmente genial entenderlo! 😀). Podría pasar 1 hora escribiendo una explicación detallada, pero ya hay una. Entonces, en su lugar, le enviaré el enlace a la mejor explicación (de la notación y las matemáticas) que conozco:

entonces expresar esos cálculos en vectores no es tan difícil, solo apila los cálculos en vectores, con productos internos y multiplicaciones de matriz (¡o productos externos si notas que también puedes usar eso!) Creo que Andrew Ng tiene alguna discusión sobre esto. notas dispersas del codificador automático:

https://web.stanford.edu/class/c…

sin embargo, personalmente nunca me gustaron tanto esas notas. Además, creo que no discutió cómo vectorizar las cosas para GD de mini lotes.

Sin embargo, la idea principal para la propagación hacia atrás en una oración es:

Para calcular la derivada de una función que es recursiva y una composición, no sorprende que tenga que calcular derivadas de manera similar, de manera recursiva.

Para ahorrar tiempo en la computación, solo asegúrese de reutilizar sus cálculos a medida que avanza para poder calcular la derivada de manera más eficiente.

No te dejes intimidar, solo tiene muchos subíndices, realmente no es tan complicado 🙂

En la retropropagación, se toma una sola muestra y se propaga hacia adelante a través de la red neuronal (es decir, se multiplica por los parámetros theta de la red) para generar una hipótesis.

Luego toma la verdad básica para esa muestra (y, la “respuesta real”) y mide la diferencia entre la hipótesis de la red (basada en los parámetros theta) y la respuesta real. Ese es el error en la capa de salida, que será un vector de valores para cada elemento de la unidad de salida.

Ahora, ¿cuánto de ese error vino de cada parte de la capa oculta? Medimos eso como una variación en los valores de la matriz theta. La retropropagación se trata de asignar el error a los elementos de la red, es decir, los valores theta inexactos entre las capas.

Para asignar el error a la capa oculta, tome el error (delta) de la capa de salida (n + 1) y pregunte, “qué diferencia (correcciones) en la matriz theta entre la capa (n) y (n + 1) ¿necesitará producir ese error exacto? ” Este es un problema de álgebra multivariable simplemente resuelto mediante la transposición de la matriz theta que conduce a la capa (n) (pero ignorando el término de sesgo, ya que no es variable), y multiplicando esa matriz transpuesta por los errores. Mecánicamente, desea ELIMINAR la columna de la matriz Theta correspondiente al término de sesgo, ya que no propagará ni asignará errores al sesgo. Esto está cubierto en el tutorial ex4.

Una vez que haya ejecutado correctamente esta solución, tiene una matriz (delta de capital o theta_grad en el ejercicio) que representa el error producido por cada término de la matriz theta dada (parámetros de red) para esa muestra que producirá EXACTAMENTE el error observado en La capa de salida.

Ahora repite esto para CADA muestra y “acumula” el error, o agrega cada nueva matriz “theta_grad” a la suma de todas las matrices anteriores “theta_grad”.

Al final, divida cada elemento de la matriz acumulada por el número de muestras para obtener el error promedio de todas las muestras causadas por los parámetros dados de la red neuronal, theta.

Por cierto, su pregunta se formulará mejor en el panel de discusión de Coursera. Tenga en cuenta que la semana 5 está llena de errores: consulte el Wiki del curso y los paneles de discusión para obtener correcciones y sugerencias.

Estos son los enlaces importantes desde la parte superior, hilos bloqueados en “Todas las discusiones del curso”. Usalos, usalos a ellos.

Casos de prueba: https://www.coursera.org/learn/m

Tutoriales: https://www.coursera.org/learn/m

Wiki:

Sí, las matemáticas son confusas. Pero si pongo las matemáticas aquí, sin duda te volveré loco. Te sugiero que vuelvas al video de Andrew Ng. Sea claro con los subíndices y superíndices. Esa es la parte confusa según yo. Los superíndices denotan la capa y los subíndices denotan el peso en cada capa.

Nadie hace. No necesitas entenderlo. Es la práctica habitual en ingeniería. Algunas personas entienden un poco más y otras un poco menos. Ningún ingeniero tiene una comprensión completamente matemática de nada.

Además, creo que incluso la explicación sobre la minimización de la función de error es posterior al descubrimiento del algoritmo, por lo que incluso los científicos no necesitaban comprenderlo matemáticamente. Simplemente probaron que funciona y luego alguien más usó las matemáticas más tarde.

¿Has estudiado cálculo? Si no, será difícil. Si es así, es bastante fácil.

Todo se trata de una cosa. La regla de la cadena todopoderosa. (u • v) ‘= v’. u ‘• v eso es todo lo que hay que saber.

u (x) = relu (w2.x + b2)

v (x) = relu (w1.x + b1)

u • v (x) = relu (w2.relu (w1.x + b1) + b2)

En la pasada posterior, debe calcular (u • v) ‘(x)

Entonces, la cosa es que en la regla de la cadena, necesitas calcular v (x), esto se hizo durante el pase hacia adelante. Entonces puede reutilizarlo para ahorrar tiempo de cálculo. De esto se trata backprop.

En principio, calcular el gradiente es solo tomar derivadas parciales. Backprop utiliza el truco de mantener los cálculos intermedios durante el pase directo para reutilizarlos durante el paso de gradiente.

More Interesting

¿Qué estructura de datos se usa para calcular enteros muy largos, por ejemplo, el número primo más grande?

¿Alguien ha explorado el uso de autómatas celulares 2D en una superficie esférica sintonizada para proyectar un universo 3D dentro que simule la gravedad?

¿Cuál es una forma simple o intuitiva de entender por qué todos los números aleatorios son normales (Teorema de Borel)?

¿Cuál es tu identidad favorita en combinatoria?

¿Por qué las matemáticas son importantes para los informáticos?

En la universidad, ¿debería centrarme más en la teoría o la aplicación en los campos de la informática y las matemáticas?

Puedo tomar la teoría de grafos o la combinatoria el próximo semestre. Me interesa la informática teórica. ¿Cuál sería mejor?

Cuando los matemáticos desarrollan algoritmos, ¿están haciendo informática?

¿Cómo es ser un experto en matemáticas trabajando como ingeniero de software?

En términos simples, ¿qué es SOCP (programación de cono de segundo orden / programación semi-definida) y en qué se diferencia la optimización convexa de otros tipos de optimizaciones?

¿Cuál es la mejor herramienta para encontrar la representación matemática del sonido de guitarra?

¿Cómo se puede usar la función zeta de Riemann para generar números pseudoaleatorios?

Informática teórica: ¿se puede crear una máquina que sea más poderosa que una máquina de turing?

¿Por qué no todas las personas que son buenas en matemáticas también son buenas en programación de computadoras?

¿Por qué algunas funciones hash usan un número primo como base? ¿Cuál es el significado de usar un número primo? ¿Es para asignar unicidad y minimizar la colisión de valores hash?