Retropropagación del gradiente

Rubén Rodríguez Abril

La crítica que Minsky dirigió hacia el Perceptrón de Rosenblatt dejó las investigaciones en redes neuronales en un estado de atonía durante dos décadas. Aunque se sabía que la solución al problema XOR pasaba por modelos de redes de más de una capa, esto obligaba al desarrollo de un mecanismo que permitiese el aprendizaje de las capas interiores de la red. Aquí es donde entró en juego el algoritmo de retropropagación del gradiente.

Retropropagación del gradiente

La retropropagación del gradiente es aquel procedimiento en cuya virtud los gradientes de la función de error son calculados en primer lugar para las neuronas de la capa de salida, y luego, sucesivamente, se computan para cada una de las capas anteriores, hasta llegar finalmente a la capa de entrada.

La aparición de este algoritmo fue esencial para el desarrollo de las redes neuronales multicapas. Tal y como demostraron Minsky y Seifert en su célebre libro Perceptrones (1969), el perceptrón de Rosenblatt y cualquier otra red neuronal de una sola capa no eran capaces de interpretar algunas funciones booleanas simples, como la puerta lógica XOR.

Aunque a partir del año 1965 (Ivakhnenko) aparecieron redes neuronales de varias capas capaces de sortear este problema, sin embargo no eran entrenables por medio del algoritmo del descenso del gradiente, ya que no era posible calcular directamente las derivadas de la función de pérdida en las capas interiores de la red. Esto provocó un impasse en el desarrollo de las redes neuronales artificiales (“invierno de la IA”), que sólo fue sorteado cuando, ya en los años 70, hizo su aparición el algoritmo de retropropagación, que sí permite calcular dichos valores para todas las neuronas de una red.

No hay nada parecido a la retropropagación en los sistemas nerviosos de los animales. Sus orígenes no se encuentran en la fisiología del cerebro sino en las teorías de grafos y de control de sistemas (cibernética). Se trata de un expediente introducido ad hoc en los perceptrones multicapas para permitir el aprendizaje supervisado de los mismos.

El algoritmo de retropropagación

Descomposición del gradiente

Como ya se señaló en artículos anteriores, el entrenamiento de las redes neuronales artificiales pivota en torno a la minimización de su función de pérdida, cuyo valor es el mismo para toda la red, y cuyas derivadas parciales respecto a los pesos sinápticos son utilizados para la actualización del valor de estos últimos. Cada una de estas derivadas parciales puede descomponerse, de acuerdo con la regla del producto de Leibniz, en tres factores diferentes:

\frac{∂E}{∂w_{ij}} = (\frac{∂E}{∂s_{j}})(\frac{∂s_{j}}{∂x_{j}})(\frac{∂x_{j}}{∂w_{ij}})

Donde E es la función de error, x_{j} la suma de excitaciones de la neurona n_{j}, s_{j} su nivel de activación, y w_{ij} el peso sináptico entre la neurona postsináptica n_{j} y la de la capa previa n_{i}. El segundo término (\frac{∂s_{j}}{∂x_{j}}) no es otra cosa que la derivada de la función de activación, mientras que el tercero, (\frac{∂x_{j}}{∂w_{ij}}), es la derivada de la función de excitación respecto al peso sináptico, es decir, el valor de entrada desde la neurona previa.

Dado lo generalizado del uso de la función rectificadora en neuronas de capas ocultas, estudiaremos la retropropagación en este caso particular. Para neuronas  que tienen el rectificador como función de activación (cuya derivada es la función de Heaviside H(x_{j})), la fórmula del gradiente toma la siguiente forma:

\frac{∂E}{∂w_{ij}} = (\frac{∂E}{∂s_{j}})H(x_{j})d_{i}
Neurona con función de activación rectificador

Los dos últimos factores del lado derecho de la ecuación, H(x_{j}) y d_{i}(la salida de la neurona previa), se calculan a partir de los datos de excitación de la propia neurona y su determinación no presenta ningún problema.

Aprendizaje en capas intermedias

Mayor dificultad plantea la expresión \frac{∂E}{∂s_{j}}, que parametriza la derivada de la función de pérdida respecto a los valores de salida de la neurona. Esta expresión sólo es calculable directamente en el caso de la capa de salida, pero no así en las intermedias. En estas últimas, su determinación sólo es posible gracias al algoritmo de retropropagación del gradiente, desarrollado de un modo general por el estudiante finés Seppo Linnainmaa en el año 1970 e introducido en el ámbito del aprendizaje profundo por Paul Werbos en el año 1975.

