Tema

Machine learningdi

Dal testo ai token: il tokenizzatore

Scriviamo «il gatto morde il cane» e vediamo una frase. Una rete neurale, invece, non può moltiplicare gatto per un peso né sommare cane a un altro numero. Prima che cominci il calcolo, il testo va diviso in unità, e ogni unità deve ricevere un numero.

Si riassume spesso tutto dicendo che il testo «diventa numeri», come se fosse un dettaglio di preparazione. Le unità di quella trasformazione hanno invece un nome che è ormai entrato nel lessico di chiunque usi questi modelli: token. Questo pezzo risponde alle tre domande che quel nome si porta dietro: a che cosa servono i token, come si usano, e come vengono ricavati dal testo - cioè chi decide dove un token finisce e dove comincia il successivo. Trasformare poi i numeri in vettori che la rete possa apprendere è il pezzo successivo, sull’embedding.

Un modello legge, scrive e conta in token

Finestra di contesto, listini a consumo e velocità di risposta si misurano tutti nella stessa unità, e la risposta di un modello nasce un token alla volta.

Chi ha usato un modello di linguaggio ha già incontrato i token, magari senza guardarli. La finestra di contesto - quanto testo il modello può tenere davanti in una volta - si dichiara in token; i listini dei servizi a consumo fatturano il token come unità di spesa, come racconta il pezzo sull’impatto computazionale della serie sugli agenti; la velocità di generazione si misura in token al secondo. Sono tre grandezze che chi compra o usa questi servizi maneggia ogni giorno, contate tutte nella stessa unità.

La ragione è che il modello non vede mai il testo com’è scritto. Vede token in ingresso e produce token in uscita: prima che una domanda arrivi al calcolo viene tokenizzata, e la risposta si costruisce un token alla volta - a ogni passo il modello pesa i candidati con le loro probabilità, il lavoro della softmax visto nel pezzo sulle reti multistrato, e ne sceglie uno. Tutto quello che un modello di linguaggio sa fare passa da qui: leggere una sequenza di token, allungarla di un token. E per tornare al testo non serve nulla di neurale: l’ultimo strato assegna una probabilità a ogni voce del vocabolario, se ne sceglie una, e quella voce è già testo - la stessa tabella che ha numerato i token, letta al contrario.

Chi scrive non deve tokenizzare niente: lo fa il servizio, in silenzio. Ma i confini dei token si sentono lo stesso. Si sentono quando un documento non entra nella finestra di contesto; quando la stessa domanda costa più in una lingua che in un’altra, e questo pezzo più avanti lo misura; quando un limite dichiarato «in token» non torna mai col conto delle parole scritte.

Resta la domanda da cui tutto dipende: chi decide dove finisce un token e dove comincia il successivo? Non la grammatica e non il dizionario. Lo decide uno strumento costruito prima del modello, con criteri suoi: il tokenizzatore.

Il token è una scelta del tokenizzatore

Lo stesso testo può diventare caratteri, parole o sottoparole: il token non è un pezzo naturale della lingua, ma l’unità scelta per il modello.

Il primo lavoro si chiama tokenizzazione. Un tokenizzatore prende il testo e restituisce una fila di unità discrete, i token. Non esiste un unico taglio corretto. La parola gatto può diventare:

Il piccolo GPT di questa serie lavora a caratteri. Nel codice di preparazione di nanoGPT il vocabolario è l’insieme ordinato dei caratteri trovati nel corpus; due mappe convertono ogni carattere nel proprio numero e ogni numero nel carattere corrispondente. È una scelta limpida per un modello didattico: nessuna parola resta fuori, purché i suoi caratteri siano presenti nel testo di addestramento. Il prezzo è la lunghezza. Una parola di dieci lettere occupa dieci passi.

Un vocabolario di parole fa il contrario. Accorcia le sequenze, perché una parola intera vale un solo token, ma deve prevedere in anticipo ogni parola che il modello incontrerà. Nomi propri, forme flesse, refusi e parole nuove fanno crescere l’elenco oppure finiscono fra gli sconosciuti. Una lingua viva non si lascia chiudere comodamente in trentamila o cinquantamila voci.

