AI & AutomationAI-generated

Embeddings: woorden als punten in een ruimte

In deel 1 werd tekst een rij token-id's. " kat" werd 9015. Maar dat getal zegt niets. Een model dat 9015 krijgt, weet daarmee nog niet dat het om een dier gaat, en nog minder dat een kat meer op een hond lijkt dan op een koning. Daar is een tweede stap voor nodig: elk id wordt een lange rij kommagetallen, een embedding.

Dit is deel 3 van Hoe AI echt werkt. Alle vectoren hieronder zijn echt. Ze komen uit GloVe, een openbare set woordvectoren van Stanford uit 2014, met 50 getallen per woord. GloVe is Engels, dus de woorden in de visual zijn dat ook. Een taalmodel als GPT of Claude maakt zijn eigen embeddings, maar het idee is hetzelfde, en met GloVe kun je alles narekenen.

Embeddingso200k_base · GPT-4o
·kat9015·hond59452·poes107257
buren in de woordenlijst
·UN9014·kat9015计划9016

9015 en 9016 liggen naast elkaar · in betekenis hebben ze niets gemeen

Een id is een rijnummer

De tokenizer van GPT-4o geeft " kat" nummer 9015 en " hond" nummer 59452. Kijk je naar de buren in de woordenlijst, dan is 9014 " UN" en 9016 het Chinese woord voor "plan". Dat de nummers naast elkaar liggen, betekent niets.

Je kunt dus niet rekenen met token-id's. Dat 59452 groter is dan 9015, zegt niets over een hond. Het nummer is alleen een adres.

Een opzoektabel

Achter dat adres staat een rij in een tabel. In GloVe heeft elk woord een rij van 50 getallen. "king" staat op rij 691 en begint met 0,51, 0,69, −0,60. De tabel heeft 400.000 rijen, voor elk woord één.

Een taalmodel doet hetzelfde met tokens. De eerste laag is zo'n tabel, met één rij per token in de woordenlijst. Er wordt niets uitgerekend, alleen opgezocht. De getallen zelf zijn wel geleerd: tijdens de training schuiven ze net zo lang tot het model er goed mee kan voorspellen.

Betekenis is een plek

Vijftig getallen kun je opvatten als een punt in een ruimte met vijftig richtingen. Die ruimte kun je niet tekenen, maar je kunt hem platslaan tot twee dimensies. De kaart toont 17 woorden na zo'n projectie. Die twee assen bevatten ongeveer de helft van de verschillen tussen deze woorden. De rest valt weg.

Toch zie je groepjes: dieren bij elkaar, fruit bij elkaar, steden en landen bij elkaar. Niemand heeft dat zo ingesteld. GloVe zag alleen welke woorden vaak bij elkaar in de buurt staan in Wikipedia en nieuwsteksten. Woorden die in dezelfde zinnen voorkomen, komen dicht bij elkaar te liggen.

Dichtbij is gelijk

Zoek je in alle 400.000 woorden welke het dichtst bij "cat" liggen, dan krijg je dog, rabbit, monkey, rat en cats. Vier dieren, en als vijfde het meervoud van cat zelf.

Let op dat de kaart soms liegt. Op de kaart is cat de dichtste buur van horse, maar in vijftig dimensies is dat dog. De kaart is een schaduw. Elke gelijkenis in dit stuk is uitgerekend in de volle vijftig dimensies.

Gelijkenis meten: de hoek

Hoe meet je "dichtbij"? Meestal met de cosinusgelijkenis. Teken elk woord als een pijl vanuit het nulpunt en kijk naar de hoek tussen twee pijlen. Wijzen ze dezelfde kant op, dan is de cosinus 1. Staan ze haaks, dan 0. Wijzen ze tegengesteld, dan −1.

Tussen cat en dog zit 23 graden: cosinus 0,92. Tussen cat en king 67 graden: 0,39. De lengte van de pijlen telt niet mee. Je rekent het uit door de getallen paarsgewijs te vermenigvuldigen, op te tellen en te delen door de twee lengtes. Bij 50 getallen is dat een paar honderd rekenstappen.

Richtingen hebben betekenis

Niet alleen de plekken zeggen iets, ook de verschillen ertussen. Trek je de vector van "man" af van die van "woman", dan houd je een richting over. Die richting lijkt op die van king naar queen: cosinus 0,60. Van boy naar girl: 0,67. Van apple naar banana, waar man en vrouw niets mee te maken hebben: 0,18.

Land en hoofdstad werkt nog beter. De stap van france naar paris en die van netherlands naar amsterdam hebben een cosinus van 0,81.

king − man + woman

