32 · Codificación posicional (positional encoding)
La auto-atención es ciega al orden: trata una oración como un conjunto. La codificación posicional reinyecta el orden de la secuencia en los embeddings.
La auto-atención es equivariante a permutaciones — ve la secuencia como un CONJUNTO desordenado. La codificación posicional añade una señal dependiente de la posición para que el modelo conozca el ORDEN de los tokens.
Sin esto:
Sin codificación posicional, un transformer no puede distinguir 'dog bites man' de 'man bites dog' — el orden sería invisible.
La auto-atención tiene una propiedad que pasamos por alto: es equivariante a permutaciones. Si barajas los tokens de entrada, los tokens de salida se barajan de la misma forma — pero la representación calculada de cada token NO cambia. ¿Por qué? Mira la fórmula softmax(QKᵀ/√d_k)·V: está construida enteramente con productos punto por pares y sumas ponderadas, ninguno de los cuales hace referencia a DÓNDE está un token en la secuencia. Para la auto-atención, una oración es un conjunto desordenado de vectores, no una secuencia.
Eso es catastrófico para el lenguaje. "dog bites man" y "man bites dog" contienen exactamente los mismos tokens; sin señal posicional, la auto-atención produce representaciones idénticas para ambos. El orden — justo lo que carga el significado — es invisible. Debemos inyectar el orden de vuelta.
El Transformer original (Vaswani et al. 2017) hace esto con la codificación posicional sinusoidal: una matriz fija (no aprendida) PE de forma (seq_len, d_model) que se SUMA a los embeddings de los tokens. Cada posición pos y cada dimensión de embedding i recibe un valor de un seno o un coseno de una frecuencia dependiente de la posición:
PE(pos, 2i) = sin(pos / 10000^(2i/d_model))— dimensiones paresPE(pos, 2i+1) = cos(pos / 10000^(2i/d_model))— dimensiones impares
Las dimensiones bajas (i pequeño) oscilan rápido (longitud de onda corta); las dimensiones altas oscilan despacio (longitud de onda larga). Juntas dan a cada posición una "huella" única, suave y multi-frecuencia — muy parecido al conteo binario, donde el bit bajo cambia en cada paso y los bits altos cambian rara vez. Sumar esta huella al embedding permite que los productos punto de la atención se vuelvan conscientes de la posición.
Python (in browser)
Python runs entirely in your browser via Pyodide (~6 MB on first Run, cached after).
Python (in browser)
Mapa de calor de PE sinusoidal: las dimensiones bajas forman franjas rápidas (longitud de onda corta), las altas forman bandas lentas (longitud de onda larga) — cada fila es una huella única de posición
Python runs entirely in your browser via Pyodide (~6 MB on first Run, cached after).
Información posicional: sinusoidal (fija) vs absoluta aprendida vs RoPE (rotatoria, relativa — vista en el Capítulo 9)
Python (in browser)
Python runs entirely in your browser via Pyodide (~6 MB on first Run, cached after).
¿Por qué un Transformer necesita codificación posicional cuando una RNN no?
- La auto-atención es equivariante a permutaciones — trata la secuencia como un conjunto — así que un Transformer debe inyectar el orden mediante codificación posicional sumada a los embeddings.
- La PE sinusoidal usa sin en dimensiones pares y cos en dimensiones impares a través de frecuencias geométricas, dando a cada posición una huella única multi-frecuencia.
- Por ser una función fija de la posición, la PE sinusoidal puede extrapolar a longitudes de secuencia mayores que las vistas en entrenamiento; los embeddings absolutos aprendidos no.
Todo transformer añade una señal posicional antes de la primera capa de atención. El Transformer original y muchos modelos de voz usan PE sinusoidal; BERT/GPT usan aprendida; los LLMs modernos (LLaMA) usan RoPE.
Si lo quitas: Te confundiría por qué los transformers incluyen una entrada de 'posición' separada, y no podrías razonar sobre los límites de longitud de contexto ni por qué existen trucos de contexto largo como el escalado de RoPE.