PASO 3b · COMPLEMENTO VISUAL

¿Por qué esa fórmula? Desarmemos el positional encoding visualmente

Vamos a ver, gráfico por gráfico, qué hace cada pedazo de la fórmula y qué pasa si cambias la constante 10000.

La fórmula que vamos a destripar

PE(pos, 2i) = sen(pos / B2i/d)
PE(pos, 2i+1) = cos(pos / B2i/d)

En el paper original, B = 10000. Llamo a esa constante "B" (por Base) en esta página, porque vamos a variarla y ver qué pasa.

Las preguntas que vamos a responder:

  1. ¿Qué pasa visualmente en cada dimensión cuando avanza la posición?
  2. ¿Por qué necesitamos muchas frecuencias distintas?
  3. ¿Por qué elevar a una potencia exponencial (B^(2i/d)) y no simplemente "multiplicar por i"?
  4. ¿Qué pasa si cambio el valor de B (10000)?

Visualización 1: cada dimensión es una onda con su propia velocidad

Olvidemos el "vector" por un momento. Cada dimensión del positional encoding es una onda independiente, que se mueve a su propia velocidad a medida que avanza la posición.

En el siguiente gráfico, el eje horizontal es la posición (0, 1, 2, ..., 50). Cada curva de color es una dimensión distinta:

🎮 Activa/desactiva las dimensiones para ver cómo se comportan

Observaciones clave:
  • La dim 0 oscila muy rápido. Cada paso de posición la mueve mucho.
  • La dim 7 (la última) apenas se mueve en todo el rango de posiciones. Es casi una línea recta.
  • Las dimensiones intermedias tienen velocidades intermedias.
Esto NO es casualidad: la fórmula está diseñada exactamente para producir esta variedad de velocidades.

Visualización 2: la "escalera de frecuencias"

Cada dimensión tiene un período: cuántas posiciones tarda en completar un ciclo (volver al mismo valor). Vamos a ver el período de cada dimensión en barras:

Cada barra muestra el período de esa dimensión en escala logarítmica. Fíjate: la longitud crece exponencialmente. Esto es lo que el "10000^(2i/d)" produce.

¿Por qué exponencial y no lineal?

Una alternativa "obvia" sería usar frecuencias lineales: dim 0 → período 10, dim 1 → período 20, dim 2 → período 30, etc. Pero esto tendría un problema: con 8 dimensiones cubrirías solo el rango de períodos 10 a 80. No podrías distinguir tokens lejanos en una secuencia de 5000.

Con la fórmula exponencial, 8 dimensiones cubren desde períodos de ~6 hasta ~60000. Cada dimensión "se especializa" en una escala temporal distinta:

Con escalas exponenciales (la fórmula real)

Períodos: 6, 25, 100, 400, 1600, 6400, 25600, 100000...
Cubre 5 órdenes de magnitud con solo 8 dimensiones.

Con escalas lineales (alternativa mala)

Períodos: 10, 20, 30, 40, 50, 60, 70, 80...
Solo cubre 1 orden de magnitud. Tokens más lejos de 80 no se distinguen bien.

Por qué exponencial es genial: permite "cubrir" muchas escalas de distancia (cercanas Y lejanas) con muy pocas dimensiones. Es la misma idea que usar una regla logarítmica: con pocas marcas puedes representar valores desde 1 hasta 10000.

Visualización 3: cada posición es una combinación única de valores

Tomando un "corte vertical" del gráfico anterior en una posición específica, obtenemos el vector PE de esa posición. Como cada dimensión está en una fase distinta, el patrón completo de valores es único para cada posición.

5

Comparando dos posiciones

Ahora veamos cómo se compara el vector PE de dos posiciones distintas. Si están cerca, sus vectores deberían parecerse; si están lejos, deberían ser distintos.

Visualización 4: ¿Qué pasa si cambio la constante 10000?

Esta es la pregunta más interesante. ¿Por qué 10000 y no 100? ¿O 1,000,000? Vamos a ver qué consecuencias tiene cada elección.

🎮 Slider gigante para ver el efecto en vivo

B = 10000

Heatmap (filas = posiciones, columnas = dimensiones)

Diagnóstico automático

Casos extremos: qué pasa con valores muy bajos o muy altos

Si B es muy pequeño (ej: B = 10)
  • El "rango" de períodos es chico: incluso las dimensiones altas oscilan rápido.
  • Todas las dimensiones empiezan a parecerse después de pocas posiciones.
  • El modelo no puede distinguir tokens en posiciones lejanas: pos=50 y pos=200 podrían tener vectores muy similares.
  • Funciona para secuencias cortas, pero falla para textos largos.
Si B es muy grande (ej: B = 1,000,000)
  • Las dimensiones altas son casi constantes en todo el rango útil.
  • Ese "casi constante" es información desperdiciada: esas dimensiones no aportan nada para distinguir posiciones.
  • El modelo usa menos dimensiones efectivas → menos resolución.
Por qué 10000 funciona bien
  • Con B=10000 y d=512 (típico en BERT), el período máximo es ~62,832 — suficiente para distinguir tokens dentro de secuencias de hasta varios miles, que es lo que se usa en NLP.
  • Es el "Goldilocks": ni tan chico que pierda información a larga distancia, ni tan grande que desperdicie dimensiones.
  • Los autores lo eligieron de forma empírica (probaron varios valores) — no hay magia matemática en el número específico 10000. Si entrenas un modelo con secuencias mucho más largas (ej: 100k tokens), tendría sentido usar una B más grande.

Curiosidad: los LLMs modernos que manejan contextos muy largos (Claude, GPT con 200k tokens) suelen usar variantes que ajustan esta base. Por ejemplo, en RoPE, técnicas como "NTK-aware scaling" modifican la base efectiva para extender el modelo a contextos más largos que aquellos con los que fue entrenado.

✅ Resumen visual

Las claves de la fórmula de positional encoding, ahora con tu intuición visual:

  1. Cada dimensión es una onda con su propia velocidad. Cada combinación de valores hace que cada posición tenga una "huella digital" única.
  2. Las velocidades están en escala exponencial (no lineal). Esto permite cubrir muchas escalas de distancia (corta + media + larga) con pocas dimensiones.
  3. La constante 10000 determina el "rango" del modelo. Más grande = puede distinguir tokens más lejanos pero pierde resolución corta. Más chico = al revés.
  4. Alternar sen y cos en dims pares/impares duplica la información disponible para cada frecuencia (al modelo le ayuda saber tanto el seno como el coseno del mismo ángulo).
La fórmula no es mágica. Es una elección de diseño que combina propiedades útiles: acotada, suave, periódica, multi-escala y libre de parámetros entrenables. Cualquier elección que cumpla esas propiedades funcionaría — esta es solo una particular que los autores demostraron empíricamente que es buena.