programa
Imagina intentar leer una novela donde cada palabra de la página está desordenada al azar. Aunque entiendas cada palabra, la trama se pierde por completo porque el orden de las palabras determina el significado. Cuando los ingenieros empezaron a diseñar modelos de lenguaje grandes (LLMs), se toparon con un obstáculo similar. ¿Cómo enseñas a un modelo a entender la secuencia de palabras cuando su mecanismo central lo procesa todo a la vez?
Aquí es donde entra en juego la codificación posicional. En este artículo, exploraremos cómo funciona por dentro y cómo dota a los transformers de sentido del orden. Veremos su evolución desde las fórmulas sinusoidales originales hasta los embeddings rotacionales modernos y cómo implementarla en tu próximo proyecto de machine learning. Si eres nuevo en la arquitectura subyacente, te recomiendo empezar por nuestra guía sobre cómo funcionan los transformers.
Domina el Aprendizaje Profundo en Python
¿Qué es la codificación posicional?
La codificación posicional es una técnica para que las redes neuronales comprendan el orden secuencial de los datos de entrada. Actúa como un conjunto de coordenadas que representa la posición relativa o absoluta de un token y se fusiona con la representación estándar de los datos.
Antes de que el texto entre en una red neuronal, las palabras se convierten en formatos numéricos continuos llamados embeddings. Sin embargo, los embeddings estándar solo capturan el significado semántico: no indican nada sobre la posición de una palabra en un texto. Puedes aprender exactamente cómo funciona este proceso con nuestro curso Introduction to Embeddings with the OpenAI API.
Una codificación posicional es una capa matemática adicional que se añade directamente a estos embeddings de tokens. Al combinar la representación semántica con un sello posicional, el modelo transformer puede distinguir entre palabras idénticas que aparecen en distintas partes de una frase.
El problema de la invariancia por permutación
Los datos secuenciales dependen mucho del orden. En lenguaje natural, la frase "el perro mordió al hombre" tiene un significado radicalmente distinto a "el hombre mordió al perro".

Históricamente, las Redes Neuronales Recurrentes (RNN) y las Long Short-Term Memory (LSTM) lo manejaban de forma inherente. Procesaban los tokens secuencialmente: la red ingería matemáticamente la segunda palabra solo tras terminar con la primera. Del mismo modo, las Redes Neuronales Convolucionales (CNN) procesan datos con ventanas deslizantes locales que capturan la disposición espacial de píxeles o palabras vecinas.
Los transformers abandonan por completo el procesamiento secuencial. Procesan todos los tokens en paralelo. El motor central de un transformer es el mecanismo de self-attention, que calcula puntuaciones de relación por pares entre cada token de la secuencia al mismo tiempo. Matemáticamente, el self-attention es invariante por permutación. Si barajas la secuencia de entrada, el mecanismo producirá exactamente las mismas puntuaciones de atención para los pares de palabras.
Sin un mecanismo que preserve el orden, el modelo pierde por completo la información secuencial. El significado semántico colapsa en una bolsa de palabras desordenada. La codificación posicional resuelve la invariancia por permutación alterando forzosamente los vectores de entrada para que el mecanismo de self-attention registre de forma distinta los tokens en la posición 1 y los de la posición 10.
¿Cómo funciona la codificación posicional?
La codificación posicional actúa modificando matemáticamente los vectores de los tokens de entrada antes de que lleguen a las capas de self-attention. Así, el modelo calcula relaciones basadas tanto en el significado como en la posición.
Construyamos algo de intuición. Imagina los embeddings estándar como una tarjeta con tu nombre en un congreso. La tarjeta te dice quién es la persona, pero dónde está en el congreso no cambia quién es ni sus relaciones con otras personas. La codificación posicional es como añadir el número de asiento a esa tarjeta. Al combinarlas, sabes quién es y dónde está sentada. Esto añade contexto a las posibles interacciones que podría tener en el evento.
En un transformer, esta combinación suele hacerse con una simple suma elemento a elemento. El modelo toma el vector de embedding semántico de una palabra y le suma un vector de codificación posicional del mismo tamaño. El vector resultante contiene una modulación sutil que las capas posteriores aprenden a interpretar como coordenadas espaciales.
Cálculo de ejemplo
Veamos un ejemplo simplificado. Imagina que tenemos un espacio de embeddings muy pequeño, de dimensión 4. Queremos procesar la palabra "DataCamp" situada en la posición 0 de nuestra secuencia.
- Embedding semántico: La red neuronal recupera el embedding de "DataCamp", que podría ser [0.51, -0.22, 0.88, 0.14].
- Codificación posicional: La fórmula posicional genera un vector de coordenadas para la posición 0. Para este ejemplo, supongamos que calcula [0.00, 1.00, 0.00, 1.00].
- Combinación: Sumamos ambos vectores elemento a elemento.
- Entrada final: La pasada forward recibe [0.51, 0.78, 0.88, 1.14].
Aunque el mismo token "DataCamp" aparezca más tarde en la posición 5, el vector de codificación posicional será diferente. En consecuencia, el vector de entrada final tendrá un aspecto completamente distinto para el mecanismo de self-attention.

