07 – Come diventano numeri le parole?

Capire l'IA: come diventano numeri le parole.

CAPIRE L’IA · 7 di N

Una rete neurale moltiplica numeri, somma risultati e applica funzioni. Ma quando scriviamo «Il gatto dorme», non le stiamo consegnando una matrice: le stiamo consegnando del testo. Come si passa dall’uno all’altra?

Il passaggio comprende due idee diverse: dividere il testo in unità identificabili e associare a queste unità rappresentazioni numeriche che la rete possa elaborare. Le prime sono i token. Le seconde sono gli embedding.

Seguiamo una frase fino ai suoi vettori. Useremo numeri inventati e molto piccoli, così da poter controllare ogni passaggio senza nasconderlo dietro una libreria software.

Il testo è già digitale. Che cosa manca?

Un computer conserva già il testo mediante una codifica: per esempio UTF-8 rappresenta i caratteri attraverso sequenze di byte. Quella codifica permette di memorizzare e ricostruire ciò che scriviamo, ma non è una rappresentazione appresa per un compito linguistico.

Possiamo pensare alla differenza tra il codice di catalogo di un libro e una descrizione del suo contenuto. Il codice permette di individuarlo. La descrizione offre informazioni utilizzabili per confrontarlo con altri libri. Anche questa analogia ha un limite: un embedding non è una scheda compilata da qualcuno, ma un vettore i cui valori vengono normalmente appresi.

Un token non coincide necessariamente con una parola

Un tokenizer trasforma il testo in una sequenza di unità. A seconda del sistema, queste possono corrispondere a parole, frammenti, punteggiatura o sequenze di byte. I metodi a sottoparole consentono di comporre molte parole usando un vocabolario di frammenti riutilizzabili. La segmentazione non coincide necessariamente con sillabe o morfemi.

Spazi, maiuscole e accenti possono cambiare la sequenza ottenuta. Non esiste quindi un conteggio universale dei token di una frase: dipende dal tokenizer. Modello e tokenizer devono essere compatibili, come spiega la guida di Hugging Face alla tokenizzazione.

Per il nostro esempio inventiamo questa suddivisione:

Il gatto dorme. → [Il] [·gatto] [·dorm] [e] [.]

Il punto mediano «·» indica uno spazio incluso nel token: è soltanto un segno esplicativo, non un carattere aggiunto alla frase. «Dorme» occupa due token. La frase contiene tre parole e, nel nostro sistema didattico, cinque token.

Il gatto dorme. diventa cinque token e gli ID 1, 2, 3, 4, 5 in un vocabolario inventato.
Esempio costruito: «dorme» è diviso in due token. Gli spazi sono rappresentati dal simbolo ·; un tokenizer reale può segmentare diversamente.

Non stiamo mostrando l’output di un tokenizer commerciale. Abbiamo costruito una regola semplice e dichiarata: serve a separare il concetto generale dai dettagli di una particolare implementazione.

Gli ID sono indirizzi, non significati

Il vocabolario associa a ogni token un numero intero, il suo ID. Nel nostro piccolo vocabolario assegniamo 1 a «Il», 2 a «·gatto», 3 a «·dorm», 4 a «e» e 5 al punto. La frase diventa la sequenza:

[1, 2, 3, 4, 5]

Questo è già un elenco di numeri, ma usarli come quantità sarebbe fuorviante. L’ID 4 non contiene il doppio del significato dell’ID 2. E due ID consecutivi non identificano necessariamente token simili.

Potremmo rinumerare il vocabolario senza cambiare il funzionamento del modello, purché riordinassimo coerentemente tutte le strutture che dipendono da quegli indici. Il numero serve a trovare una voce, come il numero di uno scaffale.

L’embedding: dalla voce di vocabolario a un vettore

Introduciamo una matrice E con una riga per ogni token del vocabolario. Ogni riga contiene d numeri. Nel nostro esempio ci sono otto voci e tre componenti per vettore: E ha dimensione 8 × 3.

