Questo articolo fa parte di una serie di approfondimenti sull’AI — il link conduce a un indice aggiornato. Allo stesso tempo fa parte di una trilogia dedicata al Transformer:
- Transformer 1: il cavallo di battaglia dell’AI
Un’introduzione moderatamente tecnica - Transformer 2: Genesi e idea
Giusto la storia, facile da leggere - Transformer 3: Come funziona? (questo articolo)
Un tentativo di guardare dentro al Transformer, per i più curiosi
Alla fine dell’articolo proponiamo un’ottima demo interattiva sul funzionamento del Transformer sviluppata da un gruppo di ricercatori del Georgia Institute of Technology 1. Sono debitore di Marco Cerrone per questa risorsa.

Ricolleghiamoci al primo articolo Transformer 1: il cavallo di battaglia dell’AI 2 da cui riprendiamo lo schema sintetico del processo di generazione

- Nel nostro esempio il processo parte da una frase composta da tre parole scritte in formato testo: “AI is cool”. Formato testo codificato nel modo usuale, per esempio con la codifica ASCII o Unicode. Niente di nuovo: sequenze di bit invece di simboli grafici.
- Le parole vengono trasformate in token mediante il processo di tokenization. Questi corrispondono a parole o parti di esse. Abbiamo visto le motivazioni: i token sono gli atomi sui cui lavorano questi algoritmi, per tale motivo li abbiamo incasellati. Ogni modello dispone di un vocabolario fisso; in GPT-4 il vocabolario consta di 250’400 token. Fin qui la codifica non cambia, è la stessa di quella usata per le parole.
- I token vengono trasformati in vettori nello spazio semantico mediante il processo di embedding. Abbiamo cercato di farcene un’idea quando ci siamo domandati cosa succeda alle parole nell’A. Nel caso di GPT-4 ogni token diventa un vettore composto da 16’384 componenti (coordinate, pensando all’esempio di un punto nel piano o nello spazio). Abbiamo visto come grazie a molteplici dimensioni si possa tener conto delle diverse affinità che una parola può avere con altre parole. Le parentesi quadre stanno a ricordarci che si tratta appunto di vettori e non delle loro rappresentazioni simboliche in lettere.
- Il transformer opera sulla sequenza di vettori così ottenuta — tre in questo esempio ma in realtà possono essere molti di più. In GPT-4 la lunghezza massima delle sequenze elaborate è di 4096 token. In questo articolo proviamo ad “aprire” il Transformer, nel limite del possibile, ma prima può essere utile fare una digressione che ci aiuti a visualizzare mentalmente le distribuzioni di token negli spazi semantici. Chi la vuole saltare può andare direttamente al Transformer uno e trino.
Rigirarsi il pezzo fra le mani
Nell’articolo Che succede alle parole nell’AI? abbiamo mostrato come gli spazi semantici siano caratterizzati da un numero di dimensioni molto elevato perché questo consente di rappresentare meglio relazioni semantiche fra token. È impossibile immaginarsi uno spazio del genere — abbiamo visto che GPT-4 lavora con 16384 dimensioni… — ma possiamo intuire qualcosa con degli esempi in tre sole dimensioni.

Questo grafico rappresenta i token di un testo nello spazio tridimensionale. In uno spazio del genere ogni punto è identificato da tre coordinate x, y e z. Dall’immagine si ricava l’impressione che i token siano raggruppati in una sorta di nuvola ma è difficile farsi un’idea della forma disponendo di un solo punto di vista e verrebbe voglia di girarci intorno per capire che forma abbia. Proviamo allora a cambiare il punto di vista, ruotando l’intero oggetto in tre diverse orientazioni.



Si vede come guardando l’oggetto da punti di vista diversi si mettano meglio in evidenza le caratteristiche dell’oggetto. Si vede qui come i punti occupino uno spazio grosso modo elissoidale con l’asse maggiore lungo Z, l’asse minore lungo X e quello intermedio lungo Y.
Vediamo un caso un po’ più articolato:

