Tema

Machine learningdi

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.

Le parole trovano il loro posto da sole: vicine a quelle che si usano in contesti simili. Cliccate una parola e vedete quali le stanno vicino; per l'analogia, il bottone «La classica» fa tutto da solo.

Cliccate una parola sulla mappa: vedete le sue vicine. Tre parole, una dopo l'altra: l'analogia.

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:

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.

Dal numero del token all'ingresso del primo blocco Transformer Il token gatto, con identificativo 2, seleziona la terza riga della matrice degli embedding dei token e ottiene un vettore formato dai valori 0,7, meno 0,2 e 0,4. La posizione 4 seleziona dalla matrice delle posizioni un vettore formato dai valori 0,1, 0,3 e meno 0,2. La loro somma produce il vettore formato da 0,8, 0,1 e 0,2, che entra nel primo blocco Transformer. TOKEN gattoID 2 MATRICE wte 0 1 2 3 4 1,1 −0,4 0,2 −0,3 0,8 0,5 0,7 −0,2 0,4 0,0 0,6 −0,1 −0,5 0,2 0,9 EMBEDDING DEL TOKEN [0,7 · −0,2 · 0,4] POSIZIONE 4 EMBEDDING POSIZIONALE [0,1 · 0,3 · −0,2] + INGRESSO x₄ [0,8 · 0,1 · 0,2] PRIMO BLOCCO
L'identificativo non entra nella rete come quantità: seleziona una riga. nanoGPT somma poi l'embedding del token all'embedding della posizione. Solo il vettore risultante attraversa i blocchi che lo renderanno dipendente dal contesto.

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.