Codificación posicional sinusoidal
El artículo original "Attention Is All You Need" introdujo un método brillante para generar vectores posicionales usando trigonometría básica. Este enfoque no necesita pesos de aprendizaje y se basa por completo en funciones matemáticas fijas.
Fundamento matemático
La codificación posicional sinusoidal usa funciones seno y coseno a distintas frecuencias para codificar información de posición. La fórmula original dictamina que, para una posición (pos) y un índice de dimensión concreto (i) dentro del vector de embedding, la codificación se calcula así:
-
Para dimensiones pares (
2i):PE(pos, 2i) = sin(pos / 10000^(2i/dmodel)) -
Para dimensiones impares (
2i+1):PE(pos, 2i+1) = cos(pos / 10000^(2i/dmodel))
En esta fórmula, dmodel es el tamaño total del vector de embedding. A medida que avanzas por las dimensiones del vector, desde el índice 0 hasta dmodel, la longitud de onda de las funciones sinusoidales aumenta geométricamente.
Ventajas y propiedades
Esta progresión geométrica de frecuencias ofrece varias ventajas claras.
- Las salidas de seno y coseno están estrictamente acotadas entre -1 y 1. Este acotamiento garantiza que las codificaciones posicionales no dominen numéricamente a los embeddings semánticos.
- Las funciones son periódicas. Gracias a las fórmulas de adición trigonométrica, una transformación lineal puede representar fácilmente la codificación posicional de una posición futura (
pos + k) como función de la posición actual (pos). Esta propiedad permite al modelo aprender posiciones relativas de forma natural. - La codificación sinusoidal usa parámetros fijos. No requiere pesos entrenables, lo que reduce enormemente la carga de memoria. Al operar sobre una función matemática continua, el modelo posee una capacidad teórica de extrapolación: puede mapear coordenadas posicionales para secuencias más largas que las vistas durante el entrenamiento.
Visualización
Para entender mejor la codificación sinusoidal, ayuda visualizarla como un mapa de calor.

El eje X de la visualización representa el tamaño de la dimensión del embedding, mientras que el eje Y indica la posición del token.
Las dimensiones inferiores de la izquierda oscilan rápidamente entre valores negativos y positivos, lo que permite distinguir posiciones de tokens cercanas. A medida que aumenta el índice de dimensión, la longitud de onda se hace mayor y la codificación cambia más gradualmente. Estas dimensiones capturan diferencias posicionales a mayor distancia.
Para las 50 posiciones mostradas aquí, muchas dimensiones superiores aparecen casi como franjas verticales uniformes. Esto ocurre porque sus longitudes de onda son tan largas que los valores de seno se mantienen cerca de 0 y los de coseno cerca de 1 dentro de esta secuencia corta, no 0 y 1, respectivamente. Así que las franjas alternas reflejan dimensiones seno–coseno adyacentes, no una codificación binaria simple. En una secuencia más larga, estas dimensiones también empezarían a variar de forma apreciable.
La conclusión es que las distintas frecuencias aportan al modelo información posicional a múltiples escalas: las dimensiones que cambian rápido capturan diferencias finas entre tokens cercanos, mientras que las que cambian lentamente siguen la posición global en secuencias largas.
Codificación posicional aprendida
Aunque las fórmulas matemáticas fijas son elegantes, las arquitecturas modernas de deep learning suelen apoyarse en los datos para aprender representaciones óptimas. Los embeddings posicionales aprendidos trasladan toda la carga del diseño al entrenamiento.
Concepto e implementación
En lugar de fijar los valores posicionales con funciones seno y coseno, los embeddings posicionales aprendidos tratan las coordenadas de posición como parámetros entrenables.
El modelo inicializa una matriz de embeddings en blanco donde cada fila corresponde a una posición específica de la secuencia. Durante el bucle estándar de entrenamiento con backpropagation, la red actualiza estos pesos posicionales junto con los embeddings semánticos de los tokens para minimizar la función de pérdida global.
Ventajas comparativas
La principal ventaja de los embeddings posicionales aprendidos es su enorme flexibilidad. Tienen libertad total para aprender las representaciones posicionales que mejor funcionen en un conjunto de datos concreto. Arquitecturas como BERT y GPT-2 popularizaron con éxito este enfoque por su gran capacidad de adaptación y su sólido rendimiento en tareas posteriores.
Limitaciones y retos
La mayor limitación de los embeddings posicionales aprendidos es el límite rígido de longitud de secuencia. Si un modelo se entrena con un máximo de 2.048 vectores posicionales aprendidos, físicamente no puede procesar un documento de 2.049 tokens.
Esta restricción limita gravemente la extrapolación en longitud y a menudo exige un costoso reentrenamiento para ampliar la ventana de contexto.
Codificación posicional relativa
A medida que los modelos evolucionaron para manejar documentos más largos, los ingenieros se dieron cuenta de que a menudo importa menos la posición absoluta de una palabra que su distancia relativa a otras palabras.
Cambio conceptual hacia posiciones relativas
Piensa en la frase "el rápido avance de la IA". La relación gramatical entre "avance" e "IA" es idéntica aparezca la frase al principio del documento o al final. La codificación posicional relativa abandona las coordenadas absolutas. En su lugar, se centra por completo en los desplazamientos de distancia entre tokens que interactúan.
Implementación en los mecanismos de atención
Para implementar codificaciones relativas, los ingenieros modifican directamente el cálculo de las puntuaciones de atención en lugar de alterar los embeddings de entrada al principio de la red.
Al calcular la puntuación de atención entre una matriz "query" y una matriz "key", la operación incluye un término de sesgo adicional aprendido que representa la distancia relativa. Esta modificación garantiza la invariancia por desplazamiento en el texto. Para profundizar en cómo operan estas matrices, lee nuestra guía sobre el mecanismo de atención en LLMs.
Compensaciones prácticas
Este enfoque ofrece una comprensión contextual muy precisa, pero introduce una sobrecarga computacional considerable. Calcular matrices de distancia relativa únicas para cada cabeza de atención incrementa drásticamente el consumo de memoria. También complica los mecanismos de caché internos usados para acelerar la generación de texto.
Información posicional absoluta vs relativa
Elegir entre codificación absoluta y relativa depende de la tarea concreta.
- Codificación absoluta funciona de maravilla cuando el diseño espacial exacto es rígido y se prioriza la ejecución rápida.
- Codificación relativa resulta muy superior para el procesamiento de lenguaje natural de formato largo, donde la estructura gramatical depende por completo de las distancias locales entre tokens, no de coordenadas absolutas del documento.
Rotary Position Embedding (RoPE)
En la búsqueda por perfeccionar las arquitecturas transformer, se introdujo Rotary Position Embedding (RoPE). Combina lo mejor de las codificaciones posicionales absolutas y relativas y se ha convertido rápidamente en un estándar del sector.
Enfoque innovador
RoPE unifica la posición absoluta y las distancias relativas mediante transformaciones rotacionales. En lugar de sumar un vector a los embeddings o añadir grandes sesgos a las puntuaciones de atención, RoPE mapea el vector de embedding a un plano complejo y lo rota por un ángulo específico. El tamaño de ese ángulo viene determinado estrictamente por la posición absoluta del token en la secuencia.

