He estado aprendiendo la red neuronal de retroalimentación y la propagación hacia atrás durante 3 meses y todavía no puedo entenderlo, ¿qué debo hacer?

Si comprende el tema del entrenamiento de redes neuronales, entonces no es difícil entender lo que está haciendo la propagación hacia atrás.

Dada una entrada [math] \ mathbf {x} [/ math] y la salida real [math] y [/ math], la pérdida [math] \ mathcal {L} \ left (f \ left (\ mathbf {x} , \ Theta \ right), y \ right) [/ math] es una medida de error de la salida predicha [math] f \ left (\ mathbf {x}, \ Theta \ right) [/ math], donde [math ] \ Theta [/ math] denota los parámetros de la red neuronal. A medida que [math] \ Theta [/ math] cambia, la salida predicha [math] f \ left (\ mathbf {x}, \ Theta \ right) [/ math] puede cambiar y, por lo tanto, para diferentes parámetros [math] \ Theta [/ math] obtenemos diferentes valores de la función de pérdida. El objetivo es encontrar los parámetros [matemática] \ Theta [/ matemática] que minimiza la pérdida. Una forma estándar de minimizar la función de pérdida es utilizar el descenso de gradiente estocástico, en el que actualizamos los parámetros [matemática] \ Theta [/ matemática] con la esperanza de avanzar hacia un mínimo. Sin embargo, para usar el descenso de gradiente estocástico, necesitamos los gradientes de la función de pérdida con respecto a los parámetros [matemática] \ Theta [/ matemática]. Una retropropagación es un método de cálculo de tales gradientes.

Piense en todo el proceso como un conjunto de cajas.

  • El primer cuadro es la pérdida [matemática] \ matemática {L} \ left (f \ left (\ mathbf {x}, \ Theta \ right), y \ right) [/ math] que queremos minimizar.
  • El segundo cuadro es el descenso de gradiente estocástico, que es un algoritmo utilizado para minimizar la función de pérdida.
  • El tercer cuadro es la propagación hacia atrás que se utiliza para calcular los gradientes, nos ayuda a tratar con el segundo cuadro.

La propagación hacia atrás es un nombre elegante dado al proceso de cálculo de los gradientes. Parece complejo ya que estamos tratando de encontrar las derivadas de la composición de funciones , que suele ser el caso con las redes neuronales. La regla de la cadena es una forma estándar de calcular dichos derivados. Por lo tanto, la propagación hacia atrás es esencialmente el cálculo de los gradientes de una función compuesta. Requiere solo cálculo elemental (saber tomar derivadas de funciones simples) y la regla de la cadena, y no matemática sofisticada.

He tratado de explicar la propagación hacia atrás en ¿Cómo funciona la propagación hacia atrás? Puedes echarle un vistazo si quieres. No he usado ninguna matemática complicada, solo requiere cálculo elemental.

Si todavía se siente incómodo con la propagación hacia atrás, le aconsejo que repase la regla de la cadena y luego vuelva a visitarla.

Puede encontrar útiles los siguientes recursos.

Redes neuronales y aprendizaje profundo.

CS231n Redes neuronales convolucionales para reconocimiento visual

Debe tratar de ver las redes neuronales como funciones formadas por otras transformaciones más simples organizadas de manera inteligente. También debe intentar derivar el algoritmo de retroproyección (backprop) para que pueda comprenderlo completamente. Intente incluso implementar la arquitectura de red neuronal feedforward + backprop desde cero.

Las redes neuronales de alimentación directa se pueden visualizar como solo una función que asigna la entrada a la salida como:

[matemáticas] y = f (x, w) [/ matemáticas]

Donde [matemática] y [/ matemática] = salida real, [matemática] f () [/ matemática] = red neuronal, [matemática] x [/ matemática] = entrada y [matemática] w [/ matemática] = pesos (parámetros )

La función [math] f [/ math] se alimenta con las capas [math] f_ {i} [/ math]. Suponiendo una red neuronal en capas [matemática] n [/ matemática] simple. Por lo tanto, la función tendrá transformaciones de capa [math] n [/ math]:

[matemáticas] y = f_ {n} (f_ {n-1} (… f_ {1} (x, w_ {1}) …, w_ {n-1}), w_ {n}) [/ matemáticas]

Así podemos ver que

[matemáticas] f (x, w) = f_ {n} (f_ {n-1} (… f_ {1} (x, w_ {1}) …, w_ {n-1}), w_ {n}) [/mates]

Donde [math] w = [w_1, w_2, …, w_ {n}] [/ math] es el conjunto de parámetros o pesos

Eso es lo que hace una red neuronal de avance.

