Capitolo 04 · Attenzione · 12 min

L'attenzione è tutto ciò che ti serve

Il meccanismo che cambia tutto. Come ogni token guarda tutti gli altri per capire il contesto.

Il pronome e il medico

Torniamo un attimo a questa frase, che abbiamo già visto:

"Il medico ha rimandato l'infermiera a casa sua perché lei…"

Per un umano, "lei" si collega naturalmente a l'infermiera. Per un LLM non è ovvio: nel momento in cui tratta il token lei, la parola infermiera è otto posizioni indietro. Come fa a collegarle?

È il ruolo dell'attenzione.

Perché esiste l'attenzione

Prima del 2017, i modelli linguistici erano per lo più ricorrenti (RNN, LSTM): leggevano il testo token per token, propagando uno "stato nascosto" che riassumeva tutto ciò che avevano visto fino a quel momento.

Problema: questo stato nascosto è un collo di bottiglia. Tutto deve passare da lì. Man mano che la frase si allunga, le informazioni vecchie si diluiscono. E l'apprendimento è sequenziale: per trattare la centesima parola bisogna aver trattato le 99 precedenti, cosa che rende difficile la parallelizzazione.

Il paper Attention Is All You Need (Vaswani et al., 2017) propone una rottura:

Niente più ricorrenza. Ogni token guarda direttamente tutti gli altri, in parallelo.

È il meccanismo che rende possibili i modelli moderni.

L'intuizione

A ogni layer del modello, ogni token compie tre operazioni:

  1. Pone una domanda al resto della frase (il vettore Query).
  2. Ogni altro token mostra un'etichetta che riassume cosa è (il vettore Key).
  3. Il token confronta la sua domanda con ogni etichetta: dove c'è corrispondenza, recupera un po' di contenuto (il vettore Value).

Il risultato: una nuova rappresentazione per ogni token, che è una somma pesata degli altri, dove i pesi vengono dalle corrispondenze Q-K.

Attention(Q, K, V) = softmax(QKT / √dk) · V

Non serve ricordare la formula: tieni l'idea. Ogni token guarda tutti gli altri e mescola ciò che trova interessante.

Da dove escono Q, K e V esattamente?

Non dal nulla. Per ogni token, prendiamo il suo vettore di embedding x e lo moltiplichiamo per tre matrici apprese durante l'addestramento:

Q = x · W_Q
K = x · W_K
V = x · W_V

Queste tre matrici W_Q, W_K, W_V sono i parametri dell'attenzione. Sono le stesse per tutti i token di uno stesso layer — sono ciò che il modello aggiusta, a colpi di gradiente, perché le buone "domande" trovino le buone "etichette".

Il fattore √d_k nella formula serve a evitare che i prodotti scalari esplodano quando la dimensione è grande. Senza di esso, i valori prima del softmax diventano enormi, il softmax satura e il gradiente muore. Dettaglio tecnico ma necessario.

Più domande alla volta

Un solo insieme di domande non basta. Un token può dover guardare il suo soggetto sintattico e la sua coreferenza e il verbo principale allo stesso tempo.

Da qui la multi-head attention: invece di un solo sistema Q-K-V, ne facciamo girare diversi in parallelo (tipicamente 8, 16, 32). Ognuno impara a specializzarsi in un tipo di relazione. Quando osserviamo un modello addestrato, scopriamo heads dedicati a:

  • l'attenzione locale (ogni token guarda sé stesso o i vicini immediati)
  • il legame soggetto-verbo
  • le coreferenze (pronomi verso il loro referente)
  • i delimitatori (punteggiatura, inizio/fine frase)
  • la rima o la struttura poetica
  • cose che non sappiamo nominare

Manipola

La visualizzazione qui sotto mostra, su due frasi, a cosa può assomigliare l'attenzione di diversi heads. I pattern sono stilizzati (i veri pesi vengono da un modello addestrato), ma ogni head corrisponde a un comportamento realmente osservato nei modelli attuali.

Ogni riga mostra come un token guarda tutti gli altri. Alcuni head seguono la sintassi (soggetto ↔ verbo), altri colgono la semantica (referenti, antecedenti). Nessuno di questi pattern è programmato a mano — emergono dal training.

Tre cose da provare:

  • Su Il gatto dorme con la head "Soggetto ↔ verbo", guarda la riga dorme. Il peso più forte va a gatto. Il verbo ha "trovato" il suo soggetto.
  • Su Coreferenza con la head "Coreferenza", guarda la riga lui. Il peso più forte risale a bambino. È esattamente il meccanismo che risolve l'enigma del pronome.
  • Su qualunque head, guarda il triangolo in alto a destra: è grigio. È la maschera causale — un token può guardare solo i token che lo precedono. È ciò che costringe il modello a predire, non a copiare.

Causale o bidirezionale?

Non tutte le attenzioni sono uguali. Esistono due regimi.

Bidirezionale. Ogni token vede tutti gli altri, sia all'indietro che in avanti. È ciò che usano BERT (Google, 2018) o gli encoder di T5. Questi modelli eccellono nel capire una frase — classificazione, question-answering estrattivo, ricerca semantica — ma non generano testo token per token.

Causale. Ogni token vede solo i precedenti. È la maschera triangolare osservata sopra. Questo vincolo rende possibile la generazione autoregressiva: per produrre la parola successiva, il modello deve poter predire a partire dal solo passato.

GPT, Claude, Llama, Gemini, Mistral — tutti gli LLM consumer sono modelli ad attenzione causale. È questa maschera che li rende capaci di predire, non solo di descrivere.

L'attenzione costa

Questa eleganza ha un prezzo. Per una sequenza di lunghezza n, calcolare la matrice di attenzione richiede O(n²) operazioni. Raddoppiare la dimensione del contesto quadruplica il costo.

È per questo che le prime finestre di contesto erano così strette: 1.024 token per GPT-2 (2019), 2.048 per GPT-3 (2020), 4.096 per GPT-3.5 (2022). Per uscirne sono servite due famiglie di tecniche: ottimizzazioni di memoria come FlashAttention, che non cambia nulla dell'O(n²) ma lo rende praticabile riorganizzando gli accessi alla GPU, e approssimazioni come lo sliding window o la sparse attention, che rinunciano a guardare tutti i token. I modelli attuali reggono comunemente il milione di token, e alcuni ne annunciano di più. Torniamo su queste tecniche al capitolo 18, dove sono legate alla memoria del KV cache.

L'attenzione è potente; è anche il principale collo di bottiglia degli LLM moderni.

Il seguito

L'attenzione da sola non fa un modello linguistico. Bisogna impilarla in blocchi successivi, aggiungere layer di calcolo "feed-forward", normalizzazioni, connessioni residuali. È l'architettura Transformer completa: il tema del prossimo capitolo.

Aggiornato il