$$
\definecolor{input}{RGB}{66, 133, 244}
\definecolor{output}{RGB}{219, 68, 55}
\definecolor{dinput}{RGB}{244, 180, 0}
\definecolor{doutput}{RGB}{15, 157, 88}
\definecolor{dweight}{RGB}{102, 0, 255}
$$
Algoritmo de propagación inversa
El algoritmo de propagación inversa es esencial para entrenar redes neuronales grandes con rapidez. En este artículo, se explica cómo funciona el algoritmo.
Desplázate hacia abajo...
Red neuronal simple
A la derecha, verás una red neuronal con una entrada, un nodo de salida y dos capas ocultas de dos nodos cada una.
Los nodos en las capas vecinas están conectados con pesos \(w_{ij}\), que son los parámetros de red.
Función de activación
Cada nodo tiene una entrada total \(\color{input}x\), una función de activación \(f(\color{input}x\color{black})\)y una salida \(\color{output}y\color{black}=f(\color{input}x\color{black})\).
\(f(\color{input}x\color{black})\) debe ser una función no lineal; de lo contrario, la red neuronal solo podrá aprender modelos lineales.
Una función de activación de uso común es la función sigmoidea: \(f(\color{input}x\color{black}) = \frac{1}{1+e^{-\color{input}x}}\).
Función de error
El objetivo es aprender las ponderaciones de la red automáticamente a partir de los datos, de manera que el resultado previsto \(\color{output}y_{output}\)
se acerque al objetivo \(\color{output}y_{target}\) de todas las entradas \(\color{input}x_{input}\).
Para medir qué tan lejos estamos del objetivo, usamos una función de error \(E\).
Una función de error de uso frecuente es \(E(\color{output}y_{output}\color{black},\color{output}y_{target}\color{black}) = \frac{1}{2}(\color{output}y_{output}\color{black} - \color{output}y_{target}\color{black})^2 \).
Propagación hacia adelante
Para comenzar, tomamos un ejemplo de entrada \((\color{input}x_{input}\color{black},\color{output}y_{target}\color{black})\) y actualizamos la capa de entrada de la red.
Para mayor coherencia, consideramos que la entrada es como cualquier otro nodo, pero sin una función de activación, por lo que su resultado es igual a su entrada, es decir, \( \color{output}y_1 \color{black} = \color{input} x_{input} \).
Propagación hacia adelante
Ahora, actualizamos la primera capa oculta. Tomamos el resultado \(\color{output}y\) de los nodos de la capa anterior y usamos las ponderaciones para calcular la entrada \(\color{input}x\) de los nodos de la siguiente capa.
$$ \color{input} x_j \color{black} = $$$$ \sum_{i\in in(j)} w_{ij}\color{output} y_i\color{black} +b_j$$
Propagación hacia adelante
Luego, actualizamos el resultado de los nodos en la primera capa oculta.
Para ello, usamos la función de activación, \( f(x) \).
$$ \color{output} y \color{black} = f(\color{input} x \color{black})$$
Propagación hacia adelante
Con estas 2 fórmulas, propagamos el resto de la red y obtenemos el resultado final de esta.
$$ \color{output} y \color{black} = f(\color{input} x \color{black})$$
$$ \color{input} x_j \color{black} = $$$$ \sum_{i\in in(j)} w_{ij}\color{output} y_i \color{black} + b_j$$
Derivada de error
El algoritmo de propagación inversa decide cuánto actualizar cada peso de la red después de comparar el resultado predicho con el deseado para un ejemplo en particular.
Para ello, debemos calcular cómo cambia el error con respecto a cada peso \(\color{dweight}\frac{dE}{dw_{ij}}\).
Una vez que tenemos las derivadas de error, podemos actualizar las ponderaciones con una regla de actualización simple:
$$w_{ij} = w_{ij} - \alpha \color{dweight}\frac{dE}{dw_{ij}}$$
donde \(\alpha\) es una constante positiva, conocida como tasa de aprendizaje, que debemos ajustar de forma empírica.
[Nota] La regla de actualización es muy simple: si el error disminuye cuando el peso aumenta (\(\color{dweight}\frac{dE}{dw_{ij}}\color{black} < 0\)), aumenta el peso; de lo contrario, si el error aumenta cuando el peso aumenta (\(\color{dweight}\frac{dE}{dw_{ij}} \color{black} > 0\)), entonces, disminuye el peso.
Derivadas adicionales
Para ayudar a calcular \(\color{dweight}\frac{dE}{dw_{ij}}\), también almacenamos para cada nodo dos derivadas más: cómo cambia el error con:
- la entrada total del nodo \(\color{dinput}\frac{dE}{dx}\) y
- el resultado del nodo \(\color{doutput}\frac{dE}{dy}\)
Propagación inversa
Comencemos a propagar de forma inversa las derivadas de error.
Dado que tenemos el resultado predicho de este ejemplo de entrada en particular, podemos calcular cómo cambia el error con ese resultado.
Dada nuestra función de error, \(E = \frac{1}{2}(\color{output}y_{output}\color{black} - \color{output}y_{target}\color{black})^2\) tenemos lo siguiente:
$$ \color{doutput} \frac{\partial E}{\partial y_{output}} \color{black} = \color{output} y_{output} \color{black} - \color{output} y_{target}$$
Propagación inversa
Ahora que ya \(\color{doutput} \frac{dE}{dy}\) podemos usar \(\color{dinput}\frac{dE}{dx}\) la regla de la cadena.
$$\color{dinput} \frac{\partial E}{\partial x} \color{black} = \frac{dy}{dx}\color{doutput}\frac{\partial E}{\partial y} \color{black} = \frac{d}{dx}f(\color{input}x\color{black})\color{doutput}\frac{\partial E}{\partial y}$$
donde \(\frac{d}{dx}f(\color{input}x\color{black}) = f(\color{input}x\color{black})(1 - f(\color{input}x\color{black}))\) cuando \(f(\color{input}x\color{black})\) es la función de activación sigmoidea.
Propagación inversa
En cuanto tengamos la derivada de error con respecto a la entrada total de un nodo, podemos obtener la derivada de error con respecto a las ponderaciones que entran en ese nodo.
$$\color{dweight} \frac{\partial E}{\partial w_{ij}} \color{black} = \frac{\partial x_j}{\partial w_{ij}} \color{dinput}\frac{\partial E}{\partial x_j} \color{black} = \color{output}y_i \color{dinput} \frac{\partial E}{\partial x_j}$$
Propagación inversa
Y si usamos la regla de la cadena, también podemos obtener \(\frac{dE}{dy}\) de la capa anterior. Hicimos un círculo completo.
$$ \color{doutput} \frac{\partial E}{\partial y_i} \color{black} = \sum_{j\in out(i)} \frac{\partial x_j}{\partial y_i} \color{dinput} \frac{\partial E}{\partial x_j} \color{black} = \sum_{j\in out(i)} w_{ij} \color{dinput} \frac{\partial E}{\partial x_j}$$
Propagación inversa
Todo lo que queda por hacer es repetir las tres fórmulas anteriores hasta que hayamos calculado todas las derivadas de error.