Anatomia di un blocco Transformer: residual, layer norm e feed-forward

Cosa c’e davvero dentro un blocco Transformer: la connessione residuale, la layer normalization e la rete feed-forward che si porta via due terzi dei parametri.
Immagine realizzata con IA
Le immagini presenti nel post possono essere realizzate o elaborate con strumenti di Intelligenza Artificiale. Questa scelta nasce anche dalla necessità di prevenire le continue contestazioni e richieste economiche improprie che ricevo relative a fotografie utilizzate che sono sempre state acquistate con regolare licenza.
Contenuti dell'articolo

Nel pezzo sui Transformer ho raccontato l’attenzione e mi sono fermato lì. Ma un blocco non è solo attenzione: è un piccolo impianto con due sotto-strati e due accorgimenti che nessuno nomina mai, la connessione residuale e la layer normalization. Il terzo pezzo, la rete feed-forward, si porta via due terzi dei parametri del modello.

Se ti manca il primo livello, parti da Cosa sono i Transformer e come funzionano e da Query, Key e Value. Qui smonto l’involucro che tiene insieme tutto il resto.

Il blocco, non il modello

Un Transformer non è un monolite: è una pila di blocchi identici. GPT-3 ne ha 96, un modello piccolo ne ha 12, ma la struttura interna è la stessa. Ogni blocco riceve una sequenza di vettori, la elabora e restituisce una sequenza della stessa forma, così il blocco successivo può fare la stessa cosa.

Dentro ogni blocco ci sono due sotto-strati. Il primo è l’attenzione, che fa parlare le parole tra loro. Il secondo è la rete feed-forward, che lavora su ogni parola separatamente. Ognuno dei due è avvolto da una normalizzazione e da una somma con l’ingresso: questa è l’anatomia completa.

Il giro di un token, passo per passo

Prendi un token e seguilo. Entra nel blocco, viene normalizzato, passa nell’attenzione e il risultato viene sommato al token di partenza. Poi viene normalizzato di nuovo, attraversa la feed-forward e il nuovo risultato viene sommato di nuovo all’ingresso.

In formula, con la convenzione dei modelli moderni: x diventa x più attenzione di norm di x, poi x diventa x più feed-forward di norm di x. Sembra un dettaglio di scrittura, in realtà è la ricetta che ha permesso di impilare cento blocchi senza farli collassare.

Le forme restano allineate per un motivo preciso: la somma finale richiede che ingresso e uscita abbiano la stessa dimensione. Se il blocco lavora a 512 dimensioni, il sotto-strato deve restituire 512 numeri, altrimenti l’addizione non ha senso. Per questo la feed-forward si espande all’interno e poi rientra: fuori resta sempre 512.

Il giro di un token dentro un blocco Transformer: normalizzazione, attenzione, somma residuale, seconda normalizzazione, feed-forward e seconda somma
Il giro completo: due normalizzazioni, due sotto-strati e due somme residuali

Perché due sotto-strati e non uno

La divisione del lavoro è netta. L’attenzione mescola informazioni tra posizioni: è l’unico punto in cui un token può sapere cosa hanno detto gli altri. La feed-forward invece non mescola niente, trasforma il vettore di ogni posizione usando solo quel vettore.

Servono entrambe perché i due compiti sono diversi. Mescolare senza elaborare produce una media di informazioni, non un ragionamento. Elaborare senza mescolare lascia ogni parola chiusa nel suo significato di partenza, come se la frase fosse un elenco di parole scollegate. Il blocco alterna i due gesti e la pila di blocchi li alterna decine di volte.

La scorciatoia che tiene in vita la rete

La connessione residuale è quella somma finale: si somma l’ingresso all’uscita. Se il sotto-strato impara a produrre zero, il blocco diventa un passaggio diretto, cioè non peggiora nulla. È una specie di rete di sicurezza: aggiungere profondità non può fare danni, al massimo non serve.

