Vai al contenuto
Capitolo 05 · 13 min

Transformer e attention

Il transformer è l'architettura che alimenta ogni LLM di punta. Il suo trucco centrale (l'auto-attention) è ciò che permette a un modello di decidere, per ogni parola, quali altre parole della frase contano. Una volta che lo capisci, il resto del campo va a posto.

The round-table metaphorSeven tokens arranged in a circle. Each is connected to every other token with thin lines of varying intensity. One token (the focus) has thicker, accent-coloured lines showing it "attends" more strongly to some neighbours than others.

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.

Self-attention on the sentence "The trophy didn't fit because it was too big"The pronoun "it" is highlighted. Curved lines connect it to every other token in the sentence. The lines are thick and accent-coloured for the tokens it attends to most: "trophy" gets the strongest weight, and thin for the rest.ATTENTION FROM “IT”Thetrophydidn'tfitbecauseitwastoobig← “it” resolves to “trophy”
Guardando «era», l'attention mette la maggior parte del suo peso su «trofeo»: il modello ha imparato a cosa si riferisce il pronome.

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.

Self-attention QKV flowQ (query) and K (key) are combined by a dot product, divided by the square root of d, passed through softmax to produce attention weights, then multiplied by V (value) to produce the attention output.QK·DOT/ √dsoftmaxweights× Vattentionsoftmax(Q · Kᵀ / √d) · V
La formula fondamentale dietro ogni LLM moderno, sotto forma di dimensioni: la query incontra la key, scalatura, softmax, pesatura dei value.

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
One transformer blockA vertical stack: layer norm, multi-head attention, residual add, layer norm, feed-forward, residual add. Two curved residual arrows skip from the input around the attention and the feed-forward layers and merge back into the main path.LayerNormMulti-head attentionevery token looks around+LayerNormFeed-forwardprivate per-token network+residualINPUTOUTPUT (TO NEXT BLOCK)
Le linee arancioni di salto sono i residui. Impila da 30 a 120 di questi blocchi e hai un LLM.

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.

Causal attention maskA square grid where rows are query tokens and columns are key tokens. Cells on or below the diagonal are filled: each token may attend to itself and to earlier tokens. Cells above the diagonal are blank, and the model is forbidden from looking ahead.t1t1t2t2t3t3t4t4t5t5t6t6QUERY ↓KEY →nopeekingahead
Le righe sono le query (il token che guarda); le colonne sono le key. La maschera azzera il triangolo superiore: nessun token può prestare attenzione a un token futuro.

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.