1) Z korpusu budowana jest macierz współwystąpień X o wymiarach |V|×|V|, gdzie |V| to rozmiar słownika, a X_ij to ważona liczba wystąpień słowa j w oknie kontekstu słowa i (waga 1/odległość). 2) Każdemu słowu przypisuje się dwa wektory: wektor słowa w_i oraz wektor kontekstu w̃_j, oraz biasy b_i, b̃_j. 3) Model minimalizuje ważoną funkcję straty J = Σ_ij f(X_ij) · (w_i^T w̃_j + b_i + b̃_j − log X_ij)^2, gdzie funkcja wagowa f(x) = (x/x_max)^α dla x < x_max, w przeciwnym razie 1 (typowo x_max = 100, α = 0.75) — tłumi wpływ rzadkich i bardzo częstych par. 4) Trening odbywa się stochastycznym gradientem (AdaGrad) na niezerowych wpisach X. 5) Końcowy embedding słowa to suma w_i + w̃_i.
Wcześniejsze metody dzieliły się na dwie szkoły: globalną faktoryzację macierzy (LSA, HAL) skutecznie wykorzystującą statystyki korpusu, ale słabą w analogiach słownych, oraz lokalne metody okna kontekstu (word2vec) świetne w analogiach, lecz nie wykorzystujące pełnych statystyk globalnych. GloVe ujednolica oba podejścia — uczy się reprezentacji bezpośrednio z globalnych liczników współwystąpień, jednocześnie dobrze radząc sobie na zadaniach analogii i podobieństwa słów.
Macierz |V|×|V|, gdzie X_ij to ważona liczba wystąpień słowa j w oknie kontekstowym słowa i. Budowana raz, jednorazowym przebiegiem korpusu.
Dwa zestawy wektorów (oraz biasy b_i, b̃_j) trenowane jednocześnie. Końcowy embedding słowa to suma w_i + w̃_i, co wygładza szum i nieznacznie poprawia wyniki.
f(x) = (x/x_max)^α dla x < x_max, w przeciwnym razie 1. Typowo x_max=100, α=0.75. Tłumi wpływ par bardzo rzadkich (potencjalny szum) i bardzo częstych (np. stopwords).
Oficjalna
GloVe uczy jeden wektor na słowo ze stałego słownika. Słowa nieobecne w korpusie treningowym (rzadkie, błędy ortograficzne, neologizmy) nie mają reprezentacji.
Każde słowo ma jeden wektor niezależnie od kontekstu zdania. Polysemia (np. „bank” rzeka vs. instytucja) jest reprezentowana jako uśrednienie znaczeń.
Dla bardzo dużych korpusów macierz X może nie zmieścić się w RAM. Oficjalna implementacja używa dyskowego shuffling i sparse storage, ale wymaga ostrożnego ustawienia parametrów.
Wyniki silnie zależą od rozmiaru okna kontekstu, lowercasing, usunięcia stopwords i tokenizacji. Replikacja wyników z papieru wymaga zachowania tych samych ustawień preprocessingu.
Mikolov et al. publikują word2vec — lokalne metody okna kontekstu uczące dystrybucyjnych reprezentacji słów. Bezpośredni poprzednik i konkurent GloVe.
Pennington, Socher i Manning publikują pracę i udostępniają pretrenowane wektory na Wikipedia+Gigaword, Common Crawl i Twitter.
Bojanowski et al. wprowadzają fastText, rozszerzający word2vec o n-gramy znakowe — rozwiązuje problem słów spoza słownika (OOV), na który GloVe i word2vec są podatne.
ELMo (Peters et al. 2018) i BERT (Devlin et al. 2018) wprowadzają kontekstowe reprezentacje słów, w których embedding zależy od zdania. Statyczne embeddingi typu GloVe stopniowo schodzą na drugi plan w badaniach NLP.
Złożoność czasowa: O(|X|) ≈ O(|C|^0.8). Złożoność przestrzenna: O(|V|·d + |X|).
Pierwsze przejście po korpusie w celu zbudowania macierzy X jest jednorazowe, ale w przypadku dużych korpusów (Common Crawl 840B tokenów) wymaga znaczącej pamięci i I/O. Sam trening jest zwykle szybszy niż budowa macierzy.
Wymiarowość wektorów słów. W oryginalnej publikacji testowano 25–300; udostępnione pretrenowane wektory mają 50, 100, 200, 300.
Liczba słów po lewej i prawej stronie słowa centralnego brana pod uwagę przy zliczaniu współwystąpień. Większe okno = więcej semantyki tematycznej, mniejsze = więcej cech składniowych.
Próg w funkcji wagowej f(x) — powyżej x_max waga = 1. Kontroluje wpływ par o wysokiej częstości.
Wykładnik w funkcji wagowej f(x) = (x/x_max)^α. Wartość 0.75 znaleziono empirycznie jako najlepszą.
Liczba epok przejścia po niezerowych wpisach macierzy X (AdaGrad).
GloVe produkuje gęste, statyczne wektory słów (jeden wektor na słowo, niezależny od kontekstu) — w przeciwieństwie do kontekstowych embeddingów (ELMo, BERT).
Trening AdaGrad można zrównoleglać po niezerowych wpisach macierzy z asynchronicznymi aktualizacjami parametrów (Hogwild!-podobnie). Inferencja (lookup wektora) jest trywialnie równoległa, ale nie wymaga obliczeń.
Oficjalna implementacja Stanford jest w C i zoptymalizowana pod CPU z OpenMP. Trening GloVe nie wymaga GPU — operacje to głównie aktualizacje rzadkich wpisów wektorowych.
Trening może być portowany na GPU (istnieją implementacje w PyTorch/TensorFlow), choć korzyści są mniejsze niż dla gęstych modeli neuronowych.