La propagación hacia delante es el recorrido que hace un dato desde la entrada hasta la salida de una red neuronal, avanzando capa por capa. En cada capa se multiplica un vector por una matriz de pesos, se suma un sesgo y se aplica una función de activación. El resultado de una capa alimenta a la siguiente hasta producir la predicción final. Comprender este flujo es el paso previo para entender cómo aprende la red. La misma explicación está disponible en inglés.

Fórmula clave $\mathbf{a}^{(l)} = f\!\left(\mathbf{W}^{(l)}\mathbf{a}^{(l-1)}+\mathbf{b}^{(l)}\right)$

Puntos clave

  • La propagación hacia delante transforma la entrada $\mathbf{x}$ en una predicción aplicando, en cada capa, la fórmula $\mathbf{a}^{(l)} = f!\left(\mathbf{W}^{(l)}\mathbf{a}^{(l-1)}+\mathbf{b}^{(l)}\right)$.
  • Cada capa hace tres operaciones: un producto de matriz por vector, la suma del sesgo y una función de activación no lineal.
  • El superíndice $(l)$ identifica la capa: $\mathbf{W}^{(1)}$ son los pesos de la primera capa y $\mathbf{a}^{(2)}$ la activación de la segunda.
  • Sin funciones de activación, apilar 2, 10 o 100 capas equivaldría a una sola transformación lineal.
  • La salida se compara con la respuesta correcta mediante una función de pérdida, y ese número es el punto de partida de la retropropagación.

¿Qué es la propagación hacia delante?

La propagación hacia delante (en inglés, forward propagation o forward pass) es el cálculo que lleva un ejemplo de entrada, a través de todas las capas, hasta la salida de la red. No hay aprendizaje en este paso: los pesos están fijos y solo se evalúa la función que define la red. Es la mitad del ciclo de entrenamiento; la otra mitad, la retropropagación, viene después.

El punto de partida es un vector de entrada $\mathbf{x}$, que renombramos como la activación de la capa cero: $\mathbf{a}^{(0)} = \mathbf{x}$. A partir de ahí, cada capa toma la activación anterior, calcula una suma ponderada y le aplica una no linealidad. Ese mecanismo de pesos, sesgos y suma ponderada lo detallamos en pesos, sesgos y la suma ponderada, y aquí lo encadenamos capa tras capa. Si quieres situar esta pieza dentro del recorrido completo, el mapa de las matemáticas de las redes neuronales muestra dónde encaja.

El cálculo capa por capa con matrices

Para una capa $l$ con activación previa $\mathbf{a}^{(l-1)}$, el cálculo se escribe en dos pasos:

$$\begin{aligned} \mathbf{z}^{(l)} &= \mathbf{W}^{(l)}\mathbf{a}^{(l-1)}+\mathbf{b}^{(l)} \quad \text{(suma ponderada, resultado lineal)}\ \mathbf{a}^{(l)} &= f!\left(\mathbf{z}^{(l)}\right) \quad \text{(activación, no linealidad)} \end{aligned}$$

Aquí $\mathbf{W}^{(l)}$ es la matriz de pesos de la capa, $\mathbf{b}^{(l)}$ el vector de sesgos y $f$ la función de activación (ReLU, sigmoide u otra). Las dimensiones tienen que encajar: si la capa $l$ tiene 4 neuronas y recibe 3 entradas, entonces $\mathbf{W}^{(l)}$ es una matriz de $4\times3$, $\mathbf{b}^{(l)}$ un vector de 4 componentes y $\mathbf{a}^{(l)}$ otro vector de 4. Ese producto de matriz por vector es la operación central, la misma que estudiamos en multiplicación de matrices en redes neuronales, y es la razón por la que las tarjetas gráficas aceleran tanto el aprendizaje profundo.

En la propagación hacia delante los pesos $\mathbf{W}$ y los sesgos $\mathbf{b}$ permanecen fijos: este paso solo evalúa la red, no la entrena. El ajuste de esos valores llega después, en la retropropagación.

Como lo definen Goodfellow, Bengio y Courville en su libro de referencia, «las redes profundas de propagación hacia delante son los modelos por excelencia del aprendizaje profundo». La propagación hacia delante es, literalmente, la definición de lo que la red calcula.

Notación de índices de capa

El superíndice entre paréntesis indica la capa, no una potencia. En una red de $L$ capas, $\mathbf{W}^{(1)}$ y $\mathbf{b}^{(1)}$ pertenecen a la primera capa oculta, y $\mathbf{W}^{(L)}$, $\mathbf{b}^{(L)}$ a la capa de salida. La activación de entrada es $\mathbf{a}^{(0)} = \mathbf{x}$ y la predicción final es $\mathbf{a}^{(L)}$.

Esta convención permite escribir toda la red como una única cadena de composiciones:

$$\mathbf{a}^{(L)} = f!\left(\mathbf{W}^{(L)}\cdots f!\left(\mathbf{W}^{(2)}f!\left(\mathbf{W}^{(1)}\mathbf{x}+\mathbf{b}^{(1)}\right)+\mathbf{b}^{(2)}\right)\cdots+\mathbf{b}^{(L)}\right)$$

La misma notación aparece en el tratamiento clásico de Michael Nielsen[1] y en la red neuronal prealimentada[2] que describe la Wikipedia. Mantener los índices ordenados evita el error más común al programar una red: confundir las dimensiones de dos matrices consecutivas.

Ver la derivación