Aggiungiamo al vocabolario «·cane», «·tavolo» e un token di riempimento, «<pad>», al quale riserviamo l’ID 0. Il riempimento può servire a costruire gruppi di sequenze della stessa lunghezza; qui non compare nella frase.

Matrice didattica con otto righe e tre componenti: ID 2 seleziona il vettore 0,8; 0,6; 0.
Valori inventati per seguire il calcolo. Il numero identificativo serve a scegliere la riga; il vettore contiene la rappresentazione elaborabile dalla rete.

L’operazione essenziale è una selezione:

embedding del token con ID i = E[i]

Per «·gatto», che ha ID 2, leggiamo la riga 2: (0,8; 0,6; 0). Il punto e virgola separa le componenti, mentre la virgola è il separatore decimale.

Applicando la stessa operazione ai cinque ID otteniamo cinque vettori, ciascuno con tre componenti. La frase diventa quindi una matrice 5 × 3: una riga per posizione, una colonna per componente. In un modello reale le dimensioni sono maggiori, ma il principio è lo stesso.

Il vocabolario e la lunghezza della frase svolgono ruoli distinti. La tabella E ha una riga per ogni token possibile; la matrice della frase ha una riga per ogni token effettivamente presente. Un token ripetuto seleziona più volte la stessa riga di E.

Un piccolo ponte con l’algebra

La selezione di una riga si può descrivere anche con un vettore one-hot: tutti zeri, tranne un 1 nella posizione dell’ID. Per l’ID 2, contando da zero:

u = (0, 0, 1, 0, 0, 0, 0, 0)
uE = (0,8; 0,6; 0)

La moltiplicazione annulla tutte le righe tranne quella scelta. È una descrizione matematica utile; in pratica si può recuperare direttamente la riga senza costruire il lungo vettore di zeri.

La distinzione è anche geometrica. Due vettori one-hot relativi a token diversi sono sempre perpendicolari: codificano l’identità, senza graduare la somiglianza. Gli embedding possono invece assumere direzioni e distanze diverse.

Che cosa significa che due embedding sono vicini?

Riprendiamo due righe della tabella:

gatto = (0,8; 0,6; 0)
cane = (0,7; 0,7; 0)

Una misura comune è la similarità coseno, che confronta la direzione di due vettori non nulli:

cos(a, b) = (a · b) / (‖a‖ ‖b‖)

Il prodotto scalare al numeratore vale 0,8 × 0,7 + 0,6 × 0,7 = 0,98. Le lunghezze dei vettori sono 1 e √0,98. Otteniamo quindi 0,98 / √0,98 ≈ 0,990: le direzioni sono molto vicine.

I vettori gatto 0,8; 0,6 e cane 0,7; 0,7 hanno direzioni vicine, con similarità coseno circa 0,990.
La similarità coseno confronta le direzioni. Gli assi non sono etichettati con proprietà linguistiche: le componenti non hanno necessariamente un significato interpretabile.

Per «tavolo», il cui vettore abbiamo scelto come (0; 0,1; 0,9), la similarità con «gatto» è invece circa 0,066. Abbiamo costruito noi questa geometria: il risultato verifica i conti, non dimostra una proprietà di un modello addestrato.

In rappresentazioni apprese, relazioni geometriche possono riflettere regolarità linguistiche utili al compito. Ma «vicino» non significa automaticamente «sinonimo». Anche parole opposte possono comparire in contesti simili. E il coseno non è una probabilità: 0,990 non significa «99% di probabilità di avere lo stesso significato».

Nemmeno le coordinate sono necessariamente proprietà leggibili come «animalità» o «dimensione». L’informazione può essere distribuita tra molte componenti. Disegnare vettori in due dimensioni aiuta a capire la geometria; proiettare embedding reali su un piano, invece, può perdere e deformare relazioni.

