Tema

Applicazioni · un modello nel browser

Il piccolo GPT che ha letto Dante

Qui sotto gira un vero modello di linguaggio: minuscolo - 800.000 parametri, un milionesimo dei grandi - e addestrato su un solo libro, la Divina Commedia, un carattere alla volta. Non sa che cosa dice, e questo è il punto: si vede come sceglie ogni carattere, con quali probabilità, guardando quali parti del testo. Tutto succede nel vostro browser: nessun dato esce da questa pagina.

IL TESTO CHE CRESCE

ATTENZIONE SUL TESTO · TESTA· blocco 4 · si sceglie nella radiografia

LE PROBABILITÀ DEL PROSSIMO CARATTERE

Carico i pesi del modello (0,8 MB)…

Da provare: «Un passo» per vedere la scelta; la temperatura agli estremi; una testa di attenzione. E scrivete voi l’inizio: anche una domanda.

LA RADIOGRAFIA: IL VIAGGIO DI UN CARATTERE NEI QUATTRO BLOCCHI
EMBEDDING
USCITA

I blocchi si parlano attraverso un unico vettore di 128 numeri, quello che in letteratura si chiama flusso residuo. L’embedding lo crea - è il ritratto in numeri del carattere appena entrato: di quel carattere solo, più la sua posizione nel testo - e ogni blocco lo legge, calcola la sua correzione e la somma al vettore, senza sostituirlo: per questo si dice «residuo». Quello che arriva all’uscita è il vettore di partenza più i quattro contributi accumulati. Le strisce qui sopra sono esattamente questo vettore, fotografato in cinque punti del viaggio (colore: segno; intensità: grandezza). Nei modelli grandi lo schema è identico - solo che il vettore, invece di 128 numeri, ne ha migliaia, e i conti girano di solito a 16 bit per velocità.

Sotto ogni stazione, la riga «direbbe:» risponde a una domanda semplice: se il viaggio finisse qui, che carattere uscirebbe? Si prende il vettore com’è in quel punto e lo si consegna in anticipo all’uscita (il trucco in letteratura si chiama logit lens): confrontando le righe si vede la scelta cambiare e maturare da un blocco all’altro. E si capisce perché la riga dell’embedding è quasi sempre la più ingenua: a quella stazione il vettore sa soltanto quale carattere è entrato e dove si trova - il resto del testo arriva solo dopo, portato dentro dall’attenzione dei blocchi. I quattro blocchi sono anche pulsanti: cliccandone uno, l’evidenziazione sul testo mostra dove guardano le teste di quel blocco.

Perché proprio quattro blocchi? È una scelta di misura: più blocchi danno testo migliore ma pesi più pesanti da scaricare, e quattro è il punto in cui questo modello sta in 0,8 MB restando istruttivo (i grandi ne impilano da decine a oltre cento, con lo stesso schema). E che cosa fa ciascuno? Nessuno lo decide, nemmeno chi li costruisce: sono identici per costruzione, senza compiti assegnati. La divisione del lavoro emerge da sola con l’addestramento - e il «direbbe» la mostra: nei primi blocchi la predizione è ancora generica, quasi ortografica; salendo si affina, e l’ultimo blocco è quello che decide. I ruoli non si programmano, si formano.

Una cosa va capita per godersi il resto: il modello non ha memorizzato parole. Non ha un vocabolario, non sa dove una parola finisca e ne cominci un'altra: ha imparato soltanto, per ognuno dei suoi 83 caratteri, quanto è probabile che segua la sequenza che lo precede. Lo «stile di Dante» che riconoscete è tutto lì: quell'enorme tabella di probabilità, distillata dalla Commedia. Le parole emergono da sole, come conseguenza statistica - ed è per questo che ogni tanto ne inventa di inesistenti che suonano perfettamente dantesche: non sta sbagliando a ricordare, sta facendo l'unica cosa che sa fare, un carattere probabile alla volta.

E l'attenzione che si accende sul testo? È il meccanismo con cui il modello decide, per ogni nuovo carattere, quanto pesa ciascuno dei caratteri che ha davanti: non li guarda tutti allo stesso modo - a ogni passo distribuisce un budget di attenzione, e l'evidenziazione che vedete è proporzionale al peso. I quattro pulsanti non sono una scelta della pagina ma l'anatomia del modello: questo GPT è costruito con quattro teste di attenzione per blocco - i modelli grandi ne hanno a decine - e sono quattro sguardi che lavorano in parallelo, ognuno col criterio che ha imparato da solo: accendetele una alla volta e guardate - chi fissa gli ultimi caratteri appena scritti, chi risale più indietro nel verso. Qui vedete le teste dell'ultimo blocco, quello che decide; nella serie di articoli l'attenzione avrà il suo pezzo intero.

Tre cose da provare. La temperatura: bassa, il modello sceglie quasi sempre il carattere più probabile e gira in tondo; alta, pesca anche i candidati improbabili e sragiona - il punto giusto sta in mezzo. «Un passo»: a ogni carattere la classifica mostra fra cosa stava scegliendo - dopo «selva» il modello sa che viene «oscura». La radiografia: apritela e generate - a ogni carattere le strisce si aggiornano e il «direbbe» matura sotto i vostri occhi.

