Přeskočit na obsah
coden

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.

12 minut Matěj Žalmánek 2026-10-16

Série Základy AI Díl 68 z 83
  1. Mapa umělé inteligence: co je co a jak to do sebe zapadá
  2. Stručná historie umělé inteligence: od Turinga po jazykové modely
  3. Data, model, trénink, inference: základní pojmy na jednom příkladu
  4. Jak číst matematický zápis: symboly, indexy, sumy a kvantifikátory
  5. Množiny a relace: stavebnice, ze které se skládají definice v AI
  6. Funkce a zobrazení: proč je každý model v AI funkce
  7. Logika a důkazy: pravidla, podle kterých se v AI uvažuje
  8. Grafy a stromy: struktura, na které stojí hledání i neuronové sítě
  9. Lineární algebra pro strojové učení: vektory, matice a proč AI hlavně násobí
  10. Derivace, gradient a řetízkové pravidlo: jak model zjistí, kterým směrem se učit
  11. Gradientní sestup: jak se model učí
  12. Co je pravděpodobnost: od hodu kostkou ke Kolmogorovovým axiomům
  13. Podmíněná pravděpodobnost a Bayesova věta: jak změnit odhad, když se dozvíte něco nového
  14. Náhodná veličina a distribuční funkce: jedna funkce, která o rozdělení řekne všechno
  15. Funkce hustoty a pravděpodobnostní funkce: proč má spojitá veličina v bodě pravděpodobnost nula
  16. Střední hodnota, rozptyl a kovariance: kde rozdělení leží, jak je široké a co s čím souvisí
  17. Přehled pravděpodobnostních rozdělení: Bernoulli, binomické, Poisson, rovnoměrné, normální a exponenciální
  18. Zákon velkých čísel a centrální limitní věta: proč se průměry chovají tak předvídatelně
  19. Statistika a odhady parametrů: maximální věrohodnost, MAP a intervaly spolehlivosti
  20. Teorie informace: entropie, křížová entropie a KL divergence — odkud se berou ztrátové funkce
  21. Prohledávání stavového prostoru: BFS, DFS, UCS a A* s animacemi
  22. Hry a protivník: minimax, alfa-beta ořezávání a Monte Carlo tree search
  23. Splňování omezujících podmínek: backtracking, propagace omezení a AC-3 na sudoku a mapě krajů
  24. Logika a znalostní systémy: dopředné a zpětné řetězení, rezoluce a expertní systémy
  25. Plánování: STRIPS, svět kostek, heuristiky z relaxace a plánování v AI agentech
  26. Lokální hledání a simulované žíhání: obchodní cestující přes krajská města
  27. Genetické algoritmy: populace, křížení, mutace a výběr na batohu na výlet
  28. Evoluční strategie a genetické programování: od pravidla jedné pětiny po Keplerův zákon
  29. Optimalizace mravenčí kolonií: jak feromonová stopa najde krátkou cestu
  30. Optimalizace hejnem částic: setrvačnost, vlastní zkušenost a zkušenost hejna
  31. Neuroevoluce: evoluce vah i tvaru neuronových sítí a algoritmus NEAT
  32. Fuzzy množiny a funkce příslušnosti: jak zapsat „trochu teplo“
  33. Fuzzy logika a pravděpodobnost: proč „trochu teplo“ neznamená „pravděpodobně teplo“
  34. Fuzzy logika: t-normy, implikace a pravidla KDYŽ–PAK
  35. Fuzzy řízení: Mamdani a Sugeno od ventilátoru po kyvadlo na vozíku
  36. Fuzzy shlukování: algoritmus fuzzy c-means a body mezi shluky
  37. Neuro-fuzzy systémy (ANFIS): fuzzy pravidla, která se učí z dat
  38. Markovovy řetězce: přechodová matice, stacionární rozdělení a PageRank
  39. Skryté Markovovy modely: Viterbiho algoritmus a nepoctivé kasino
  40. Bayesovské sítě: proč je tráva mokrá a co z toho plyne pro postřikovač
  41. Kalmanův filtr: jak z nepřesných měření odhadnout, kde auto je a jak rychle jede
  42. Druhy strojového učení: s učitelem, bez učitele, s částečným učitelem a další
  43. Přeučení a regularizace: proč model, který zná data nazpaměť, selže
  44. Vyhodnocení modelu: křížová validace, F1 a křivka ROC
  45. Shlukování a snížení dimenze: k-means, PCA a t-SNE
  46. Klasifikace a regrese: dvě úlohy učení s učitelem
  47. Lineární regrese: nejmenší čtverce geometricky i maticově
  48. Polynomiální a nelineární regrese: jak přímku ohnout
  49. Logistická regrese: sigmoida, šance a křížová entropie
  50. Vícetřídní klasifikace a softmax: od dvou tříd k mnoha
  51. Naivní Bayesův klasifikátor: spamový filtr, který funguje lépe, než by měl
  52. Ztrátové funkce: co přesně model minimalizuje
  53. Rozhodovací stromy a k nejbližších sousedů: modely bez vzorců
  54. Ansámbly: náhodný les a gradient boosting
  55. SVM a jádrový trik: nejširší hranice a jak ji ohnout
  56. Signál a vzorkování: proč platí Nyquistův teorém
  57. Fourierova transformace: rozklad signálu na frekvence
  58. Filtry a konvoluce: vyhlazení, hrany a odstranění šumu
  59. Zvuk a řeč: spektrogram, melová škála a MFCC
  60. Obraz jako signál: pixely, barvy, konvoluce a hrany
  61. Perceptron a umělý neuron: nejjednodušší neuronová síť a co neumí
  62. Neuronová síť od nuly: zpětné šíření chyby krok za krokem
  63. Aktivace, inicializace a normalizace: drobnosti, na kterých hluboká síť stojí
  64. Konvoluční sítě: jak síť poznává obrázky
  65. Rekurentní sítě: paměť pro posloupnosti a mizející gradient
  66. LSTM a GRU: brány, které rozhodují, co si síť zapamatuje
  67. Autoenkodéry: síť, která se učí data stlačit a zase rozbalit
  68. Embeddingy a word2vec: jak se slovo stane vektorem
  69. Mechanismus pozornosti: jak se model naučí, kam se dívat
  70. Transformery a velké jazykové modely: architektura krok za krokem
  71. Tokenizace: jak se text rozseká na kousky pro model
  72. Předtrénování a škálování: proč větší model a víc dat funguje
  73. Doladění a RLHF: jak se z doplňovače textu stane asistent
  74. Prompty, kontext a RAG: jak modelu dát správné informace
  75. Variační autoenkodéry (VAE): nové obrázky ze spojitého latentního prostoru
  76. Generativní adversariální sítě (GAN): padělatel proti detektivovi
  77. Difúzní modely: jak se z čistého šumu stane obrázek
  78. Markovovy rozhodovací procesy: stavy, akce, odměny a Bellmanovy rovnice
  79. Q-learning a DQN: učení hodnoty akcí od tabulky po neuronovou síť
  80. Policy gradient a PPO: učení přímo strategie
  81. Jak funguje AI agent: jazykový model ve smyčce s nástroji
  82. Programování s AI agenty: zadání, testy a kontrola
  83. Vyhodnocení a bezpečnost AI systémů: jak měřit a jak hlídat

