Czym są embeddingi słów?

Embeddingi słów (ang. word embeddings) to gęste, niskowymiarowe wektory liczbowe reprezentujące słowa w ciągłej przestrzeni wektorowej. Każde słowo jest mapowane na wektor (typowo 100-300 wymiarów), tak aby słowa o podobnym znaczeniu miały bliskie wektory.

To fundamentalna koncepcja przetwarzania języka naturalnego, która rozwiązuje problem reprezentacji tekstu — komputer nie rozumie słów, potrzebuje liczb. Wcześniejsze podejścia (one-hot encoding, Bag-of-Words) tworzyły wektory rzadkie, wielowymiarowe i pozbawione informacji o podobieństwie semantycznym.

Przełomowa właściwość embeddingów: relacje semantyczne kodowane jako operacje wektorowe. Najsłynniejszy przykład: vec(„Król") - vec(„Mężczyzna") + vec(„Kobieta") ≈ vec(„Królowa"). Analogia „Mężczyzna jest dla Króla tym, czym Kobieta jest dla Królowej" została wychwycona automatycznie z danych — model nie został nauczony tej relacji jawnie.

Ładowanie wizualizacji...

Hipoteza dystrybucyjna

Embeddingi opierają się na hipotezie dystrybucyjnej (J.R. Firth, 1957): „Poznasz słowo po towarzystwie, jakie utrzymuje" (You shall know a word by the company it keeps).

Słowa występujące w podobnych kontekstach mają podobne znaczenie. „Kot" i „pies" pojawiają się w podobnych zdaniach: „X biegał po podwórku", „nakarmił X-a", „X spał na kanapie". Model uczący się z kontekstów nadaje im bliskie wektory — bez żadnej wiedzy o zoologii.

Word2Vec

Word2Vec (Mikolov et al., Google, 2013) to przełomowy model uczący się embeddingów z dużych korpusów tekstu. Dwa warianty:

CBOW (Continuous Bag of Words)

CBOW przewiduje słowo docelowe na podstawie jego kontekstu (otaczających słów). Wejście: [„kot", „siedział", „___", „macie"] → wyjście: „na". Sieć neuronowa z jedną warstwą ukrytą; wektory embeddingów to wagi tej warstwy.

Algorytm:

  1. Weź okno kontekstowe (np. 5 słów)
  2. Uśrednij wektory kontekstu
  3. Przewiduj słowo centralne
  4. Zaktualizuj wagi za pomocą backpropagation

CBOW jest szybszy i lepiej radzi sobie z częstymi słowami.

Skip-gram

Skip-gram odwraca zadanie: na podstawie słowa docelowego przewiduje kontekst. Wejście: „na" → wyjście: [„kot", „siedział", „macie"]. Dla każdej pary (słowo docelowe, słowo kontekstowe) model trenuje się jako klasyfikator binarny.

Skip-gram lepiej radzi sobie z rzadkimi słowami i małymi korpusami.

Optymalizacje treningowe

Trening na pełnym słowniku jest kosztowny (softmax po ~100k słowach). Dwie kluczowe optymalizacje:

Negative Sampling: Zamiast softmax po całym słowniku, trenuj binarny klasyfikator: „czy słowo Y jest kontekstem słowa X?" z kilkoma losowymi negatywnymi próbkami (5-20 „nie-kontekstów").

Hierarchical Softmax: Organizacja słownika w drzewo binarne (Huffman tree). Zamiast obliczać prawdopodobieństwo dla każdego słowa, wystarczy O(log V) operacji.

Hiperparametry Word2Vec

  • Wymiarowość (dim): 100-300 — więcej wymiarów = więcej informacji, ale ryzyko overfittingu na małych korpusach
  • Rozmiar okna kontekstowego (window): 5-10 — małe okno chwyta relacje syntaktyczne (przymiotnik-rzeczownik), duże — semantyczne (kraj-stolica)
  • Min count: minimalna częstość słowa (usuwanie hapax legomenon)
  • Epochs: 5-15 — iteracje po korpusie

GloVe (Global Vectors)

GloVe (Pennington et al., Stanford, 2014) łączy zalety dwóch podejść:

  • Metody globalne (LSA) — analizują macierz współwystępowania całego korpusu
  • Metody lokalne (Word2Vec) — uczą się z lokalnych kontekstów

Algorytm GloVe:

  1. Zbuduj macierz współwystępowania X: Xᵢⱼ = ile razy słowo j pojawia się w kontekście słowa i
  2. Trenuj model minimalizujący: Σ f(Xᵢⱼ) · (wᵢᵀw̃ⱼ + bᵢ + b̃ⱼ - log Xᵢⱼ)²

Funkcja f(x) waży współwystępowania: rzadkie współwystępowania mają niższą wagę (redukcja szumu), bardzo częste — ograniczoną (unikanie dominacji par jak „the, of").

GloVe vs. Word2Vec: W praktyce dają porównywalną jakość. GloVe jest deterministyczny (brak losowości w treningu), Word2Vec jest prostszy konceptualnie.

FastText

FastText (Bojanowski et al., Facebook, 2017) rozszerza Word2Vec o n-gramy znakowe:

Słowo „playing" reprezentowane jest jako zbiór n-gramów: {, }. Wektor słowa to suma wektorów jego n-gramów.

Kluczowe zalety FastText:

  • Obsługa OOV (Out-of-Vocabulary): Nawet słowo niewidziane w treningu ma wektor — złożony z n-gramów obecnych w innych słowach. „Niesamowity" → n-gramy „nies", „iesa", „samo" itp. mogą mieć wektory z treningu.
  • Języki morfologicznie bogate: Polski, turecki, fiński — języki z bogatą fleksją mają ogromne słowniki. FastText radzi sobie lepiej, bo „biegam", „biegasz", „biegali" dzielą n-gramy.
  • Literówki i neologizmy: Tolerancja na drobne zmiany pisowni.

Ewaluacja embeddingów

Analogie wektorowe

Test: A jest dla B tym, czym C jest dla ___? vec(A) - vec(B) + vec(C) ≈ vec(D)

Przykłady: Paryż-Francja+Polska ≈ Warszawa, Król-Mężczyzna+Kobieta ≈ Królowa.

Benchmark: Google Analogy Test (19k pytań: semantyczne i syntaktyczne). Trafność 60-75% to dobry wynik.

Podobieństwo semantyczne

Korelacja między ocenami podobieństwa słów przez model i ludzi. Benchmark: WordSim-353, SimLex-999.

Zadania downstream

Ostatecznie embeddingi ocenia się pośrednio — przez wynik modelu, w którym są używane: klasyfikacja tekstu, NER, analiza sentymentu. Lepsze embeddingi → lepszy model downstream.

Od embeddingów statycznych do kontekstowych

Ograniczenia embeddingów statycznych

Word2Vec, GloVe, FastText generują jeden wektor na słowo — niezależnie od kontekstu. Słowo „zamek" ma ten sam wektor w „zamek królewski" i „zamek w drzwiach". To fundamentalne ograniczenie.

ELMo (Embeddings from Language Models)

ELMo (Peters et al., 2018) generuje kontekstowe embeddingi: wektor słowa zależy od zdania. Architektura: dwukierunkowy LSTM pretrenowany na zadaniu modelowania języka. „Zamek" w kontekście „zamek królewski" → inny wektor niż w „zamek w drzwiach".

BERT i transformery

BERT i GPT generują embeddingi kontekstowe za pomocą self-attention (transformery). Każdy token ma wektor zależny od wszystkich innych tokenów w sekwencji. To standard we współczesnym NLP — embeddingi statyczne są używane głównie jako baseline lub w scenariuszach z ograniczeniami obliczeniowymi.

Embeddingi zdaniowe i dokumentowe

Poza embedingami słów, istnieją embeddingi wyższego poziomu:

  • Doc2Vec — rozszerzenie Word2Vec na dokumenty
  • Sentence-BERT — embeddingi zdań z BERT, zoptymalizowane pod podobieństwo semantyczne
  • text-embedding-ada-002 (OpenAI) — komercyjny model embeddingów tekstu
  • E5, GTE, BGE — open-source modele embeddingów zdaniowych (MTEB leaderboard)

Zastosowania: wyszukiwanie semantyczne, klasteryzacja dokumentów, systemy rekomendacji, RAG (Retrieval-Augmented Generation).

Zastosowania praktyczne

Wyszukiwanie semantyczne

Zamiast dopasowywania słów kluczowych — wyszukiwanie po znaczeniu. Zapytanie „jak leczyć ból głowy" znajduje artykuł pt. „Terapia migreny" — bo embeddingi są bliskie.

Analiza sentymentu

Embeddingi jako cechy wejściowe dla klasyfikatora sentymentu. Słowa „świetny", „doskonały", „rewelacyjny" mają bliskie wektory → model łatwo uczy się ich pozytywnego znaczenia.

Systemy rekomendacji

Embeddingi produktów, filmów, artykułów. Produkty z bliskimi embeddingami → rekomendacja „podobne produkty".

Klasteryzacja dokumentów

Grupowanie dokumentów po embeddingach za pomocą K-Means lub DBSCAN.

Transfer learning

Pretrenowane embeddingi jako starter dla modeli NLP na małych zbiorach. Zamiast uczenia od zera, model zaczyna z wiedzą semantyczną z ogromnego korpusu.

Bias w embeddingach

Embeddingi odzwierciedlają biasy z danych treningowych. Badania (Bolukbasi et al., 2016) wykazały:

  • vec(„programista") bliżej vec(„mężczyzna") niż vec(„kobieta")
  • vec(„pielęgniarka") bliżej vec(„kobieta")
  • Stereotypy rasowe, etniczne, wiekowe

Debiasing: techniki takie jak hard debiasing (projekcja ortogonalna) i fine-tuning na zbalansowanych danych częściowo redukują biasy, ale nie eliminują ich całkowicie.

Praktyczne snippety w Pythonie

Sentence-Transformers — najpopularniejsze rozwiązanie

from sentence_transformers import SentenceTransformer

# Model wielojęzyczny — działa też dla polskiego
model = SentenceTransformer("paraphrase-multilingual-MiniLM-L12-v2")

sentences = [
    "Sztuczna inteligencja zmienia świat",
    "AI rewolucjonizuje technologię",
    "Lubię pizzę z ananasem"
]
embeddings = model.encode(sentences)
print(embeddings.shape)  # (3, 384)

# Podobieństwo cosinusowe między pierwszymi dwoma zdaniami
from sklearn.metrics.pairwise import cosine_similarity
sim = cosine_similarity([embeddings[0]], [embeddings[1]])
print(f"Podobieństwo zdań 1 i 2: {sim[0][0]:.3f}")  # ~0.85

Gensim Word2Vec — klasyczna implementacja

from gensim.models import Word2Vec

# Trening na własnym korpusie (lista list tokenów)
corpus = [
    ["sztuczna", "inteligencja", "zmienia", "świat"],
    ["uczenie", "maszynowe", "to", "podzbiór", "AI"],
    ["sieci", "neuronowe", "uczą", "się", "wzorców"]
]
model = Word2Vec(corpus, vector_size=100, window=5, min_count=1, workers=4)

# Wektor dla słowa
vec = model.wv["sztuczna"]
print(vec.shape)  # (100,)

# Najbliższe słowa
print(model.wv.most_similar("sztuczna", topn=3))

OpenAI Embeddings API — produkcyjne rozwiązanie

from openai import OpenAI

client = OpenAI()
response = client.embeddings.create(
    model="text-embedding-3-small",  # 1536 wymiarów, 0,02 USD/1M tokenów
    input="Sztuczna inteligencja w Polsce — stan na 2026"
)
embedding = response.data[0].embedding
print(f"Wymiarów: {len(embedding)}")  # 1536

Wyszukiwanie semantyczne — przykład end-to-end

from sentence_transformers import SentenceTransformer
import numpy as np

model = SentenceTransformer("paraphrase-multilingual-MiniLM-L12-v2")

# Baza dokumentów
docs = [
    "Q-learning to algorytm uczenia ze wzmocnieniem",
    "Transformery zrewolucjonizowały NLP",
    "Sieci konwolucyjne CNN świetnie nadają się do obrazów",
    "GAN tworzą realistyczne syntetyczne dane"
]
doc_embeddings = model.encode(docs)

# Wyszukiwanie
query = "jak AI uczy się przez nagrody?"
q_emb = model.encode([query])

# Cosine similarity
from sklearn.metrics.pairwise import cosine_similarity
scores = cosine_similarity(q_emb, doc_embeddings)[0]
top_idx = np.argsort(scores)[::-1][:2]

for idx in top_idx:
    print(f"[{scores[idx]:.3f}] {docs[idx]}")
# Najwyżej: "Q-learning to algorytm uczenia ze wzmocnieniem"

Dla większych aplikacji wykorzystaj dedykowaną bazę wektorową: Pinecone, Weaviate, Qdrant lub Chroma. Zobacz też RAG (Retrieval-Augmented Generation) — najpopularniejsze zastosowanie embeddingów w produkcji LLM.

Podsumowanie

Embeddingi słów to fundament współczesnego NLP. Word2Vec udowodnił, że znaczenie słów można kodować jako wektory, GloVe wykorzystał globalną statystykę, FastText dodał n-gramy znakowe. Choć embeddingi kontekstowe (BERT, GPT) zdominowały NLP, statyczne embeddingi pozostają ważne jako baseline, w systemach o ograniczonych zasobach i jako koncepcja fundamentalna do zrozumienia reprezentacji tekstowej w AI.