Le sottoparole sono il compromesso: mantengono unite le sequenze frequenti e compongono quelle rare con pezzi più piccoli. Gatto può avere una voce propria, mentre una parola rara può essere composta da radice, suffisso e altri frammenti. Il tokenizzatore non sta facendo un’analisi grammaticale: cerca unità riutilizzabili secondo le frequenze del corpus.

Le fusioni del BPE si apprendono prima sul corpus

Il byte pair encoding costruisce una tabella sul corpus di addestramento; quando arriva un testo nuovo, applica quella tabella senza ricostruirla.

Uno dei metodi più importanti per costruire sottoparole è il byte pair encoding, abbreviato BPE. Philip Gage lo descrisse nel 1994 come algoritmo di compressione. Nel 2016 Rico Sennrich, Barry Haddow e Alexandra Birch lo adattarono alla traduzione neurale: si parte da unità piccole e si fonde, un passo alla volta, la coppia adiacente più frequente.

Perché prendersi la briga, se caratteri e parole sono già lì? Perché il BPE unisce i pregi di entrambi. Rispetto ai caratteri comprime: la stessa frase scende da decine di segni a una manciata di token, e ogni passo del modello lavora su un’unità che porta più informazione. Rispetto alle parole non lascia mai nulla fuori: la parola mai vista si scompone in pezzi noti, fino alle singole lettere se serve. E la taglia del vocabolario si sceglie: si fissa il numero di voci che si è disposti a pagare in righe di matrice, e le fusioni si fermano lì - «un vocabolario aperto attraverso un vocabolario di taglia fissa», nelle parole di Sennrich e colleghi.

Supponiamo che nel corpus ricorrano spesso g seguito da a. La prima fusione crea ga. Se in seguito ga compare spesso davanti a t, una nuova fusione crea gat; altre fusioni possono arrivare a gatto. Non è detto che il risultato coincida con una sillaba o con un morfema. Il criterio è statistico: vince la coppia più frequente fra quelle ancora disponibili.

Qui è decisiva la distinzione fra due momenti. L’addestramento BPE legge il corpus e produce una tabella delle fusioni BPE, ordinata. La codifica BPE prende poi una frase nuova e applica le fusioni già apprese. Se si costruisse una tabella diversa per ogni frase, la stessa parola potrebbe essere segmentata e numerata in modi diversi secondo il testo che la circonda; il modello perderebbe il proprio alfabeto.

Da quale corpus si impara, allora, decide tutto il resto. Il gioco qui sotto lo mette alla prova con un duello: da una parte un vocabolario BPE addestrato sull’apertura dei Promessi sposi, dall’altra quello dei modelli di OpenAI, imparato dal web di oggi. La stessa frase passa nei due, e i due conti quasi mai coincidono: è il modo più rapido per accorgersi che i token non sono né parole né lettere, e che a deciderne il numero è il testo su cui il vocabolario è nato.

I tagli mostrati sono misurati davvero, non simulati: quelli di OpenAI con la sua libreria ufficiale, quelli manzoniani con un BPE addestrato sul corpus del romanzo.

IL DUELLO DEI VOCABOLARI

Due tokenizzatori, la stessa frase. Il primo ha imparato dal primo capitolo dei Promessi sposi; il secondo è quello dei modelli di OpenAI, addestrato sul web. Stessa frase, due conti: guardate chi spende meno, e perché.

Promessi sposi 0

OpenAI 0

Il vocabolario del duello è una versione didattica: conserva la differenza fra maiuscole e minuscole, usa gli spazi come confini senza trasformarli in token, non fonde oltre i confini delle parole e tiene separata la punteggiatura. Le ricette vere cambiano due punti decisivi: da dove si parte, e con quale criterio si fonde.

BPE sui byte è la mossa di GPT-2. Il vocabolario di partenza contiene 256 simboli, uno per ciascun possibile valore di un byte: bastano a rappresentare senza perdita qualunque stringa Unicode, e con questa ricetta nessun segno resta sconosciuto, qualunque cosa si scriva. Il prezzo si vede a zero fusioni: la parola perché parte in sette byte e non in sei segni, dato che la é ne occupa due. GPT-2 aggiunge anche regole che impediscono molte fusioni fra categorie di caratteri diverse, per non consumare il vocabolario con varianti quasi uguali come dog., dog! e dog?.