Celá osnova série 83 z 83 témat hotovo

Co si odnesete
  • 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.

Laicky řečeno

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.

Laicky řečeno

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ů.

Laicky řečeno

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ě
Ztráta jedné dvojice (slovo, soused); učení ji minimalizuje pro všechny dvojice v textu. Je to ztráta logistické regrese pro k + 1 otázek „soused, nebo ne?“.

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

  1. cos(vw, vx1) ≥ cos(vw, vx2) ≥ … ≥ cos(vw, vxr);
  2. 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í.

Slovonejpodobnější slova (kosinová podobnost)
králmuž (0,84), princ (0,82), otec (0,82), dospělý (0,76)
prahamadrid (0,96), londýn (0,93), paříž (0,91), řím (0,87)
peskůň (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.

Laicky řečeno

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
Odpověď je slovo, jehož vektor míří nejvíc stejným směrem jako bod, kam nás dovedla šipka.

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

1. hlavní komponenta (bez jednotky) 2. hlavní komponenta (bez jednotky) mužženachlapecdívkakrálkrálovnaprincprinceznaotecmatkasyndcera 1. hlavní komponenta (bez jednotky) 2. hlavní komponenta (bez jednotky)
Embeddingy promítnuté do roviny (PCA): vlevo všechny skupiny, vpravo jen osoby; šipky vedou od mužského k ženskému tvaru osobyměstazemězvířatajídlo

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ě
Kladné B znamená „blíž mužům“, záporné „blíž ženám“, 0 nestranně. Je to náš jednoduchý ukazatel pro tento díl, ne standardizovaná míra.
Dvojiceinženýr – mužský tvarinženýr – ženský tvarrozdíl
(muž, žena)0,4600,3090,151
(chlapec, dívka)0,4360,3010,136
(král, královna)0,4340,3060,128
(princ, princezna)0,4480,3030,145
(otec, matka)0,4450,3200,125
(syn, dcera)0,4350,2870,149
průměr = B(inženýr)0,139
Laicky řečeno

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.

Agent na vašem počítači, ovládaný z telefonu