Con el algoritmo de backprop, la idea es encontrar la derivada de un parámetro de peso con respecto a la función objetivo diferenciable definida [math] L [/ math]. Normalmente necesitamos minimizar la función objetivo, que normalmente se denomina función de pérdida o costo que mide el rendimiento de las redes neuronales.

Primero definamos una notación para nuestra red.

Los pesos están indexados como:

[matemáticas] w ^ {l} _ {ij} [/ matemáticas]

donde [matemática] l [/ matemática] = índice de capa, [matemática] i [/ matemática] = índice de nodo, [matemática] j [/ matemática] = índice de peso.

y

[matemáticas] x ^ {l} _ {ij} [/ matemáticas]

denota el elemento de entrada que se multiplica con ponderación [matemática] w ^ {l} _ {ij} [/ matemática].

Deje que [math] z [/ math] sea igual al producto escalar.

[matemáticas] z ^ {l} = punto (x ^ {l}, w ^ {l} [/ matemáticas])

que representa la transformación lineal en la capa [math] l [/ math] y:

[matemáticas] x ^ {l + 1} = \ varphi (z ^ {l}) [/ matemáticas]

Es la salida activada para la capa [matemática] l [/ matemática] que también es la entrada a la siguiente capa [matemática] l + 1 [/ matemática]. Con la notación fuera del camino, podemos seguir adelante para derivar backprop para nuestra red feedforward.

Deseamos evaluar

[matemática] \ frac {\ parcial L} {\ parcial w ^ {l} _ {ij}} [/ matemática]

Comenzamos usando la regla de la cadena

[matemáticas] \ frac {\ partial L} {\ partial w ^ {l} _ {ij}} = \ sum_ {k} ^ {m_ {l}} \ frac {\ partial L} {\ partial x ^ {l +1} _ {k}} \ frac {\ parcial x ^ {l + 1} _ {k}} {\ parcial w ^ {l} _ {ij}} [/ matemáticas]

Donde [math] m_ {l} [/ math] = número de neuronas en la capa [math] l [/ math].

[matemáticas] \ frac {\ partial L} {\ partial w ^ {l} _ {ij}} = \ sum_ {k} ^ {m_ {l}} \ frac {\ partial L} {\ partial x ^ {l +1} _ {k}} \ frac {\ partial x ^ {l + 1} _ {k}} {\ partial z ^ {l} _ {k}} \ frac {\ partial z ^ {l} _ { k}} {\ parcial w ^ {l} _ {ij}} [/ matemáticas]

Lo sabemos

[matemática] \ frac {\ parcial z ^ {l} _ {k}} {\ parcial w ^ {l} _ {ij}} = x ^ {l} _ {ij} [/ matemática]

Para [matemáticas] i = k [/ matemáticas] y cero de lo contrario

Así

[matemáticas] \ frac {\ partial L} {\ partial w ^ {l} _ {ij}} = \ frac {\ partial L} {\ partial x ^ {l + 1} _ {i}} \ frac {\ parcial x ^ {l + 1} _ {i}} {\ parcial z ^ {l} _ {i}} x ^ {l} _ {ij} [/ matemáticas]

Dónde

[matemáticas] \ frac {\ partial x ^ {l + 1} _ {i}} {\ partial z ^ {l} _ {i}} = \ frac {\ partial \ varphi (z ^ {l} _ {i })} {\ parcial z ^ {l} _ {i}} [/ matemáticas]

Es la derivada de la función de activación para la capa [math] l [/ math].

Nota: [matemática] x ^ {l + 1} _ {i} [/ matemática] es la salida activada del nodo [matemática] i [/ matemática] en la capa [matemática] l [/ matemática] que es la entrada a la capa [matemáticas] l + 1 [/ matemáticas].

Podemos escribir más

[matemática] \ frac {\ parcial L} {\ parcial x ^ {l + 1} _ {i}} = \ delta ^ {l} _ {i} [/ matemática]

Como el error de retroceso, es decir, el error que proviene de la capa de nivel superior [matemática] l + 1 [/ matemática].

Así

[matemáticas] \ frac {\ partial L} {\ partial w ^ {l} _ {ij}} = \ delta ^ {l} _ {i} \ frac {\ partial \ varphi (z ^ {l} _ {i })} {\ parcial z ^ {l} _ {i}} x ^ {l} _ {ij} [/ matemáticas]

Estamos a medio camino.

Por lo tanto, solo tenemos que descubrir cómo se propagan las [math] \ delta [/ math] a partir de las capas de alto nivel. Podemos seguir usando la regla de la cadena.