La regola WordPiece cambia invece il criterio di scelta: vince la coppia più frequente in rapporto alla ricorrenza dei suoi due pezzi, così una coppia rara i cui pezzi compaiono quasi solo insieme batte una coppia di pezzi comunissimi.

Sulla stessa apertura del Manzoni la differenza si vede subito: il BPE comincia da er e on, la regola WordPiece ricompone per prime le rarità inseparabili

La differenza di criterio si legge meglio nella tabella delle fusioni, che è ordinata: il primo gradino è quello che la ricetta sceglie per primo. Sono i dieci gradini iniziali, imparati dallo stesso corpus.

# BPE salda ricorre WordPiece salda ricorre
1 436 volte Hy 1 volta
2 346 volte 00 1 volta
3 334 volte 59 2 volte
4 321 volte 600 1 volta
5 290 volte 598 1 volta
6 er 186 volte 593 1 volta
7 on 157 volte 24 1 volta
8 al 136 volte 58 1 volta
9 an 132 volte 583 1 volta
10 or 128 volte 16 5 volte

Il punto mediano segna la fine della parola: è la e quando chiude una parola, e il BPE la salda per prima perché in italiano succede continuamente. Le due colonne dicono tutto: il BPE comincia dalle cose che ricorrono a centinaia, WordPiece da cose che il corpus contiene una volta sola - il gruppo Hy di Hynojosa e gli anni delle gride, 1583, 1593, 1598, 1600. Non è un capriccio: quei pezzi non compaiono mai separati, e per il criterio di WordPiece questo vale più della frequenza.

Unigram non ha una tabella da mostrare accanto a queste, e la ragione è la stessa che il diagramma qui sotto rende visibile: non salda niente, quindi non produce gradini in ordine. Il suo addestramento toglie unità da un vocabolario già ampio, e il risultato è un elenco di superstiti, non una scala.

Gli altri tokenizzatori e chi li adotta

Wordpieces, Unigram e SentencePiece cambiano la ricetta di scelta delle unità, ma il piatto resta uguale: un vocabolario costruito prima, su un corpus, e applicato poi a ogni testo nuovo.

Le stesse parole in mano a due ricette diverse Dopo quattrocento fusioni imparate sullo stesso corpus, il BPE e la regola WordPiece hanno saldato parole diverse. Il BPE tiene intere lago e del, che nel corpus ricorrono spesso, e lascia Quel spezzato in Q, u, el. WordPiece fa il contrario: tiene intera Quel, perché la Q non compare mai senza la u, e lascia in lettere lago e del. In fondo la terza ricetta, Unigram, che si muove al contrario: parte da tutti i pezzi possibili della parola lago - dieci, dalle singole lettere alla parola intera - e toglie quelli che il corpus non giustifica, finche ne resta uno solo. DOPO 400 FUSIONI IMPARATE SULLO STESSO CORPUS «lago» «Quel» «del» BPE lago Quel del ha già saldato le parole che ricorrono spesso WordPiece lago Quel del ha già saldato la Q con la u: non stanno mai separate Unigram PARTE DA TUTTI I PEZZI POSSIBILI DI «LAGO» l la lag lago a ag ago g go o TOGLIE QUELLI CHE IL CORPUS NON GIUSTIFICA lago ALLA FINE NE RESTA UNO SOLO: LA PAROLA INTERA
Stesso corpus, stesso numero di fusioni, parole diverse saldate. Il BPE sceglie ciò che ricorre più spesso, e dopo quattrocento gradini ha già in tasca lago e del, mentre Quel gli resta in tre pezzi. WordPiece sceglie ciò che non si trova mai separato, e infatti salda Quel - la Q senza la u in italiano non esiste - lasciando in lettere le parole comuni. Unigram si muove al contrario: mette in tavola tutti i pezzi possibili della parola - per lago sono dieci, dalle lettere sciolte alla parola intera - e poi toglie quelli che il corpus non giustifica, finché non ne resta uno. Tre criteri, tre vocabolari diversi dallo stesso testo.

