Capitolo 03 · Embeddings · 10 min

Lo spazio del significato

Parole in uno spazio geometrico. Re − Uomo + Donna = Regina, e altri miracoli vettoriali.

Un'equazione che non dovrebbe funzionare

Considera questa operazione:

re − uomo + donna ≈ regina

È un'equazione aritmetica, come 5 − 2 + 4 = 7. Solo che riguarda parole.

E funziona. Non perché qualcuno abbia programmato "re" e "regina" per assomigliarsi. Ma perché ogni parola è stata trasformata in una lista di numeri — un vettore — e l'algebra del significato diventa algebra e basta.

È l'idea più controintuitiva degli LLM, e anche la più potente.

Dal token alla posizione

Nel capitolo precedente abbiamo visto che il testo diventa una sequenza di token IDs — interi come 5234 o 91. Ma un intero nudo non ha struttura. Il token 5234 non è "vicino" né "lontano" dal token 5235. Sono solo numerati.

Perché un modello possa calcolare con le parole, serve una rappresentazione più ricca. La soluzione: associare a ogni token un vettore da diverse centinaia a diverse migliaia di numeri reali: 768 per un modello piccolo, 4096 per un modello intermedio, 12.288 per GPT-3, 16.384 per Llama 3 405B. È ciò che chiamiamo un embedding.

All'inizio dell'addestramento, questi vettori sono casuali. Poco a poco, a forza di predire milioni di parole successive, il modello impara a disporli in modo che parole dal significato vicino abbiano vettori vicini.

Nessuno ha scritto questa regola. Emerge dal compito di predizione.

Perché funziona

Pensa a cosa significa predire bene la parola dopo "Il re ha parlato a sua…". Le buone risposte sono figlia, moglie, madre, regina — non motore o algoritmo. Un modello che predice bene queste continuazioni deve sapere che queste parole sono sostituibili in quel contesto.

Il modo più economico per memorizzare questa equivalenza, quando hai miliardi di parametri e miliardi di frasi, è raggruppare "figlia", "moglie", "madre", "regina" nella stessa regione dello spazio vettoriale. Il gradiente spinge in questa direzione a ogni iterazione, senza che nessun umano debba etichettare nulla.

Gli embeddings non sono progettati. Sono la traccia geometrica del compito di predizione.

Manipola lo spazio

Lo spazio qui sotto è una caricatura a due dimensioni — i veri embeddings ne hanno centinaia. Ma le proprietà essenziali ci sono: cluster semantici, vicinato, aritmetica vettoriale.

Ogni punto è una parola proiettata in uno spazio di significato. I vicini condividono un tema — non un'ortografia. La freccia mostra l'aritmetica vettoriale che rende possibile Re − Uomo + Donna = Regina.

Tre cose da notare:

  • I cluster appaiono senza che li abbiamo nominati. Passa sopra gatto e vedrai cane, topo, leone. Passa sopra gioia e vedrai amore, paura, tristezza. Le categorie non esistono nei dati — esistono nella geometria.
  • Alcune direzioni hanno un senso. Il vettore che va da uomo a donna è più o meno lo stesso che va da re a regina, o da padre a madre. È questa regolarità che fa funzionare l'aritmetica. Una precisazione onesta: questa proprietà è stata scoperta sugli embeddings statici di tipo word2vec (2013), dove una parola = un vettore fisso. Nella tabella di embeddings di un LLM esiste ancora, ma molto più rumorosa — l'intuizione resta giusta, l'uguaglianza è approssimativa.
  • Le distanze sono relative, non assolute. Che gatto sia a distanza 0.32 da cane non significa nulla di per sé. Ciò che conta è che sia più vicino a cane che a pane o rabbia.

L'illusione 2D

Nei veri modelli, un embedding ha tra 768 e 16.384 dimensioni a seconda della taglia del modello. Perché così tante?

Perché in 2D siamo costretti a fare compromessi. gatto deve essere vicino a cane (animali domestici), a topo (mammiferi), a tigre (felini), a uccello (animale). Tutte queste "prossimità" tirano in direzioni diverse — e in 2D entrano in conflitto.

A 768 dimensioni, ogni faccetta del significato può avere la propria direzione. La parola gatto può essere vicina a cane lungo l'asse "animale domestico", vicina a tigre lungo l'asse "felino", vicina a topo lungo l'asse "piccolo mammifero". Lo spazio è abbastanza grande per far coesistere tutte queste relazioni senza schiacciarle.

Gli umani pensano che non si possano visualizzare 768 dimensioni. Gli embeddings non chiedono tanto: le usano solo per ordinare le categorie senza collisioni.

Misurare la vicinanza: la similarità coseno

Quando diciamo che due parole sono "vicine" nello spazio degli embeddings, come lo misuriamo concretamente? Non con la distanza euclidea classica. Con la similarità coseno.

L'idea: si guarda l'angolo tra i due vettori, non la loro lunghezza. Due vettori che puntano nella stessa direzione hanno similarità coseno pari a 1, qualunque sia la loro ampiezza. Due vettori ortogonali danno 0. Due vettori opposti, −1.

cos(u, v) = (u · v) / (||u|| × ||v||)

Perché questa misura e non un'altra? Perché la norma di un embedding (la sua lunghezza) varia per ragioni che non hanno a che fare con il significato — frequenza della parola, profondità del layer. La direzione, invece, codifica il significato. La similarità coseno isola ciò che conta.

È anche la misura che alimenta tutta la ricerca semantica moderna: i database vettoriali (Pinecone, pgvector, Chroma…) indicizzano milioni di vettori e trovano i più vicini a una query in un attimo. Ne riparleremo al capitolo 10 (RAG).

Conseguenze

Questa rappresentazione geometrica ha effetti sorprendenti:

  • Gli errori ortografici spesso passano. Scrivi buongirno invece di buongiorno e il modello capisce lo stesso. Attenzione alla spiegazione, è controintuitiva: non è perché i due embeddings di partenza si assomigliano. Il tokenizer taglia buongirno in pezzi che non hanno nulla a che vedere con quelli di buongiorno, e i loro vettori d'ingresso non sono correlati. È attraversando gli strati, guardando il contesto attorno, che il modello avvicina progressivamente le due rappresentazioni. La robustezza non viene dalla tabella degli embeddings: viene ricostruita strada facendo.
  • I bias si incastrano. Se nel corpus di addestramento infermiere appare più spesso al femminile e medico al maschile, l'aritmetica degli embeddings lo rifletterà. medico − uomo + donna può dare infermiera. Molto lavoro va nella correzione di questi bias — ne riparleremo al capitolo 8.
  • Tutto diventa calcolabile. Una volta che il significato è diventato un vettore, possiamo sommare, proiettare, misurare angoli. È esattamente ciò che fa il meccanismo successivo.

Il seguito

La tua parola è diventata un vettore. Anche quella accanto. E quella prima. Come fa il modello, a partire da questa sequenza di vettori, a decidere che in "Il medico ha rimandato l'infermiera a casa sua perché **lei**…", il pronome lei si riferisce all'infermiera e non al medico?

Risposta nel prossimo capitolo: l'attenzione, il meccanismo che permette a ogni token di guardare tutti gli altri prima di decidere chi è.

Aggiornato il