Rotary Position Embedding (RoPE)
L'incorporamento posizionale rotatorio (RoPE) ruota i vettori query e key in base alla posizione dei token, facendo dipendere i punteggi di attenzione dalla distanza relativa. È usato nella maggior parte degli LLM open source.
Il Rotary Position Embedding (RoPE) fornisce a un Transformer informazioni sull'ordine dei token ruotando ogni vettore query e key di un angolo proporzionale alla posizione del token. L'autoattenzione da sola non distingue un ordine delle parole da un altro, quindi i modelli devono in qualche modo integrare le informazioni posizionali; con RoPE, il punteggio di attenzione tra una query alla posizione m e una key alla posizione n dipende solo dal loro scarto m − n. Introdotto nel 2021 con il modello RoFormer e reso popolare da GPT-J e GPT-NeoX di EleutherAI, RoPE è oggi la codifica posizionale standard dei modelli linguistici di grandi dimensioni (LLM) open source, tra cui Llama, Mistral, Qwen, Gemma e DeepSeek.
Come funziona RoPE#
RoPE divide ciascun vettore query e key di dimensione d in d/2 coppie di feature e tratta ogni coppia come un punto su un piano. Alla posizione m, la coppia i viene ruotata dell'angolo m·θᵢ, con θᵢ = base^(−2i/d) e una base di 10,000 nel documento originale. Le prime coppie ruotano rapidamente e distinguono l'ordine locale più fine, mentre le ultime ruotano lentamente e continuano a distinguere token separati da migliaia di posizioni. Ruotare una query di mθ e una key di nθ fa sì che il loro prodotto scalare dipenda solo dalla differenza (m − n)θ; inoltre, la rotazione non cambia mai la lunghezza di un vettore. La rotazione viene applicata all'interno di ogni livello di attenzione, dopo le proiezioni query e key; i vettori value non vengono ruotati e agli embedding dei token in input non viene aggiunto nulla:
Il frammento qui sotto implementa la rotazione con numeri complessi, come nel codice di riferimento Llama di Meta, e verifica la proprietà della posizione 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}")Stampa -8.2811 per entrambe le coppie distanti tre token, sia che si trovino alle posizioni 5 e 2 sia alle posizioni 105 e 102; stampa invece -11.4563 quando gli stessi vettori sono distanti un token. La query ruotata mantiene la sua lunghezza di 8.3705.
RoPE a confronto con altre codifiche posizionali#
- Codifica assoluta sinusoidale: il Transformer originale aggiunge vettori fissi di seno e coseno agli embedding di input una sola volta, prima del primo livello. La distanza relativa deve essere dedotta dal segnale incorporato.
- Embedding assoluti appresi: BERT e GPT-2 apprendono un vettore per ogni posizione, fino a 512 e 1,024 posizioni, e non dispongono di embedding per le posizioni oltre tali limiti.
- Bias relativi di posizione: T5 e ALiBi aggiungono ai punteggi di attenzione un bias appreso o fisso basato sulla distanza. RoPE codifica la distanza relativa tramite la rotazione stessa e non aggiunge parametri.
Estendere la finestra di contesto#
Un modello addestrato con RoPE su sequenze di lunghezza L non ha mai visto gli angoli di rotazione delle posizioni oltre L e il meccanismo di attenzione perde efficacia quando li incontra. I metodi di estensione del contesto ridimensionano gli angoli invece di riaddestrare il modello da zero. Interpolazione delle posizioni comprime le nuove posizioni nell'intervallo usato per l'addestramento e ha esteso i modelli Llama a una finestra di contesto di 32.768 token entro 1.000 passaggi di affinamento. Il ridimensionamento che tiene conto di NTK e il metodo YaRN dilatano le coppie lente e a bassa frequenza più di quelle veloci, e YaRN ha esteso Llama 2 a 128K token con un numero di token di addestramento 10 volte inferiore rispetto ai metodi precedenti. Llama 3 ha aumentato il valore di base da 10.000 a 500.000 durante il preaddestramento, così le coppie più lente ruotano meno per token e le posizioni distanti restano distinguibili.
RoPE nei modelli di visione#
Le immagini richiedono due coordinate, quindi i Vision Transformer usano RoPE 2D, o assiale: metà delle coppie di feature di ogni head ruota in base alla colonna di una patch e l'altra metà in base alla sua riga. Qwen2-VL aggiunge un terzo asse, quello temporale, per i video nel suo M-RoPE multimodale. Il SAM 2 di Meta, disponibile nel pacchetto Ultralytics, applica RoPE assiale nei quattro livelli della sua attenzione alla memoria, in cui le feature del frame video corrente prestano attenzione alle feature memorizzate dei frame precedenti. Le key di ogni frame memorizzato ricevono la stessa griglia di angoli delle query del frame corrente, quindi l'attenzione tra i due dipende dallo scarto spaziale tra le patch.