Il BPE non è comunque l’unico attrezzo del mestiere. I «wordpieces» della traduzione neurale di Google dividono le parole «in un insieme limitato di sotto-unità comuni»: parenti stretti delle fusioni BPE, con una ricetta di scelta diversa. Il metodo Unigram rovescia la prospettiva: fra i tanti modi possibili di segmentare una parola sceglie il più probabile secondo un modello di linguaggio a unigrammi - e campionare anche le alternative, durante l’addestramento, rende il modello più robusto. Il suo addestramento è un procedimento iterativo di stima e potatura, lontano dalla semplicità delle fusioni. SentencePiece, infine, è la cassetta degli attrezzi che addestra questi vocabolari di sottoparole direttamente dal testo grezzo, spazi compresi, dichiaratamente indipendente dalla lingua. Ricette diverse, piatto uguale: un vocabolario costruito prima, su un corpus, e applicato poi a ogni testo nuovo.

E i modelli di larga diffusione? La famiglia GPT è rimasta al BPE sui byte: i vocabolari sono distribuiti col codice aperto tiktoken, dove la tabella che associa ogni modello alla sua codifica si legge in chiaro - dalla cl100k di GPT-4 alla o200k dei modelli successivi, GPT-5 compreso, coi nomi che dichiarano la taglia: centomila e duecentomila voci. La famiglia Llama dichiara nel lavoro del 2023 la stessa ricetta con la cassetta di Kudo: i dati tokenizzati «con l’algoritmo byte-pair encoding, usando l’implementazione di SentencePiece», coi numeri spezzati in cifre singole e i byte come ripiego per i caratteri sconosciuti.

GPT-2 · 50.257 VOCI · 10 TOKEN

Quel␣ramo␣del␣lago␣di␣Como

CL100K (GPT-4) · 100.277 VOCI · 9 TOKEN

Quel␣ramo␣del␣lago␣di␣Como

O200K (MODELLI SUCCESSIVI) · 200.019 VOCI · 6 TOKEN

Quel␣ramo␣del␣lago␣di␣Como
La frase d'apertura del romanzo, tokenizzata con i vocabolari veri della famiglia GPT e ricostruita con tiktoken. Qui lo spazio, mostrato come ␣, appartiene al token che segue. Più il vocabolario è grande, più l'italiano resta intero: da dieci token a sei.

La scelta del tokenizzatore si paga tre volte

Compressione delle sequenze, righe di matrice spese bene, parole rare che ereditano statistica: sono le tre spese su cui i tokenizzatori si confrontano.

Si paga tre volte, e tutte e tre le spese restano aperte per tutta la vita del modello.

Fra le ricette affermate le differenze sono spesso di rifinitura; cambiare criterio a metà strada, invece, non si può.

La lezione comune non è che ogni tokenizzatore debba usare BPE: il vocabolario viene stabilito prima dell’uso e diventa parte del modello. Cambiare tokenizzatore significa cambiare gli identificativi, la lunghezza delle sequenze e la prima matrice di pesi.

L’italiano paga più token dell’inglese

Il vocabolario premia la lingua e l’argomento che dominano il suo corpus di addestramento: tutto il resto si scompone in più pezzi, e ogni pezzo in più si paga in denaro, tempo e contesto.

Le fusioni del BPE premiano le sequenze frequenti nel corpus di addestramento. Se quel corpus è in gran parte inglese, le parole inglesi conquistano voci intere del vocabolario, mentre le parole delle altre lingue si fermano più spesso a frammenti. Lo stesso contenuto, tradotto, produce sequenze di lunghezza diversa.

E quel che vale fra le lingue vale anche fra gli argomenti: un vocabolario cresciuto su testi di programmazione impara per intero le parole del codice, uno cresciuto su atti giudiziari impara le formule dei tribunali. Il vocabolario parla la lingua dei testi che ha letto; tutto il resto lo compone a pezzi.

Il duello qui sopra mostra lo stesso meccanismo a parti rovesciate. Il vocabolario nato dal Manzoni legge in cinque token «l’Illustrissimo ed Eccellentissimo Signore», che a OpenAI ne costa undici; ma davanti a «il modello di linguaggio produce token» il conto si capovolge, sedici contro sette, perché quelle parole nel romanzo non esistono. Un vocabolario è sempre lo specchio del testo su cui è nato.

