06 · Sieci · 4 min czytania · Interaktywne · aktualizacja
Czym są embeddingi w uczeniu maszynowym i jak powstają?
W skrócie
Embedding to wektor liczb reprezentujący obiekt, np. słowo, produkt czy obraz, tak że obiekty podobne dla zadania leżą blisko siebie w przestrzeni.
Co to jest
Embedding (osadzenie, reprezentacja wektorowa) to gęsty wektor liczb rzeczywistych, zwykle o kilkudziesięciu do kilku tysięcy wymiarów, który reprezentuje obiekt: słowo, token, użytkownika, produkt, obraz. Embeddingi są uczone tak, aby obiekty podobne pod względem zadania miały bliskie wektory. Odległość lub kąt między wektorami staje się wtedy miarą podobieństwa, z którą dalsze warstwy sieci i proste algorytmy potrafią pracować.
Porównaj dwa sposoby zapisu słowa. Kodowanie one-hot to wektor długości słownika z jedną jedynką: „kot” i „pies” są w nim tak samo różne jak „kot” i „hipoteka”, bo każde dwa wektory są prostopadłe. Embedding zastępuje ten wektor np. 300 liczbami, w których „kot” i „pies” leżą blisko, bo pojawiają się w podobnych kontekstach. Wymiary zwykle nie mają nazw, ale kierunki w przestrzeni często odpowiadają cechom znaczeniowym.
Embeddingi są wszędzie: w modelach językowych (pierwsza warstwa każdego transformera), w systemach rekomendacyjnych (wektory użytkowników i produktów), w wyszukiwaniu semantycznym, w danych tabelarycznych z wielokategorycznymi cechami. Każda warstwa ukryta sieci tworzy zresztą jakąś reprezentację wektorową danych; „embeddingiem” nazywa się zwykle tę, której używamy poza samą siecią.
Mechanizm — dlaczego tak działa
Technicznie warstwa embeddingów to tabela, czyli macierz E o wymiarach (liczba obiektów) × d. Obiekt numer i dostaje wiersz E[i]. Jest to dokładnie to samo, co pomnożenie wektora one-hot przez macierz E, tyle że bez mnożenia przez miliony zer. Wiersze macierzy są zwykłymi wagami sieci: startują losowo i są poprawiane propagacją wsteczną, gdy obiekt pojawia się w danych.
Podobne obiekty dostają podobne wektory, bo pełnią podobną rolę w zadaniu. Jeśli sieć ma przewidywać sąsiednie słowa, a „kot” i „pies” pojawiają się w podobnych kontekstach („karmię ___”, „___ śpi na kanapie”), gradient popycha ich wektory w zbliżone miejsca. To hipoteza dystrybucyjna: znaczenie słowa wynika z towarzystwa, w jakim występuje. Ta sama logika działa dla produktów kupowanych przez podobnych klientów.
Gęstość daje uogólnienie. W one-hot wiedza o „kocie” nie przenosi się na „psa”. W embeddingu wszystko, czego sieć nauczy się dla jednego punktu przestrzeni, częściowo dotyczy jego sąsiadów. Dzięki temu rzadkie obiekty korzystają z danych o podobnych częstych obiektach.
Wymiar d to kompromis. Zbyt mały ściśnie różne obiekty w jedno miejsce, zbyt duży marnuje parametry i sprzyja przeuczeniu dla rzadkich obiektów. Przy 10 000 kategorii i d = 16 tabela ma 160 000 parametrów, a każda kategoria dostaje tylko tyle aktualizacji, ile razy pojawi się w danych.
Zastrzeżenia: embeddingi uczą się tego, co jest w danych, łącznie z uprzedzeniami. Klasyczne wektory słów kodowały stereotypy płciowe obecne w tekstach. Podobieństwo jest też zawsze podobieństwem ze względu na zadanie: dwa słowa przeciwne znaczeniowo („gorący”, „zimny”) mają często bardzo bliskie wektory, bo występują w tych samych kontekstach.
Na przykładzie
Sieć 64-64-10 z ReLU wytrenowana na zbiorze Digits 8×8 (standaryzowane piksele, 1347 obrazków treningowych, MLPClassifier, random_state=0) tworzy w warstwie ukrytej 64-wymiarowy embedding każdego obrazka. Klasyfikator najbliższego sąsiada (1-NN) na surowych pikselach myli się na 15 z 450 obrazków testowych (96,7% trafności). Ten sam 1-NN, porównujący obrazki przez ich embeddingi, myli się tylko na 7 (98,4%). Wymiar jest taki sam, zmieniła się tylko geometria: sieć poprzesuwała obrazki tak, by odległość odzwierciedlała to, która to cyfra, a nie np. grubość kreski.
Wymiar ma znaczenie. Gdy warstwa ukryta ma tylko 2 neurony, 1-NN na tak powstałym dwuwymiarowym embeddingu trafia tylko w 64,2% przypadków: dziesięć klas nie mieści się dobrze w dwóch wymiarach.
Dane: Digits (ręcznie pisane cyfry 8×8)
W praktyce
- PyTorch:
nn.Embedding(num_embeddings, embedding_dim)przyjmuje tensory indeksów (long);padding_idxpozwala zarezerwować wektor zerowy dla wypełnienia. - Wymiar na start: od 8–16 dla cech tabelarycznych z kilkudziesięcioma kategoriami do 256–4096 w modelach językowych; popularna heurystyka to wymiar rosnący jak pierwiastek czwartego stopnia z liczby kategorii, ale warto go stroić.
- Do porównań zwykle normalizuj wektory i używaj podobieństwa kosinusowego; długość wektora często koduje częstość obiektu, a nie znaczenie.
- Gotowe embeddingi tekstu (np. z modeli typu sentence-transformers) to dobry punkt startu do klasyfikacji i wyszukiwania; do wizualizacji rzutuj je przez PCA, t-SNE lub UMAP, pamiętając o zniekształceniach tych metod.
- Nieznane w treningu kategorie mapuj na wspólny wektor „nieznany”, a rzadkie łącz w jedną grupę, zanim tabela urośnie bez potrzeby.
Najczęstsze pytania
- Czym różni się embedding od kodowania one-hot?
- One-hot ma tyle wymiarów, ile kategorii, jest rzadki i nie zawiera informacji o podobieństwie. Embedding jest gęsty, ma zwykle znacznie mniej wymiarów i jest uczony, więc odległości niosą sens. Matematycznie embedding to one-hot pomnożony przez uczoną macierz.
- Czy wymiary embeddingu coś znaczą?
- Pojedyncze współrzędne zwykle nie mają czytelnej interpretacji, bo obrót całej przestrzeni nie zmienia odległości. Znaczenie niosą raczej kierunki i względne położenie punktów, co można badać np. przez różnice wektorów.
- Czy embeddingi z jednego modelu można porównywać z embeddingami z innego?
- Nie bezpośrednio. Każdy model tworzy własną przestrzeń, w której osie są ustawione dowolnie. Porównywać można tylko odległości w obrębie jednej przestrzeni, chyba że obie zostaną specjalnie do siebie dopasowane.
Źródła
- Bengio Y., Ducharme R., Vincent P., Jauvin C., „A Neural Probabilistic Language Model”, Journal of Machine Learning Research 3, 2003, s. 1137–1155.
- Mikolov T., Chen K., Corrado G., Dean J., „Efficient Estimation of Word Representations in Vector Space”, arXiv:1301.3781, 2013.
- Guo C., Berkhahn F., „Entity Embeddings of Categorical Variables”, arXiv:1604.06737, 2016.
- Jurafsky D., Martin J. H., „Speech and Language Processing”, 3rd ed. draft, rozdz. „Vector Semantics and Embeddings”.
- Dokumentacja PyTorch,
torch.nn.Embedding: https://pytorch.org/docs/stable/generated/torch.nn.Embedding.html