[matemática] \ delta ^ {l} _ {i} = \ frac {\ parcial L} {\ parcial x ^ {l + 1} _ {i}} [/ matemática]

[matemáticas] \ delta ^ {l} _ {i} = \ sum_ {k} ^ {m_ {l + 1}} \ frac {\ partial L} {\ partial x ^ {l + 2} _ {k}} \ frac {\ parcial x ^ {l + 2} _ {k}} {\ parcial x ^ {l + 1} _ {i}} [/ matemáticas]

Podemos escribir

[matemática] \ frac {\ parcial L} {\ parcial x ^ {l + 2} _ {k}} = \ delta ^ {l + 1} _ {k} [/ matemática]

Así

[matemáticas] \ delta ^ {l} _ {i} = \ sum_ {k} ^ {m_ {l + 1}} \ delta ^ {l + 1} _ {k} \ frac {\ partial x ^ {l + 2} _ {k}} {\ parcial x ^ {l + 1} _ {i}} [/ matemáticas]

Promover

[matemáticas] \ delta ^ {l} _ {i} = \ sum_ {k} ^ {m_ {l + 1}} \ delta ^ {l + 1} _ {k} \ frac {\ partial x ^ {l + 2} _ {k}} {\ parcial z ^ {l + 1} _ {k}} \ frac {\ parcial z ^ {l + 1} _ {k}} {\ parcial x ^ {l + 1} _ {i}} [/ matemáticas]

Pero sabemos que

[matemáticas] \ frac {\ parcial z ^ {l + 1} _ {k}} {\ parcial x ^ {l + 1} _ {i}} = w ^ {l + 1} _ {ki} [/ matemática ]

[matemáticas] \ delta ^ {l} _ {i} = \ sum_ {k} ^ {m_ {l + 1}} \ delta ^ {l + 1} _ {k} \ frac {\ parcial x ^ {l + 2} _ {k}} {\ parcial z ^ {l + 1} _ {k}} w ^ {l + 1} _ {ki} [/ matemáticas]

Dónde

[matemáticas] \ frac {\ partial x ^ {l + 2} _ {k}} {\ partial z ^ {l + 1} _ {k}} = \ frac {\ partial \ varphi (z ^ {l + 1 } _ {k})} {\ parcial z ^ {l + 1} _ {k}} [/ matemática]

Luego

[matemáticas] \ delta ^ {l} _ {i} = \ sum_ {k} ^ {m_ {l + 1}} \ delta ^ {l + 1} _ {k} \ frac {\ partial \ varphi (z ^ {l + 1} _ {k})} {\ parcial z ^ {l + 1} _ {k}} w ^ {l + 1} _ {ki} [/ matemáticas]

Así que hemos terminado, ahora ese es el algoritmo de backprop para las redes neuronales de avance.

Espero que esto ayude.

Lo que debes hacer es:

  1. Escriba la expresión de una red neuronal con n capas, con 1 salida final.
  2. Calcula el gradiente a mano.
  3. Exprésalo usando multiplicaciones matriciales.
  4. Implemente esto usted mismo en su idioma favorito.

More Interesting

¿Qué tan importante es Octave como primer paso en Machine Learning? ¿Se utiliza en la industria?

¿Cuál es la importancia de las redes residuales profundas?

¿Qué arquitectura / herramientas usan los gigantes tecnológicos como Facebook / Amazon / Apple / Microsoft para el análisis de big data / ML?

Cómo utilizar una GPU en mis algoritmos de aprendizaje automático de R

¿Existen aplicaciones reales de uso de Elastic Net?

¿Qué información se debe divulgar para caracterizar un conjunto de datos para la clasificación de texto?

¿LinkedIn utiliza Deep Learning?

¿Pueden los algoritmos de aprendizaje automático de análisis de datos reemplazar el trabajo realizado por los científicos de datos?

¿Cuáles son los criterios principales para la inicialización de los pesos en el aprendizaje profundo? Si quiero diseñar un algoritmo para la inicialización del peso, ¿qué factores debo tener en cuenta?

¿A qué se refiere el término "regresión" en "análisis de regresión"?

¿Necesito implementar modelos de aprendizaje profundo desde cero?

Si alguien sin experiencia en programación quisiera aprender algoritmos y aprendizaje automático, ¿cuáles serían las mejores fases de estudio e investigación? ¿Sería mejor comenzar con el aprendizaje de la codificación? ¿Con qué idioma es mejor comenzar?

¿El análisis de sentimientos basado en léxico se considera un método no supervisado?

¿Cuáles son los nuevos modelos de aprendizaje profundo que aparecen en los últimos años?

¿Cómo se usa LSTM para la clasificación?