Dai vettori alle relazioni: l'attenzione
Il pezzo sull’embedding ha lasciato ogni token in una condizione precisa: il vettore che entra nel primo blocco del modello sa quale voce del vocabolario rappresenta e in quale punto della sequenza si trova. Ma è ancora solo. Il vettore di pesca in «mangia una pesca» e in «oggi pesca dal molo» è lo stesso, e diventerà due rappresentazioni diverse soltanto quando il resto della frase potrà agire su di lui. Il meccanismo che lo permette si chiama attenzione, ed è il motivo per cui questa serie ha risalito la scala fin qui.
Questo pezzo risponde a quattro domande: da dove veniva il problema (dalle reti che leggevano un token alla volta), come funziona il meccanismo (domanda, chiave e valore, con la softmax già vista nel pezzo sulle reti multistrato), quali correzioni lo rendono usabile (la scala e la maschera causale), e perché ha vinto - insieme al prezzo, salato, che chiede in cambio.
La rete ricorrente comprime il passato in un vettore di stato
La rete ricorrente legge un token alla volta e comprime il passato in un vettore di stato: su sequenze lunghe i gradienti svaniscono, e quel vettore unico diventa un collo di bottiglia.
Prima dell’attenzione, il linguaggio si affrontava con la rete neurale ricorrente (RNN nel gergo). L’idea è naturale: la frase si legge come la leggiamo noi, un elemento alla volta, e la rete conserva in un gruppo di neuroni un vettore di stato che riassume tutto ciò che ha visto fino a quel punto. La rassegna di Nature già citata nei pezzi precedenti la descrive così: lo stato contiene, implicitamente, la storia di tutti gli elementi passati della sequenza.
La stessa rassegna registra i due guai. Il primo riguarda l’addestramento: una rete ricorrente srotolata nel tempo è una rete profondissima in cui tutti gli strati condividono gli stessi pesi, e i gradienti della retropropagazione crescono o si riducono a ogni passo - su molti passi, tipicamente esplodono o svaniscono. Imparare a conservare un’informazione per molto tempo è difficile; le reti LSTM, con una cella di memoria dedicata, furono il rimedio storico e ressero il campo per anni.
Il secondo guaio si vede meglio sulla traduzione automatica, che di questi modelli era il banco di prova. Lo schema si chiama codificatore-decodificatore (encoder-decoder): una rete ricorrente legge l’intera frase inglese e consegna il suo stato finale - un solo vettore - a una seconda rete, che da quel vettore genera la frase francese parola per parola. Tutto ciò che la frase di partenza aveva da dire deve passare per quel vettore, qualunque sia la sua lunghezza: dieci parole o sessanta, lo spazio è lo stesso.
L’attenzione nasce per la traduzione
Nel 2014 il decodificatore impara a cercare, a ogni parola, le parti utili della frase di partenza; nel 2017 il Transformer tiene l’attenzione e rinuncia alla ricorrenza.
Nel 2014, sul preprint, Dzmitry Bahdanau, Kyunghyun Cho e Yoshua Bengio chiamarono il difetto per nome: l’uso di un vettore a lunghezza fissa è un collo di bottiglia per l’architettura codificatore-decodificatore. La loro proposta: invece di comprimere tutto in un vettore, lasciare che il decodificatore, a ogni parola che genera, cerchi nella frase di partenza le parti rilevanti per quella parola. È il primo meccanismo di attenzione: un calcolo che assegna pesi alle posizioni della frase sorgente e costruisce, per ogni parola da generare, un riassunto su misura. Gli allineamenti che il modello imparava da solo - quale parola francese guarda quale parola inglese - concordavano con l’intuizione di un traduttore.
L’attenzione nacque dunque dentro una rete ricorrente, come protesi. Il passo successivo fu chiedersi se la protesi non fosse migliore dell’arto. Nel 2017 Ashish Vaswani e colleghi risposero con un’architettura, il Transformer, che della ricorrenza fa a meno del tutto; il titolo del lavoro è un manifesto: Attention Is All You Need, l’attenzione è tutto ciò che serve. Curiosamente, la rassegna di Nature l’aveva quasi predetto due anni prima: i sistemi che elaborano il linguaggio, scrivevano gli autori nel 2015, miglioreranno molto quando impareranno strategie per prestare attenzione selettivamente a una parte alla volta.
Quando ogni posizione di una sequenza interroga le altre posizioni della stessa sequenza, l’attenzione si chiama autoattenzione, la forma che ci accompagnerà da qui in avanti: quella dei modelli di linguaggio che generano testo, quella scritta nelle righe di nanoGPT.
Domanda, chiave e valore
Ogni posizione ricava dal proprio vettore una domanda, una chiave e un valore: i confronti fra domanda e chiavi, passati dalla softmax, decidono quanto ciascun valore entra nella nuova rappresentazione.
Il meccanismo si regge su tre proiezioni. Da ogni vettore in ingresso - quello che il pezzo precedente ha costruito sommando embedding del token ed embedding posizionale - il modello ricava tre vettori più piccoli, moltiplicando per tre matrici di pesi apprese. Sono la domanda, la chiave e il valore di quella posizione, e hanno ruoli diversi: la domanda è ciò che la posizione cerca nelle altre; la chiave è l’etichetta con cui la posizione si lascia trovare; il valore è il contenuto che la posizione consegna a chi la trova. I nomi inglesi - query, key, value - richiamano gli archivi e le basi di dati, e l’analogia è quella: si interroga uno schedario, le schede si trovano per etichetta, e ciò che si porta via è il contenuto.
Il conto procede in tre mosse. La domanda di una posizione si confronta con la chiave di ciascuna posizione accessibile: il confronto è un prodotto scalare, la somma dei prodotti componente per componente, e produce un punteggio - alto se domanda e chiave sono allineate, basso altrimenti. I punteggi passano poi dalla softmax, che il pezzo sulle reti multistrato ha già svolto: diventano pesi di attenzione, tutti positivi e con somma 1. Infine i valori delle posizioni si sommano, ciascuno moltiplicato per il suo peso: il risultato è la nuova rappresentazione della posizione che aveva fatto la domanda.
Sulla frase di casa il calcolo si può guardare per intero. In «il gatto morde il cane», la posizione di cane formula la sua domanda e la confronta con le cinque chiavi disponibili, la propria compresa. I due il non producono lo stesso punteggio: il token è identico, ma l’embedding posizionale li ha resi vettori diversi, quindi chiavi diverse. Supponiamo che i punteggi siano 0,2 per il primo il, 1,1 per gatto, 2,3 per morde, 0,4 per il secondo il, 0,9 per cane stesso. La softmax li trasforma nei pesi 0,07 · 0,17 · 0,55 · 0,08 · 0,13, che sommano a 1. Più di metà della nuova rappresentazione di cane arriva dal valore di morde, e un altro sesto da gatto: il vettore che esce dall’attenzione sa di essere il cane che viene morso, e sa da chi. È l’inizio della rappresentazione contestuale promessa dal pezzo precedente.
Il calcolo dei punteggi, da solo, non vede l’ordine: se i vettori in ingresso non portassero l’embedding posizionale del pezzo precedente, la frase sarebbe per l’attenzione un sacchetto di token, e «il gatto morde il cane» diventerebbe indistinguibile da «il cane morde il gatto». La posizione entra nel meccanismo perché sta già dentro i vettori che generano domande, chiavi e valori.
Questi pesi sono, del resto, i più guardabili di tutto il modello: le mappe di attenzione del piccolo GPT che accompagna questa serie accendono sul testo esattamente i numeri di questo calcolo, mentre il modello decide il prossimo carattere.
Potete rifare il conto della figura con le vostre frasi: scrivete una frase, cliccate una parola - quella farà la domanda - e vedete quanta attenzione dà alle altre. Per la frase di casa i numeri sono quelli dell’articolo; per le altre frasi sono una simulazione dichiarata, per mostrare la meccanica: il conto - prodotto scalare, softmax, somma pesata - è quello vero, i numeri no.
La scala dei punteggi e la maschera causale
I punteggi si dividono per la radice della dimensione delle chiavi, perché la softmax non si paralizzi; la maschera causale mette a meno infinito le posizioni future, perché il modello impari a generare un token alla volta.
Il meccanismo appena descritto ha bisogno di due correzioni, ed
entrambe stanno in una riga di codice. La prima è un fatto di scala.
Quando domande e chiavi hanno molte componenti, i prodotti scalari
tendono a crescere in valore assoluto, e punteggi molto grandi
spingono la softmax nella regione dove i suoi gradienti sono
piccolissimi: l’addestramento smette di correggere. Il rimedio proposto nel 2017 è dividere ogni punteggio per la radice quadrata della
dimensione delle chiavi: con chiavi di sessantaquattro numeri, si
divide per otto. In nanoGPT è il fattore
1.0 / math.sqrt(k.size(-1))
che accompagna il prodotto fra domande e chiavi.
La seconda correzione è la maschera causale, e discende dal
compito. Un modello che genera testo produce un token alla volta, e
durante l’addestramento impara predicendo, per ogni posizione della
frase, il token successivo. Se la posizione di morde potesse
consultare la chiave di cane, che nella frase viene dopo, il
compito sarebbe barato: la risposta è nel testo. La maschera
impedisce la scorciatoia ponendo a meno infinito, prima della
softmax, i punteggi verso le posizioni future: la softmax trasforma
meno infinito in peso zero, e il futuro semplicemente non partecipa
alla somma. In nanoGPT la maschera è una matrice triangolare
costruita con
torch.tril,
applicata col
masked_fill a -inf
nell’implementazione esplicita, o delegata al parametro is_causal
della versione veloce. Nell’esempio della figura la questione non si
poneva, ma solo perché cane è l’ultima posizione: per morde, i
pesi verso il secondo il e verso cane sarebbero azzerati.
Le teste multiple di attenzione
Più copie del meccanismo, ciascuna con le proprie proiezioni, guardano la stessa frase da sottospazi diversi; le uscite ricomposte fianco a fianco formano l’uscita del blocco.
Una frase intreccia relazioni di natura diversa: chi compie l’azione, a che cosa si riferisce un pronome, quale aggettivo accompagna quale nome. Un solo insieme di proiezioni produce un solo sistema di pesi, e un sistema solo fa una media che confonde. Per questo l’attenzione si replica: il blocco contiene più teste di attenzione, copie parallele del meccanismo, ciascuna con le proprie matrici di domanda, chiave e valore, ciascuna con vettori più corti. Gli autori del 2017 usano otto teste che lavorano su sessantaquattro componenti l’una, invece di una testa sola da cinquecentododici, e motivano la scelta così: il modello può prestare attenzione, insieme, a informazioni che vivono in sottospazi di rappresentazione diversi, in posizioni diverse. Gli autori osservano anche che le singole teste imparano chiaramente a svolgere compiti diversi, spesso legati alla struttura sintattica e semantica della frase.
In nanoGPT le teste non si vedono come moduli separati, e vale la pena
guardare il perché. Un’unica moltiplicazione,
c_attn,
produce in un colpo solo domande, chiavi e valori di tutte le teste; due
righe di rimodellamento
separano le teste,
ognuna fa il proprio conto da sola, e le uscite si
ricompongono una accanto all’altra
in un vettore della dimensione di partenza, che un’ultima proiezione
rimescola. Il GPT-2 di base, quello che nanoGPT riproduce, usa dodici
teste su una dimensione di settecentosessantotto: sessantaquattro
componenti a testa, la stessa aritmetica del lavoro originale.
Perché l’attenzione ha vinto
Fra due posizioni qualunque il percorso è un passo solo e l’addestramento procede in parallelo; in cambio ogni posizione si confronta con tutte le precedenti, e il conto cresce col quadrato della finestra.
Il confronto con la ricorrenza, a questo punto, si può fare con i numeri dell’articolo del 2017, che gli dedica una sezione. Il primo criterio è la lunghezza del percorso che l’informazione deve compiere. In una rete ricorrente, perché la prima parola di una frase di cento token influenzi l’ultima, il segnale attraversa cento aggiornamenti dello stato, e a ogni passo può diluirsi; gli autori osservano che più corti sono i percorsi fra due posizioni, più facile è imparare le dipendenze a lungo raggio. Nell’autoattenzione il percorso fra due posizioni qualunque è un passo: la domanda dell’una incontra la chiave dell’altra direttamente, in un solo passaggio. Le dipendenze lontane - il soggetto a inizio frase, il pronome tre capoversi dopo - smettono di essere le più fragili.
Il secondo criterio è il parallelismo. La ricorrenza è sequenziale per costruzione: lo stato del passo dieci non si può calcolare prima dello stato del passo nove. L’autoattenzione calcola tutti i punteggi di tutte le posizioni con poche moltiplicazioni di matrici, il mestiere in cui gli acceleratori di calcolo eccellono: in addestramento l’intera frase si elabora in una volta. È il motivo pratico per cui i modelli hanno potuto crescere di scala come i pezzi della serie agenti-ai hanno raccontato dal lato dei costi.
La vittoria ha un prezzo, e conviene dargli subito il nome che ritroveremo: il costo quadratico dell’attenzione. Ogni posizione si confronta con tutte quelle che la precedono, quindi i confronti crescono col quadrato della lunghezza: una finestra di mille token ne comporta un milione, una di centomila dieci miliardi. È il conto che sta dietro un fatto già misurato in questa serie dal lato economico: il contesto lungo si paga. Come i modelli riducano questo conto senza rinunciare al meccanismo - la cache di chiavi e valori, le attenzioni raggruppate - è materia del pezzo sulle evoluzioni.
Un’ultima nota, per tenere onesto il quadro. Il Transformer del 2017
rappresentava le posizioni con funzioni sinusoidali fisse, non con la
matrice appresa wpe che nanoGPT usa e il pezzo precedente ha
mostrato; gli autori provarono entrambe le strade e riportano
risultati quasi identici. Il meccanismo dell’attenzione non dipende da
come la posizione entra nei vettori, purché entri. E «ha sostituito la
ricorrenza» va detto col perimetro giusto: nei modelli di linguaggio
la sostituzione è compiuta, ma le reti ricorrenti lavorano ancora dove
le sequenze sono lunghe e i calcolatori piccoli, e il costo quadratico
è la ragione per cui la ricerca sulle alternative non si è mai
fermata.
Il pezzo sull’embedding aveva promesso il meccanismo che permette a ogni posizione di pesare quelle precedenti, e ora è sul tavolo: domanda, chiave e valore, la softmax che trasforma punteggi in pesi, la maschera che protegge il futuro, le teste che moltiplicano i punti di vista. Manca ancora il montaggio: come l’attenzione si alterna agli strati che elaborano posizione per posizione, che cosa tiene in piedi una pila di decine di blocchi, e come dalla cima della pila esca la probabilità del prossimo token. Nel prossimo pezzo apriremo il Transformer col cacciavite, seguendo le trecento righe di nanoGPT dall’ingresso all’uscita.
I concetti che questo articolo introduce
Otto voci coprono la strada che portava all’attenzione, il meccanismo con le sue tre proiezioni, i correttivi, le teste e il prezzo che si porta dietro.
| Concetto | Ambito | Che cos’è | Si lega a |
|---|---|---|---|
| Rete neurale ricorrente | machine-learning | Una rete che legge la sequenza un elemento alla volta, conservando in un vettore di stato la storia degli elementi già visti | soffre sulle dipendenze lontane, dove i gradienti svaniscono; è stata sostituita dal meccanismo di attenzione in molti compiti sul linguaggio |
| Meccanismo di attenzione | machine-learning | Il calcolo che produce, per una posizione, una somma pesata dei valori delle altre posizioni, con pesi decisi dalla compatibilità fra domanda e chiavi | usa domanda, chiave e valore; produce i pesi di attenzione; è nato dentro la rete neurale ricorrente per la traduzione |
| Autoattenzione | machine-learning | Il meccanismo di attenzione applicato da una sequenza verso sé stessa: ogni posizione interroga le altre posizioni della stessa sequenza | è un caso del meccanismo di attenzione; in nanoGPT è vincolata dalla maschera causale; produce la rappresentazione contestuale |
| Domanda, chiave e valore | machine-learning | Le tre proiezioni apprese ricavate dal vettore di ogni posizione: la domanda interroga, la chiave si lascia trovare, il valore è il contenuto che viene trasmesso | derivano dall’embedding del token sommato all’embedding posizionale; il confronto fra domanda e chiavi produce i pesi di attenzione |
| Pesi di attenzione | machine-learning | I coefficienti, prodotti dalla softmax sui punteggi fra domanda e chiavi, con cui una posizione pesa le altre; sommano a 1 | derivano da domanda, chiave e valore tramite la softmax; decidono la somma dei valori; sono azzerati sulle posizioni future dalla maschera causale |
| Maschera causale | machine-learning | Il vincolo che impedisce a ogni posizione di usare le posizioni successive, ponendo a meno infinito i loro punteggi prima della softmax | agisce sui pesi di attenzione; rende l’autoattenzione adatta a generare un token alla volta |
| Teste di attenzione | machine-learning | Una delle copie parallele del meccanismo, ciascuna con le proprie proiezioni, che guardano la stessa sequenza da sottospazi diversi | ripete il meccanismo di attenzione in parallelo; le uscite ricomposte formano l’uscita del blocco di autoattenzione |
| Costo quadratico dell’attenzione | machine-learning | Il prezzo del collegamento diretto: ogni posizione si confronta con tutte le precedenti, e i confronti crescono col quadrato della lunghezza della finestra | deriva dall’autoattenzione; motiva la cache di chiavi e valori e le attenzioni raggruppate del pezzo sulle evoluzioni; si lega al costo del contesto misurato nella serie agenti-ai |
Fonti
Le affermazioni portanti vengono dai lavori originali e dal codice nanoGPT fissato al commit esaminato; le citazioni dai paper sono traduzioni nostre.
- Improve and Manage,
serie-machine-learning,
GitHub, 2026 - il repository dei widget della serie: qui sta «Chi
guarda chi» di questo pezzo (cartella
attenzione/), insieme ai widget di tutti gli altri pezzi della serie. - Ashish Vaswani, Noam Shazeer, Niki Parmar, Jakob Uszkoreit, Llion Jones, Aidan N. Gomez, Łukasz Kaiser e Illia Polosukhin, Attention Is All You Need, NeurIPS 2017, primaria aperta e letta (sezioni 3.2, 3.5 e 4) - la definizione di attenzione come somma pesata dei valori con pesi dalla compatibilità fra domanda e chiave; la divisione per la radice della dimensione delle chiavi contro i gradienti piccolissimi della softmax; le otto teste da sessantaquattro componenti sui cinquecentododici del modello e i sottospazi di rappresentazione; la maschera a meno infinito sui collegamenti illeciti; i percorsi in un passo contro i percorsi in n passi della ricorrenza, e il costo per strato quadratico nella lunghezza; le posizioni sinusoidali e apprese con risultati quasi identici.
- Dzmitry Bahdanau, Kyunghyun Cho e Yoshua Bengio, Neural Machine Translation by Jointly Learning to Align and Translate, ICLR 2015, primaria aperta, letto l’abstract - il vettore a lunghezza fissa dichiarato collo di bottiglia del codificatore-decodificatore, la ricerca morbida delle parti rilevanti della frase sorgente, gli allineamenti che concordano con l’intuizione.
- Yann LeCun, Yoshua Bengio e Geoffrey Hinton, Deep Learning, Nature 521, 2015, rassegna aperta; le pagine sulle reti ricorrenti rilette per questo pezzo - il vettore di stato che contiene la storia della sequenza, i gradienti che esplodono o svaniscono sui molti passi, le LSTM come rimedio, il codificatore-decodificatore per la traduzione e la previsione sull’attendere selettivamente una parte alla volta.
- Andrej Karpathy,
nanoGPT al commit
3adf61e154c3, licenza MIT, codice letto - la classeCausalSelfAttention(righe 29-76 dimodel.py): la proiezione unica per domande, chiavi e valori di tutte le teste, la scala sulla radice della dimensione, la maschera triangolare a meno infinito, la somma coi valori e la ricomposizione delle teste; le dodici teste su dimensione settecentosessantotto del GPT-2 di base.