C’è un secondo effetto, meno intuitivo e più importante. Quando si calcolano i gradienti per addestrare il modello, la derivata di una somma è una somma di derivate e il ramo diretto ha derivata 1. Il segnale di errore attraversa quindi tutti i blocchi senza smorzarsi. Senza residuali, in una pila profonda il gradiente si assottiglia fino a sparire e l’addestramento non parte nemmeno.

Questa idea arriva dalle reti convoluzionali, dove ha permesso di passare da venti strati a centinaia. Nei Transformer è entrata dal primo giorno e senza di lei i modelli grandi semplicemente non si addestrano.

Layer normalization: rimettere i numeri in scala

Le uscite dell’attenzione non hanno una scala stabile: alcuni valori crescono, altri restano piccoli e la distribuzione cambia da token a token. Se si accumula questa variabilità su decine di blocchi, i numeri esplodono o collassano.

La layer normalization rimette ordine. Per ogni token calcola media e varianza sulle dimensioni, sottrae la media e divide per la deviazione standard, poi applica due parametri appresi, uno di scala e uno di spostamento, che permettono al modello di annullare la normalizzazione se non gli serve.

Un esempio con tre numeri: il vettore 2, 4, 6 ha media 4 e deviazione standard circa 1,63. Sottraendo la media si ottiene meno 2, 0, più 2 e dividendo per la deviazione standard circa meno 1,22, 0 e più 1,22. Il vettore ora ha media zero e varianza uno, qualunque fosse la scala di partenza. I due parametri appresi possono poi allargarlo o spostarlo, se al modello serve.

Il dettaglio che conta: la normalizzazione è per token, non per batch. Ogni vettore viene normalizzato contando solo su se stesso, senza dipendere dagli altri esempi. È il motivo per cui funziona bene anche quando si addestra con batch piccoli o si fa inferenza su una frase sola.

Molti modelli recenti usano RMSNorm, una variante che non sottrae la media e divide solo per la radice della media dei quadrati. Costa meno e nella pratica funziona uguale: è la normalizzazione dei modelli della famiglia LLaMA.

Pre-norm e post-norm

L’ordine dei pezzi cambia il comportamento. Il Transformer originale normalizzava dopo la somma, nella variante chiamata post-norm. I modelli moderni normalizzano prima del sotto-strato, nella variante pre-norm.

La differenza si sente in profondità: con la pre-norm il ramo diretto resta pulito, senza normalizzazioni in mezzo e l’addestramento è molto più stabile. In pratica si riesce a salire di profondità senza trucchi sul learning rate e senza lunghe fasi di riscaldamento.

La rete feed-forward: due terzi dei parametri

Il secondo sotto-strato è una piccola rete neurale applicata a ogni token. Due strati lineari con una non linearità in mezzo: il primo espande la dimensione, il secondo la riporta a quella di partenza. Nel Transformer originale si passa da 512 a 2048 e poi di nuovo a 512.

Il punto che sorprende: qui i token non si parlano. Le stesse matrici vengono applicate a ogni posizione, una alla volta, senza scambi di informazione. Tutto il mescolamento avviene nell’attenzione, mentre la feed-forward elabora ogni posizione per conto suo.

Questo modo di lavorare ha un nome: position-wise. In pratica è come applicare la stessa piccola rete a ogni riga di una tabella, una riga alla volta, senza far comunicare le righe tra loro. Per questo la feed-forward è identica per tutte le posizioni e non ha bisogno di sapere dove si trova nella frase.

Ripartizione dei parametri in un blocco Transformer: circa un terzo all'attenzione e due terzi alla rete feed-forward
Dove finiscono i parametri: un terzo all’attenzione, due terzi alla feed-forward

Il conto dei parametri lo dice chiaramente. L’attenzione usa quattro matrici da d per d, quindi circa quattro d quadro. La feed-forward ne usa due da d per 4d, quindi otto d quadro. Risultato: il feed-forward si prende due terzi e l’attenzione si prende il resto.

Perché è larga quattro volte

