Tema

Machine learningdi

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.

L'autoattenzione per la posizione di cane nella frase il gatto morde il cane Cinque colonne, una per token: il, gatto, morde, il, cane. La domanda di cane, confrontata con le cinque chiavi, produce i punteggi 0,2, 1,1, 2,3, 0,4 e 0,9. La softmax li trasforma nei pesi 0,07, 0,17, 0,55, 0,08 e 0,13, mostrati anche come barre. Ogni peso moltiplica il valore della sua colonna: 0,1 0,0 0,2 per il primo il; 0,6 meno 0,2 0,1 per gatto; meno 0,1 0,8 0,3 per morde; 0,2 0,1 0,1 per il secondo il; 0,5 meno 0,1 0,4 per cane. La somma pesata produce l'uscita 0,14 0,40 0,26, la nuova rappresentazione di cane. La colonna di morde, che porta il peso maggiore, è evidenziata. TOKEN PUNTEGGIO PESO VALORE FA LA DOMANDA ilPOS 0 gattoPOS 1 mordePOS 2 ilPOS 3 canePOS 4 0,2 1,1 2,3 0,4 0,9 0,07 0,17 0,55 0,08 0,13 0,1 0,0 0,2 0,6 −0,2 0,1 −0,1 0,8 0,3 0,2 0,1 0,1 0,5 −0,1 0,4 + SOMMA PESATA NUOVA RAPPRESENTAZIONE DI cane [0,14 · 0,40 · 0,26]
La domanda di cane, confrontata con le cinque chiavi, produce i punteggi; la softmax li trasforma in pesi che sommano a 1; ogni peso moltiplica il valore della sua posizione e la somma è la nuova rappresentazione. I numeri sono inventati per rendere il conto visibile; la struttura è quella del codice.

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 frase di casa, pronta: il gatto morde il cane. Cliccate una parola: sarà quella a fare la domanda.

Le parole della frase: cliccate quella che farà la domanda.

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.