Positional Encoding
Czytasz zdania „BMW wyprzedziło Volvo” i „Volvo wyprzedziło BMW”. Zawierają dokładnie te same słowa, ale zmiana kolejności odwraca role samochodów. Jeżeli mechanizm modelu widzi wyłącznie opisy słów i porównuje je jak nieuporządkowany zbiór, brakuje mu sygnału określającego ich miejsca w zdaniu.
Positional Encoding dostarcza informacji o pozycji kawałka tekstu. W oryginalnym Transformerze do listy liczb opisujących token dodawano drugą listę, wyliczoną z numeru miejsca. Token to jednostka tekstu; jego opis liczbowy nazywa się embeddingiem.
Słowo „Volvo” na miejscu pierwszym i trzecim otrzymuje więc różny sygnał wejściowy. Model może uczyć się wykorzystywania tej różnicy przy interpretacji zdania. W pierwotnym rozwiązaniu wzorce pozycji przypominały fale o różnych częstotliwościach; wyliczano je za pomocą funkcji sinus i cosinus.
Sygnał pozycji nie blokuje zaglądania do przyszłych fragmentów. Tę funkcję pełni Causal Masking. Nie każdy model dodaje pozycję w ten sam sposób: Rotary Position Embedding wprowadza ją przez obracanie części opisów liczbowych.
Źródło mechanizmu: Wyjaśnienie: Dive into Deep Learning, §11.6.3.
Mechanizm i szczegóły
W oryginalnym Transformer do reprezentacji każdego tokena dodawano wektor zbudowany z sinusów i cosinusów o różnych częstotliwościach. Wektor miał ten sam wymiar co embedding, więc dodawanie odbywało się współrzędna po współrzędnej. Attention Is All You Need, §3.5.
Co dostaje model
Schemat dodawania można zapisać jako : to embedding tokena na pozycji , a zależy od pozycji.
W dwuwymiarowej ilustracji wzoru sinusoidalnego , a . Ten sam token z tym samym embeddingiem otrzyma więc inny wektor wejściowy na tych dwóch pozycjach. Te liczby pokazują kodowanie miejsca, nie znaczenie tokena ani siłę jego związku z sąsiadem.
Positional Encoding nie zastępuje maski przyczynowej. Informacja o położeniu nie zabrania dostępu do przyszłej pozycji; robi to maska. Wariant sinusoidalny jest jednym ze sposobów reprezentowania pozycji, a nie wymaganym rozwiązaniem w każdym modelu.
Zobacz także: Rotary Position Embedding wprowadza pozycję przez obrót query i key zamiast dodawania wektora pozycji do embeddingu.