Token Embedding
Komputer dostaje numer oznaczający fragment tekstu. Sam numer 17 nie mówi mu, czym ten fragment jest ani jak wiąże się z innymi. Potrzebuje użytecznego opisu liczbowego, który będzie mógł przekształcać podczas obliczeń.
Token Embedding zamienia identyfikator tokena — kawałka tekstu ze słownika — na wektor, czyli listę liczb. W typowym rozwiązaniu numer wskazuje wiersz wyuczonej tabeli. Jeśli token ma numer 17, odczytujemy siedemnasty odpowiedni wiersz, a nie traktujemy liczby 17 jako miary znaczenia.
Wartości tabeli są dopasowywane podczas uczenia. Ten sam token początkowo dostaje ten sam opis niezależnie od zdania. Dopiero dalsze warstwy mogą przekształcić go z użyciem kontekstu: „zamek w drzwiach” i „zamek na wzgórzu” wymagają różnego otoczenia.
Embedding nie jest więc gotową definicją słowa ani dowodem zrozumienia znaczenia. To wejściowy opis, na którym pracują kolejne mechanizmy, np. Self-attention.
Źródło mechanizmu: warstwa Embedding w Keras.
Mechanizm i szczegóły
Od identyfikatora do wektora
Wyobraźmy sobie fragment tabeli o trzech współrzędnych:
| Identyfikator | Wektor |
|---|---|
| 6 | [0,2; −0,1; 0,5] |
| 9 | [−0,4; 0,3; 0,8] |
Dla wejścia [6, 9, 6] pobieramy kolejno pierwszy, drugi i ponownie pierwszy z pokazanych wierszy. To wymyślone wartości, a średniki oddzielają współrzędne. Powtórzony identyfikator daje ten sam wektor z tej samej tabeli, nawet jeśli występuje w innym miejscu zdania.
Token Embedding nie zawiera jeszcze wyniku analizy sąsiednich tokenów. Self-attention może później nadać dwóm wystąpieniom różne reprezentacje zależne od kontekstu. Positional Encoding dostarcza osobno informacji o miejscu w sekwencji.
Laboratorium: od tokena do uczenia
Poniżej można prześledzić odczyt tabeli, przemianować identyfikatory, zmienić współrzędną i wykonać krok uczenia. Wszystkie cztery części korzystają z tej samej tabeli. Własny przykład ma sześć tokenów i sześć współrzędnych na token; słowa traktujemy jako niepodzielne jednostki. Rzeczywisty tokenizer może dzielić słowa na mniejsze fragmenty.
Skąd biorą się wartości wektorów
W oryginalnym Transformer uczono embeddings razem z modelem; nie wymagano wcześniejszego treningu Word2Vec. Opisuje to Attention Is All You Need, §3.4.
Tabela o wymiarach przechowuje parametrów: to liczba tokenów w słowniku, a to długość każdego wektora. Odczyt trzech identyfikatorów daje macierz . Przemianowanie ID razem z przestawieniem odpowiednich wierszy zachowuje wynik odczytu. Zmiana zawartości wiersza zmienia natomiast wektor pobierany przy każdym wystąpieniu tego tokena. Kształt i wyuczany charakter tabeli opisuje również dokumentacja PyTorch Embedding.
W części o uczeniu wejściem jest „kamienny”, a poprawnym następnym tokenem „zamek”. Model ma tylko dwie możliwe odpowiedzi: „zamek” i „klucz”. Dwa stałe wektory wag przekształcają wejściowy embedding w wyniki liczbowe, zwane logitami. Softmax zamienia je w prawdopodobieństwa. Cross-entropy dla tej próbki wynosi ; jest to szczególny przypadek straty opisanej w dokumentacji PyTorch.
Przycisk uczenia oblicza gradient tej straty względem sześciu współrzędnych wejściowego wektora i odejmuje od nich gradient pomnożony przez 0,4. Przy początkowych ustawieniach pierwszy krok zwiększa prawdopodobieństwo celu z około 47,0% do 61,0%, a stratę zmniejsza z około 0,755 do 0,495. Zmienia się wiersz „kamienny”, bo to on był wejściem; „zamek” był etykietą celu. Te liczby pochodzą z obliczeń przykładu.
W tym eksperymencie wagi wyjściowe są zamrożone i osobne od tabeli wejściowej, bez momentum i weight decay. Dzięki temu widać samą aktualizację jednego odczytanego wiersza. W pełnym modelu sposób uczenia i współdzielenie wag mogą sprawić, że zmieniają się także inne parametry. Poprawa na jednej próbce pokazuje działanie optymalizacji, nie jakość modelu językowego.
Gdzie pojawia się kontekst
„Oto kamienny zamek” i „oto metalowy zamek” używają w laboratorium tego samego tokena „zamek” na tej samej pozycji. Odczyt tabeli daje identyczny wektor. Dodanie tego samego Positional Encoding również zachowuje równość obu wejść. Dopiero obliczenie Self-attention uwzględnia różnicę między poprzedzającymi tokenami.
Demonstracja oblicza jedną głowę attention z jednostkowymi projekcjami Q, K i V oraz sinusoidalnym Positional Encoding według Attention Is All You Need, §3.2 i §3.5. Można odczytać wszystkie wagi attention i ujednolicić zdania, aby wyniki ponownie były identyczne. To model wpływu kontekstu z ustalonymi wagami, a nie wytrenowany klasyfikator dwóch znaczeń „zamku”.
Szerzej o późniejszym przekształcaniu wektorów mówi artykuł o attention. Jego określenie „updated embeddings” odnosi się do reprezentacji po obliczeniach, które należy odróżnić od samego odczytu tabeli.
Źródła
- Keras: Embedding layer — zamiana identyfikatorów na wektory.
- PyTorch: Embedding — tabela parametrów i kształt wyniku.
- PyTorch: CrossEntropyLoss — strata dla celu będącego identyfikatorem klasy.
- Vaswani et al., 2017, Attention Is All You Need — embeddings, Self-attention i Positional Encoding.