Embeddingy a word2vec: jak se slovo stane vektorem
Proč nestačí one-hot, distribuční hypotéza, word2vec se skip-gramem a negativními vzorky, nejbližší slova, analogie král − muž + žena, mapa slov a předsudky převzaté z dat — na textu z gramatiky a modelu napsaném od nuly.
Série Základy AI Díl 68 z 83
- Mapa umělé inteligence: co je co a jak to do sebe zapadá
- Stručná historie umělé inteligence: od Turinga po jazykové modely
- Data, model, trénink, inference: základní pojmy na jednom příkladu
- Jak číst matematický zápis: symboly, indexy, sumy a kvantifikátory
- Množiny a relace: stavebnice, ze které se skládají definice v AI
- Funkce a zobrazení: proč je každý model v AI funkce
- Logika a důkazy: pravidla, podle kterých se v AI uvažuje
- Grafy a stromy: struktura, na které stojí hledání i neuronové sítě
- Lineární algebra pro strojové učení: vektory, matice a proč AI hlavně násobí
- Derivace, gradient a řetízkové pravidlo: jak model zjistí, kterým směrem se učit
- Gradientní sestup: jak se model učí
- Co je pravděpodobnost: od hodu kostkou ke Kolmogorovovým axiomům
- Podmíněná pravděpodobnost a Bayesova věta: jak změnit odhad, když se dozvíte něco nového
- Náhodná veličina a distribuční funkce: jedna funkce, která o rozdělení řekne všechno
- Funkce hustoty a pravděpodobnostní funkce: proč má spojitá veličina v bodě pravděpodobnost nula
- Střední hodnota, rozptyl a kovariance: kde rozdělení leží, jak je široké a co s čím souvisí
- Přehled pravděpodobnostních rozdělení: Bernoulli, binomické, Poisson, rovnoměrné, normální a exponenciální
- Zákon velkých čísel a centrální limitní věta: proč se průměry chovají tak předvídatelně
- Statistika a odhady parametrů: maximální věrohodnost, MAP a intervaly spolehlivosti
- Teorie informace: entropie, křížová entropie a KL divergence — odkud se berou ztrátové funkce
- Prohledávání stavového prostoru: BFS, DFS, UCS a A* s animacemi
- Hry a protivník: minimax, alfa-beta ořezávání a Monte Carlo tree search
- Splňování omezujících podmínek: backtracking, propagace omezení a AC-3 na sudoku a mapě krajů
- Logika a znalostní systémy: dopředné a zpětné řetězení, rezoluce a expertní systémy
- Plánování: STRIPS, svět kostek, heuristiky z relaxace a plánování v AI agentech
- Lokální hledání a simulované žíhání: obchodní cestující přes krajská města
- Genetické algoritmy: populace, křížení, mutace a výběr na batohu na výlet
- Evoluční strategie a genetické programování: od pravidla jedné pětiny po Keplerův zákon
- Optimalizace mravenčí kolonií: jak feromonová stopa najde krátkou cestu
- Optimalizace hejnem částic: setrvačnost, vlastní zkušenost a zkušenost hejna
- Neuroevoluce: evoluce vah i tvaru neuronových sítí a algoritmus NEAT
- Fuzzy množiny a funkce příslušnosti: jak zapsat „trochu teplo“
- Fuzzy logika a pravděpodobnost: proč „trochu teplo“ neznamená „pravděpodobně teplo“
- Fuzzy logika: t-normy, implikace a pravidla KDYŽ–PAK
- Fuzzy řízení: Mamdani a Sugeno od ventilátoru po kyvadlo na vozíku
- Fuzzy shlukování: algoritmus fuzzy c-means a body mezi shluky
- Neuro-fuzzy systémy (ANFIS): fuzzy pravidla, která se učí z dat
- Markovovy řetězce: přechodová matice, stacionární rozdělení a PageRank
- Skryté Markovovy modely: Viterbiho algoritmus a nepoctivé kasino
- Bayesovské sítě: proč je tráva mokrá a co z toho plyne pro postřikovač
- Kalmanův filtr: jak z nepřesných měření odhadnout, kde auto je a jak rychle jede
- Druhy strojového učení: s učitelem, bez učitele, s částečným učitelem a další
- Přeučení a regularizace: proč model, který zná data nazpaměť, selže
- Vyhodnocení modelu: křížová validace, F1 a křivka ROC
- Shlukování a snížení dimenze: k-means, PCA a t-SNE
- Klasifikace a regrese: dvě úlohy učení s učitelem
- Lineární regrese: nejmenší čtverce geometricky i maticově
- Polynomiální a nelineární regrese: jak přímku ohnout
- Logistická regrese: sigmoida, šance a křížová entropie
- Vícetřídní klasifikace a softmax: od dvou tříd k mnoha
- Naivní Bayesův klasifikátor: spamový filtr, který funguje lépe, než by měl
- Ztrátové funkce: co přesně model minimalizuje
- Rozhodovací stromy a k nejbližších sousedů: modely bez vzorců
- Ansámbly: náhodný les a gradient boosting
- SVM a jádrový trik: nejširší hranice a jak ji ohnout
- Signál a vzorkování: proč platí Nyquistův teorém
- Fourierova transformace: rozklad signálu na frekvence
- Filtry a konvoluce: vyhlazení, hrany a odstranění šumu
- Zvuk a řeč: spektrogram, melová škála a MFCC
- Obraz jako signál: pixely, barvy, konvoluce a hrany
- Perceptron a umělý neuron: nejjednodušší neuronová síť a co neumí
- Neuronová síť od nuly: zpětné šíření chyby krok za krokem
- Aktivace, inicializace a normalizace: drobnosti, na kterých hluboká síť stojí
- Konvoluční sítě: jak síť poznává obrázky
- Rekurentní sítě: paměť pro posloupnosti a mizející gradient
- LSTM a GRU: brány, které rozhodují, co si síť zapamatuje
- Autoenkodéry: síť, která se učí data stlačit a zase rozbalit
- Embeddingy a word2vec: jak se slovo stane vektorem
- Mechanismus pozornosti: jak se model naučí, kam se dívat
- Transformery a velké jazykové modely: architektura krok za krokem
- Tokenizace: jak se text rozseká na kousky pro model
- Předtrénování a škálování: proč větší model a víc dat funguje
- Doladění a RLHF: jak se z doplňovače textu stane asistent
- Prompty, kontext a RAG: jak modelu dát správné informace
- Variační autoenkodéry (VAE): nové obrázky ze spojitého latentního prostoru
- Generativní adversariální sítě (GAN): padělatel proti detektivovi
- Difúzní modely: jak se z čistého šumu stane obrázek
- Markovovy rozhodovací procesy: stavy, akce, odměny a Bellmanovy rovnice
- Q-learning a DQN: učení hodnoty akcí od tabulky po neuronovou síť
- Policy gradient a PPO: učení přímo strategie
- Jak funguje AI agent: jazykový model ve smyčce s nástroji
- Programování s AI agenty: zadání, testy a kontrola
- Vyhodnocení a bezpečnost AI systémů: jak měřit a jak hlídat
Celá osnova série 83 z 83 témat hotovo
- Proč se slova kódují hustými vektory a podle čeho se učí.
- Jak funguje word2vec a proč se s jeho vektory dá počítat.
- Proč embeddingy převezmou i stereotypy a kde je dnes potkáte.
Co se hodí znát předem: Lineární algebra pro strojové učení: vektory, matice a proč AI hlavně násobí, Autoenkodéry: síť, která se učí data stlačit a zase rozbalit
Neuronová síť umí počítat jen s čísly. Obrázek je pole jasů, zvuk pole vzorků — ale co se slovem? Dát každému slovu pořadové číslo nestačí: „pes“ s číslem 17 by pak byl blíž slovu s číslem 18 než „kočce“ s číslem 912. V roce 2013 přišel Tomáš Mikolov se spolupracovníky v Googlu s metodou word2vec, která každému slovu přiřadí vektor — embedding — tak, že podobná slova mají podobné vektory a s vektory se dá dokonce počítat: král − muž + žena ≈ královna. Dnes je vrstva embeddingů na vstupu každého jazykového modelu. V tomhle dílu word2vec napíšeme od nuly a naučíme na textu, o kterém přesně víme, co obsahuje.
Navazuje na díly Lineární algebra a Autoenkodéry a reprezentace.
1. Slovo jako vektor jedniček a nul
Definice — kódování one-hot
Nechť S = {s1, …, sV} je slovník o V ≥ 1 navzájem různých slovech v pevném pořadí. One-hot vektor slova si (i ∈ {1, …, V}) je vektor o(si) ∈ {0, 1}V se složkami
o(si)j = 1, je-li j = i, o(si)j = 0, je-li j ≠ i (j = 1, …, V),
tj. i-tý vektor standardní báze ℝV: jednička na pozici daného slova a jinde nuly.
Každé slovo dostane vlastní spínač. Je to poctivé — nic se nepředstírá — ale naprosto bezradné: kosinová podobnost (z dílu o lineární algebře) libovolných dvou různých slov je 0 a vzdálenost vždy √2. „Král“ je stejně daleko od „královny“ jako od „chleba“. A vektor má tolik složek, kolik je slov — v češtině statisíce.
cos(a, b) = a · b/‖a‖ ‖b‖ = ∑i aibi/√∑i ai2 · √∑i bi2 (a, b ∈ ℝn ∖ {0})
- cos(a, b)
- kosinová podobnost, kosinus úhlu mezi vektory: 1 pro stejný směr, 0 pro kolmé, −1 pro opačný. Tou se v celém dílu měří, jak jsou si slova podobná
- a · b
- skalární součin: sčítá součiny odpovídajících složek, takže je velký, když mají oba vektory velké hodnoty na stejných místech
- ‖a‖ ‖b‖
- součin délek. Dělí se jím, aby nezáleželo na délce, jen na směru: častá slova mívají delší vektory, a bez dělení by vycházela „podobná“ všemu
Příklad — dvě různá slova v kódování one-hot
Slovník o třech slovech: „král“ = (1, 0, 0), „královna“ = (0, 1, 0), „chleba“ = (0, 0, 1).
skalární součin: 1 · 0 + 0 · 1 + 0 · 0 = 0, délky: ‖„král“‖ = ‖„královna“‖ = 1 → cos = 0/1 · 1 = 0
vzdálenost: ‖(1, −1, 0)‖ = √12 + (−1)2 + 02 = √2 ≈ 1,41
(Barvy podle vzorce kosinové podobnosti výše.)
Pro dvojici „král“ a „chleba“ vyjde přesně totéž. Dva různé one-hot vektory nemají jedničku nikdy na stejném místě, a tak je jejich součin vždy 0 — ať jde o jakákoli slova.
2. Slovo poznáš podle sousedů
Definice — distribuční hypotéza a embedding
Distribuční hypotéza zní: slova, která se vyskytují v podobných kontextech, mají podobný význam. Není to matematická věta, ale empirické pozorování lingvistiky (Zellig Harris, John Firth, 50. léta); „podobný kontext“ a „podobný význam“ se v ní formálně nedefinují a word2vec ji jen využívá.
Nechť S je slovník o V slovech a d ≥ 1 celé číslo, obvykle d ≪ V (řádově desítky až stovky). Embedding slovníku je zobrazení
v : S → ℝd, w ↦ vw,
které každému slovu w přiřadí hustý vektor vw (obecně se všemi složkami nenulovými, na rozdíl od one-hot) a jehož hodnoty se naučí z textu tak, aby slova s podobnými kontexty měla podobné vektory — měřeno kosinovou podobností. Vektor vw se nazývá embedding slova w.
Lingvista John Firth to v roce 1957 shrnul: „Slovo poznáš podle společnosti, ve které se pohybuje.“ Když neznáte slovo „tatarák“, ale čtete „k večeři byl tatarák s topinkami“, víte, že je to jídlo. Nikdo vám ho nedefinoval — stačili sousedé.
Abychom mohli výsledky ověřit, nebudeme učit na skutečném textu, ale na textu z malé gramatiky, jejíž strukturu známe. Věty o osobách s rodem (král vládl, královna vládla), rolí (královská, rodinná, obecná) a věkem (dospělý, mladý); věty o městech a zemích včetně jazyka, kterým se tam mluví; o zvířatech a jídle. Celkem 6 000 vět, 39 093 slov a slovník se 116 slovy. Do vět o profesích jsme schválně vložili stereotyp — k němu se vrátíme na konci.
Definice — kontextové okno
Nechť w1, …, wT ∈ S je věta o T ≥ 1 slovech a m ≥ 1 celé číslo (velikost okna). Kontext pozice t ∈ {1, …, T} je množina pozic
Km(t) = {t + j : j ∈ ℤ, 1 ≤ |j| ≤ m, 1 ≤ t + j ≤ T}
a slova ws pro s ∈ Km(t) jsou sousedé slova wt. Učení pracuje s posloupností dvojic (slovo, soused)
D = ( (wt, ws) : t = 1, …, T, s ∈ Km(t) )
sestavenou přes všechny věty textu. Podmínka 1 ≤ t + j ≤ T znamená, že okno nepřekračuje hranici věty; tatáž dvojice slov se v D může vyskytnout víckrát.
Příklad — dvojice z jedné věty
Věta „král vládl v paláci a seděl na trůnu“ má 8 slov, okno m = 3. Slovo „paláci“ (4. slovo) má sousedy král, vládl, v, a, seděl, na — 6 dvojic. Krajní slova mají sousedy jen z jedné strany:
počty sousedů po slovech: 3 + 4 + 5 + 6 + 6 + 5 + 4 + 3 = 36 dvojic
celý korpus, okno ±3: 162 558 dvojic; za 6 průchodů 975 348 kroků učení
Definice — vrstva embeddingů
Nechť S = {s1, …, sV} je slovník, d ≥ 1 a v : S → ℝd embedding. Vrstva embeddingů je matice E ∈ ℝV × d, jejíž i-tý řádek je vsiT (i = 1, …, V), spolu s lineárním zobrazením
o ↦ ETo, ℝV → ℝd.
Pro one-hot vektor o = o(si) je ETo = ∑j=1V oj · (j-tý řádek E)T = vsi, protože jediná nenulová složka je oi = 1: násobení one-hot vektorem z matice jen vybere jeden řádek. Proto se v praxi nenásobí, ale rovnou čte řádek tabulky; matematicky je to ale lineární vrstva sítě a její váhy se učí jako každé jiné.
V = 3, d = 2: E = [[0,2; −0,5], [0,9; 0,1], [−0,3; 0,4]], o = (0, 1, 0) → ETo = 0 · (0,2; −0,5) + 1 · (0,9; 0,1) + 0 · (−0,3; 0,4) = (0,9; 0,1)
U nás je V = 116 a d = 20: celá „slovní zásoba“ sítě je tabulka 116 × 20 = 2 320 čísel a každé slovo popisuje 20 čísel místo 116 nul a jedniček.
3. word2vec: předpověz své sousedy
Definice — skip-gram s negativními vzorky
Nechť S je slovník, text je posloupnost vět nad S, m ≥ 1 velikost okna, D posloupnost dvojic (slovo, soused) z celého textu podle definice kontextového okna, k ≥ 1 počet negativních vzorků a d ≥ 1 rozměr vektorů. Nechť σ(s) = 1/1 + e−s je sigmoida a Pšum rozdělení pravděpodobnosti na S (definované níže).
Skip-gram s negativními vzorky přiřadí každému slovu w ∈ S dva vektory, vlastní vw ∈ ℝd a kontextový uw ∈ ℝd, a hledá je tak, aby minimalizovaly součet ztrát přes všechny dvojice
L = ∑(w, c) ∈ D ℓ(w, c), ℓ(w, c) = −log σ(vw · uc) − ∑i=1k log σ(−vw · uni),
kde negativní vzorky n1, …, nk ∈ S se pro každou dvojici losují nezávisle podle Pšum (ztráta je tedy náhodná a minimalizuje se stochastickým gradientním sestupem). Embeddingem je w ↦ vw; kontextové vektory se po učení zahodí. Slovy: skóre vw · uc skutečného souseda se tlačí nahoru a skóre náhodných slov dolů.
Síť hraje hru „patří tohle slovo do okolí tohohle?“. Za skutečné sousedy dostane odměnu, za náhodná slova trest. Aby ji vyhrála, musí slova, která mívají stejné sousedy, umístit blízko sebe — jinak by se nemohla trefovat. Je to vlastně logistická regrese z dílu o logistické regresi, jen se učí i to, z čeho je vstup složený.
Naše nastavení: vektory o 20 číslech, okno ±3 slova, 5 negativních vzorků, 6 průchodů textem. Učení trvá asi půl vteřiny.
ℓ(w, c) = −log σ(vw · uc) − ∑i=1k log σ(−vw · uni), ni ~ Pšum
- −log σ(vw · uc)
- skutečný soused c. σ(vw · uc) je pravděpodobnost „patří do okolí“, kterou síť dvojici přisoudí; chceme ji blízko 1. −log z ní dělá trest: 0 pro jistotu, prudce roste, když síť skutečného souseda odmítá
- ∑i=1k
- k = 5 negativních vzorků na jednu skutečnou dvojici. Místo porovnání se všemi 116 slovy slovníku (softmax) stačí pár náhodných — proto je metoda rychlá i pro slovníky se statisíci slov
- log σ(−vw · uni)
- náhodné slovo ni. Protože σ(−s) = 1 − σ(s), je to (s mínusem před součtem) trest za pravděpodobnost, že síť náhodné slovo za souseda považuje. Bez tohoto členu by ztrátu nejlíp splnilo, kdyby byly všechny vektory stejné a dlouhé
- ni ~ Pšum
- negativní slova se losují podle upravené frekvence (níže), ne rovnoměrně
Pšum(w) = f(w)0,75/∑w′ ∈ S f(w′)0,75
- Pšum(w)
- pravděpodobnost, že slovo w vylosujeme jako negativní vzorek
- f(w)0,75
- počet výskytů slova v textu, ztlumený mocninou 0,75: častá slova se losují častěji (jsou to nejčastější „falešní sousedé“), ale ne tolik, aby přehlušila vzácná. Exponent 0,75 zvolili autoři word2vec pokusně (Mikolov a kol., 2013)
- ∑w′ f(w′)0,75
- součet přes celý slovník, aby pravděpodobnosti dávaly dohromady 1
Příklad — co udělá mocnina 0,75
„a“ (3 461 výskytů, nejčastější slovo): podle frekvence 8,85 %, podle Pšum 5,30 %
„španělsky“ (32 výskytů, nejvzácnější): podle frekvence 0,08 %, podle Pšum 0,16 %
(Barva podle vzorce výše.) „Podle frekvence“ je podíl f(w)/∑w′ f(w′) bez mocniny.
Poměr nejčastějšího a nejvzácnějšího slova klesne ze 108 : 1 na 34 : 1.
Algoritmus — skip-gram s negativními vzorky
- Vstup: text (posloupnost vět nad slovníkem S), rozměr d = 20, okno m = 3, k = 5 negativních vzorků, rozdělení Pšum, počet průchodů 6.
- Výstup: embedding vw ∈ ℝd pro každé w ∈ S.
- Kroky: (1) vw náhodně z intervalu (−0,5/d, 0,5/d) po složkách, uw = 0; (2) v každém průchodu nastavit krok η a pro každou dvojici (w, c) ∈ D vylosovat k negativních slov a udělat jeden krok gradientního sestupu na ℓ(w, c) podle u i v (kód níže).
- Zastavení: po 6 průchodech textem.
v[w] = náhodně z (−0,5/d, 0,5/d) # vlastní vektory (embeddingy)
u[w] = 0 # kontextové vektory
for e in range(6):
eta = 0,05 · (1 − e/6) + 0,001 # krok se zmenšuje
for veta in text:
for t, w in enumerate(veta):
for c in sousede(veta, t, m=3):
g = 0
for (x, y) in [(c, 1)] + [(losuj(P_šum), 0) for _ in range(5)]:
chyba = σ(v[w] · u[x]) − y # derivace ztráty podle skóre
g += chyba · u[x]
u[x] −= eta · chyba · v[w]
v[w] −= eta · g
return v
Derivace −log σ(s) podle s je σ(s) − 1 a derivace −log σ(−s) je σ(s); obojí je σ(s) − y, stejně jako u logistické regrese. Gradient podle vw je to číslo krát ux a naopak.
Příklad — jeden krok učení
Dvourozměrné vektory vw = (1; 0), uc = (0,5; 0,5), skutečný soused (y = 1), krok η = 0,05:
skóre: s = 1 · 0,5 + 0 · 0,5 = 0,5, σ(0,5) = 0,622, ztráta −ln 0,622 = 0,474
chyba: 0,622 − 1 = −0,378
uc ← (0,5; 0,5) − 0,05 · (−0,378) · (1; 0) = (0,519; 0,5)
vw ← (1; 0) − 0,05 · (−0,378) · (0,5; 0,5) = (1,009; 0,009)
nové skóre: 1,009 · 0,519 + 0,009 · 0,5 = 0,528, σ = 0,629, ztráta 0,463
(Ztráta je tu jen první, barevný člen vzorce ℓ(w, c) výše — příklad sleduje jedinou dvojici se skutečným sousedem, bez negativních vzorků.)
Oba vektory se k sobě trochu natočily. U negativního slova (y = 0) je chyba kladná a vektory se od sebe odtlačí.
Příklad — jak klesá ztráta
Kontextové vektory začínají jako nuly, takže na začátku je každé skóre 0 a σ(0) = 1/2 pro skutečného souseda i pro všech pět negativních slov (barvy podle vzorce ℓ(w, c) výše):
ztráta na začátku: −ln 1/2 − 5 · ln 1/2 = 6 · 0,693 = 4,159
průměrná ztráta v 1. až 6. průchodu: 1,617; 1,386; 1,360; 1,330; 1,306; 1,276
K nule nedojde: totéž slovo má v textu mnoho různých sousedů a některá vylosovaná „negativní“ slova jsou ve skutečnosti také jeho sousedé, takže dokonale odpovídat nejde.
4. Nejbližší slova
Definice — nejbližší slova
Nechť S je slovník o V ≥ 2 slovech, v : S → ℝd ∖ {0} embedding, w ∈ S a r ∈ {1, …, V − 1}. r nejbližších slov ke slovu w je posloupnost navzájem různých slov x1, …, xr ∈ S ∖ {w} taková, že
- cos(vw, vx1) ≥ cos(vw, vx2) ≥ … ≥ cos(vw, vxr);
- cos(vw, vxr) ≥ cos(vw, vy) pro každé y ∈ S ∖ {w, x1, …, xr}.
Slovy: r slov různých od w s největší kosinovou podobností, seřazených sestupně (při shodě podobností rozhodne pořadí ve slovníku). V tabulce je r = 4 a čísla v závorkách jsou ty podobnosti. Kontextové vektory u se k tomu nepoužívají.
| Slovo | nejpodobnější slova (kosinová podobnost) |
|---|---|
| král | muž (0,84), princ (0,82), otec (0,82), dospělý (0,76) |
| praha | madrid (0,96), londýn (0,93), paříž (0,91), řím (0,87) |
| pes | kůň (1,00), ovce (1,00), kráva (1,00), kočka (1,00) |
| byla | šla (0,67), spala (0,65), unavená (0,59), vládla (0,56) |
Král má za sousedy jiné mužské osoby a slovo „dospělý“; Praha jiná hlavní města; pes jiná zvířata (podobnost 1,00 — v naší gramatice se zvířata vyskytují v úplně stejných větách, takže se nedají rozlišit). „Byla“ má za sousedy ostatní slova v ženském rodě. Podobnost krále s královnou je 0,62, s chlebem 0,30.
5. Počítání se slovy: analogie
Definice — vektorová analogie
Nechť S je slovník o aspoň čtyřech slovech, v : S → ℝd ∖ {0} embedding a a, b, c ∈ S navzájem různá slova taková, že q = vb − va + vc ≠ 0. Odpověď vektorové analogie „a je k b jako c k ?“ (zapisujeme a : b = c : ?) je slovo
d* = arg maxw ∈ S ∖ {a, b, c} cos(vw, q),
tj. slovo různé od a, b, c, jehož vektor je kosinově nejbližší bodu q (rozbor níže). Analogie s očekávanou odpovědí d ∈ S je vyřešena správně, právě když d* = d.
Rozdíl žena − muž je směr „ženský rod“. Když ho přičteme ke králi, dojdeme ke královně. Funguje to, protože se král od královny liší ve stejných kontextech jako muž od ženy (vládl/vládla, byl/byla), a tak je ten rozdíl v prostoru vektorů pokaždé zhruba stejná šipka.
d* = arg maxw ∉ {a, b, c} cos( vw, vb − va + vc )
- vb − va
- šipka od a k b — to, čím se liší (žena − muž: směr rodu). Odečtením zmizí, co mají obě slova společného („je to osoba, dospělá“)
- vc
- výchozí bod: tutéž šipku přiložíme ke králi
- vw
- kandidát na odpověď; zkouší se všechna slova slovníku
- cos
- kosinová podobnost: rozhoduje směr, ne délka, takže nevadí, že součet tří vektorů je delší než vektor jednoho slova
- w ∉ {a, b, c}
- zadaná slova se vynechají. U embeddingů ze skutečného textu často bývá bodu vb − va + vc nejblíž samo c (na standardní sadě analogií to ukázal Tal Linzen, 2016) a bez vynechání by analogie často „odpověděla“ zadaným slovem
král − muž + žena: nejbližší slovo je královna (0,99), za ní matka a princezna. Ve všech 30 analogiích tvaru „muž : žena = král : ?“ mezi šesti dvojicemi osob vyšlo správné slovo 30 z 30. Hlavní města („Francie : Paříž = Itálie : ?“) 48 z 56. Většina chyb (6 z 8) má zajímavou příčinu: v Rakousku i v Německu se mluví německy, a tak Vídeň a Berlín sdílejí kontext a analogie s nimi se pletou. Embedding věrně zachycuje, co je v datech — včetně toho, co jsme si nepřáli.
Příklad — kolik je analogií a co dělá vynechání
rod: 6 dvojic osob; za (a, b) vezmeme jednu a za (c, ?) jinou → 6 · 5 = 30 analogií
hlavní města: 8 dvojic země–město → 8 · 7 = 56 analogií
král − muž + žena bez vynechání: královna (0,99), pak žena (0,85)
V našem malém korpusu by tedy královna vyhrála i bez vynechání, „žena“ (slovo b) by byla hned druhá.
A ještě jedno ponaučení z ladění: s oknem ±2 slova vyšlo jen 9 z 56 analogií s městy. Ve větě „ve městě praha se mluví česky“ je jazyk od města tři slova daleko a okno ±2 tu souvislost vůbec nevidí. Velikost okna rozhoduje, jaký druh podobnosti embedding zachytí.
6. Mapa slov
Dvacetirozměrné vektory jsme promítli metodou PCA z dílu o snížení dimenze do roviny; předtím jsme každý vektor vydělili jeho délkou, aby mapa ukazovala směry, tedy totéž, co měří kosinová podobnost. Vlevo se skupiny slov oddělí samy; zvířata a jídla splynou do bodu, protože mají v naší gramatice totožné kontexty. Vpravo jsou jen osoby a šipky od mužského k ženskému tvaru míří u všech dvojic stejným směrem — to je ten „směr rodu“, na kterém stojí analogie. A druhá osa mapy osob odděluje mladé (chlapec, princ, syn) od dospělých (muž, král, otec): síť sama našla v datech dvě nezávislé vlastnosti, rod a věk, a dala každé vlastní směr.
7. Embeddingy se naučí i předsudky
Ve větách o profesích byl inženýr v 80 % případů muž a učitel v 80 % případů žena. Změříme, o kolik je profese v průměru podobnější mužskému tvaru než ženskému (přes všech šest dvojic osob): inženýr 0,139 ve prospěch mužů, učitel −0,106, tedy ve prospěch žen. Nikdo síti neřekl, že inženýr má být muž; jen to četla v textu.
B(p) = 1/6 ∑i=16 [ cos(vp, vmi) − cos(vp, vži) ]
- cos(vp, vmi)
- jak podobná je profese p mužskému tvaru i-té dvojice (muž, chlapec, král, …)
- cos(vp, vži)
- totéž pro ženský tvar téže dvojice. Odečítají se tvary z jedné dvojice, takže se role a věk (král proti chlapci) vyruší a zbude jen rod
- 1/6 ∑
- průměr přes všech šest dvojic, aby výsledek nezávisel na jednom náhodně vychýleném slově
| Dvojice | inženýr – mužský tvar | inženýr – ženský tvar | rozdíl |
|---|---|---|---|
| (muž, žena) | 0,460 | 0,309 | 0,151 |
| (chlapec, dívka) | 0,436 | 0,301 | 0,136 |
| (král, královna) | 0,434 | 0,306 | 0,128 |
| (princ, princezna) | 0,448 | 0,303 | 0,145 |
| (otec, matka) | 0,445 | 0,320 | 0,125 |
| (syn, dcera) | 0,435 | 0,287 | 0,149 |
| průměr = B(inženýr) | 0,139 |
Embedding je zrcadlo textu, na kterém se učil. Tolga Bolukbasi a kolegové v roce 2016 ukázali, že embeddingy naučené na zprávách Google News odpovídají na analogii „muž : programátor = žena : ?“ slovem „hospodyně“. Systém, který podle takových vektorů třídí životopisy, by stereotyp nejen převzal, ale i automaticky uplatnil. Proto se dnes zkoumá, jak předsudky v modelech měřit a zmírňovat.
8. Od word2vec k jazykovým modelům
- GloVe a fastText (2014, 2016) — příbuzné metody; fastText skládá vektor slova z kousků slov, takže zvládne i slova, která nikdy neviděl, a hodí se pro češtinu s jejími koncovkami.
- Kontextové embeddingy. Ve word2vec má „koruna“ jediný vektor, ať jde o peníze, nebo o královskou korunu. Modely jako BERT (2018) dávají slovu vektor podle celé věty.
- Vrstva embeddingů v jazykových modelech. Každý jazykový model začíná tabulkou, která každému tokenu přiřadí vektor; učí se spolu se zbytkem sítě.
- Vyhledávání podle významu. Embeddingy celých vět a dokumentů se ukládají do databází a hledá se v nich podle kosinové podobnosti — tak jazykové modely hledají v dokumentech odpovědi (RAG). Je to metoda k nejbližších sousedů z dílu o stromech a sousedech, jen v prostoru významů.
9. Shrnutí
- One-hot vektory nenesou žádnou podobnost: každá dvě slova mají kosinovou podobnost 0.
- Embedding je hustý vektor naučený z kontextů; word2vec předpovídá sousedy slova a od náhodných slov je odlišuje.
- Na 39 093 slovech z gramatiky se podobná slova seskupila: Praha k hlavním městům, „byla“ ke slovům v ženském rodě.
- S vektory jde počítat: král − muž + žena = královna; analogie s rodem 30 z 30, s hlavními městy 48 z 56.
- Embeddingy převezmou i stereotypy z dat: inženýr vyšel o 0,14 blíž mužům, učitel o 0,11 blíž ženám.
Chcete si to osahat? Nechte AI agenta stáhnout předtrénované české vektory fastText a vyzkoušet analogie jako „Praha : Česko = Bratislava : ?“ — a pak hledejte, kde selžou a proč.
Máte na to jiný názor? Napište na support@coden-app.com.