¿Cómo funciona el algoritmo Backpropagation en una Red Neuronal? Parte II.

Enrique Blanco    24 octubre, 2019
Figura 1. #letsgetnastywithmaths

En el anterior post de esta serie comenzamos nuestra andadura para intentar resumir el algoritmo de backpropagation. En este nuevo post proseguiremos con una breve explicación de las cuatro ecuaciones fundamentales detrás de backpropagation que nos permitirán una total comprensión del algoritmo.

Las cuatro ecuaciones fundamentales de backpropagation

Backpropagation se trata de comprender cómo el cambio de los pesos y sesgos en una red impacta en la función de coste. En definitiva, esto significa calcular las derivadas parciales \frac{\partial C}{\partial w_{jk}^l } y \frac{\partial C}{ \partial b_j^l}. Pero para calcularlos, primero introducimos una cantidad intermedia, \delta_j^l, que podemos llamar el error en la j-ésima neurona de la capa l-ésima. Backpropagation nos dará un procedimiento para calcular el error \delta_j^l, y luego relacionarlo con \frac{\partial C}{\partial w_{jk}^l } y \frac{\partial C}{ \partial b_j^l} .

Para comprender cómo se define el error, imagine que hay un demonio en nuestra red neuronal:

Figura 1: Red neuronal con demonio.
Figura 1: Red neuronal con demonio.

El demonio se sienta en la j-ésima neurona en la capa l. A medida que entra la entrada a la neurona, el demonio juega con la operación de la neurona. Agrega un pequeño cambio \Delta z_j^l a la ponderación del input de la neurona, de modo que en lugar de generar \sigma(z_j^l ) la neurona produce \sigma(z_j^l+\Delta z_j^l). El cambio se propaga a través de las capas posteriores de la red, lo que finalmente causa que la función de coste cambie en una cantidad \frac{\partial C}{ \partial z_j^l} \Delta z_j^l .
Pero este demonio es un buen demonio y está tratando de ayudarnos a mejorar el coste, es decir, están tratando de encontrar un \delta z_j^l que lo reduzca. Suponga que \frac{\partial C}{ \partial z_j^l}   tiene un valor grande (ya sea positivo o negativo). Entonces el demonio puede reducir el costo bastante eligiendo \Delta z_j^l para tener el signo opuesto a \frac{\partial C}{ \partial z_j^l} \Delta z_j^l . Por el contrario, si \frac{\partial C}{ \partial z_j^l} \Delta z_j^l está cerca de cero, entonces el demonio no puede mejorar mucho la función de coste tocando z_j^l, por lo que tendrá a la neurona muy cerca del punto de equilibrio. Podemos entonces decir que \frac{\partial C}{ \partial z_j^l} \Delta z_j^l es una medida del error en la neurona.
Motivados por esta historia, definimos el error \delta_j^l de la neurona j en la capa l por:

\delta_j^l = \frac{\partial C}{\partial z_j^l}

Quizás se pregunte por qué el demonio está cambiando la entrada ponderada z_j^l. Seguramente sería más natural imaginar al demonio cambiando la activación de salida a_j^l, con el resultado de que estaríamos usando \partial C como nuestra medida de error. De hecho, si haces esto, las cosas funcionarán de manera bastante similar a la discusión a continuación. Pero resulta que la presentación backpropagation es un poco algebraicamente más complicada. Entonces nos quedaremos con \frac{\partial C}{ \partial z_j^l} como nuestra medida de error .

Plan de ataque

Backpropagation se basa en cuatro ecuaciones fundamentales. Juntas, esas ecuaciones nos dan una manera de calcular tanto el error \delta_j^l como el gradiente de la función de coste. A continuación, se declaran las cuatro ecuaciones.

Sin embargo, tengamos cuidado: no debemos esperar asimilar instantáneamente las ecuaciones. Tal expectativa conducirá a la decepción. De hecho, las ecuaciones de retropropagación son algo complejas, por lo que comprenderlas bien requiere tiempo y paciencia. La buena noticia es que esa paciencia se paga muchas veces. Por lo tanto, la discusión en esta parte es simplemente un comienzo, ayudándole en el camino hacia una comprensión profunda de las ecuaciones.

a. BP1: Una ecuación del error en la capa de salida, \delta^L.

\delta_j^l =  \frac{\partial C}{\partial a_j^L} \sigma'(z-j^L)

Esta es una expresión muy natural. El primer término a la derecha, \frac{\partial C}{ \partial a_j^l} , solo mide cómo de rápido está cambiando el coste en función de la activación de salida j-ésima. Si, por ejemplo, C no depende mucho de una neurona de salida particular, j, entonces \delta_j^L será pequeño, que es lo que podemos esperar. El segundo término a la derecha, \sigma' (z_j^L ), mide cómo de rápido la función de activación \sigma está cambiando en z_j^L.

Tenga en cuenta que todo en la ecuación BP1 se calcula fácilmente. En particular, calculamos z_j^L mientras calculamos el comportamiento de la red, y sólo es una pequeña sobrecarga adicional para calcular \sigma' (z_j^L ). La forma exacta de \frac{\partial C}{ \partial a_j^l} , por supuesto, dependerá de la forma de la función de coste. Sin embargo, siempre que se conozca la función de coste, debería haber pocos problemas de cálculo y entonces \frac{\partial C}{ \partial a_j^l}= (a_j^L-y_j) , que obviamente es fácilmente computable.

La ecuación BP1 es una expresión componente para \delta_j^L . Es una expresión perfectamente buena, pero no la forma basada en matriz que queremos para la propagación hacia atrás. Sin embargo, es fácil reescribir la ecuación en forma matricial, como:

\delta^L=\nabla_a C \odot \sigma'(z^L)

Puede pensar que \nabla_a C expresa la tasa de cambio de C con respecto a las activaciones de salida. Es fácil ver que la ecuación anterior y BP1 son equivalentes, y por esa razón a partir de ahora usaremos BP1 indistintamente para referirnos a ambas ecuaciones. Como ejemplo, en el caso del costo cuadrático tenemos \nabla_a C=(a_j^L-y_j), por lo que la forma completamente basada en matriz de BP1 se convierte en:

\delta^L = (a_j^L-y_j) \odot \sigma'(z^L)

b. BP2: Una ecuación del error \delta^l en términos del error de la siguiente capa, \delta^(l+1).

\delta^l = ( (w^{l+1} )^T \delta^{l+1}) \odot \sigma'(z^L)

donde (w^{l+1} )^T es la transposición de la matriz de peso w^{l+1} para la capa (l + 1). Esta ecuación parece complicada, pero cada elemento tiene una buena interpretación. Supongamos que conocemos el error \delta^{l+1} en la capa (l + 1). Cuando aplicamos la matriz de peso de transposición, (w^{l+1} )^T , podemos pensar intuitivamente en esto como mover el error hacia atrás a través de la red, dándonos algún tipo de medida del error en la salida de la capa l-ésima. Luego tomamos el producto Hadamard \odot  \sigma' (z^l ) . Esto mueve el error hacia atrás a través de la función de activación en la capa l, dándonos el error \delta^l en la entrada ponderada a la capa l.

Combinando BP1 y BP2 tenemos el error \delta^l de cualquier capa de la red. Empezamos usando BP1 para calcular el error \delta^L y aplicando BP2 las n veces que deseemos llegaremos a calcular el error \delta^{L-n} .

c. BP3: Una ecuación para calcula la tasa de cambio del coste con respecto a cualquier bias de la red,

\delta_j^l = \frac{\partial C}{\partial b_j^l}

Es decir, el error \delta_j^l es exactamente a la tasa de cambio \frac{\partial C}{ \partial b_j^l} . Esta es una gran noticia, ya que BP1 y BP2 ya nos han dicho cómo calcular \delta_j^l . Podemos reescribir BP3 en forma abreviada como:

\delta = \frac{\partial C}{\partial b}

Donde se entiende que \delta se evalúa en la misma neurona que el bias b.

d. BP4: una ecuación para la tasa de cambio de la función de coste con respecto a cualquier peso en la red,

\frac{\partial C}{\partial w_{jk}^l}=(a_k^{l-1} - \delta_j^l)

Esto nos dice cómo calcular las derivadas parciales \frac{\partial C}{ \partial w_{jk}^l} en términos de las cantidades \delta^l y a^{l-1}, que ya sabemos cómo calcular. La ecuación se puede reescribir en una notación menos pesada como índice:

\frac{\partial C}{\partial w}=a_{in}\delta_{out}

donde se entiende que a_{in} es la activación de la entrada de neuronas al peso w, y \delta_{out} es el error de la salida de neuronas del peso w. Al acercarnos para ver sólo el peso w, y las dos neuronas conectadas por ese peso, podemos representar esto como:

Figura 2: Dos neuronas conectadas por ese peso
Figura 2: Dos neuronas conectadas por ese peso

Una buena consecuencia de la ecuación anterior es que cuando la activación a_{in} es pequeña, a_{in}\sim 0 , el término de gradiente \frac{\partial C}{\partial w} también tenderá a ser pequeño. En este caso, diremos que el peso aprende lentamente, lo que significa que no cambiará mucho durante el descenso del gradiente. En otras palabras, una consecuencia de BP4 es que los pesos que salen de las neuronas de baja activación aprenden lentamente.

Hay otras ideas a lo largo de estas líneas que se pueden obtener de BP1 BP4. Comencemos mirando la capa de salida. Considere el término \sigma'(z_j^L) en BP1. Recuerde de la gráfica de la función sigmoide en el último capítulo que la función \sigma se vuelve muy plana cuando \sigma' (z_j^L) es aproximadamente 0 o 1. Cuando esto ocurra tendremos \sigma' (z_j^L )\sim 0. Y así la lección es que un peso en la capa final aprenderá lentamente si la neurona de salida es de baja activación (\sim 0) o alta activación (\sim 1). En este caso, es común decir que la neurona de salida se ha saturado y, como resultado, el peso ha dejado de aprender (o está aprendiendo lentamente). Observaciones similares también son válidas para los sesgos de la neurona de salida.
Podemos obtener información similar para las capas anteriores. En particular, tenga en cuenta el término \sigma' (z_j^L) en BP2. Esto significa que es probable que \delta^l se vuelva pequeño si la neurona está cerca de la saturación. Y esto, a su vez, significa que cualquier entrada de peso a una neurona saturada aprenderá lentamente.

Resumiendo

En resumen, hemos aprendido que un peso aprenderá lentamente si la neurona de entrada tiene baja activación o si la neurona de salida se ha saturado, es decir, tiene alta o baja activación. Ninguna de estas observaciones es demasiado sorprendente. Aun así, ayudan a mejorar nuestro modelo mental de lo que está sucediendo a medida que una red neuronal aprende.

Figura 3: Resumen de las ecuaciones de backpropagation
Figura 3: Resumen de las ecuaciones de backpropagation

En el siguiente post veremos cómo estas ecuaciones nos permiten dar con el buscado algoritmo, con el que podremos calcula el gradiente de la función de coste.

Para mantenerte al día con LUCA, visita nuestra página web,  suscríbete a LUCA Data Speaks o síguenos en TwitterLinkedIn YouTube.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *