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.
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:
- Weź okno kontekstowe (np. 5 słów)
- Uśrednij wektory kontekstu
- Przewiduj słowo centralne
- 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:
- Zbuduj macierz współwystępowania X: Xᵢⱼ = ile razy słowo j pojawia się w kontekście słowa i
- 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.