Codificações Posicionais
Transformers são construídos em torno de atenção (attention), que compara tokens com outros tokens independentemente da distância. Essa flexibilidade é uma força — mas também cria um problema fundamental: a autoatenção (self-attention) é invariante à permutação a menos que injetemos explicitamente informação sobre ordem (para texto) ou layout espacial (para imagens/áudio). Se você embaralhar os tokens em uma sequência e aplicar os mesmos pesos de atenção, uma camada de atenção “vanilla” não consegue perceber a diferença.
Codificações posicionais (positional encodings) (também chamadas de incorporações de posição (position embeddings) ou representações de posição (position representations)) são a família de métodos que fornece essa informação ausente. Elas permitem que um modelo aprenda padrões como “a próxima palavra”, “o sujeito vem antes do verbo” ou “este pixel está acima daquele pixel”, embora a atenção em si não imponha nenhuma noção de localidade ou sequência.
Este artigo foca por que a informação de posição é necessária e nas principais abordagens: métodos posicionais absolutos e relativos, incluindo variantes modernas amplamente usadas como RoPE e ALiBi.
Por que Transformers precisam de informação de posição
Em uma Arquitetura Transformer típica, cada token é mapeado para um vetor de incorporação (embedding vector) e então processado por blocos empilhados de autoatenção (self-attention) (veja Mecânica da Atenção). Na atenção por produto escalar (dot-product attention) pura, a pontuação entre o token i e o token j depende apenas de seus vetores baseados no conteúdo (consultas e chaves), não de seus índices:
[ \text{score}(i, j) = \frac{Q_i \cdot K_j}{\sqrt{d}} ]
Se permutarmos os tokens de entrada, o conjunto de produtos escalares par a par é permutado da mesma forma. Sem sinais posicionais, o modelo não consegue aprender funções sensíveis à ordem, como:
- Distinguir “cachorro morde homem” de “homem morde cachorro”
- Impor restrições de geração da esquerda para a direita além de uma máscara causal
- Aprender sintaxe, limites de frases e n-gramas locais de forma robusta
- Representar distâncias (“a palavra de 3 posições atrás”) e estrutura de longo alcance
- Lidar com layouts 2D/3D (imagens, quadros de vídeo, grades tempo-frequência de espectrogramas)
Uma máscara causal de atenção (causal attention mask) (usada em modelos de linguagem autorregressivos) impede atender ao futuro, mas ainda assim não diz ao modelo quão longe algo está no passado ou onde ocorre.
Duas famílias de alto nível: absoluto vs relativo
Métodos posicionais diferem no que representam e em como são injetados no modelo.
Codificações posicionais absolutas
Métodos absolutos atribuem a cada índice de posição (p \in {0,1,\dots,L-1}) um vetor de incorporação (E_p) e o combinam com a incorporação do token.
Combinação comum: [ X_p = \text{TokenEmbed}(t_p) + \text{PosEmbed}(p) ]
Isso faz com que a representação de cada token dependa de sua localização absoluta na sequência.
Prós
- Simples e amplamente suportado
- Funciona bem quando os comprimentos de treino e teste coincidem
- Eficiente em tempo de execução
Contras
- Frequentemente extrapola mal para sequências mais longas do que as vistas no treinamento (dependendo do método)
- O índice absoluto pode ser menos natural do que a distância relativa para muitas tarefas
Codificações posicionais relativas
Métodos relativos representam relações como “o token j está a k passos do token i” (onde (k = j-i)). Em vez de codificar onde um token está, eles codificam como as posições se relacionam durante o cálculo de atenção.
Um padrão comum é adicionar um viés aos logits de atenção: [ \text{score}(i, j) = \frac{Q_i \cdot K_j}{\sqrt{d}} + b(i, j) ] onde (b(i, j)) depende de (j-i) (distância) ou às vezes de fatores adicionais.
Prós
- Expressa naturalmente distância e direção
- Frequentemente generaliza melhor para contextos mais longos
- Alinha-se com muitos padrões linguísticos e de séries temporais
Contras
- Mais complexidade de implementação (embora variantes modernas sejam eficientes)
- Algumas formas adicionam custo de memória ou computação
Métodos posicionais absolutos na prática
Incorporações absolutas de posição aprendidas
Esta é a abordagem usada nos modelos GPT originais e nos modelos no estilo BERT: aprender uma tabela de consulta (E \in \mathbb{R}^{L_{\max} \times d}).
Como funciona
- Durante o treinamento, posições 0..(L_{\max}-1) têm incorporações treináveis.
- Na inferência, as sequências não devem exceder (L_{\max}), a menos que você estenda/interpole as incorporações.
Nota prática: estender o comprimento de contexto de um modelo frequentemente exige tratamento especial (por exemplo, interpolação ou mudança para um esquema relativo). Adicionar ingenuamente novas posições aprendidas pode degradar o desempenho.
Trecho no estilo PyTorch
import torch
import torch.nn as nn
class AbsolutePositionalEmbedding(nn.Module):
def __init__(self, max_len: int, d_model: int):
super().__init__()
self.pos = nn.Embedding(max_len, d_model)
def forward(self, x): # x: [batch, seq, d_model]
b, seq, d = x.shape
positions = torch.arange(seq, device=x.device)
return x + self.pos(positions)[None, :, :]
Codificações posicionais senoidais (fixas)
Introduzidas no artigo original do Transformer, as codificações senoidais são funções determinísticas da posição:
[ PE(p, 2i) = \sin\left(p / 10000^{2i/d}\right), \quad PE(p, 2i+1) = \cos\left(p / 10000^{2i/d}\right) ]
Intuição
- Frequências diferentes permitem que o modelo infira distâncias relativas via combinações lineares.
- Como ela é definida para todo (p), pode em princípio extrapolar além dos comprimentos treinados (embora nem sempre perfeitamente na prática).
Prós
- Sem parâmetros extras
- Pode produzir codificações para comprimentos arbitrários
Contras
- Ainda é um esquema absoluto; algumas tarefas se beneficiam mais de representações explicitamente relativas
- A extrapolação pode ser frágil dependendo do setup de treinamento e do uso downstream
Exemplo Se um modelo aprende a atender a posições com uma relação de fase específica, ele pode calcular (aproximadamente) “quão distantes” dois tokens estão, porque senóides têm deslocamentos previsíveis.
Métodos posicionais relativos na prática
Métodos relativos vêm em vários sabores. Os mais comuns em LLMs modernos são vieses de logits de atenção (attention logit biases) (por exemplo, no estilo T5) e métodos rotatórios (rotary) (RoPE).
Posição relativa como viés de atenção (estilo T5)
Uma abordagem amplamente usada (notavelmente no T5) é adicionar um viés escalar aprendido a cada cabeça de atenção com base em um bucket de distância relativa:
[ \text{score}(i, j) = \frac{Q_i \cdot K_j}{\sqrt{d}} + \text{BiasHead}\big(\text{bucket}(j-i)\big) ]
Detalhe-chave de implementação: agrupamento em buckets (bucketing) comprime muitas distâncias em um pequeno número de bins (alta resolução perto, baixa resolução longe). Isso reduz parâmetros e incentiva generalização.
Por que o bucketing ajuda
- O modelo pode representar “perto” com precisão (importante para sintaxe local)
- Ele ainda pode representar “longe” de forma grosseira sem precisar de um parâmetro único para cada distância
Prós
- Alto desempenho
- Eficiente: adiciona apenas um pequeno tensor de viés por cabeça
Contras
- Requer um design cuidadoso de bucketing
- Representa distância, mas nem sempre direção/geometria de forma tão rica quanto outros métodos
Posição relativa via incorporações par a par (Shaw et al.)
Um método relativo anterior adiciona uma incorporação aprendida (R_{j-i}) ao cálculo de atenção (frequentemente em chaves e/ou valores). Conceitualmente:
[ \text{score}(i, j) = \frac{Q_i \cdot (K_j + R_{j-i})}{\sqrt{d}} ]
Isso pode ser mais expressivo do que um viés escalar, mas pode ser mais pesado de implementar com eficiência para sequências longas.
ALiBi (Atenção com Vieses Lineares)
ALiBi adiciona uma penalidade linear fixa (não aprendida) baseada na distância:
[ \text{score}(i, j) = \frac{Q_i \cdot K_j}{\sqrt{d}} - m_h \cdot (i-j) ] para atenção causal onde (j \le i), com inclinação (m_h) dependendo da cabeça (h).
Intuição
- Incentiva a atenção a focar mais em tokens próximos por padrão
- Diferentes cabeças têm inclinações diferentes, produzindo uma mistura de comportamentos de atenção local e global
- Frequentemente melhora a extrapolação para contextos mais longos porque o viés é definido para distâncias arbitrárias
Prós
- Muito simples e rápido
- Boas propriedades de extrapolação de comprimento
- Não requer parâmetros posicionais aprendidos
Contras
- Menos expressivo do que métodos relativos aprendidos (é um prior linear de distância)
- Pode subajustar tarefas que exigem padrões posicionais complexos, a menos que isso seja compensado pela capacidade do modelo
RoPE (Incorporações Posicionais Rotatórias)
RoPE é uma das técnicas posicionais modernas mais influentes e é amplamente usada em famílias de LLMs. Em vez de adicionar incorporações a vetores de token, o RoPE rotaciona vetores de consulta e chave de forma dependente da posição. O produto escalar entre vetores rotacionados depende implicitamente da posição relativa.
Em alto nível:
- Divida a dimensão de cada cabeça em pares 2D.
- Aplique uma matriz de rotação parametrizada pela posição (via sen/cos).
- Use (Q) e (K) rotacionados na atenção.
Isso produz pontuações de atenção que incorporam deslocamentos relativos de forma matematicamente elegante.
Por que funciona
- O produto escalar entre dois vetores rotacionados depende da diferença de ângulos, que depende de (i-j).
- Isso efetivamente produz um efeito posicional relativo enquanto ainda é computado com atenção padrão por produto escalar.
Prós
- Forte desempenho empírico em LLMs
- Eficiente e fácil de fundir em kernels
- Suporta naturalmente raciocínio relativo
Contras
- A extrapolação para comprimentos muito maiores ainda pode exigir modificações (por exemplo, variantes de escalonamento de frequência como escalonamento consciente de NTK (NTK-aware scaling), YaRN, etc.)
- Conceitualmente mais complexo do que “adicionar uma incorporação”
Exemplo prático: por que RoPE ajuda Na predição do próximo token, muitas vezes é mais importante saber que um token relevante está “20 tokens atrás” do que que ele está na posição absoluta 512. O RoPE torna esses deslocamentos relativos diretamente visíveis para a atenção.
O que “generalização para contexto mais longo” realmente significa
Uma motivação recorrente para métodos relativos é melhor extrapolação de comprimento (length extrapolation): usar um modelo em comprimentos de sequência maiores do que aqueles vistos durante o treinamento.
- Incorporações absolutas aprendidas são limitadas por (L_{\max}) e não definem comportamento além disso.
- Senoidal define codificações para todos os comprimentos, mas o modelo pode não ter aprendido a usar fases de alcance extremamente longo de forma confiável.
- ALiBi e muitos esquemas de viés relativo definem uma regra baseada em distância que se estende naturalmente.
- RoPE se estende naturalmente na forma, mas a distribuição de ângulos/frequências muda com contextos mais longos; a extrapolação prática frequentemente se beneficia de ajustes de escalonamento.
Em sistemas de LLMs em produção, estender o comprimento de contexto não é apenas sobre ter uma fórmula para posições — também envolve:
- Dados de treinamento contendo contextos longos
- Estabilidade de otimização em comprimentos de sequência longos
- Restrições de computação/memória da atenção (veja Mecânica da Atenção)
Codificações posicionais além de texto 1D
Codificações posicionais 2D para imagens (Transformers Visuais)
Em um Vision Transformer (ViT), a entrada é uma sequência de patches de imagem. A posição agora corresponde a uma grade 2D ((x, y)), não a um único índice.
Abordagens comuns:
- Incorporações 2D absolutas aprendidas: ou uma incorporação por índice de patch (achatado) ou incorporações x/y separadas somadas.
- Incorporações senoidais 2D: aplicar sen/cos ao longo das dimensões x e y.
- Viés de posição relativa: viés aprendido depende de ((\Delta x, \Delta y)), popular em transformers visuais hierárquicos.
Elas são cruciais porque trocar dois patches deve mudar o significado: uma relação “nariz acima da boca” é posicional.
Áudio e representações tempo-frequência
Para espectrogramas, você pode querer:
- Codificação posicional ao longo do tempo (dimensão de sequência)
- Codificação posicional ao longo de bins de frequência
- Às vezes vieses indutivos diferentes (por exemplo, localidade em frequência)
Vieses relativos em duas dimensões são comuns.
Modelos multimodais
Em transformers multimodais (texto + imagem/vídeo), representações posicionais devem lidar com:
- Diferentes modalidades com geometria diferente
- Sequências concatenadas (por exemplo, tokens de texto seguidos de tokens de imagem)
- Atenção cruzada entre modalidades (a informação posicional pode ser específica da modalidade)
Os designs variam: alguns modelos mantêm sistemas posicionais separados por modalidade e dependem de projeções aprendidas para alinhá-los.
Como escolhas posicionais afetam o comportamento do modelo
Localidade vs contexto global
Muitas tarefas precisam de ambos:
- Padrões locais (frases, dependências curtas)
- Estrutura global (correferência, restrições em nível de documento)
Mecanismos posicionais atuam como priors:
- ALiBi tende a preferir atenção local por padrão.
- O bucketing de viés relativo pode modelar “perto vs longe” com clareza.
- RoPE suporta interações relativas ricas; a localidade emerge do treinamento e da arquitetura, em vez de uma penalidade explícita.
Viés indutivo e eficiência de dados
A codificação posicional é parte do viés indutivo do modelo:
- Priors fortes (como ALiBi) podem melhorar a eficiência de dados para algumas tarefas de sequência.
- Esquemas mais flexíveis (vieses relativos aprendidos, RoPE) podem exigir mais dados, mas podem modelar padrões complexos.
Eficiência e restrições de implementação
Do ponto de vista de engenharia:
- Incorporações absolutas aprendidas: trivial de implementar, sobrecarga mínima.
- Tabelas de viés relativo: pequena sobrecarga; fácil de adicionar aos logits de atenção.
- RoPE: tipicamente aplicado a Q/K por cabeça; eficiente em kernels de atenção fundidos.
- Alguns métodos mais antigos de incorporação relativa podem ser custosos para contextos muito longos devido a operações par a par.
Exemplo ilustrativo mínimo: adicionando viés relativo aos logits de atenção
Abaixo está um esboço simplificado (não otimizado para produção) de como adicionar um viés relativo aprendido baseado em distância:
import torch
import torch.nn as nn
class RelativeBias(nn.Module):
def __init__(self, num_buckets: int, num_heads: int, max_distance: int = 128):
super().__init__()
self.num_buckets = num_buckets
self.max_distance = max_distance
self.bias = nn.Embedding(num_buckets, num_heads)
def bucket(self, rel_pos: torch.Tensor) -> torch.Tensor:
# rel_pos: [seq, seq] with values in [-seq+1, seq-1]
# Simple symmetric clipping + shifting (toy version)
rel_pos = rel_pos.clamp(-self.max_distance, self.max_distance)
# Map to buckets (toy): uniform bins
# In practice, use log-scaled buckets (as in T5)
bucket = (rel_pos + self.max_distance) * (self.num_buckets - 1) // (2 * self.max_distance)
return bucket.long()
def forward(self, seq_len: int, device=None):
device = device or self.bias.weight.device
positions = torch.arange(seq_len, device=device)
rel = positions[None, :] - positions[:, None] # [seq, seq] (j - i)
b = self.bucket(rel) # [seq, seq]
bias = self.bias(b) # [seq, seq, heads]
return bias.permute(2, 0, 1) # [heads, seq, seq]
# Usage inside attention:
# attn_logits: [batch, heads, seq, seq]
# attn_logits = attn_logits + rel_bias[None, ...]
Esse padrão corresponde a como muitos transformers em produção incorporam informação relativa: como um termo aditivo às pontuações de atenção.
Escolhendo uma codificação posicional na prática
Não existe um método único “melhor”; orientações comuns:
- Se você quer simplicidade e um comprimento máximo fixo é aceitável:
Incorporações absolutas aprendidas são um baseline forte. - Se você quer sem parâmetros e extrapolação razoável:
Senoidal ou ALiBi são opções atraentes. - Se você está treinando um LLM e quer um padrão moderno e forte:
RoPE (frequentemente com modificações de escalonamento de comprimento ao estender o contexto) é amplamente usado. - Se você quer modelagem explícita de distância e comportamento estável em contexto longo:
Viés relativo (estilo T5) ou ALiBi são escolhas comuns.
Considere também:
- Distribuição de comprimento de sequência no treinamento (você de fato treina com contextos longos?)
- Tarefas-alvo (dependências locais vs globais)
- Restrições de tempo de execução (latência, memória, suporte de kernel)
Equívocos comuns e armadilhas
“A máscara causal dá informação posicional.”
Ela apenas impõe direcionalidade (não olhar para frente). Não codifica distância nem localização absoluta.“Senoidal sempre extrapola perfeitamente.”
A codificação é definida além do comprimento de treinamento, mas o uso aprendido pelo modelo pode não generalizar sem exposição a contextos mais longos ou escalonamento apropriado.“Métodos relativos são sempre melhores.”
Incorporações absolutas podem funcionar extremamente bem quando os comprimentos de sequência são limitados e consistentes (por exemplo, classificação em entradas de tamanho fixo).“Codificação posicional é apenas para texto.”
Qualquer transformer sobre conjuntos/patches/tokens precisa de uma noção de arranjo quando a ordem ou a geometria importam (visão, áudio, robótica, multimodal).
Resumo
Codificações posicionais são essenciais em transformers porque a atenção por si só não codifica ordem ou geometria. Em termos gerais:
- Codificações posicionais absolutas anexam uma representação a cada índice de posição e a combinam com as incorporações de tokens (aprendidas ou senoidais).
- Métodos posicionais relativos codificam distâncias/deslocamentos, geralmente modificando as pontuações de atenção (viés relativo, ALiBi) ou transformando consultas/chaves para fazer com que produtos escalares dependam de deslocamentos relativos (RoPE).
Sistemas modernos de transformers escolhem métodos posicionais com base em uma combinação de qualidade do modelo, generalização de comprimento e eficiência de implementação. Entender esses trade-offs é fundamental ao construir ou adaptar modelos transformer para modelagem de linguagem com contexto longo, visão e tarefas multimodais.