Una neurona sola es débil. La magia aparece cuando pones varias en paralelo. Y al hacerlo, la suma ponderada se convierte en una multiplicación de matrices — la misma que viste en el Transformer.
Una capa es simplemente un grupo de neuronas en paralelo. Todas reciben las mismas entradas, pero cada una tiene sus propios pesos y bias, así que cada una calcula algo distinto.
Nuestra red XOR tiene una capa oculta de 2 neuronas: h₁ (la de la
lección 1) y una segunda, h₂. Ambas ven la entrada (x₁, x₂):
Neurona h₁: w = [0.20, 0.40] b = -0.10 Neurona h₂: w = [-0.30, 0.10] b = 0.20
Visto como un grafo: cada entrada se conecta con cada neurona, y cada conexión tiene su propio peso. Por eso hay 4 conexiones (2 entradas × 2 neuronas):
Fíjate: x₁ y x₂ llegan a ambas neuronas, pero por caminos
con pesos distintos. Esa red de conexiones con pesos es, literalmente, lo que guarda una capa.
Cada neurona hace su propia suma ponderada (lección 1):
Neurona h₁ (pesos [0.20, 0.40], bias -0.10): x₁ · w : 1 · 0.20 = 0.20 x₂ · w : 0 · 0.40 = 0.00 sumo: 0.20 + 0.00 = 0.20 + bias: 0.20 + (-0.10) = 0.10 Neurona h₂ (pesos [-0.30, 0.10], bias 0.20): x₁ · w : 1 · -0.30 = -0.30 x₂ · w : 0 · 0.10 = 0.00 sumo: -0.30 + 0.00 = -0.30 + bias: -0.30 + (0.20) = -0.10
Juntando las dos salidas en un vector: z = [0.10, −0.10]. Los corchetes [...] con números separados por coma son la forma de escribir un vector — simplemente una lista ordenada de números, como una fila de una tabla. ¿Te suena ese resultado? Es justo lo que anticipamos.
En vez de calcular h₁ y h₂ por separado, podemos apilar sus pesos en una matriz W (una columna por neurona) y hacerlo todo de un golpe. La regla es: el vector de entrada multiplica cada columna de la matriz, y cada resultado es la z de una neurona. Es decir: cada neurona es una fila del cálculo matricial. En el cálculo que sigue, z₁ viene de multiplicar la entrada por la columna 1 de W, y z₂ por la columna 2:
| x = [x₁, x₂] | × | W =
|
+ b = [-0.10, 0.20] |
columna 1 = pesos de h₁ | columna 2 = pesos de h₂
z = [1, 0] · W + b z₁ = (1·0.20) + (0·0.40) + (-0.10) = 0.10 ← h₁ z₂ = (1·-0.30) + (0·0.10) + (0.20) = -0.10 ← h₂ z = [0.10, -0.10]
x @ W que viste en Q, K, V del Transformer.
Tras la suma matricial aplicamos la activación a cada componente del vector (lección 2):
σ(z) = 1 / (1 + e^(-z)). La aplicamos a cada componente: Componente 1, z = 0.10: -z = -0.10 e^(-z) = 0.904837 1 + e^(-z) = 1.904837 1 / (...) = 0.524979 Componente 2, z = -0.10: -z = 0.10 e^(-z) = 1.105171 1 + e^(-z) = 2.105171 1 / (...) = 0.475021 a = [0.524979, 0.475021]
Ese vector a es la salida completa de la capa oculta para la entrada (1, 0).
Será la entrada de la capa de salida, que arma la predicción final.
El mismo cálculo, ahora como grafo de flujo con los valores reales corriendo por las conexiones:
Sigue un número: x₁=1 entra a h₁ multiplicado por 0.20,
x₂=0 entra por 0.40 (pero aporta 0). Sumado al bias da z=0.10,
y la sigmoid lo convierte en a₁=0.5250. Lo mismo, en paralelo, para h₂.
entrada → × W → + b → activación → salida
| Pieza | Forma en nuestra capa oculta |
|---|---|
| Entrada x | vector de 2 (x₁, x₂) |
| Matriz W | 2 × 2 (2 entradas → 2 neuronas) |
| Bias b | vector de 2 (uno por neurona) |
| Salida a | vector de 2 (a₁, a₂) |
activación(x · W + b). Varias neuronas en paralelo se computan de golpe como una multiplicación matricial: el vector de entrada x se multiplica por la matriz W (cuyos vectores-columna son los pesos de cada neurona) y se añade el bias b. Con entrada (1,0), la capa oculta de XOR produce a = [0.5250, 0.4750].
En la lección 4 conectamos esta capa con la de salida y hacemos el forward pass completo de la red.