Embeddingi: jak tekst staje się zbiorem liczb

Embeddingi zamieniają słowa i zdania w wektory, które można porównywać maszynowo. Wyjaśniamy, jak powstają, co naprawdę mierzy podobieństwo i gdzie intuicja zawodzi.

Ilustracja: chmura słów zamieniona w siatkę punktów i wektorów w przestrzeni trójwymiarowej

Embedding to wektor liczb, który reprezentuje fragment tekstu: słowo, zdanie, akapit albo cały dokument. Model dobiera te liczby tak, żeby teksty o podobnym znaczeniu znalazły się blisko siebie w wielowymiarowej przestrzeni. Dzięki temu komputer może porównywać znaczenie bez rozumienia języka, a wyszukiwanie, grupowanie i klasyfikacja tekstu sprowadzają się do działań na liczbach.

Skąd bierze się wektor dla słowa

Klasyczne podejście opisał zespół Tomasa Mikolova w 2013 roku. Model word2vec uczył się wektorów, przewidując słowo na podstawie kontekstu albo kontekst na podstawie słowa. Słowa pojawiające się w podobnych otoczeniach dostawały podobne reprezentacje, bo sieć musiała rozwiązywać podobne zadania.[1] To praktyczna wersja starej obserwacji językoznawców: znaczenie słowa widać po tym, z czym się je łączy.

Pojedynczy wymiar takiego wektora nie ma czytelnej interpretacji. Nikt nie projektuje osi odpowiadającej rodzajowi gramatycznemu czy tematyce. Znaczenie rozkłada się na kombinację setek kierunków, a autorzy pracy pokazali, że takie reprezentacje dobrze wypadają w testach podobieństwa składniowego i semantycznego.[1] To efekt uboczny uczenia, a nie założenie zapisane w kodzie.

Podobieństwo to kąt, nie odległość w centymetrach

W praktyce porównuje się zwykle podobieństwo kosinusowe, czyli kosinus kąta między wektorami. Wynosi 1 dla wektorów wskazujących ten sam kierunek, 0 dla prostopadłych i -1 dla przeciwnych. Długość wektora bywa normalizowana, bo w wielu modelach rośnie ona z częstością występowania słowa albo z długością tekstu, a nie z jego treścią.

Ta miara ma konsekwencje. Dwa zdania mogą mieć zupełnie inną długość i nadal być blisko siebie, jeśli mówią o tym samym. Z drugiej strony bliskość nie oznacza prawdy ani zgodności logicznej. Wektory opisują wzorce współwystępowania, a nie stosunek autora do tematu.

Kontekst zmienia wektor

Wektory z word2vec są stałe: słowo ma jedną reprezentację niezależnie od zdania. Nowsze modele, w tym BERT z 2018 roku, liczą reprezentację tokenu z uwzględnieniem całego kontekstu.[3] To rozwiązuje problem słów wieloznacznych. Wyraz bank w zdaniu o rzece i w zdaniu o finansach dostaje inne wektory, bo model widzi różne otoczenie.

Modele transformerowe, opisane w pracy z 2017 roku, łączą naukę reprezentacji tokenów z informacją o pozycji, żeby model wiedział, gdzie w zdaniu znajduje się dany element.[2] Późniejsze prace pokazały, jak z reprezentacji pojedynczych tokenów zrobić sensowny wektor całego zdania. Sentence-BERT z 2019 roku trenował dwie kopie tego samego modelu tak, aby zdania o podobnym znaczeniu miały bliskie wektory i można je było porównywać kosinusowo bez drogiego przeliczania par.[4]

Do czego się ich używa

Pierwsze zastosowanie to wyszukiwanie semantyczne. Zapytanie zamienia się w wektor, a system zwraca dokumenty o najbliższych wektorach, nawet jeśli nie zawierają tych samych słów. To podstawa wyszukiwania w bazach wiedzy i mechanizmu dostarczania kontekstu do modeli językowych, nazywanego często RAG.

Drugie to grupowanie i porządkowanie zbiorów. Wektory pozwalają łączyć zgłoszenia o podobnej treści, wykrywać duplikaty, porządkować katalog produktów albo znajdować artykuły na ten sam temat. Trzecie to klasyfikacja i rekomendacje: zamiast ręcznie pisać reguły, wystarczy porównać reprezentację nowego tekstu z przykładami.

W każdym z tych przypadków embedding nie jest bazą faktów. To sposób na miarę podobieństwa. System, który zwraca najbliższy dokument, nie sprawdza, czy odpowiedź jest poprawna, tylko czy jest blisko zapytania.

Gdzie intuicja zawodzi

Najczęstszy błąd to traktowanie progu podobieństwa jak uniwersalnej miary. Wartość 0,8 w jednym modelu oznacza coś innego niż 0,8 w innym, a progi trzeba dobierać na własnych danych, najlepiej z oznaczonymi parami. Zmiana modelu unieważnia też cały indeks: wektory z dwóch różnych modeli nie są porównywalne, nawet jeśli mają ten sam wymiar.

Drugi problem to negacja i drobne różnice. Zdania o podobnym słownictwie, ale przeciwnym sensie, potrafią być blisko siebie, bo dzielą większość kontekstów. Podobnie pytanie i odpowiedź bywają blisko, choć nie są tym samym. Dlatego w wyszukiwaniu łączy się embeddingi z filtrowaniem i z pełnotekstowym dopasowaniem, zamiast polegać wyłącznie na wektorach.

Trzeci to utrata szczegółu. Wektor streszcza tekst do kilkuset liczb, więc daty, liczby i nazwy własne mogą zniknąć w uśrednieniu. Długi dokument warto dzielić na mniejsze fragmenty, ale wtedy pojawia się pytanie, jak łączyć wyniki z różnych części. To zagadnienie projektowe, nie właściwość modelu.

Jak to sprawdzić samemu

Wystarczy kilka linijek w Pythonie. Po pobraniu wektorów dla dwóch tekstów liczy się iloczyn skalarny podzielony przez iloczyn ich długości. Jeśli biblioteka zwraca wektory nieznormalizowane, warto to zrobić jawnie, żeby wynik miał interpretację kosinusa. Potem można porównać kilka par, o których wiadomo, że są bliskie, i kilka przypadków granicznych.

Warto przy tym pamiętać, że embeddingi działają na tokenach, a nie na literach czy słowach w sensie językowym. To, jak tekst zostanie podzielony, wpływa na wynik, a w języku polskim tokenizacja wypada drożej niż w angielskim, co opisaliśmy w tekście o tokenizacji i kosztach polskiego tekstu. Dla wyszukiwania oznacza to inną liczbę fragmentów i inne koszty niż w prostych szacunkach.

Co zapisać w projekcie

Przy wdrożeniu liczą się trzy rzeczy: wersja modelu, wymiar wektora i sposób normalizacji. Bez tego po miesiącu nie wiadomo, dlaczego wyniki się zmieniły. Warto też trzymać surowy tekst obok wektorów, bo ponowne przeliczenie całego zbioru bywa konieczne przy każdej zmianie modelu, a bez tekstu źródłowego jest niemożliwe.

I ostatnia uwaga praktyczna: embeddingi dziedziczą skłonności danych treningowych. Jeśli zbiór tekstów przedstawia jakąś grupę w określony sposób, wektory będą bliżej łączyć ją z tymi skojarzeniami. To nie znaczy, że model jest zły, tylko że mierzy wzorce w danych, a nie obiektywne podobieństwo znaczeń. Przy zastosowaniach, w których wynik ma skutki dla ludzi, trzeba to sprawdzić na reprezentatywnych przykładach.

Źródła

  1. T. Mikolov, K. Chen, G. Corrado, J. Dean, „Efficient Estimation of Word Representations in Vector Space”, arXiv:1301.3781, 16 stycznia 2013. https://arxiv.org/abs/1301.3781
  2. A. Vaswani i in., „Attention Is All You Need”, arXiv:1706.03762, 12 czerwca 2017. https://arxiv.org/abs/1706.03762
  3. J. Devlin, M.-W. Chang, K. Lee, K. Toutanova, „BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding”, arXiv:1810.04805, 11 października 2018. https://arxiv.org/abs/1810.04805
  4. N. Reimers, I. Gurevych, „Sentence-BERT: Sentence Embeddings using Siamese BERT-Networks”, arXiv:1908.10084, 27 sierpnia 2019. https://arxiv.org/abs/1908.10084

Kuba

Autor w Teknews

Pisze o sztucznej inteligencji i internecie. Najbardziej lubi rozbierać na części to, co inni nazywają magią: tokeny, okna kontekstu, algorytmy rekomendacji. Zanim napisze, że coś działa w określony sposób, szuka tego w dokumentacji albo w publikacji, a nie w wątku na X.

Jak powstają nasze teksty