“Una sala riunioni dove ogni parola decide a quali altre parole prestare orecchio.”
Il problema che l'attention risolve
Prendi la frase: «Il trofeo non entrava nella valigia marrone perché era troppo grande.» A cosa si riferisce «era»? Ovviamente al trofeo. Ribaltala: «…perché era troppo piccola.» Ora «era» si riferisce alla valigia. Per risolvere quel pronome, devi guardare il resto della frase e decidere cosa conta.
Le architetture precedenti (RNN, LSTM) elaboravano il testo da sinistra a destra, una parola alla volta, sperando che il contesto rilevante sopravvivesse in uno stato nascosto fino all'arrivo del pronome. Erano lente, difficili da addestrare e spesso dimenticavano. Il transformer (2017) ha detto: dimentica la sinistra-destra. Lascia che ogni parola guardi ogni altra parola, *nello stesso momento*, e decida cosa pesare. Questa è l'attention.
L'auto-attention, concettualmente
Ogni token gioca tre ruoli incarnati da tre vettori derivati dal suo embedding: una query («cosa sto cercando?»), una key («a cosa corrispondo?») e un value («cosa contribuisco se mi si trova?»).
Per un dato token, confronta la sua query con la key di ogni altro token (un prodotto scalare dà un punteggio di similarità). Applica la softmax a quei punteggi per ottenere una distribuzione di probabilità su tutti i token. Ora somma il value di ogni token, pesato dal suo punteggio. Il risultato è una nuova rappresentazione per questo token, mescolata a partire dalle parti della frase che ha giudicato rilevanti.
Fai questo per ogni token in parallelo. Tutto lo strato è una grande moltiplicazione tra matrici. Lo strato intero gira su una GPU in pochi millisecondi anche per migliaia di token.
Teste multiple, conversazioni multiple
Uno strato di attention impara un solo «modo di guardare». Ma una frase ha simultaneamente molte strutture: sintattica, semantica, coreferenza, sentiment. I transformer eseguono quindi l'attention in parallelo più volte per strato (le «teste»), ciascuna con le proprie proiezioni Q/K/V apprese. Una testa può seguire «qual è il soggetto di questo verbo?» Un'altra può seguire «a cosa si riferisce questo pronome?» Un'altra ancora può seguire «è una domanda?»
La maggior parte dei transformer di produzione ha tra 16 e 128 teste di attention per strato, e tra 30 e 120 strati impilati uno sull'altro. La quantità totale di «sguardi all'intorno» che il modello compie per un singolo token è sbalorditiva.
Il blocco transformer completo
Un transformer è una pila di blocchi identici. Ogni blocco fa due cose:
- Strato di auto-attention: ogni token presta attenzione a ogni altro token e aggiorna la sua rappresentazione.
- Strato feed-forward: la rappresentazione di ogni token passa attraverso una piccola rete neurale privata (la stessa rete per ogni token, applicata indipendentemente). È qui che risiede la maggior parte delle «conoscenze» grezze del modello, in termini di parametri.
Entrambi gli strati hanno connessioni residue (l'input viene aggiunto all'output) e un passo di normalizzazione. La connessione residua è ciò che permette di impilare 100 strati e più senza che il segnale si degradi. Senza di essa, i transformer profondi non si addestrano.
# one transformer block, conceptually
def block(x):
x = x + multi_head_attention(layer_norm(x))
x = x + feed_forward(layer_norm(x))
return x
Da dove entra la posizione?
L'attention di per sé è invariante per permutazione. Non sa quale parola sia venuta prima. Le frasi chiaramente si curano dell'ordine («il cane morde l'uomo» contro «l'uomo morde il cane»). I transformer aggiungono quindi una codifica posizionale all'embedding di ogni token in ingresso. O uno schema sinusoidale fisso (articolo originale del 2017) o, più di recente, embedding posizionali rotatori appresi (RoPE). Il modello impara a usare quel segnale per codificare l'ordine.
Il mascheramento causale: renderlo un modello di linguaggio
Un modello di linguaggio prevede il prossimo token a partire dai token precedenti. Quando calcola l'attention per il token *t*, non deve essere autorizzato a vedere i token *t+1, t+2…*: sarebbe barare. La correzione è una maschera causale: azzerare i punteggi di attention da ogni token verso tutti i token futuri. Il modello è costretto a prevedere solo dal passato.
Questa è la differenza tra i modelli della famiglia GPT (causali, solo decoder) e i modelli della famiglia BERT (bidirezionali, solo encoder, senza maschera). GPT genera testo; BERT comprende testo. La maggior parte degli LLM moderni è solo decoder, perché generare si rivela includere comprendere.
Perché scala così bene
Ogni token che presta attenzione a ogni altro token è O(n²) rispetto alla lunghezza della sequenza. Per n=4000 token sono 16 milioni di prodotti scalari per testa per strato. Tanti, ma banalmente parallelizzabili su una GPU. Lo schema di calcolo del transformer (massicce moltiplicazioni tra matrici) è esattamente ciò per cui gli acceleratori moderni sono costruiti. Ecco perché assorbe bene il calcolo e perché le leggi di scala continuano a reggere.
Il costo quadratico è anche il motivo per cui le finestre di contesto sono difficili da ingrandire. La maggior parte dello sforzo ingegneristico dietro i modelli a «contesto da 1 M di token» va in approssimazioni ingegnose: attention sparsa, finestre scorrevoli, KV cache, varianti ad attention lineare.
Una riga per ciascuno
- L'auto-attention permette a ogni token di decidere quali altri token gli interessano, in parallelo, in un'unica passata.
- L'attention multi-testa esegue molti «modi di guardare» in parallelo; gli strati feed-forward immagazzinano la maggior parte delle conoscenze grezze.
- Le connessioni residue e la normalizzazione di strato sono ciò che rende addestrabili i transformer da 100 strati e più.
- La posizione è iniettata separatamente perché l'attention da sola non ha alcuna nozione di ordine; la KV cache è ciò che rende economica la generazione.
Dove andare ora