Ideas matemáticas
En un espacio 2D, la rotación se aplica con la matriz de rotación 2D estándar. Para dimensiones superiores, RoPE agrupa las dimensiones del embedding en pares y aplica rotaciones 2D únicas a cada bloque en función del índice de posición absoluta.
Gracias a las propiedades geométricas de las matrices de rotación, el producto punto de un vector query rotado y un vector key rotado depende únicamente del ángulo relativo entre ellos. Así, RoPE utiliza un mapeo de posición absoluta para codificar de forma natural la distancia relativa entre tokens.
RoPE vs codificación sinusoidal
Como muestra el gráfico anterior, la codificación sinusoidal cambia la magnitud y la dirección del vector original. RoPE, en cambio, preserva la magnitud y solo necesita el ángulo entre dos posiciones para entender su distancia relativa.
Attention With Linear Biases (ALiBi)
Mientras RoPE se apoya en matemáticas rotacionales complejas, otra técnica llamada Attention with Linear Biases (ALiBi) adopta un enfoque completamente distinto.
Simplicidad y eficiencia
ALiBi descarta por completo la idea de añadir información posicional a los embeddings iniciales de los tokens. Los embeddings de palabras entran en el transformer totalmente intactos.
En su lugar, ALiBi interviene en el último paso del cálculo de atención. Justo antes de que los logits de atención pasen por la función softmax, ALiBi resta una penalización estática proporcional a la distancia entre los dos tokens. Cuanto más alejadas estén dos palabras, mayor será la penalización restada a su puntuación de atención.
Rendimiento
Este método es muy sencillo de implementar y muy eficiente. Su mayor ventaja es su extrema eficacia para extrapolar en longitud. Un modelo entrenado con ALiBi en secuencias de 1.024 tokens puede generar texto coherente en secuencias del doble de longitud sin bloquearse.
Si te interesa explorar otras técnicas avanzadas utilizadas para acelerar la generación de texto y la inferencia, consulta nuestra guía sobre speculative decoding.
Cuándo usar cada codificación posicional
Empieza por lo que estás construyendo y elige el método que encaje: a veces es uno, a veces varios.
- Quieres una base sencilla y sin parámetros: sinusoidal (fórmulas fijas, nada que entrenar).
- Tu longitud de secuencia es fija y buscas el máximo rendimiento en un conjunto de datos específico: aprendida.
- Necesitas manejar secuencias más largas que las entrenadas: RoPE es la mejor opción entre las técnicas que pueden extrapolar.
- La gramática depende de la distancia entre tokens, no de su posición absoluta: relativa o RoPE.
- Estás creando un LLM moderno de propósito general: RoPE.
- La extrapolación en longitud es tu principal prioridad y quieres la implementación más simple: ALiBi.
- Quieres las ventajas de las posiciones relativas sin la sobrecarga de memoria y caché: RoPE (las relativas dan el beneficio pero son más costosas).
Implementación práctica y consideraciones de arquitectura
Para salvar la distancia entre teoría y práctica, hay que entender cómo integrar codificaciones posicionales en bases de código reales y gestionar limitaciones de arquitectura.
Implementar codificación posicional en transformers
Para añadir codificaciones posicionales a un transformer en frameworks como PyTorch, los desarrolladores suelen crear un módulo dedicado. Este módulo genera la matriz de codificación una vez y la registra como buffer para que no se actualice por accidente durante el backpropagation.
A continuación tienes una implementación práctica estándar de una pasada forward que incorpora codificaciones sinusoidales. Las codificaciones se calculan una sola vez a partir de fórmulas de seno y coseno y nunca cambian durante el entrenamiento; por eso se almacenan en un buffer en lugar de como parámetros entrenables (y por eso no añaden coste de entrenamiento).
import torch
import torch.nn as nn
import math
class PositionalEncoding(nn.Module):
def __init__(self, d_model: int, max_len: int = 5000):
super().__init__()
pe = torch.zeros(max_len, d_model)
position = torch.arange(0, max_len, dtype=torch.float).unsqueeze(1)
# Calculate the division term for frequencies
div_term = torch.exp(torch.arange(0, d_model, 2).float() * (-math.log(10000.0) / d_model))
# Apply sine to even indices and cosine to odd indices
pe[:, 0::2] = torch.sin(position * div_term)
pe[:, 1::2] = torch.cos(position * div_term)
pe = pe.unsqueeze(0)
# Register as a buffer
self.register_buffer('pe', pe)
def forward(self, x: torch.Tensor) -> torch.Tensor:
# Add positional encoding directly to the input embeddings
seq_len = x.size(1)
x = x + self.pe[:, :seq_len, :]
return x
En __init__, el módulo precalcula la tabla de codificación hasta max_len posiciones: position es una columna de índices (0, 1, 2, …) y div_term son las frecuencias, que resultan ser 1 / 10000^(2i/d_model), así que las dimensiones bajas obtienen ondas rápidas y las altas, ondas lentas.
Aplicar sin a las dimensiones pares (0::2) y cos a las impares (1::2) rellena la tabla. Luego, forward hace el único trabajo en tiempo de ejecución: recorta la tabla a la longitud de secuencia de la entrada y la suma a los embeddings de los tokens elemento a elemento. Ten en cuenta que el módulo asume una forma batch-first [batch, seq_len, d_model], por eso forward recorta en la dimensión 1.
Sesgo posicional y el fenómeno de "perdido en el medio"
Una consecuencia no deseada de mapear longitudes de secuencia grandes es el sesgo posicional. A menudo se manifiesta como el fenómeno de "perdido en el medio". Al procesar documentos muy extensos, los modelos de lenguaje tienden a recordar mucho mejor los hechos del principio o del final de un prompt que los del medio. Esto puede sonarte, ya que la memoria humana funciona de forma parecida (al menos en mi caso; ¡no me digas que soy la única persona que recuerda mejor el principio y el final de los libros que el resto!).
La teoría dice que esto ocurre porque el mecanismo de atención se ve abrumado por contexto irrelevante y ancla de forma natural a los primeros tokens (que marcan la instrucción) y a los últimos tokens (que están más recientes en memoria). Para mitigar este sesgo, los desarrolladores recurren a avanzadas estrategias de chunking y sistemas de recuperación semántica.
Codificación posicional para dominios especializados
Los transformers ya no se limitan estrictamente al texto. El concepto de codificación posicional se adapta rápidamente para manejar distintos tipos de datos en múltiples dominios.
En los vision transformers, las imagenes se dividen en rejillas de patches. Una codificación secuencial 1D simple no capta la proximidad espacial en 2D. Por ello, los modelos de visión suelen usar codificaciones posicionales aprendidas en 2D que tienen en cuenta las coordenadas X e Y del patch de imagen.
Existen adaptaciones similares para modelos de series temporales continuas, donde codificaciones específicas rastrean distancias temporales, estacionalidad y marcas de tiempo.
Investigación adicional sobre codificación posicional
A medida que la carrera por ampliar las ventanas de contexto se acelera, refinar cómo entienden la posición los modelos sigue siendo un área de investigación en machine learning muy activa y crítica.
Extrapolación en longitud y extensión de contexto
Hoy, los usuarios exigen ventanas de contexto enormes para procesar de una vez bases de código enteras o sagas de novelas. Dado que entrenar modelos desde cero con longitudes de secuencia masivas es demasiado caro, la investigación se apoya en técnicas de extensión de contexto.
Métodos como la interpolación posicional comprimen matemáticamente las coordenadas posicionales de una secuencia mucho más larga dentro de los límites de la longitud de entrenamiento original. Métodos adaptativos como YaRN ajustan dinámicamente la frecuencia rotacional de los parámetros de RoPE para ampliar sin fisuras la comprensión de distancias del modelo.
Transformers sin codificación posicional explícita
De forma sorprendente, algunas investigaciones sugieren que la codificación posicional explícita no siempre es estrictamente necesaria. En modelos de lenguaje causales solo decodificadores, el enmascaramiento causal estándar (un mecanismo que obliga a los tokens a mirar solo hacia atrás) filtra de forma inherente información de orden temporal.
Esto significa que podría ser posible aprender reglas posicionales de forma implícita únicamente a partir de la máscara causal mediante un ajuste estratégico de la temperatura y cambios de arquitectura.
Retos y líneas futuras
La frontera final pone de relieve una disyuntiva persistente entre la adaptación estricta (optimizar el rendimiento para una longitud de secuencia específica) y la extrapolación impecable (permitir que el modelo generalice sin límite).
Las áreas emergentes de investigación se centran intensamente en la codificación multimodal. Crear representaciones posicionales universales que fusionen coordenadas de vídeo 3D con flujos de texto y audio es uno de los objetivos para la próxima generación de modelos de inteligencia artificial.
Conclusión
La codificación posicional cierra la brecha entre el procesamiento en paralelo y la comprensión secuencial, y nos permite crear modelos que procesen grandes volúmenes de datos en orden. Hemos visto cómo las codificaciones aprendidas y relativas ofrecen una flexibilidad enorme, y cómo innovaciones modernas como RoPE y ALiBi optimizan tanto la elegancia matemática como la eficiencia computacional.
A medida que las ventanas de contexto pasan de unos pocos miles de tokens a millones, el simple acto matemático de indicar a una red neuronal dónde está cada cosa seguirá siendo el corazón del diseño de modelos.
Si quieres profundizar y practicar, te recomiendo inscribirte en nuestro itinerario de habilidades Developing Large Language Models.
Preguntas frecuentes sobre codificación posicional
¿Qué es la codificación posicional en machine learning?
La codificación posicional es una técnica matemática utilizada para aportar a las redes neuronales información sobre el orden de los datos en una secuencia.
¿Por qué los modelos transformer necesitan codificación posicional?
A diferencia de las antiguas Redes Neuronales Recurrentes, que procesan los datos paso a paso, los transformers procesan todo simultáneamente mediante un mecanismo de self-attention. Como el self-attention es naturalmente invariante por permutación, trata la entrada como una bolsa de palabras desordenada. La codificación posicional lo resuelve inyectando coordenadas secuenciales directamente en los datos antes de que el modelo los procese.
¿Cuál es la diferencia entre codificación posicional absoluta y relativa?
La codificación posicional absoluta asigna a un token una coordenada fija basada en su índice exacto en una secuencia. La codificación relativa ignora la ubicación exacta en la cuadrícula y calcula la distancia entre dos tokens que interactúan, centrándose solo en su desplazamiento contextual.
¿Qué es Rotary Position Embedding (RoPE)?
RoPE es un método de codificación muy utilizado que mapea los embeddings de tokens a un plano complejo y los rota por un ángulo determinado por su posición absoluta. Cuando el modelo calcula las puntuaciones de atención, la relación entre dos vectores rotados depende por completo de su distancia relativa.
¿Qué son los embeddings posicionales aprendidos?
En lugar de usar fórmulas matemáticas fijas como seno y coseno, los embeddings posicionales aprendidos tratan las coordenadas espaciales como pesos entrenables. El modelo inicializa una matriz de posiciones en blanco y actualiza estas coordenadas durante el entrenamiento para aprender representaciones espaciales óptimas para un conjunto de datos concreto.
Soy un científico de datos con experiencia en análisis espacial, aprendizaje automático y canalización de datos. He trabajado con GCP, Hadoop, Hive, Snowflake, Airflow y otros procesos de ciencia/ingeniería de datos.