L'anatomia, in numeri. Il modello è fatto di 814.592 parametri, i numeri che l'addestramento ha regolato uno per uno, e si dividono così:

Dove stanno gli 814.592 parametriDue barre orizzontali proporzionali. La prima è il modello intero: quasi tutta la lunghezza sono i quattro blocchi (787.456 parametri), poi due segmenti sottili per le posizioni della finestra (16.384) e il vocabolario (10.624), e la normalizzazione finale (128), invisibile a questa scala. La seconda barra ingrandisce un blocco: due terzi sono la piccola rete interna (131.072), un terzo l'attenzione (65.536), e le due normalizzazioni (256) di nuovo invisibili.Il modello intero · 814.592 parametriblocco 1blocco 2blocco 3blocco 4le posizioni della finestra · 16.384il vocabolario · 10.624la normalizzazione finale · 128, invisibile a questa scalaDentro un blocco, ingrandito · 196.864 parametrila piccola rete internal'attenzione131.07265.536le due normalizzazioni · 256, di nuovo invisibili
La lunghezza di ogni segmento è proporzionale al numero di parametri. Quasi tutto il modello sta nei quattro blocchi; dentro un blocco, due terzi dei numeri sono la rete interna e un terzo l'attenzione. Le normalizzazioni esistono ma a questa scala non si vedono: pesano davvero così poco.

Ogni carattere che vedete nascere è passato per tutti e quattro i blocchi, e ha fatto lavorare tutti questi numeri.

Un ultimo pezzo non si vede ma si sente: la cache di chiavi e valori - in letteratura KV cache, da key e value - la memoria di lavoro dell'attenzione. Non è un'astuzia di questa pagina: è un componente di serie di ogni motore che fa dialogare con i modelli. Senza, a ogni carattere nuovo il modello rifarebbe da capo i conti su tutto il testo che ha davanti, e ogni carattere costerebbe più del precedente. Con la cache, ogni blocco conserva gli appunti già presi sui caratteri letti: quando ne arriva uno nuovo, i conti si fanno solo su di lui, e gli appunti si allungano di una riga. È il motivo per cui la pagina risponde in un lampo anche su un telefono, ed è la stessa tecnica che nei modelli grandi regge le conversazioni lunghe. Attenzione però a non confonderla coi pesi: i pesi sono il modello - il file da 0,8 MB, che durante la generazione non cambia mai - mentre la cache appartiene al motore che li fa lavorare (qui, il JavaScript di questa pagina): nasce vuota quando si comincia e si butta quando si ricomincia. Nella serie la cache avrà il suo pezzo.

La cache di chiavi e valori all'arrivo del carattere numero 86Due barre a confronto nello stesso istante: il testo ha 85 caratteri e ne arriva uno nuovo. Senza cache, la barra è colorata per intero: i conti si rifanno sui primi 85 caratteri più il nuovo, 86 conti in questo passo. Con la cache, il colore c'è solo sul carattere nuovo: gli 85 sono appunti conservati che si rileggono senza rifarli, 1 conto. Sotto: gli appunti si allungano di una riga, da 85 a 86.Senza cache · arriva il carattere numero 86i primi 85 caratteri: conti rifatti da capoconti in questo passo: 86Con la cache · arriva lo stesso caratterei primi 85 caratteri: appunti conservati, si rileggono e bastaconti in questo passo: 1e gli appunti si allungano di una riga: da 85 a 86
Lo stesso istante, con e senza cache: il testo ha 85 caratteri e ne arriva uno nuovo. Il colore segna i conti fatti in questo passo: sopra, senza cache, la barra è colorata per intero perché il modello rifà i conti su tutti: 86. Sotto, con la cache, il colore acceso è solo sul carattere nuovo: gli appunti si rileggono senza rifarli, e il conto è uno. Il risparmio si ripete a ogni carattere: è la differenza fra una pagina che arranca e una che risponde.

Resta la domanda che questo giocattolo rende inevitabile: come si passa da qui a una chat che risponde a tono? Non cambiando il meccanismo - anche ChatGPT genera un pezzetto di testo alla volta, pescando fra i più probabili. Cambiano due cose:

Quando scrivete in una chat, il sistema appende il vostro messaggio a un copione con i turni segnati e chiede al modello di continuarlo: la risposta a tono è il completamento più probabile di quel copione. Il gesto, dunque, è lo stesso che avete davanti - un carattere probabile alla volta. Ma se sia soltanto statistica è oggi un dibattito aperto: quello che cresce con la scala non è il gesto, è ciò che il modello arriva a calcolare dentro quel gesto, fra un blocco e l'altro - lo stesso lavoro che la radiografia qui sopra mostra in miniatura. Alcuni vi riconoscono solo probabilità molto raffinate; altri, una forma di pensiero che si costruisce negli strati intermedi e si esprime nell'ultimo. La serie di articoli ci torna, con le prove di entrambe le parti.

Il modello è un GPT in miniatura addestrato con nanoGPT sul testo della Commedia (dominio pubblico): stessa architettura dei modelli grandi - attenzione, blocchi, generazione un frammento alla volta: qui un carattere, nei grandi un pezzo di parola chiamato token - ridotta di un fattore un milione. La serie di articoli che lo accompagna, a partire dalle origini del machine learning, racconta ogni pezzo di quello che state vedendo.

Fonti