Dla pozycji pos i wymiaru i embeddingu o szerokości d_model definiuje się: PE(pos, 2i) = sin(pos / 10000^(2i/d_model)) oraz PE(pos, 2i+1) = cos(pos / 10000^(2i/d_model)). Wymiary parzyste otrzymują sinus, nieparzyste cosinus, a długość fali rośnie geometrycznie od 2π do 2π·10000 wraz z indeksem wymiaru. Tak zbudowany wektor jest dodawany (a nie konkatenowany) do embeddingu tokenu na samym wejściu modelu, przed pierwszym blokiem attention. Kluczowa właściwość: dla dowolnego k istnieje liniowa transformacja przekształcająca PE(pos) w PE(pos+k), dzięki czemu model może łatwo nauczyć się uwagi na pozycje względne, mimo że kodowanie jest absolutne. Encoding jest stały i raz wyliczany — nie ma żadnych parametrów do uczenia.
Transformer, w odróżnieniu od RNN i CNN, jest z natury permutacyjnie niezmienniczy względem tokenów wejścia — bez dodatkowej informacji o pozycji wszystkie tokeny są dla niego „workiem słów". Sinusoidal Positional Encoding rozwiązuje ten problem najprostszym możliwym sposobem: deterministyczną funkcją pozycji, której nie trzeba uczyć i która działa dla dowolnej długości sekwencji znanej w czasie pretreningu.
Sinusoidal PE w oryginalnej pracy jest dodawane do embeddingu, nie konkatenowane. Konkatenacja wymagałaby zmiany d_model i zaburza ustaloną strukturę projekcji query/key/value.
Mimo że PE jest dobrze zdefiniowane dla dowolnego pos, modele trenowane na długości L w praktyce słabo działają na L' >> L — wzorce attention nigdy nie były widziane przy takich pozycjach.
W oryginalnej pracy embedding tokenu jest mnożony przez sqrt(d_model) przed dodaniem PE, żeby zachować rząd wielkości obu sygnałów. Pominięcie tego skalowania jest częstym błędem dydaktycznych implementacji i znacząco pogarsza trening.
Vaswani et al. publikują Transformera i wraz z nim deterministyczne sinusoidalne kodowanie pozycji. Autorzy porównują je z learned PE — uzyskują niemal identyczne wyniki, ale wybierają sinusoidal jako prostsze i ekstrapolujące na większe długości.
BERT (Devlin et al., 2018) i GPT (Radford, 2018) wybierają uczone embeddingi pozycji zamiast sinusoidalnych — uzyskują bardzo zbliżone wyniki kosztem braku ekstrapolacji poza długość treningu.
Shaw et al. (Google) wprowadzają relatywne kodowania pozycji — pokazują, że jawne modelowanie odległości między tokenami daje lepsze wyniki niż absolutne PE w wielu zadaniach NLP.
RoPE (Su et al.) oraz ALiBi (Press et al.) zastępują dodawalne sinusoidalne/learned PE: RoPE rotuje pary wymiarów, ALiBi dodaje liniowy bias w attention. Oba lepiej radzą sobie z długim kontekstem niż klasyczne sinusoidal PE — to początek schyłku oryginalnej metody w nowych dużych LLM.
W nowych dużych LLM (Llama 2/3, Qwen, DeepSeek, Mistral) Sinusoidal PE jest praktycznie wyparte przez RoPE. Pozostaje w użyciu w starszych modelach, dydaktyce i prostszych Transformerach (np. małe modele audio/wizja).
Szerokość embeddingu, równa szerokości wektora PE. W oryginalnej pracy d_model = 512.
Podstawa potęgi w wzorze: pos / base^(2i/d_model). W oryginalnej pracy 10000 — wybrana empirycznie. Zmiana wpływa na zakres długości fal i pośrednio na zdolność do reprezentacji pozycji.
Liczba pozycji, dla których PE jest wyliczane z góry i cache'owane. Implementacyjny detal — sama funkcja jest dobrze zdefiniowana dla dowolnego pos.
Sinusoidal PE jest dodawany do każdego embeddingu wejściowego — operacja gęsta, deterministyczna, bez routingu.
Encoding jest deterministyczną funkcją pozycji — całą macierz PE można wyliczyć raz przy inicjalizacji i reużywać. Brak jakichkolwiek zależności sekwencyjnych.
Sinusoidal PE to czysto matematyczna, deterministyczna operacja — precompute raz przy inicjalizacji, w runtime tylko dodawanie. Działa identycznie na każdym hardware.