Rotary Position Embedding (RoPE)
Rotary Position Embedding (RoPE) dreht Query- und Key-Vektoren entsprechend der Tokenposition, sodass Attention-Scores vom relativen Abstand abhängen. Wird in den meisten offenen LLMs verwendet.
Rotary Position Embedding (RoPE) vermittelt einem Transformer Informationen über die Reihenfolge von Token, indem jeder Abfrage- und Schlüsselvektor um einen Winkel gedreht wird, der proportional zur Position des Tokens ist. Selbstaufmerksamkeit kann für sich genommen keine Wortreihenfolge erkennen. Deshalb müssen Modelle Positionsinformationen auf irgendeine Weise einbringen. Bei RoPE hängt der Aufmerksamkeitswert zwischen einer Abfrage an Position m und einem Schlüssel an Position n ausschließlich von ihrem Abstand m − n ab. RoPE wurde 2021 mit dem Modell RoFormer eingeführt und durch EleutherAIs GPT-J und GPT-NeoX bekannt. Heute ist RoPE die standardmäßige Positionskodierung in frei verfügbaren großen Sprachmodellen (LLMs), darunter Llama, Mistral, Qwen, Gemma und DeepSeek.
So funktioniert RoPE#
RoPE teilt jeden Abfrage- und Schlüsselvektor der Dimension d in d/2 Merkmals-Paare auf und behandelt jedes Paar als Punkt in einer Ebene. An Position m wird Paar i um den Winkel m·θᵢ gedreht, wobei θᵢ = base^(−2i/d) und der Basiswert im ursprünglichen Paper 10.000 beträgt. Die ersten Paare drehen sich schnell und erfassen die lokale Reihenfolge präzise. Die letzten drehen sich langsam und können Token auch dann noch unterscheiden, wenn Tausende Positionen zwischen ihnen liegen. Durch die Drehung einer Abfrage um mθ und eines Schlüssels um nθ hängt ihr Skalarprodukt nur noch von der Differenz (m − n)θ ab. Die Drehung verändert niemals die Länge eines Vektors. Die Drehung erfolgt in jeder Aufmerksamkeitsschicht nach den Projektionen von Abfrage und Schlüssel. Wertvektoren werden nicht gedreht, und zu den Einbettungen der Eingabetoken wird nichts addiert:
Der folgende Ausschnitt setzt die Drehung mit komplexen Zahlen um, wie es auch Metas Referenzcode für Llama tut, und überprüft die Eigenschaft der relativen Position:
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}")Für beide Paare im Abstand von drei Token wird -8.2811 ausgegeben, unabhängig davon, ob sie sich an den Positionen 5 und 2 oder 105 und 102 befinden. Für dieselben Vektoren im Abstand von einem Token wird -11.4563 ausgegeben. Die Länge der gedrehten Abfrage bleibt bei 8.3705.
RoPE im Vergleich zu anderen Positionskodierungen#
- Sinusförmige absolute Positionskodierung: Der ursprüngliche Transformer addiert vor der ersten Schicht einmalig feste Sinus- und Kosinusvektoren zu den Eingabeeinbettungen. Der relative Abstand muss aus dem überlagerten Signal erschlossen werden.
- Gelernte absolute Einbettungen: BERT und GPT-2 lernen je einen Vektor pro Position – bis zu 512 beziehungsweise 1.024 Positionen. Für Positionen jenseits dieser Grenze haben sie keine Einbettung.
- Relative Positionsverzerrungen: T5 und ALiBi addieren eine gelernte oder festgelegte, abstandsabhängige Verzerrung zu den Aufmerksamkeitswerten. RoPE kodiert den relativen Abstand durch die Drehung selbst und benötigt keine zusätzlichen Parameter.
Das Kontextfenster erweitern#
Ein mit RoPE auf Sequenzen der Länge L trainiertes Modell hat die Drehwinkel für Positionen jenseits von L noch nie gesehen. Sobald diese auftreten, lässt die Aufmerksamkeit nach. Verfahren zur Kontexterweiterung skalieren die Winkel neu, statt das Modell von Grund auf neu zu trainieren. Position Interpolation quetscht neue Positionen in den trainierten Bereich und erweiterte Llama-Modelle innerhalb von 1.000 Feinabstimmungsschritten auf ein Kontextfenster mit 32.768 Token. Die NTK-bewusste Skalierung und YaRN dehnen die langsamen, niederfrequenten Paare stärker als die schnellen. YaRN erweiterte Llama 2 auf 128K Token und benötigte dabei zehnmal weniger Trainingstoken als frühere Verfahren. Beim Vortraining erhöhte Llama 3 den Basiswert von 10.000 auf 500.000. Dadurch drehen sich die langsamsten Paare pro Token weniger, und weit auseinanderliegende Positionen bleiben unterscheidbar.
RoPE in Bildverarbeitungsmodellen#
Bilder benötigen zwei Koordinaten, daher verwenden Vision Transformers 2D-RoPE, auch als axiale RoPE bezeichnet: Die Hälfte der Merkmalspaare jedes Aufmerksamkeitskopfs rotiert entsprechend der Spalte eines Patches, die andere Hälfte entsprechend seiner Zeile. Qwen2-VL ergänzt seine multimodale M-RoPE für Video um eine dritte, zeitliche Achse. Metas SAM 2, das im Ultralytics-Paket läuft, verwendet axiale RoPE in den vier Schichten seiner Speicheraufmerksamkeit, bei der die Merkmale des aktuellen Videoframes gespeicherte Merkmale früherer Frames berücksichtigen. Die Schlüssel jedes gespeicherten Frames erhalten dasselbe Winkelraster wie die Abfragen des aktuellen Frames, sodass die Aufmerksamkeit zwischen dem aktuellen Frame und jedem gespeicherten Frame vom räumlichen Versatz zwischen den Patches abhängt.










