Dai token ai vettori: l'embedding
Il pezzo sul tokenizzatore si è chiuso su una fila di indirizzi: «il gatto morde il cane» è diventato una sequenza di identificativi, e gli identificativi, per costruzione, sanno soltanto distinguere. Gatto non è più vicino a cane che a mercoledì. Una rete che ricevesse quei numeri come quantità imparerebbe relazioni che non esistono: il 4 di morde non è il doppio del 2 di gatto.
Si riassume spesso tutto dicendo che il testo «diventa numeri». È vero, ma nasconde la parte interessante. Il primo numero è soltanto un indirizzo; il vettore ricavato da quell’indirizzo è un parametro appreso; la posizione nella frase richiede un’informazione ancora diversa. Capire queste tre cose separatamente evita di attribuire all’embedding un significato che non possiede e prepara il problema che verrà dopo: mettere in relazione parole lontane dentro una sequenza.
La matrice degli embedding trasforma l’indirizzo in un vettore
La one-hot rende l’indirizzo un vettore che sa solo distinguere; la matrice degli embedding sostituisce quel vettore con una riga appresa, che l’addestramento modifica insieme agli altri pesi della rete.
Il primo modo di trasformare un indirizzo in un vettore è il più
esplicito: la codifica one-hot, un vettore di zeri con un solo 1.
Se il vocabolario ha cinque voci e gatto occupa la terza, il suo
vettore è [0, 0, 1, 0, 0]. Il difetto si vede subito: ogni token
occupa un asse diverso, e la distanza fra due vettori distinti è
sempre la stessa - l’equidistanza degli indirizzi, tradotta in
geometria.
Una rete non ha bisogno di costruire davvero quel vettore enorme. La
one-hot serve a vedere il calcolo: moltiplicarla per una tabella di
pesi equivale a selezionare la riga in cui compare l’unico 1, e le
librerie eseguono direttamente questa selezione. La tabella si chiama
matrice degli embedding. Le righe sono tante
quante le voci del vocabolario; le colonne sono le dimensioni scelte
per rappresentarle. Un vocabolario di cinquemila token con vettori di
sessantaquattro numeri produce una matrice 5.000 × 64.
All’inizio quei valori sono quasi casuali. Quando la retropropagazione aggiorna il modello, modifica anche le righe dei token coinvolti negli esempi. La riga selezionata dall’identificativo diventa l’embedding del token: il suo vettore iniziale, prima che gli strati successivi lo mettano in relazione con il resto della frase.
L’addestramento dispone gli embedding secondo somiglianze d’uso
L’addestramento non assegna definizioni ai vettori: dispone le unità in uno spazio dove usi simili possono produrre rappresentazioni vicine.
Per capire perché una rappresentazione distribuita - dove il
significato di ogni parola è spalmato su molte dimensioni condivise,
invece di occupare un asse tutto suo - sia utile, basta contare. Con un vocabolario di centomila parole, le sequenze possibili
di dieci parole sono 100.000¹⁰, cioè 10⁵⁰. Nessun corpus può
mostrarle tutte. Un modello basato soltanto sulle frequenze di
sequenze brevi, il modello n-gramma, incontra qui la
maledizione della dimensionalità: quasi ogni frase abbastanza
lunga è nuova.
Nel 2003 Yoshua Bengio, Réjean Ducharme, Pascal Vincent e Christian Jauvin proposero di imparare insieme due cose: un vettore distribuito per ogni parola e la funzione che assegna probabilità alla parola successiva. Così una frase di addestramento non informa il modello soltanto su se stessa. Se le parole usate in ruoli simili ricevono vettori vicini, ciò che il modello apprende da una frase può estendersi ad altre frasi che contengono quelle parole.
«Vicino» qui ha un significato calcolabile. Si può misurare una distanza oppure l’angolo fra due vettori, spesso con la similarità del coseno. Non significa necessariamente «sinonimo». Caldo e freddo compaiono in costruzioni molto simili e possono risultare vicini proprio perché occupano ruoli analoghi, pur indicando estremi opposti. L’embedding registra regolarità d’uso; non contiene una definizione da dizionario.
La matrice degli embedding risolve inoltre il limite della one-hot senza perdere l’identità dei token. Le righe restano distinte, ma i vettori che contengono non sono più equidistanti fra loro. La retropropagazione può avvicinare o separare quei vettori e organizzare più proprietà nelle stesse dimensioni.
Le analogie di word2vec sono un risultato, non una regola
Furono misurate nel 2013 su parole inglesi: dicono che uno spazio appreso può contenere regolarità, non che ogni embedding debba averle.
Nel 2013 Tomas Mikolov, Kai Chen, Greg Corrado e Jeffrey Dean mostrarono che grandi corpora potevano produrre embedding di parola di buona qualità in tempi molto più brevi dei modelli precedenti. Il loro lavoro riporta l’esempio diventato celebre:
vector("King") − vector("Man") + vector("Woman") ≈ vector("Queen")
Il calcolo segue una regolarità osservata nello spazio: la differenza fra King e Man è
simile a quella fra Queen e Woman. Per questo il vettore più vicino al risultato è
Queen. La versione italiana re − uomo + donna ≈ regina aiuta a leggere l’operazione, ma non è una misura eseguita su
un modello italiano.
Il risultato è importante perché mostra che uno spazio appreso può contenere regolarità geometriche. Non garantisce che ogni relazione linguistica diventi una direzione pulita, né che la stessa analogia sopravviva cambiando corpus, algoritmo o tokenizzatore. Soprattutto, word2vec dà un vettore statico a ogni parola intera. In un modello che usa parole come token, quel vettore è anche un embedding del token. Il piccolo GPT di questa serie - un nanoGPT addestrato sui caratteri - assegna invece vettori iniziali ai caratteri; un GPT-2 li costruisce per i token prodotti dal suo BPE. La coincidenza vale dunque solo quando l’unità del vocabolario è una parola intera.
Potete vederlo accadere: il widget qui sotto addestra davanti a voi un
piccolo spazio di parole su un corpus minimo italiano, partendo ogni
volta da una disposizione a caso scelta con un seme - le parole che
co-occorrono si attraggono, le coppie mai vicine si respingono - e la
mappa si dispone da sola. Poi potete comporre l’analogia: cliccate tre
parole, e il punto a − b + c cade dove la geometria della mappa
dice. L’avvertenza del pezzo vale qui per intero: la mappa è
illustrativa, non misurata, e la classica re − uomo + donna ≈ regina
regge con molti semi e non con tutti - proprio come le analogie di
word2vec, che sono una regolarità osservata senza garanzia che valga
altrove.
nanoGPT somma l’embedding del token a quello della posizione
In nanoGPT lo stesso token parte dallo stesso vettore, riceve un embedding della posizione e diventa contestuale attraversando i blocchi del Transformer.
L’embedding del token non sa ancora dove si trova. Se gatto
compare all’inizio o alla fine, l’identificativo seleziona la stessa
riga di wte. Per questo nanoGPT possiede una seconda matrice, wpe:
la posizione zero seleziona una riga, la posizione uno la successiva,
e così via fino alla lunghezza massima del contesto. Il vettore scelto
è l’embedding posizionale.
La somma dei due risponde a due domande diverse:
- quale token occupa questo punto?
wte; - in quale punto della sequenza si trova?
wpe.
La figura mostra il calcolo in tre dimensioni. Il token gatto ha
identificativo 2, quindi seleziona la terza riga della matrice wte.
La posizione 4 seleziona una riga della matrice wpe. I due vettori si
sommano e il risultato entra nel primo blocco del Transformer.
I valori della figura sono inventati per rendere il conto visibile;
la struttura è quella del codice. In nanoGPT le due matrici si chiamano
wte e wpe,
e la somma
tok_emb + pos_emb
precede il primo blocco.
Il risultato non è ancora la comprensione del token nella frase. Entra nei blocchi del Transformer, dove viene modificato in funzione delle altre posizioni accessibili. Il vettore che esce da quegli strati è una rappresentazione contestuale. Una stessa parola come pesca può allora ricevere rappresentazioni diverse in «mangia una pesca» e «oggi pesca dal molo», perché il resto della frase è diverso.
Questa distinzione impedisce tre equivoci. L’identificativo è un indirizzo arbitrario; l’embedding del token è il vettore iniziale appreso; la rappresentazione contestuale è il risultato provvisorio del lavoro degli strati su quella specifica occorrenza.
Questa geografia ha una conseguenza pratica. Il vocabolario tocca la rete in due soli punti: la matrice d’ingresso e l’ultimo strato, che assegna una probabilità a ogni voce del vocabolario. In nanoGPT i due punti sono la stessa matrice, condivisa: un’economia che si chiama weight tying, la condivisione dei pesi. Tutto il resto del modello non vede altro che vettori, e del vocabolario non sa nulla. Da qui il trapianto del vocabolario: a un modello già addestrato si cambia il tokenizzatore, si ricostruiscono le righe della matrice degli embedding, e si riprende per un tratto l’addestramento, perché le righe nuove non hanno ancora imparato niente. Il metodo WECHSEL fa partire le righe nuove già vicine al significato di quelle vecchie, e trasferisce così un modello a un’altra lingua con uno sforzo di addestramento fino a sessantaquattro volte minore rispetto a ripartire da zero. È il rimedio al conto che il pezzo sul tokenizzatore ha misurato: un modello nato anglocentrico può adattarsi a una lingua che pagava troppi token.
La sequenza resta un problema distinto
Una rete multistrato distingue l’ordine entro una finestra fissa; ma la finestra è il limite: ciò che cade oltre il suo margine non può contribuire.
Ora possiamo correggere un’idea troppo comoda. «Il gatto morde il cane» e «il cane morde il gatto» contengono gli stessi token, ma non producono lo stesso ingresso: i vettori compaiono in righe diverse e ricevono posizioni diverse. L’ordine non è scomparso.
Anche il modello di Bengio del 2003, costruito con una rete multistrato, distingue le posizioni: concatena le rappresentazioni di un numero fisso di parole precedenti, e il primo posto non è intercambiabile col secondo. Il limite sta in quel «numero fisso». Una parola oltre la finestra non può contribuire; allargare la finestra aumenta ingressi e parametri senza offrire un modo flessibile di scegliere quali distanze contino davvero.
Questo è il problema della sequenza che il pezzo consegna al successivo. L’informazione posizionale dice dove si trova ciascun token. L’attenzione stabilirà quali posizioni mettere direttamente in relazione entro il contesto disponibile. Non cancellerà il limite massimo del contesto, ma eviterà di comprimere ogni dipendenza in una catena di passi o in un numero rigido di slot.
Nel nanoGPT che ci accompagna, il testo è ormai diventato una sequenza di indirizzi: ciascuno seleziona un vettore appreso, al quale si somma il vettore della posizione. Altre architetture trasmettono l’ordine in modi diversi; il problema resta lo stesso. Nel prossimo pezzo apriremo il meccanismo che permette a ogni posizione di pesare quelle precedenti: domanda, chiave, valore e maschera causale.
I concetti che questo articolo introduce
Dieci voci distinguono il primo vettore e il suo difetto, i tre significati di embedding, la matrice che li produce, il trapianto che la riscrive e il problema ancora aperto.
| Concetto | Ambito | Che cos’è | Si lega a |
|---|---|---|---|
| Codifica one-hot | machine-learning | Un vettore lungo quanto il vocabolario, composto di zeri tranne un unico 1; rende ogni voce equidistante dalle altre | moltiplicata per la matrice degli embedding equivale a selezionarne una riga; rappresenta l’identificativo del token |
| Matrice degli embedding | machine-learning | Un parametro appreso con una riga per ogni token e una colonna per ogni dimensione del vettore | trasforma l’identificativo del token nell’embedding del token; viene appresa mediante la retropropagazione |
| Embedding del token | machine-learning | Il vettore iniziale associato a un token prima che gli strati lo mettano in relazione col contesto | è selezionato dalla matrice degli embedding; in nanoGPT si somma all’embedding posizionale; coincide con un embedding di parola quando ogni token è una parola intera |
| Embedding di parola | machine-learning | Il vettore statico associato a una parola intera nei modelli storici come word2vec | mostra regolarità distribuzionali; è un caso di embedding del token nei modelli con tokenizzazione a parole; è distinto dalla rappresentazione contestuale |
| Embedding posizionale | machine-learning | Un vettore che introduce l’informazione sulla posizione occupata dal token, usato da nanoGPT e da altre architetture | in nanoGPT si somma all’embedding del token; è uno dei modi con cui un modello rappresenta l’ordine |
| Rappresentazione contestuale | machine-learning | Il vettore trasformato dagli strati del modello in funzione degli altri token accessibili | deriva dalla rappresentazione iniziale e dagli strati successivi; in nanoGPT la rappresentazione iniziale somma l’embedding del token all’embedding posizionale |
| Maledizione della dimensionalità | machine-learning | La crescita combinatoria delle sequenze possibili, tanto rapida che nessun corpus può coprirle tutte | affligge il modello n-gramma; motiva l’embedding di parola e le rappresentazioni distribuite |
| Modello n-gramma | machine-learning | Un modello statistico che stima il prossimo token dalle frequenze di sequenze corte osservate e, quando i conteggi mancano, può ricorrere a sequenze più brevi | soffre della maledizione della dimensionalità; tratta il token come simbolo discreto senza somiglianza appresa |
| Problema della sequenza | machine-learning | La difficoltà di trattare lunghezze variabili, ordine e dipendenze lontane senza legarli a una finestra rigida di ingressi | non è risolto dal solo embedding del token; richiede un modo per rappresentare l’ordine e meccanismi che colleghino posizioni diverse |
| Trapianto del vocabolario | machine-learning | La sostituzione del tokenizzatore in un modello già addestrato: si ricostruiscono le righe della matrice degli embedding e la testa di uscita, spesso la stessa matrice, e si riprende l’addestramento perché le righe nuove partono quasi casuali | richiede un nuovo vocabolario; ricostruisce la matrice degli embedding; riduce il costo in token di una lingua o di un dominio |
Fonti
Le affermazioni portanti vengono dai lavori originali e dal codice nanoGPT fissato al commit esaminato.
- Improve and Manage,
serie-machine-learning,
GitHub, 2026 - il repository dei widget della serie: qui sta lo spazio
dei significati di questo pezzo (cartella
embedding/), insieme ai widget di tutti gli altri pezzi della serie. - Yoshua Bengio, Réjean Ducharme, Pascal Vincent e Christian Jauvin,
A Neural Probabilistic Language Model,
JMLR 3, 2003, primaria aperta e letta - la maledizione della
dimensionalità, le
10⁵⁰sequenze e l’apprendimento congiunto delle rappresentazioni distribuite delle parole; traduzioni nostre. - Tomas Mikolov, Kai Chen, Greg Corrado e Jeffrey Dean, Efficient Estimation of Word Representations in Vector Space, 2013, primaria aperta e letta - i vettori di parole, la scala dell’addestramento e l’analogia King, Man, Woman, Queen; gli autori richiamano per quell’esempio un proprio lavoro precedente.
- Yann LeCun, Yoshua Bengio e Geoffrey Hinton, Deep Learning, Nature 521, 2015, rassegna aperta e letta - la codifica one-of-N, le vicinanze fra vettori di parole e il limite degli n-grammi.
- Andrej Karpathy,
nanoGPT al commit
3adf61e154c3, licenza MIT, codice letto - le matriciwteewpe, la loro somma prima dei blocchi Transformer, e il legame fra la matrice d’ingresso e la testa di uscita (weight tying, riga 138 del commit). - Benjamin Minixhofer, Fabian Paischer e Navid Rekabsaz, WECHSEL: Effective initialization of subword embeddings for cross-lingual transfer of monolingual language models, NAACL 2022, primaria aperta, letto l’abstract - la sostituzione del tokenizzatore con la reinizializzazione degli embedding guidata da embedding multilingui, e lo sforzo di addestramento fino a 64 volte minore rispetto a ripartire da zero.