Positional encoding is de manier waarop een taalmodel de volgorde van woorden bijhoudt. Het model bekijkt alle woorden tegelijk, dus zonder extra informatie lijken "de hond bijt de man" en "de man bijt de hond" bijna hetzelfde. Positional encoding voegt de plek van elk woord toe, en de methode bepaalt hoe goed een model omgaat met teksten die langer zijn dan zijn trainingsteksten, zoals een lang contract.
Waarom heeft een transformer het nodig?
De transformer werkt zonder recurrentie, dus moesten Vaswani e.a. (2017) informatie over de relatieve of absolute positie van de tokens in de reeks toevoegen. Attention vergelijkt elk token met elk ander token, en die vergelijking kijkt op zichzelf niet naar waar de tokens staan. Modellen die van links naar rechts schrijven zijn een gedeeltelijke uitzondering: elk token ziet alleen de tokens ervoor, en Haviv e.a. (2022) zagen dat zulke modellen ook zonder positional encoding een besef van positie oppikken en goed blijven meekomen.
Welke methoden zijn er?
- Sinusvormige encoding. De oorspronkelijke transformer telt bij de embedding van elk token een vast patroon van sinus- en cosinusgolven op, met golflengtes van 2π tot 10.000 × 2π. De auteurs kozen dit omdat het het model misschien in staat stelt te extrapoleren naar langere teksten; geleerde positievectoren gaven in hun tests bijna dezelfde resultaten.
- Geleerde position embeddings. Het model leert per positie één vector. BERT (Google, 2018) trainde zijn position embeddings op reeksen van hoogstens 512 tokens.
- Rotary position embedding (RoPE). Su e.a. (2021) draaien de query- en keyvectoren over een hoek die van de positie afhangt, zodat de attention-score tussen twee tokens van hun afstand afhangt. LLaMA van Meta (2023) verving absolute position embeddings door RoPE in elke laag.
- ALiBi. Press, Smith en Lewis (2021) voegen helemaal geen positievectoren toe: elke attention-score krijgt een straf die evenredig is met de afstand tussen de twee tokens. Een model van 1,3 miljard parameters, getraind op 1.024 tokens, kon 2.048 tokens even goed aan als een sinusvormig model dat op 2.048 was getraind, en trainde 11% sneller. BLOOM (BigScience, 2022) gebruikt het en merkte dat de training er ook soepeler door verliep.
Hoe komen modellen aan een langere context?
Een model laten werken op teksten die langer zijn dan in de training gaat meestal mis. Press e.a. zagen dat een sinusvormig model, getraind op 512 tokens, beter werd tot 20 extra tokens en na 50 slechter; modellen met RoPE gingen ook achteruit. Bij RoPE-modellen is de gebruikelijke route de posities te herschalen en kort op lange teksten te trainen. Position Interpolation (Chen e.a., Meta, 2023) perst de posities samen tot het getrainde bereik en bracht LLaMA naar 32.768 tokens binnen 1.000 stappen fine-tuning. YaRN (Peng e.a., 2023) bracht Llama 2 naar een contextvenster van 128K tokens met een paar honderd stappen. Meta verhoogde de basisfrequentie van RoPE in Llama 3 naar 500.000 en liet de context in zes fasen groeien van 8K naar 128K tokens, met ongeveer 800 miljard trainingstokens.
Voorbeeld
RoPE werkt op paren getallen in de query- en keyvectoren. Dit fragment draait per positie één paar en laat zien dat de score bij dezelfde query en key alleen afhangt van de afstand tussen de twee tokens:
1 import math 2 3 def rotate(x, y, pos, theta=0.5): 4 # RoPE voor één paar dimensies: draai de vector over pos * theta 5 a = pos * theta 6 return x * math.cos(a) - y * math.sin(a), x * math.sin(a) + y * math.cos(a) 7 8 def score(q, k, q_pos, k_pos): 9 qx, qy = rotate(*q, q_pos) 10 kx, ky = rotate(*k, k_pos) 11 return round(qx * kx + qy * ky, 3) 12 13 q, k = (1.0, 0.5), (0.3, 2.0) 14 print(score(q, k, 2, 5), score(q, k, 10, 13)) # twee keer afstand 3: -1.753 -1.753 15 print(score(q, k, 2, 6)) # afstand 4: -2.223
Bronnen
- Vaswani et al.: Attention Is All You Need (2017), section 3.5arXiv
- Su et al.: RoFormer: Enhanced Transformer with Rotary Position Embedding (2021)arXiv
- Press, Smith and Lewis: Train Short, Test Long: Attention with Linear Biases Enables Input Length Extrapolation (2021)arXiv
- Chen et al.: Extending Context Window of Large Language Models via Positional Interpolation (2023)arXiv
- Peng et al.: YaRN: Efficient Context Window Extension of Large Language Models (2023)arXiv
- Haviv et al.: Transformer Language Models without Positional Encodings Still Learn Positional Information (2022)arXiv