Il conto si può fare anche nella direzione che interessa a chi scrive in italiano. Abbiamo preso il periodo d’apertura del corpus, «Quel ramo del lago di Como… dall’altra parte», e la sua traduzione inglese del 1834, e li abbiamo contati con le codifiche della famiglia GPT distribuite con tiktoken. L’italiano ha meno parole, 57 contro 61, e più token: 113 contro 75 con la codifica di GPT-2, 105 contro 73 con la cl100k di GPT-4, 93 contro 72 con la o200k dei modelli successivi. I vocabolari più grandi accorciano il divario, da una volta e mezza a quasi un terzo in più, ma la direzione non cambia: a parità di contenuto, l’italiano paga più token.

Su scala più ampia il fenomeno è stato misurato da Aleksandar Petrov, Emanuele La Malfa, Philip Torr e Adel Bibi: lo stesso testo, tradotto in lingue diverse, può costare fino a quindici volte più token secondo la coppia di lingue considerata, e la disparità non sparisce nei tokenizzatori addestrati apposta per il multilingue; perfino contando in caratteri o in byte, fra le lingue resta un divario di oltre quattro volte. Le conseguenze che il lavoro elenca sono concrete: il costo dei servizi a consumo, che contano il token come unità di spesa; i tempi di elaborazione; e la quantità di testo che entra nella finestra di contesto. Il tokenizzatore è il punto esatto in cui questi conti si decidono, molto prima che il modello cominci a calcolare.

Il vocabolario si prepara prima del modello

Per un modello nuovo la prima decisione è la miscela del corpus su cui addestrare il tokenizzatore; i vocabolari già costruiti si scaricano, e le famiglie maggiori dichiarano le loro scelte.

Chi addestra un modello nuovo comincia da qui. Prima dei pesi si prepara il vocabolario: si compone un corpus con le lingue e gli argomenti che il modello dovrà maneggiare, ci si addestra sopra il tokenizzatore, e soltanto dopo parte l’addestramento vero. Il calcolo della tabella è la parte facile, un procedimento automatico che in confronto ai costi del modello non costa quasi nulla. Il giudizio sta tutto nella miscela: le proporzioni fra lingue e argomenti decidono chi otterrà le voci intere, e il sovrapprezzo della sezione precedente si fissa qui, una volta per tutte - insieme alle voci speciali, che vanno riservate in anticipo.

Le famiglie maggiori questa miscela la dichiarano. Il lavoro di LLaMA del 2023 mette in tabella le proporzioni del suo corpus: due terzi di pagine web CommonCrawl in inglese, il 15% del corpus C4, il 4,5% di codice da GitHub, altrettanta Wikipedia in venti lingue, italiano compreso, e per il restante nove per cento libri, articoli scientifici e domande e risposte. Leggere quella tabella è leggere il destino di ogni lingua e di ogni argomento dentro il modello: le percentuali di là diventano i token in più o in meno di qua.

Non è obbligatorio partire da zero: i vocabolari già costruiti si scaricano. Le codifiche della famiglia GPT sono pubblicate con tiktoken, come s’è visto; i modelli a pesi aperti distribuiscono il tokenizzatore insieme ai pesi; i multilingui di ricerca come mT5 dichiarano vocabolari da 250.000 voci costruiti su un centinaio di lingue. Il riuso ha anche una forma intermedia, ed è la più istruttiva: Llama 3 dichiara un vocabolario da 128.000 voci fatto di 100.000 voci prese da tiktoken più 28.000 aggiunte apposta per le lingue diverse dall’inglese - si riusa la base, e con le voci nuove si ottiene lo sconto per le lingue che pagavano troppo.

La regola pratica è una sola: nella maggior parte dei progetti il vocabolario non si sceglie nemmeno - arriva col modello, e non ci si pensa più. Chi costruisce un assistente in italiano sopra un modello della famiglia GPT si ritrova la o200k senza averla mai nominata, paga il sovrapprezzo della lingua misurato qui sopra, e mette quel sovrappiù nel preventivo come qualunque altra spesa. Il tokenizzatore su misura è l’eccezione, non il primo passo.

