Hoppa till innehållet
AI-grafen
E· Universitettransformerarkitektur· ca 60 min· utvecklande· verifierad 2026-09-20

Positionell kodning och RoPE

Kunna förklara sinus-, inlärd och roterande positionskodning, och implementera RoPE.

Förkunskaper

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 ii med vinkel mθim\theta_i: R(mθi)R(m\theta_i). RoPE sätter qm=RΘ,mWQxmq_m = R_{\Theta,m} W^Q x_m, kn=RΘ,nWKxnk_n = R_{\Theta,n} W^K x_n. Eftersom rotationsmatriser är ortogonala och kommuterar inom samma plan: qm⊤kn=(WQxm)⊤RΘ,m⊤RΘ,n(WKxn)=(WQxm)⊤RΘ, n−m(WKxn)q_m^\top k_n = (W^Q x_m)^\top R_{\Theta,m}^\top R_{\Theta,n} (W^K x_n) = (W^Q x_m)^\top R_{\Theta,\,n-m}(W^K x_n) — en funktion av n−mn-m. Frekvenserna θi=b−2i/d\theta_i = b^{-2i/d} 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 θ\theta (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

Alla källor och licenser