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 gia visto:

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

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

E il ruolo dell'attenzione.

Perche esiste l'attenzione

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

Problema: questo stato nascosto e un collo di bottiglia. Tutto deve passare da li. Man mano che la frase si allunga, le informazioni vecchie si diluiscono. E l'apprendimento e 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 piu ricorrenza. Ogni token guarda direttamente tutti gli altri, in parallelo.

E 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 e (il vettore Key).
  3. Il token confronta la sua domanda con ogni etichetta: dove c'e corrispondenza, recupera un po' di contenuto (il vettore Value).

Il risultato: una nuova rappresentazione per ogni token, che e 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 cio 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 cio che il modello aggiusta, a colpi di gradiente, perche le buone "domande" trovino le buone "etichette".

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

Piu domande alla volta

Un solo insieme di domande non basta. Un token puo 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 se 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 puo 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 piu forte va a gatto. Il verbo ha "trovato" il suo soggetto.
  • Su Coreferenza con la head "Coreferenza", guarda la riga lui. Il peso piu forte risale a bambino. E esattamente il meccanismo che risolve l'enigma del pronome.
  • Su qualunque head, guarda il triangolo in alto a destra: e grigio. E la maschera causale — un token puo guardare solo i token che lo precedono. E cio 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. E cio 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. E 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. E 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.

E per questo che le finestre di contesto erano limitate a 2.048 token in GPT-2, a 8.192 token in GPT-3.5, e che sono serviti trucchi algoritmici (FlashAttention, sliding window, sparse attention) per arrivare ai 200.000 token di oggi. Torniamo su queste tecniche al capitolo 18, dove sono legate alla memoria del KV cache.

L'attenzione e potente; e 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. E l'architettura Transformer completa: il tema del prossimo capitolo.

Aggiornato il

Attention: il meccanismo che cambia tutto · Step by Token