Dat leidt tot de bekendste rekensom uit dit vak. Neem king, haal man eraf en tel woman erbij. Waar kom je uit? Tomas Mikolov en collega's lieten in 2013, in de artikelen waaruit word2vec voortkwam, zien dat je dan dicht bij queen uitkomt. Met GloVe gebeurt hetzelfde: queen, met een cosinus van 0,86.

Maar kijk naar het lijstje in de visual. Het woord dat écht het dichtst bij de uitkomst ligt, is king zelf, met 0,89. De stap van man naar woman is klein vergeleken met de plek van king, dus je komt niet ver. Queen wint pas als je de drie woorden uit de som overslaat. Dat is in de meeste analogietests de standaard.

Hoeveel getallen echt

Vijftig is weinig. De word2vec-vectoren van Google News hebben er 300. GPT-2 small, het kleinste model uit 2019, gebruikt 768 getallen per token en GPT-2 XL 1600. Llama 3.1 8B gebruikt er 4096.

Dat loopt snel op. Llama 3.1 8B heeft 128.256 tokens in zijn woordenlijst. Alleen de embeddingtabel bevat dus al 525 miljoen getallen. Wat al die richtingen precies betekenen, is grotendeels onbekend. Een richting als die van man naar woman kun je soms terugvinden, maar de afzonderlijke getallen hebben meestal geen naam.

Van woorden naar zinnen

Een zin kun je ook een vector geven. De ruwste manier: neem het gemiddelde van de woordvectoren. Dat doet de visual hier. "puppy keeps howling" komt dan het dichtst bij "the dog barked all night long", terwijl geen enkel woord overeenkomt. Je zoekt op betekenis, niet op letters.

Echte zoeksystemen gebruiken modellen die speciaal getraind zijn om hele zinnen of alinea's in één vector te vatten. Het principe blijft hetzelfde: vraag en tekst worden punten, en je zoekt de dichtstbijzijnde. Dat is precies de ophaalstap in RAG.

Speel zelf

Kies drie woorden en reken A − B + C uit. De lijst toont welke van de 17 woorden het dichtst bij de uitkomst liggen, uitgerekend in vijftig dimensies. De pijl op de kaart laat dezelfde stap zien als van B naar C.

Probeer paris − france + netherlands, of prince − boy + girl. Zet daarna "invoer telt mee" aan en kijk hoe vaak A gewoon zelf wint. Laat B en C leeg om alleen de buren van één woord te zien.

Wat niet in het plaatje past

Een vector per token, niet per betekenis. In de tabel heeft " bank" één rij, of het nu om een zitbank of een geldbank gaat. Pas de lagen daarna halen de betekenis uit de rest van de zin. Hoe dat werkt, staat in deel 4 over attention.

Woorden zijn geen tokens. GloVe heeft een vector per heel woord. Een taalmodel heeft er een per token. " koningin" is in de tokenizer van GPT-4o twee tokens, " kon" en "ingin". Geen van beide rijen gaat over een koningin. Het model moet die betekenis zelf opbouwen in de lagen erna.

De analogie werkt lang niet altijd. bigger − big + small geeft in GloVe niet smaller maar larger. Smaller komt pas op de derde plek. Malvina Nissim, Rik van Noord en Rob van der Goot lieten in 2020 zien dat de mooie voorbeelden vaak afhangen van het overslaan van de invoerwoorden. Ze lieten ook zien dat sommige bekende "bevooroordeelde" analogieën deels door die regel ontstaan. Er zit wel echt vooroordeel in embeddings, want ze leren van menselijke tekst. Alleen bewijst één rekensom het niet.

Zelf proberen

Met Python en gensim laad je dezelfde vectoren (ongeveer 70 MB):

pip install gensim
python3 -c "import gensim.downloader as api; m = api.load('glove-wiki-gigaword-50'); print(m.most_similar(positive=['king', 'woman'], negative=['man'], topn=3))"

Bovenaan staat queen, met ongeveer 0,85. Het getal wijkt iets af van dat in de visual, omdat gensim elke vector eerst op lengte 1 brengt. most_similar laat de invoerwoorden altijd weg: king kan dus nooit winnen. Met m.most_similar('cat') zie je de buren van een woord.

Tot slot

Ik kende king − man + woman als het standaardvoorbeeld. Ik had nooit zelf nagerekend dat king dichter bij de uitkomst ligt dan queen. Dat vind ik eerlijk gezegd het leukste resultaat van deze hele post. Het mooiste voorbeeld uit het vak werkt alleen als je één woord van de uitslag weghaalt.

Het idee wordt er voor mij niet kleiner door. Niemand heeft GloVe verteld dat amsterdam bij netherlands hoort zoals paris bij france, en toch staat die stap er met een cosinus van 0,81 in. Maar ik kijk voortaan wel anders naar elke grafiek met woorden op een kaartje: dat is een schaduw van iets met vijftig, of vierduizend, dimensies.