Rotary Position Embedding (RoPE)
A incorporação posicional rotativa (RoPE) roda os vetores de consulta e chave de acordo com a posição do token, fazendo com que as pontuações de atenção dependam da distância relativa. É utilizada na maioria dos LLMs abertos.
A Incorporação Posicional Rotativa (RoPE) fornece a um transformer informações sobre a ordem dos tokens ao girar cada vetor de consulta e chave por um ângulo proporcional à posição do token. A autoatenção, por si só, não consegue distinguir uma ordem de palavras de outra, então os modelos precisam injetar a posição de alguma forma; com RoPE, a pontuação de atenção entre uma consulta na posição m e uma chave na posição n depende apenas do deslocamento m − n. Apresentada em 2021 com o modelo RoFormer e popularizada pelo GPT-J e GPT-NeoX da EleutherAI, a RoPE é agora a codificação posicional padrão dos modelos de linguagem grandes (LLMs) abertos, incluindo Llama, Mistral, Qwen, Gemma e DeepSeek.
Como funciona a RoPE#
A RoPE divide cada vetor de consulta e chave de dimensão d em d/2 pares de características e trata cada par como um ponto em um plano. Na posição m, o par i é girado pelo ângulo m·θᵢ, com θᵢ = base^(−2i/d) e base de 10.000 no artigo original. Os primeiros pares giram rapidamente e distinguem a ordem local com precisão, enquanto os últimos giram lentamente e ainda diferenciam tokens separados por milhares de posições. Girar uma consulta por mθ e uma chave por nθ faz com que seu produto escalar dependa apenas da diferença (m − n)θ, e a rotação nunca altera o comprimento de um vetor. A rotação é aplicada dentro de cada camada de atenção, após as projeções de consulta e chave; os vetores de valor não são girados, e nada é adicionado às incorporações dos tokens na entrada:
O trecho abaixo implementa a rotação com números complexos, como faz o código de referência Llama da Meta, e verifica a propriedade de posição relativa:
import torch
torch.manual_seed(0)
dim = 64
freqs = 10000 ** (-torch.arange(0, dim, 2) / dim) # one rotation frequency per pair of features
def rope(x, pos):
"""Rotate each consecutive feature pair of x by the angle pos * frequency."""
pairs = torch.view_as_complex(x.reshape(-1, 2))
return torch.view_as_real(pairs * torch.polar(torch.ones_like(freqs), pos * freqs)).flatten()
q, k = torch.randn(2, dim)
# The same query and key, three tokens apart, at two different places in the sequence
print(f"positions 5 and 2: {rope(q, 5) @ rope(k, 2):.4f}")
print(f"positions 105 and 102: {rope(q, 105) @ rope(k, 102):.4f}")
print(f"positions 5 and 4: {rope(q, 5) @ rope(k, 4):.4f}") # one token apart
print(f"Vector length kept: {rope(q, 5).norm():.4f} vs {q.norm():.4f}")Ele imprime -8.2811 para ambos os pares separados por três tokens, estejam eles nas posições 5 e 2 ou 105 e 102, e -11.4563 quando os mesmos vetores estão separados por um token. A consulta girada mantém seu comprimento de 8.3705.
RoPE vs. outras codificações posicionais#
- Codificação absoluta senoidal: o transformer original adiciona vetores fixos de seno e cosseno às incorporações de entrada uma vez, antes da primeira camada. A distância relativa precisa ser inferida a partir do sinal incorporado.
- Incorporações absolutas aprendidas: BERT e GPT-2 aprendem um vetor por posição, até 512 e 1.024 posições, e não têm incorporação para posições além desses limites.
- Vieses de posição relativa: T5 e ALiBi adicionam às pontuações de atenção um viés aprendido ou fixo baseado na distância. A RoPE codifica a distância relativa por meio da própria rotação e não adiciona parâmetros.
Estendendo a janela de contexto#
Um modelo treinado com RoPE em sequências de comprimento L nunca viu os ângulos de rotação de posições além de L, e a atenção se degrada quando as encontra. Os métodos de extensão de contexto reescalam os ângulos em vez de treinar tudo novamente. A Interpolação Posicional comprime novas posições no intervalo treinado e estendeu os modelos Llama a uma janela de contexto de 32.768 tokens em 1.000 etapas de ajuste fino. O escalonamento com reconhecimento de NTK e o YaRN alongam os pares lentos e de baixa frequência mais do que os rápidos, e o YaRN estendeu o Llama 2 a 128 mil tokens usando 10 vezes menos tokens de treinamento do que os métodos anteriores. O Llama 3 aumentou a base de 10.000 para 500.000 durante o pré-treinamento, fazendo os pares mais lentos girarem menos por token e mantendo distinguíveis as posições distantes.
RoPE em modelos de visão#
As imagens precisam de duas coordenadas, por isso os transformers de visão usam RoPE 2D, ou axial: metade dos pares de características de cada cabeça gira com a coluna do patch e a outra metade, com sua linha. O Qwen2-VL acrescenta um terceiro eixo, temporal, para vídeo em sua M-RoPE multimodal. O SAM 2 da Meta, disponível no pacote Ultralytics, aplica RoPE axial nas quatro camadas de sua atenção de memória, em que as características do quadro de vídeo atual prestam atenção às características armazenadas dos quadros anteriores. As chaves de cada quadro armazenado recebem a mesma grade de ângulos que as consultas do quadro atual, de modo que a atenção entre os dois depende do deslocamento espacial entre os patches.