Il fattore quattro non è magia: è un compromesso trovato per tentativi. Allargare la parte interna aumenta la capacità del modello, ma costa memoria e calcolo in proporzione. Quattro volte è il punto in cui il guadagno in qualità supera il costo, ed è rimasto lo standard per anni.

Dentro quella espansione il modello sembra costruirsi una specie di memoria di pattern. Studi di interpretabilità hanno mostrato neuroni che si attivano su combinazioni ricorrenti, per esempio “una città” più “un paese”: la feed-forward funziona come un archivio di associazioni apprese, consultato in base al contesto prodotto dall’attenzione.

Le varianti recenti cambiano la forma, non l’idea. SwiGLU e GEGLU usano tre matrici invece di due e un rapporto intorno a otto terzi, perché la formulazione a cancelli rende meglio a parità di parametri. I modelli mixture of experts spingono oltre: sostituiscono la feed-forward con decine di esperti e ne attivano solo due per token.

C’è anche un conto pratico: la feed-forward costa più dell’attenzione quando le sequenze sono corte, mentre l’attenzione domina quando le sequenze diventano lunghe, perché cresce con il quadrato della lunghezza. Nelle applicazioni reali il rapporto tra le due parti cambia con il tipo di utilizzo, ed è uno dei motivi per cui le architetture vengono ritoccate.

La non linearità in mezzo segue lo stesso ragionamento delle reti classiche: senza di lei due strati lineari equivalgono a uno solo e l’espansione non servirebbe a niente. Oggi si usa quasi sempre GELU o SiLU al posto della ReLU, come racconto nelle funzioni di attivazione.

Cosa succede togliendo un pezzo

La prova del nove è l’ablation: si toglie un componente e si guarda cosa si rompe. Togli la residuale e il modello profondo non converge, perché il gradiente non arriva in fondo. Togli la normalizzazione e i valori esplodono dopo pochi blocchi. Togli la feed-forward e la capacità crolla, perché resta solo il mescolamento tra parole senza elaborazione.

Qualche anno di ricerca ha provato a semplificare: ci sono architetture che riducono o eliminano parti, mostrando che i tre pezzi sono in parte ridondanti. Nessuno però è riuscito a togliere tutti e tre insieme senza perdere qualità. L’anatomia è un compromesso, non perché ogni pezzo sia indispensabile da solo.

Se devi ricordare la struttura, pensala così: normalizzo, mescolo con l’attenzione, sommo l’ingresso, normalizzo, elaboro ogni token, sommo di nuovo. Due giri e due sicurezze.

Domande frequenti

La connessione residuale è la stessa cosa di uno skip connection?

Sì. I due nomi indicano la stessa operazione: sommare l’ingresso all’uscita di un sotto-strato per lasciare un percorso diretto al segnale.

Perché layer normalization e non batch normalization?

Perché ogni token va normalizzato per conto suo, senza dipendere dagli altri esempi del batch. Così il comportamento resta identico tra addestramento e inferenza, anche con una frase sola.

La feed-forward è una rete neurale?

Sì, una rete a due strati applicata posizione per posizione. È la parte del blocco che trasforma i vettori, mentre l’attenzione si occupa di farli parlare tra loro.

Perché l’espansione interna è quattro volte?

È un compromesso tra capacità e costo. Quattro volte è il valore che per anni ha dato il miglior rapporto tra qualità e risorse e le varianti moderne lo cambiano solo con formulazioni diverse.

Queste cose valgono solo per i modelli giganti?

No, la struttura è identica in un modello da 100 milioni di parametri. Cambiano il numero di blocchi e la larghezza, non l’anatomia del singolo blocco.

Dove vedo questi pezzi in un modello open?

Nei file di configurazione trovi voci come hidden size, intermediate size e numero di layer: sono esattamente i tre numeri che descrivono questa anatomia.

Per approfondire: i Transformer, query, key e value, le leggi di scala e la KV cache.

Newsletter settimanale con le ultime novità sull’intelligenza artificiale

Corso gratuito sull’Intelligenza Artificiale, dalle nozioni base ai concetti più complessi

Condividi:

Potrebbero interessarti