Rotary Position Embedding (RoPE)
L’encodage positionnel rotatif (RoPE) fait pivoter les vecteurs de requête et de clé selon la position des jetons, afin que les scores d’attention dépendent de la distance relative. Il est utilisé dans la plupart des LLM ouverts.
L’encodage positionnel rotatif (RoPE) fournit à un transformeur des informations sur l’ordre des jetons en faisant tourner chaque vecteur de requête et de clé d’un angle proportionnel à la position du jeton. L’auto-attention ne peut pas, à elle seule, distinguer les différents ordres des mots ; les modèles doivent donc intégrer la position d’une manière ou d’une autre. Avec RoPE, le score d’attention entre une requête à la position m et une clé à la position n dépend uniquement de leur décalage m − n. Introduit en 2021 avec le modèle RoFormer et popularisé par GPT-J et GPT-NeoX d’EleutherAI, RoPE est désormais l’encodage positionnel standard des grands modèles de langage (LLM) ouverts, notamment Llama, Mistral, Qwen, Gemma et DeepSeek.
Fonctionnement de RoPE#
RoPE divise chaque vecteur de requête et de clé de dimension d en d/2 paires de caractéristiques et traite chaque paire comme un point dans un plan. À la position m, la paire i tourne d’un angle m·θᵢ, où θᵢ = base^(−2i/d) et la base vaut 10 000 dans l’article d’origine. Les premières paires tournent rapidement et distinguent l’ordre local précis, tandis que les dernières tournent lentement et distinguent encore des jetons séparés par des milliers de positions. La rotation d’une requête de mθ et d’une clé de nθ fait dépendre leur produit scalaire uniquement de la différence (m − n)θ, et la rotation ne modifie jamais la longueur d’un vecteur. La rotation est appliquée dans chaque couche d’attention, après les projections des requêtes et des clés ; les vecteurs de valeur ne tournent pas, et rien n’est ajouté aux plongements des jetons en entrée :
L’extrait ci-dessous implémente la rotation avec des nombres complexes, comme le fait le code de référence Llama de Meta, et vérifie la propriété de position relative :
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}")Le code affiche -8.2811 pour les deux paires séparées de trois jetons, qu’elles se trouvent aux positions 5 et 2 ou 105 et 102, et -11.4563 lorsque les mêmes vecteurs sont séparés d’un jeton. La requête tournée conserve sa longueur de 8.3705.
RoPE et autres encodages positionnels#
- Encodage absolu sinusoïdal : le transformeur d’origine ajoute des vecteurs fixes de sinus et de cosinus aux plongements d’entrée, une seule fois, avant la première couche. Le modèle doit déduire la distance relative du signal ainsi incorporé.
- Plongements absolus appris : BERT et GPT-2 apprennent un vecteur par position, jusqu’à 512 et 1 024 positions, et ne disposent d’aucun plongement au-delà de cette limite.
- Biais de position relative : T5 et ALiBi ajoutent aux scores d’attention un biais appris ou fixe fondé sur la distance. RoPE encode la distance relative par la rotation elle-même et n’ajoute aucun paramètre.
Étendre la fenêtre de contexte#
Un modèle entraîné avec RoPE sur des séquences de longueur L n’a jamais rencontré les angles de rotation correspondant aux positions au-delà de L ; l’attention se dégrade lorsqu’il les rencontre. Les méthodes d’extension du contexte redimensionnent les angles au lieu de reprendre l’entraînement depuis zéro. L’interpolation positionnelle comprime les nouvelles positions dans la plage d’entraînement et a étendu la fenêtre de contexte de Llama à 32 768 jetons en 1 000 étapes d’affinage. La mise à l’échelle adaptée au noyau neuronal et YaRN étirent davantage les paires lentes à basse fréquence que les paires rapides ; YaRN a étendu Llama 2 à 128 000 jetons avec 10 fois moins de jetons d’entraînement que les méthodes précédentes. Llama 3 a fait passer la base de 10 000 à 500 000 pendant le préentraînement, si bien que les paires les plus lentes tournent moins par jeton et que les positions éloignées restent distinguables.
RoPE dans les modèles de vision#
Les images nécessitent deux coordonnées ; les transformeurs de vision utilisent donc RoPE en 2D, ou axial : la moitié des paires de caractéristiques de chaque tête tourne selon la colonne d’un patch et l’autre moitié selon sa ligne. Qwen2-VL ajoute un troisième axe temporel pour la vidéo dans son M-RoPE multimodal. Le SAM 2 de Meta, disponible dans le package Ultralytics, applique RoPE axial dans les quatre couches de son attention mémoire, où les caractéristiques de la trame vidéo actuelle portent leur attention sur les caractéristiques stockées des trames précédentes. Les clés de chaque trame stockée reçoivent la même grille d’angles que les requêtes de la trame actuelle ; l’attention entre les deux dépend donc du décalage spatial entre les patchs.