Farsene uno proprio conviene quando la miscela è davvero diversa da quelle in circolazione: un modello per l’italiano giuridico, su un vocabolario anglocentrico, pagherebbe il sovrapprezzo a ogni frase. Gli attrezzi sono quelli già visti fra le ricette - SentencePiece, e librerie come i tokenizers di Hugging Face - e addestrano un vocabolario dal testo grezzo senza bisogno di macchine speciali. Riusare, invece, regala la compatibilità: un modello che condivide il vocabolario con la sua famiglia può scambiare pesi e rappresentazioni con lei, ed è la porta per gli adattamenti che il prossimo pezzo racconta.

L’identificativo del token è un indirizzo

Il numero assegnato a un token dice dove trovarlo nel vocabolario; non misura il suo significato.

Dopo la tokenizzazione ogni voce riceve un intero. In un vocabolario minuscolo potremmo avere gatto → 2, cane → 3, morde → 4. Il 4 di morde non è il doppio del 2 di gatto, e sottrarre i due numeri non rivela alcuna relazione linguistica. L’identificativo del token è un indirizzo: permette di ritrovare una voce, come il numero di uno scaffale.

Non tutte le voci del vocabolario vengono dal testo. Le codifiche reali riservano identificativi a segni di servizio che nessun corpus contiene: la codifica di GPT-2 chiude le sue 50.257 voci con <|endoftext|>, il segno che separa un documento dall’altro, e le codifiche successive ne aggiungono altri per i confini di un prompt o di un completamento. Sono token a tutti gli effetti: hanno un indirizzo, e il modello li incontra e li produce come gli altri.

Qui il testo è arrivato al confine di ciò che un tokenizzatore può fare. «Il gatto morde il cane» è diventato una fila di indirizzi, e gli indirizzi, per costruzione, non si somigliano: sanno soltanto distinguere. Perché gatto possa avvicinarsi a cane più che a mercoledì, il numero deve smettere di essere un indirizzo e diventare un vettore che l’addestramento può modificare. È l’embedding.

I concetti che questo articolo introduce

Otto voci coprono il taglio del testo, la costruzione del vocabolario e il numero che fa da indirizzo.

Concetto Ambito Che cos’è Si lega a
Tokenizzazione machine-learning La trasformazione del testo in una sequenza di token secondo un vocabolario; può operare a caratteri, parole, sottoparole o byte produce il token; usa il vocabolario; può applicare la codifica BPE
Vocabolario machine-learning L’elenco finito dei token disponibili, con un identificativo assegnato a ciascuna voce è usato dalla tokenizzazione; collega ogni voce al proprio identificativo del token; la sua dimensione dipende dall’addestramento BPE
Identificativo del token machine-learning Il numero intero che individua una voce del vocabolario; è un indirizzo, non una quantità dotata di significato identifica il token; seleziona una riga della prima matrice di pesi
Byte pair encoding machine-learning Famiglia di algoritmi che costruisce unità a lunghezza variabile fondendo ripetutamente coppie frequenti; la variante di Sennrich parte da caratteri, quella di GPT-2 dai byte comprende l’addestramento BPE e la codifica BPE; costruisce il vocabolario
Miscela del corpus machine-learning Le proporzioni di lingue e argomenti nel corpus su cui si addestra il tokenizzatore: decidono quali parole ottengono voci intere e quali si compongono a pezzi determina l’addestramento BPE; si riflette nelle voci del vocabolario
Addestramento BPE machine-learning La costruzione, su un corpus, della tabella ordinata delle fusioni e del vocabolario produce la tabella delle fusioni BPE; precede la codifica BPE
Tabella delle fusioni BPE machine-learning L’elenco ordinato delle coppie che il tokenizzatore può fondere, appreso sul corpus di addestramento è prodotta dall’addestramento BPE; governa la codifica BPE
Codifica BPE machine-learning L’applicazione a un testo nuovo della tabella delle fusioni già appresa usa la tabella delle fusioni BPE; produce il token

Fonti

I dati e le affermazioni portanti vengono dai lavori originali, dal codice dei tokenizzatori e da una misura fatta da noi sul Manzoni e sulla sua traduzione inglese.