Cos’è cambiato rispetto alla Fig. 2? Forse è la stessa nuvola elissoidale ma con più punti al centro? Difficile dire. Procediamo come prima, girando intorno.



Scopriamo così che vi sono due gruppi di punti, uno simile al precedente e uno più piccolo e un po’ spostato, che si vede particolarmente bene nella figura c) a destra. Una situazione che non poteva essere percepita nella proiezione in Fig. 4.
Il transformer uno e trino
Il Transformer agisce sui vettori in input [AI], [is] e [cool] (passo 3 della Fig. 1) per ottenere rappresentazioni “ruotate” dei vettori 3, che indichiamo usando il corsivo [AI], [is] e [cool] (passo 5 della Fig. 1), per distinguerle da quelle in input. I vettori trasformati sono calcolati in modo da facilitare la scelta del prossimo token. Il processo che si svolge nel Transformer (passo 4 della Fig. 1) consta di tre fasi 4: 1) calcolo delle proiezioni Query, Key e Value dei vettori in input, 2) calcolo della matrice di attenzione, 3) calcolo dei vettori in output.
Proiezioni Query, Key e Value dei vettori input
Il Transformer, ogni volta che deve scegliere il prossimo token si “rigira in mano” il testo (vettore) di cui dispone sino a quel momento, valutando l’attenzione di ciascun token per tutti gli altri contenuti nel brano — da qui il concetto di self-attention, in altri termini l’attinenza di ciascuna parola con tutte le altre presenti nel testo. E lo fa, per così dire con una sorta di debate o di gioco delle parti.
Ma come fare a scindere l’uno nelle parti? Chi è l’uno?
L’uno è il testo disponibile.
E le parti? Queste sono tre versioni trasformate (ruotate) del vettore in input, che corrispondono a tre diverse rappresentazioni dei token usate nel modo seguente: il Transformer prende ogni token (nella versione Query) e va a vedere quanto è affine (“attento”) a ciascun altro token (nella versione Key). L’insieme di questi valori di affinità (attention) per tutte le coppie di token costituisce la matrice di attenzione (attention matrix). Infine, ad ogni token del tipo Value, viene assegnato un peso dedotto dall’attention matrix per tenere conto dell’influenza di tutti gli altri token.
Si può immaginare che ciascuna delle tre versioni sia un modo diverso di vedere la stessa nuvola di punti in maniera ottimizzata per interpretare i tre ruoli.
Vediamo il processo un po’ più in dettaglio.

Il lettore attento si domanderà come vengano determinati i proiettori Query, Key e Value. Nella Nota su alcuni termini che compaiono parlando di AI: vettori e matrici avevamo visto come un vettore possa essere trasformato mediante una matrice e come tale trasformazione si svolga attraverso somme di prodotti fra gli elementi di ciascuna riga della matrice di trasformazione e quelli del vettore da trasformare. Ebbene, i nostri proiettori non sono altro che matrici di questo genere. La domanda quindi è: come vengono determinati gli elementi di tali matrici? La risposta disorienta un poco il ricercatore del secolo scorso, uso a lavorare con catene di rapporti causa effetto:
Gli elementi dei proiettori Query, Key e Value sono determinati esclusivamente attraverso l’addestramento e senza il ricorso ad alcun altro tipo di conoscenza.
I numeri delle matrici che esprimono le proiezioni Query, Key e Value fanno dunque parte dei parametri del modello che vengono detreminati attraverso l’addestramento su immense raccolte di dati, buona parte di ciò che è raggiungibile in Internet. Si tratta di svariate centinaia di miliardi di parametri, ad esempio 1’800 miliardi per ChatGPT e 600 miliardi per DeepSeek, valutati con lunghi processi iterativi di correzioni successive su insiemi di decine di migliaia di miliardi di parole. Pare impossibile ma funziona (a modo suo). In altri tempi sarebbe sembrato un atto di fede! Ma andiamo avanti.
Calcolo della matrice di attenzione
Il passo successivo consiste nel calcolo della matrice di attenzione che esprime l’attenzione di ciascun token per tutti gli altri.