Sin activación, dos capas encadenadas dan $\mathbf{W}^{(2)}\!\left(\mathbf{W}^{(1)}\mathbf{x}+\mathbf{b}^{(1)}\right)+\mathbf{b}^{(2)} = \left(\mathbf{W}^{(2)}\mathbf{W}^{(1)}\right)\mathbf{x}+\left(\mathbf{W}^{(2)}\mathbf{b}^{(1)}+\mathbf{b}^{(2)}\right)$, que vuelve a tener la forma $\mathbf{W}’\mathbf{x}+\mathbf{b}’$: una sola capa lineal. Por eso la no linealidad $f$ es imprescindible para que apilar capas añada capacidad.

Ejemplo numérico completo

Tomemos una red pequeña con 2 entradas, una capa oculta de 2 neuronas con activación ReLU y una salida con activación sigmoide. Partimos de la entrada $\mathbf{a}^{(0)} = [1, 2]$.

Capa 1, con $\mathbf{W}^{(1)} = \begin{bmatrix}0{,}1 & 0{,}3\ 0{,}2 & 0{,}4\end{bmatrix}$ y $\mathbf{b}^{(1)} = [0{,}1,\, 0{,}2]$:

$$\begin{aligned} z_1 &= 0{,}1\cdot1+0{,}3\cdot2+0{,}1 = 0{,}8 \quad \text{(primera neurona)}\ z_2 &= 0{,}2\cdot1+0{,}4\cdot2+0{,}2 = 1{,}2 \quad \text{(segunda neurona)}\ a_1 &= \operatorname{ReLU}(0{,}8)=0{,}8,\quad a_2=\operatorname{ReLU}(1{,}2)=1{,}2 \end{aligned}$$

La activación de la capa oculta es, por tanto, $\mathbf{a}^{(1)} = [0{,}8,\, 1{,}2]$. Ahora la capa de salida, con $\mathbf{W}^{(2)} = [0{,}5,\, -0{,}6]$ y $\mathbf{b}^{(2)} = 0{,}25$:

$$\begin{aligned} z^{(2)} &= 0{,}5\cdot0{,}8+(-0{,}6)\cdot1{,}2+0{,}25 = 0{,}4-0{,}72+0{,}25 = -0{,}07\ a^{(2)} &= \operatorname{sigmoide}(-0{,}07)\approx0{,}482 \end{aligned}$$

La red predice $0{,}482$, un valor entre 0 y 1 que podemos leer como una probabilidad. Todo el cálculo son 3 multiplicaciones por suma en la primera capa, 2 en la segunda y dos activaciones: nada más que aritmética encadenada. Con estos mismos pasos, repetidos millones de veces, un modelo como GPT-3 evalúa sus 175.000 millones de parámetros en cada pasada hacia delante.

De la propagación hacia delante a la función de pérdida

La predicción $\mathbf{a}^{(L)}$ por sí sola no dice si la red acierta. Para eso se compara con la respuesta correcta $y$ mediante una función de pérdida $L$. En nuestro ejemplo, si la etiqueta correcta fuese $y = 1$, la entropía cruzada binaria daría $L = -\ln(0{,}482) \approx 0{,}729$: cuanto más lejos de 1, mayor el castigo.

Ese número es la bisagra entre las dos mitades del entrenamiento. La propagación hacia delante produce la pérdida; a continuación, la retropropagación recorre la red en sentido inverso y calcula el gradiente $\nabla L$ respecto a cada peso, para que el descenso de gradiente ajuste $\mathbf{W}$ y $\mathbf{b}$ con una tasa de aprendizaje $\eta$. Ese siguiente paso lo situamos dentro del mapa completo de las matemáticas de la red.

Preguntas frecuentes

¿En qué se diferencia la propagación hacia delante de la retropropagación?

La propagación hacia delante va de la entrada a la salida y calcula la predicción y la pérdida con los pesos actuales. La retropropagación va de la salida a la entrada y calcula cómo cambiar esos pesos. Una evalúa la red; la otra la entrena. Siempre se ejecutan en ese orden: primero hacia delante, después hacia atrás.

¿Por qué necesitamos una función de activación no lineal?

Porque sin ella cada capa sería solo $\mathbf{W}^{(l)}\mathbf{a}^{(l-1)}+\mathbf{b}^{(l)}$, una operación lineal, y componer varias operaciones lineales da otra operación lineal. Apilar 100 capas no aportaría nada: la red no podría representar relaciones curvas. La no linealidad de $f$ es lo que da profundidad real a una red profunda.

¿Qué dimensiones deben tener las matrices de pesos?

Si la capa $l$ produce $n$ salidas a partir de $m$ entradas, $\mathbf{W}^{(l)}$ es una matriz de $n\times m$, $\mathbf{b}^{(l)}$ un vector de $n$ y $\mathbf{a}^{(l)}$ otro vector de $n$. La regla práctica: el número de columnas de $\mathbf{W}^{(l)}$ debe coincidir con el número de componentes de $\mathbf{a}^{(l-1)}$.

Conclusión

La propagación hacia delante es la parte de la red que muchos ya intuyen sin nombrarla: multiplicar por unos pesos, sumar un sesgo, activar y repetir. Escrita con matrices y con la notación de índices $(l)$, cabe en una sola línea, $\mathbf{a}^{(l)} = f!\left(\mathbf{W}^{(l)}\mathbf{a}^{(l-1)}+\mathbf{b}^{(l)}\right)$, y se generaliza a cualquier número de capas. El paso siguiente es cerrar el ciclo con la función de pérdida y la retropropagación, donde la red empieza de verdad a aprender.

Fuentes

  1. Michael Nielsen
  2. red neuronal prealimentada
  3. Deep Learning (Goodfellow, Bengio y Courville), capítulo 6
  4. Mathematics for Machine Learning (Deisenroth, Faisal y Ong)

Ruta: La neurona y las funciones de activación