El delta de la neurona

Dentro de este algoritmo juega un papel fundamental una variable denominada delta de la neurona (δ_{j}), que es igual a la derivada de la función de pérdida respecto a la suma neta de excitaciones (\frac{∂E}{∂x_{j}}) recibida por la neurona. Determina hasta qué punto la suma total de excitaciones de una neurona particular ha contribuido a la generación de error en la red.

El delta de una neurona se caracteriza porque su valor puede calcularse a partir del de las neuronas de la capa siguiente. Por ello, nos basta con conocer el valor del delta de las neuronas de salida para calcular, mediante un procedimiento iterativo, el delta de las neuronas de cada una las capas interiores. Por ese motivo se habla de retropropagación del delta.

Neurona de salida y oculta, y le retropropagación del delta

Para hallar el gradiente respecto un peso sináptico w_{ij} es necesario multiplicar el delta de la neurona receptora x_{j} por la intensidad d_{i} del impulso transmitido a través de dicha sinapsis. El delta puede ser calculado directamente, a partir de la función de error, en las neuronas de salida, pero no así en las neuronas anteriores de las capas ocultas. En cada una de éstas, el delta de una neurona δ_{j} es calculado a partir de los deltas δ_{k} de las células de la capa inmediatamente posterior.

Para obtener el gradiente de la función de error respecto a un peso sináptico w_{ij} a partir del delta, basta con multiplicar éste por la intensidad (d_{i}) de la señal de la neurona aferente n_{i}:

\frac{∂E}{∂w_{ij}} = d_{i}δ_{j} = (\frac{∂E}{∂x_{j}})(\frac{∂x_{j}}{∂w_{ij}}) 

Cálculo del delta

El algoritmo de retropropagación se basa en la regla del producto de Leibniz, que aplicada al delta descompone a este último en dos factores:

δ_{j} = \frac{∂E}{∂x_{j}} = (\frac{∂E}{∂s_{j}})(\frac{∂s_{j}}{∂x_{j}})

El segundo de ellos es la derivada de la función de activación, cuyo cálculo no acarrea excesivas complicaciones, salvo las medidas expuestas en el artículo previo acerca de valores de este gradiente excesivamente bajos. Para el caso de una función de activación rectificadora tal gradiente es siempre 1 para un argumento positivo. Por lo que se refiere al primer factor, éste se calcula a partir de todos los deltas δ_{k} de las neuronas de la capa siguiente con las que esté conectada la neurona:

\frac{∂E}{∂s_{j}} = (\frac{∂E}{∂x_{k}})(\frac{∂x_{k}}{∂s_{k}}) = ∑δ_{k}w_{jk}
δ_{j}= (∑δ_{k}w_{jk})(\frac{∂s_{j}}{∂x_{j}})

Así pues, para calcular los deltas de una capa de neuronas, debemos multiplicar el vector de deltas de la capa siguiente con la matriz de pesos sinápticos de las conexiones. Y el resultado se debe de multiplicar por el vector con las derivadas de la función de activación para cada neurona de la capa.

Esquema de la propagación y la retropropagación del gradiente

Esquema completo de la propagación de los pulsos sinápticos (que se dirige hacia adelante) y de la retropropagación del gradiente (que corre en sentido inverso). Estas dos operaciones se realizan de modo consecutivo para cada nuevo dato que analiza la red. La actualización del peso sináptico sólo se realiza al concluir el lote, a partir de la media del gradiente.

Implementación de la retropropagación

Pasaremos ahora a mostrar un ejemplo de aplicación del mecanismo de retropropagación en una red multicapas. Utilizaremos el rectificador como función de activación de las neuronas interiores, softmax como función de activación de las neuronas de salida y la entropía cruzada como función de pérdida, una combinación muy recurrente en redes actuales:

Cálculo del delta en la neurona de salida

El delta de las neuronas de salida se define por la expresión siguiente:

δ_{k}= \frac{∂E}{∂s_{k}}

Como ya se señaló en artículos anteriores, en los sistemas de clasificación suele utilizarse la entropía cruzada como función de pérdida y softmax como función de activación. A menudo, si se trata de sistemas de clasificación de imágenes (por ejemplo árboles), todos los valores de v_{i} -la verdad subyacente- devienen nulos, salvo el correspondiente (v_{z}) a la categoría (la especie arbórea) a la que efectivamente pertenece la imagen, que es igual a uno. Entonces, la fórmula de la entropía cruzada deja de ser un sumatorio y queda simplificada:

E = – log  s_{z}
s_{z} = softmax(z) =\frac{e^{x_{z}}}{∑e^{x_{k}}}
E = -log  s_{z} = – log  \frac{e^{x_{z}}}{∑e^{x_{k}}} = log  e^{x_{z}}  –  log  ∑e^{x_{k}} = log  ∑e^{x_{k}}  –  x_{z}

donde x_{k} es el valor de excitación de cada neurona de salida y x_{z} es valor de excitación de la neurona que marca la categoría correcta y s_{z} su función de activación.

Neurona de salida desde la que se inicia la retropropagación

Los deltas de las neuronas de salida, que señalan la derivada de E respecto a la activación de la neurona correspondiente son, simplemente:

\frac{∂E}{∂x_{z}} = \frac{e^{x_{z}}}{∑e^{x_{k}}}  –  1
\frac{∂E}{∂x_{y}} = \frac{e^{x_{y}}}{∑e^{x_{k}}}

este último para cualquier neurona n_{y} de la capa de salida que no sea n_{z}. Así, pues, si utilizamos softmax como función de activación y la entropía cruzada como función de pérdida (es lo que sucede en redes como AlexNet), el delta de cada neurona equivale al valor de su activación, al que se le ha de restar uno cuando se trata de la neurona que señala la categoría acertada.

Cálculo de la función delta en las neuronas intermedias

Los deltas de las neuronas de una capas intermedia, se calculan a partir de los deltas de la capa inmediatamente posterior (de ahí la expresión de retropropagación del delta). Si se utiliza el rectificador como función de activación, ello se realiza con arreglo a esta ecuación:

δ_{j}= ∑(w_{jk}δ_{k})H(x_{j})

Donde δ_{j} el delta de la neurona n_{j} presináptica, w_{jk} es el peso de la conexión sináptica entre las neuronas n_{j} y n_{k} en la capa posterior, δ_{k} el delta de la neurona n_{k}, x_{j} la salida de la neurona presináptica cuyo delta queremos calcular, y H la función de Heaviside.

La cantidad que aparece en el primero de los paréntesis se obtiene a partir de valores de las neuronas de la capa posterior. Mientras que los impulsos nerviosos en una red se propagan hacia adelante desde las neuronas de entrada hasta las de salida, los deltas se retropropagan desde la salida de la red hacia las capas interiores.

Neurona de la capa oculta hacia la que se propaga el delta de la neurona de salida
Actualización de los pesos sinápticos.

La derivada del gradiente de un peso sináptico es igual al delta de la neurona multiplicado por la intensidad del pulso de la neurona aferente d_{i}.

\frac{∂E}{∂w_{ij}} = d_{i}δ_{j}

La modificación del peso sináptico tiene lugar al concluir el análisis de un lote. Entonces se realiza la media del gradiente en dicho lote y el resultado se multiplica por la tasa de aprendizaje (ascenso del gradiente) de la neurona o por el negativo (descenso del gradiente) de dicha tasa:

Δw_{ij} = -a([\frac{∂E}{∂w_{ij}}])
Δw_{ij} = a([\frac{∂E}{∂w_{ij}}])

Conclusiones

En resumidas cuentas, dentro de una red neuronal multicapas los impulsos nerviosos atraviesan toda la red en una única dirección, desde la capa de entrada hasta la salida (“red alimentada hacia adelante”), mientras que la actualización de los pesos sinápticos tiene lugar en la dirección contraria: comienza en las neuronas de salida, y va progresivamente, capa a capa, retrocediendo hacia la entrada. Ésta es la idea en torno a la cual pivotan la mayor parte de los sistemas de aprendizaje profundo existentes en la actualidad.

La aparición de los algoritmos de retropropagación fue un hito que permitió definitivamente la construcción de perceptrones multicapas, y el surgimiento de redes neuronales con una tipología más compleja, como las redes neuronales convolucionales (especializadas en el reconocimiento de patrones visuales) o las redes neuronales recurrentes (muchas de las cuales se usan en el procesamiento natural del lenguaje), que analizaremos con posterioridad en otros artículos de La Máquina Oráculo.

Lecturas Recomendadas

 – Linnainmaa, Seppo (1970). The representation of the cumulative rounding error of an algorithm as a Taylor expansion of the local rounding errors.

 – Schmidhuber, Jürgen (2020). Who invented Backpropagation?

 – Werbos, Paul (1994). The Roots of Backpropagation.

Aprende a programar redes neuronales desde cero.

La Máquina Oráculo utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies, pinche el enlace para mayor información.plugin cookies

ACEPTAR
Aviso de cookies