Conectamos capas. Aquí ves el "forward pass": el viaje completo de los datos desde la entrada hasta la predicción, número por número, sin saltarnos nada.
Para resolver XOR usamos una red diminuta de tres capas:
"MLP" = Multi-Layer Perceptron, el nombre clásico de esta arquitectura totalmente conectada.
Capa oculta (W₁, b₁): h₁: w=[0.20, 0.40] b=-0.10 h₂: w=[-0.30, 0.10] b=0.20 Capa de salida (W₂, b₂): ŷ: w=[0.50, -0.40] b=0.10 (un peso por cada neurona oculta: a₁ y a₂)
Vamos a seguir el dato sin saltarnos ni una sola operación. Lo dividimos en 4 micro-pasos: (A) suma de la capa oculta, (B) activación de la capa oculta, (C) suma de la salida, (D) activación de la salida.
Cada neurona oculta multiplica las entradas por sus pesos y suma el bias. Una operación a la vez:
Neurona h₁ — sus pesos son [0.20, 0.40], bias -0.10: producto de x₁: x₁ · w = 1 · 0.20 = 0.20 producto de x₂: x₂ · w = 0 · 0.40 = 0.00 sumo los productos: 0.20 + 0.00 = 0.20 sumo el bias: 0.20 + (-0.10) = 0.10 ← z₁ de h₁ Neurona h₂ — sus pesos son [-0.30, 0.10], bias 0.20: producto de x₁: x₁ · w = 1 · -0.30 = -0.30 producto de x₂: x₂ · w = 0 · 0.10 = 0.00 sumo los productos: -0.30 + 0.00 = -0.30 sumo el bias: -0.30 + (0.20) = -0.10 ← z₁ de h₂ z₁ = [0.10, -0.10]
Aplicamos la sigmoid a cada componente de z₁, y la sigmoid también la desarmamos paso a paso:
σ(z) = 1 / (1 + e^(-z)) Para z = 0.10 (neurona h₁): -z = -0.10 e^(-z) = e^(-0.10) = 0.904837 1 + e^(-z) = 1 + 0.904837 = 1.904837 1 / (...) = 1 / 1.904837 = 0.524979 ← a₁ de h₁ Para z = -0.10 (neurona h₂): -z = 0.10 e^(-z) = e^(0.10) = 1.105171 1 + e^(-z) = 1 + 1.105171 = 2.105171 1 / (...) = 1 / 2.105171 = 0.475021 ← a₁ de h₂ a₁ = [0.524979, 0.475021]
La neurona de salida toma a₁ como entrada. Sus pesos son [0.50, -0.40] y bias 0.10:
producto de a₁: 0.524979 · 0.50 = 0.262489 producto de a₂: 0.475021 · -0.40 = -0.190008 sumo los productos: 0.262489 + (-0.190008) = 0.072481 sumo el bias: 0.072481 + 0.10 = 0.172481 ← z₂
Una última sigmoid, otra vez desarmada:
Para z = 0.172481: -z = -0.172481 e^(-z) = e^(-0.172481) = 0.841574 1 + e^(-z) = 1 + 0.841574 = 1.841574 1 / (...) = 1 / 1.841574 = 0.543014 ŷ = a₂ = 0.543014
Los mismos 4 micro-pasos, ahora condensados en una tabla que se lee de izquierda a
derecha. Fíjate cómo la salida de la capa oculta (a₁, a₂) se
convierte en la entrada de la neurona de salida — así es como una neurona "se conecta"
con las otras:
| Capa | Neurona | ① productos (entrada · peso) | ② Σ | ③ + bias = z | ④ σ(z) = a |
|---|---|---|---|---|---|
| oculta | h₁ | x₁·w = 1 · 0.20 = 0.2000 x₂·w = 0 · 0.40 = 0.0000 |
0.2000 | + (-0.10) = 0.1000 | 0.524979 |
| h₂ | x₁·w = 1 · -0.30 = -0.3000 x₂·w = 0 · 0.10 = 0.0000 |
-0.3000 | + (0.20) = -0.1000 | 0.475021 | |
| salida | ŷ | a₁·w = 0.524979 · 0.50 = 0.262489 a₂·w = 0.475021 · -0.40 = -0.190008 |
0.072481 | + (0.10) = 0.172481 | 0.543014 |
ŷ). Sus
"entradas" ya no son x₁, x₂, sino a₁ = 0.524979 y
a₂ = 0.475021 — justo los resultados de la columna ④ de las neuronas ocultas. La
salida de una capa es la entrada de la siguiente. Eso es lo que significa que las neuronas estén
"conectadas".
Aplicando el mismo forward pass a las cuatro entradas posibles:
| x₁ | x₂ | XOR (target) | z₁ (oculta) | a₁ | ŷ (predicción) |
|---|---|---|---|---|---|
| 0 | 0 | 0 | [−0.10, 0.20] | [0.4750, 0.5498] | 0.5294 |
| 0 | 1 | 1 | [0.30, 0.30] | [0.5744, 0.5744] | 0.5393 |
| 1 | 0 | 1 | [0.10, −0.10] | [0.5250, 0.4750] | 0.5430 |
| 1 | 1 | 0 | [0.50, 0.00] | [0.6225, 0.5000] | 0.5526 |
Ya tienes el forward pass. Pero la red predice mal. En la lección 5 aprenderemos a medir cuán mal (la función de pérdida), que es el primer paso para corregirla.