L’elemento a12, dato da
a12 = q11k21 + q12k22 + q13k23 + q14k24 + q15k25
è quindi una sorta di prodotto fra il token [AI]Q e il token [is]K. Non è la prima volta che troviamo l’idea di prodotto fra token. Ci è già capitato nell’articolo Che succede alle parole nell’AI? dove avevamo accennato alla valutazione delle affinità fra token attraverso il prodotto scalare dei rispettivi vettori nello spazio semantico. Ebbene, l’equazione non è altro che il prodotto scalare nel linguaggio dell’algebra lineare fra i token [AI]Q e [is]K; precisamente fra i vettori {q11, q12, q13, q14, q15} e {k21, k22, k23, k24, k25}. È con tali prodotti scalari che il transformer valuta le relazioni di attenzione fra token, che noi invece percepiamo come relazioni semantiche. Gli elementi della matrice di attenzione esprimono quindi tutti valori di attenzione fra tutte le possibili coppie di parole presenti nel testo in input.
Calcolo dei vettori in output
Per calcolare la matrice di attenzione abbiamo utilizzato le versioni Query e Key dei vettori in ingresso. Ci rimane ora da completare la trasformazione mediante la moltiplicazione della matrice di attenzione per i vettori Value:

I vettori trasformati [AI], [is] e [cool] rappresentano sempre gli stessi token ma espressi in una forma adatta al calcolo delle probabilità da assegnare ai token presenti nel vocabolario. In sostanza, gli elementi dei vettori trasformati, z11, z12 ecc., sono una media pesata dei vettori Value dove i pesi sono dati dai valori di attenzione.
Assegnazione delle probabilità e scelta del prossimo token
Il passaggio dai vettori trasformati alla distribuzione delle probabilità è realizzato mediante una rete neurale semplice. La figura seguente mostra gli ultimi tre passaggi del processo intero che abbiamo visto nella Fig.1.

Per avere un’idea dei numeri in gioco, se il modello utilizzato per il nostro esempio fosse GPT-4, la rete feed-forward (diciamo rete neurale convenzionale) nel passo 6 assegnerebbe un peso a ciascuno dei 250’400 token del vocabolario, a partire dai tre vettori trasformati, ciascuno costituito da 16384 componenti.
A questo punto il gioco sembra fatto ma in realtà proprio qui viene il bello. Se l’algoritmo scegliesse semplicemente il token con la probabilità più alta verrebbe meno la qualità generativa del modello e l’intelligenza apparirebbe molto meno intelligente. In realtà la scelta viene fatta in modo casuale entro un gruppo di token più probabili. In un articolo precedente (Alla ricerca dell’intelligenza… con una manopola o due…) abbiamo descritto come viene gestita la scelta casuale attraverso l’aggiustamento empirico della temperatura e di altri parametri. Nella sezione successiva possiamo toccare con mano il meccanismo di controllo della temperatura e altri aspetti del Transformer.
Per chi non si accontenta… una super demo!
La trattazione che offriamo in questi articoli è molto semplificata ed è limitata agli elementi essenziali che servono a comprendere i meccanismi fondamentali che alimentano gli LLM. In realtà ci sono una quantità di accorgimenti apparentemente minori ma che, nel loro insieme, sono indispensabili per produrre le incredibili prestazioni a cui siamo abituati. Avremmo potuto includere una descrizione accessibile di una buona parte di essi ma avremmo corso il rischio di perdere la visione d’insieme.
Un gruppo di ricercatori del Georgia Institute of Technology ha realizzato il Transformer Explainer, uno strumento interattivo per giocare con il funzionamento del Transformer. La demo utilizza una versione del modello GPT-2 che gira interamente nel browser dell’utente 6. L’Explainer contiene più informazioni rispetto a quello che abbiamo scritto qui. Può quindi essere utilizzato per approfondire altri dettagli del modello oppure per riflettere ulteriormente su quanto scritto fino ad ora. Qui di seguito commentiamo gli elementi che possono essere riferiti a quanto discusso.

