Lección 4

De tabla a red

La tabla bigram es rígida: solo sabe lo que vio. Una red neuronal puede generalizar — predecir combinaciones que nunca vio antes. Eso es lo que hace posible el lenguaje.

1. El cocinero que solo sigue recetas

Imagina dos cocineros. El primero tiene un libro de recetas con todas las combinaciones exactas de ingredientes que alguna vez funcionaron. Si le pides un plato con un ingrediente nuevo que no está en su libro, responde "no sé" — no puede improvisar.

El segundo cocinero aprendió principios: qué sabores se complementan, cómo afecta la temperatura, cuándo una salsa necesita más acidez. Si le pides algo nuevo, puede razonar desde lo que sabe.

🍳 La tabla bigram es el primer cocinero. Si nunca vio "xz" en el dataset, P("xz") = 0 — no puede predecir nada. La red neuronal es el segundo cocinero: aprendió principios que le permiten interpolar patrones nuevos.

2. El problema concreto: combinaciones no vistas

El dataset tiene 32.000 nombres. Pero el número de posibles pares de caracteres es 27 × 27 = 729. La mayoría aparece en el dataset. Sin embargo:

Tabla vs Red · Diferencia conceptual
Comparación: tabla bigram vs red neuronal Izquierda: tabla rígida con celdas discretas. Derecha: red neuronal con conexiones continuas y pesos ajustables. Tabla Bigram ae inr a e i n r 0 5% 4% 28% 14% 8% 2% 4% 30% 15% 20% 4% 1% 20% 10% 35% 20% 10% 3% 5% Valores enteros fijos No aprenden. No generalizan. Red Neuronal (MLP) entrada oculta 27 logits w = 3.7, -1.2... Aprenden. Generalizan.

La tabla tiene valores fijos (conteos). La red tiene pesos continuos que se ajustan durante el entrenamiento para minimizar el error.

3. train1.py — el primer MLP

El modelo train1.py de Karpathy reemplaza la tabla por una red de 3 capas muy simple:

Forward pass del MLP · train1.py
Forward pass del MLP de train1.py Cinco cajas conectadas: token de entrada, embedding, capa oculta con ReLU, logits, softmax. TOKEN 10 (k) EMBEDDING 16 números wte[10] CAPA OCULTA 16×W + ReLU 16 activaciones LOGITS 27 números uno por token SOFTMAX 27 probs suman 1.0

El token de entrada se convierte en un embedding (vector de 16 números), pasa por una capa oculta con ReLU, produce 27 logits (uno por posible siguiente carácter) y softmax convierte los logits en probabilidades.

¿Qué es ReLU?

ReLU (Rectified Linear Unit) es la función de activación más simple que existe. Su regla: si el número es negativo, devuelve cero; si es positivo, lo devuelve igual.

✍️ ReLU con números concretos
ReLU(x) = max(0, x)

Ejemplos:
  ReLU(-3.5) = 0.0   ← negativo → aplana a cero
  ReLU(-0.1) = 0.0   ← negativo → aplana a cero
  ReLU(0.0)  = 0.0   ← exactamente cero → cero
  ReLU(2.7)  = 2.7   ← positivo → pasa igual
  ReLU(8.1)  = 8.1   ← positivo → pasa igual

¿Por qué necesitamos ReLU?
Sin activación no lineal, apilar capas lineales no sirve de nada:
  capa2(capa1(x)) = W2(W1·x) = (W2·W1)·x = una sola capa lineal

Con ReLU entre capas, la red puede aprender patrones no lineales
(como que "k" antes de vocal tiene un patrón distinto a "k" antes de consonante).
      

🎮 Pruébalo: tabla vs red

Los dos modelos reciben el mismo carácter inicial. El bigram solo mira ese carácter. El MLP usa un embedding de 16 dimensiones que captura más contexto.

Bigram (tabla)
MLP (red neuronal)

* El MLP es simulado con distribuciones entrenadas. En el código real, los pesos se aprenden por gradiente.

4. Lo que aprendiste

En esta lección:
  • La tabla bigram no puede generalizar — si no vio un patrón, no puede predicirlo.
  • train1.py introduce un MLP: token → embedding → capa oculta → logits → softmax.
  • Los pesos de la red son números continuos (ej: 3.7, -1.2) que se ajustan durante el entrenamiento.
  • ReLU es la función de activación que permite que apilar capas tenga sentido.