Positionell kodning och RoPE
Kunna förklara sinus-, inlärd och roterande positionskodning, och implementera RoPE.
Förkunskaper
- DAttentionkrävs
- DTransformers — arkitekturenkrävs
Intuition
Attention är permutationsinvariant: blandar du ordningen på tokens får du samma mängd utdata i ny ordning. «Hunden bet mannen» och «mannen bet hunden» skulle se likadana ut. Positionen måste alltså läggas till.
- Sinuskodning (originalet): ett fast vektormönster per position av sinus/cosinus i olika frekvenser. Ingen inlärning, kan i princip extrapolera.
- Inlärd: en embedding per position, som för tokens. Enkelt, men kan inte gå längre än tränad längd.
- RoPE (roterande): i stället för att addera position till x roterar man Q och K med en vinkel proportionell mot positionen. Skalärprodukten q·k beror då bara på skillnaden i position — attention får relativ position gratis. Standard i moderna LLM (Llama, Qwen).
Kod
import numpy as np
def rope(x, pos, base=10_000):
"""x: (d,) med d jämnt. Roterar par (x[2i], x[2i+1]) med vinkel pos * base^(-2i/d)."""
d = x.shape[0]
i = np.arange(d // 2)
theta = pos * base ** (-2 * i / d)
c, s = np.cos(theta), np.sin(theta)
x1, x2 = x[0::2], x[1::2]
out = np.empty_like(x)
out[0::2] = x1 * c - x2 * s
out[1::2] = x1 * s + x2 * c
return out
rng = np.random.default_rng(0); q, k = rng.normal(size=8), rng.normal(size=8)
a = rope(q, 3) @ rope(k, 1) # positioner 3 och 1 (avstånd 2)
b = rope(q, 10) @ rope(k, 8) # positioner 10 och 8 (avstånd 2)
print(np.isclose(a, b)) # True — bara relativ position spelar roll
print(np.isclose(a, rope(q, 5) @ rope(k, 1))) # False — annat avstånd
Sinuskodning: PE[pos, 2i] = sin(pos / 10000^(2i/d)), PE[pos, 2i+1] = cos(...), adderas till token-embeddingen.
Formellt
Rotation i planet med vinkel : . RoPE sätter , . Eftersom rotationsmatriser är ortogonala och kommuterar inom samma plan: — en funktion av . Frekvenserna ger långsamma rotationer i höga index (lång räckvidd) och snabba i låga (lokal precision). Förlängning av kontext efter träning görs genom att skala (positionsinterpolation, NTK-aware, YaRN).
Behärskning innebär
- Förklarar varför attention behöver positionsinformation
- Beskriver sinus-, inlärd och roterande (RoPE) kodning
- Implementerar RoPE och visar att relativ position bevaras
Logga in för att göra övningarna och bygga upp din behärskning.
Källor
- arXiv — RoFormer: Enhanced Transformer with Rotary Position Embedding — arXiv (öppen åtkomst; licens per artikel)
- arXiv — Attention Is All You Need — arXiv (öppen åtkomst; licens per artikel)