Da dove arrivano i numeri della tabella?

Nel nostro esempio li abbiamo scelti a mano. In un modello linguistico addestrato da zero, la tabella viene tipicamente inizializzata con valori casuali e aggiornata insieme agli altri parametri. Si possono anche riutilizzare rappresentazioni già addestrate.

Il meccanismo è quello incontrato nell’articolo Come si addestra una rete neurale?: la rete produce una previsione, la perdita misura l’errore e la retropropagazione calcola i gradienti. L’ottimizzatore usa questi gradienti per aggiornare anche i valori della matrice degli embedding, quando sono addestrabili.

Non occorre assegnare manualmente una definizione a ogni parola. L’obiettivo di addestramento premia rappresentazioni che contribuiscono a svolgere il compito. Questo non garantisce che la geometria ottenuta corrisponda perfettamente alle nostre categorie linguistiche.

Durante il normale utilizzo, la tabella resta fissa. Selezionare una riga per una nuova frase è un calcolo, non un nuovo apprendimento.

Una stessa parola può avere più significati

«Ho perso la chiave di casa.»
«Questa è la chiave del problema.»

Se «chiave» corrisponde allo stesso token, il suo embedding iniziale è lo stesso nei due casi. La sola tabella non decide quale uso sia pertinente. Inoltre, la semplice selezione delle righe non incorpora di per sé l’ordine: per rappresentarlo occorrono meccanismi posizionali.

Nei Transformer, i blocchi successivi combinano le informazioni disponibili nel contesto e trasformano i vettori. Distinguiamo dunque embedding iniziale del token e rappresentazione contestuale di una sua occorrenza. Quest’ultima può cambiare tra le due frasi, anche con parametri fissi.

È il punto da cui parte l’articolo 08, «L’attenzione e i Transformer: collegare le parole nel contesto»: come può la rappresentazione di una posizione incorporare informazioni provenienti dalle altre?

Dal vettore al testo, e tre conseguenze pratiche

Un modello generativo compie anche il percorso verso l’uscita: dalla rappresentazione finale calcola punteggi per i token del vocabolario, li trasforma in una distribuzione e una procedura di generazione seleziona il token successivo. Il tokenizer riconverte poi la sequenza di ID in testo. Non si tratta semplicemente di scegliere l’embedding più vicino.

Da quanto abbiamo visto seguono tre conseguenze. Il limite di contesto espresso in token non corrisponde a un numero fisso di parole. Lingue, nomi rari e stringhe insolite possono avere segmentazioni molto diverse. Infine, un embedding dell’intera frase o di un documento richiede un metodo per produrre una rappresentazione complessiva: non coincide automaticamente con una delle righe della tabella dei token.

Tre cose da conservare

  1. Il token è un’unità di elaborazione. Può essere una parola, un frammento o un’altra unità prevista dal tokenizer.
  2. L’ID identifica; l’embedding rappresenta. Il primo seleziona una riga, il secondo offre un vettore che la rete può trasformare.
  3. Il contesto richiede altri calcoli. L’embedding iniziale è il punto di partenza per costruire rappresentazioni sensibili alla frase.

Le parole diventano elaborabili attraverso una sequenza concreta di operazioni: segmentazione, identificazione e selezione di vettori. È da queste rappresentazioni numeriche che la rete comincia a costruire relazioni utili sul linguaggio.

← Torna al percorso Capire l’IA

Commenti

2 risposte a “07 – Come diventano numeri le parole?”

  1. […] tappe precedenti abbiamo incontrato token ed embedding e il meccanismo dell’attenzione. Ora possiamo unirli: un modello linguistico autoregressivo […]

  2. […] percorso Capire l’IA abbiamo visto come le parole diventano numeri. Qui scendiamo dentro il meccanismo: come vengono scelti i frammenti, perché cambiano fra […]

Lascia un commento