A) Questa è la casella per inserire un testo iniziale. Il sistema consente di selezionare uno fra cinque incipit preconfezionati ma si può anche inserire qualcosa di nostro. Molto divertente proporre parole italiane per vedere come si comporta. In questo caso abbiamo provato l’esempio utilizzato nell’articolo: AI is cool. Appena si preme il tasto (B) Generate propone il prossimo token: AI is cool but.
B) Il tasto Generate consente di lanciare il Transformer per individuare il prossimo token.
C) A sinistra sono elencati i token utilizzati ad ogni passo. Qui abbiamo i nostri primi tre token.
La grafica è sensibile al passaggio del mouse che in certe posizioni mostra varie informazioni e approfondimenti. Qui vediamo la prima elaborazione (embedding) cui va incontro il token AI, da parola composta da due lettere in un vettore di 768 elementi, che è la dimensione dello spazio semantico in GPT-2. In GPT-4 sarebbe 16’384.
D) Il flusso si divide in tre rami per generare le tre versioni Query, Key e Value dei token. Due di questi, Query e Key, confluiscono nella produzione della matrice di attenzione.
E) Qui si mostra la matrice di attenzione che è costituita da 3 x 3 elementi perché tre sono i token su cui operare a questo passo. Ad ogni passo la matrice cresce di una riga e una colonna, quindi al prossimo avrà 4 x 4 elementi. Passando con il mouse su un qualsiasi elemento viene mostrato il corrispondente valore di attenzione. Cliccando sulla matrice si apre una grafica secondaria che mostra dinamicamente i passi dettagliati con cui vengono “ripuliti” e normalizzati i dati. Questi sono alcuni degli aspetti che abbiamo omesso dalla nostra descrizione.
F ) L’applicazione della matrice di attenzione ai vettori Value produce la versione finale dei token, idonea al proseguimento della frase. Si tratta sempre di vettori costituiti d 768 dimensioni ma hanno ovviamente componenti diverse lungo ciascuna dimensioni, sono cioè vettori “ruotati”.
G) Questa sezione mostra la distribuzione delle probabilità assegnate ai token di tutto il vocabolario. I token sono ordinati dall’alto al basso per valori decrescenti di probabilità e la figura mostra i primi 14 elementi, dove si deve tenere presente che gli elementi sono molti di più: 50’000 in questo piccolo modello (GPT-2) e oltre 250’000 in GPT-4. La distribuzione dipende dal valore della temperatura 7. I valori rappresentano la probabilità di essere il prossimo token nella frase. Trattandosi di probabilità, i valori sono normalizzati di modo che la somma totale sia pari ad uno. Da questa distribuzione si capisce che, considerato che il vocabolario di GPT-2 consta di circa 50’000 voci , la gran parte delle probabilità è molto piccola. In questo esempio la grafica mostra che i cinque token più probabili, “,“, “.“, “and“, “but“, “!“, hanno probabilità 30.76
H) Questo elemento è lo slider che permette di controllare il valore della temperatura. Si possono selezionare valori compresi fra 0.2 e 10. La figura sotto mostra le distribuzioni che si ottengono con T = 0.2, T = 1 e T = 10 rispettivamente. È chiaro come T abbia l’effetto di deformare la distribuzione di probabilità: quando è piccolo la distribuzione amplifica il peso dei primi token a discapito degli altri, rendendo più deterministico il modello; quando invece assume valori maggiori la distribuzione si appiattisce, rendendo più probabili anche token “strani”. Qui si chiude per il momento l’approfondimento sul Transformer che probabilmente accontenta pochi: molti dei meno esperti si ritroveranno confusi mentre chi ne sa qualcosa troverà difetti che non siamo riusciti ad evitare nel tentativo di trovare la quadra. Se qualcuno ha idee per migliorare il testo mi scriva.
sudo apt update
sudo apt install nodejs
node -v
sudo apt install npm
npm install -g npm@11.0.0
nvm install v23.5.0
npm run dev
Poi aprire il browser Internet, andare in
http://localhost:5173
e attendere…
↩︎



3 pensieri riguardo “Transformer 3: Come funziona?”