Cos’è la feed-forward nei Transformer: il motore che nessuno guarda

L’attenzione prende tutta la scena, ma la maggior parte dei parametri sta altrove. Come funziona la feed-forward, cosa impara e perché senza di lei il modello non saprebbe cosa dire.
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

L’attenzione prende tutta la scena: se leggi qualcosa sui Transformer, il 90% delle pagine parla di query, key e value.
Poi apri il modello e scopri che la maggior parte dei parametri non sta lì.

Sta in un blocco che quasi nessuno nomina: la feed-forward.
È il secondo motore del Transformer, quello che trasforma davvero l’informazione: ad esempio in GPT-3 da solo vale circa due terzi di tutti i pesi.
È tipo il Buzz Aldrin dell’intelligenza: tutti parlano sempre solo di Armstrong (l’attenzione).

In questo articolo lo spiego senza formule, con esempi numerici piccoli e con i numeri veri di un modello grande.
Alla fine dovresti riuscire a raccontare a un amico cosa fa questa rete e perché, senza di lei, un Transformer sarebbe solo un modo elegante di mescolare parole.

Prima il quadro generale. Se ti manca il contesto, parti da Cosa sono i Transformer e come funzionano e poi dall’anatomia di un blocco Transformer. Qui entriamo dentro un solo pezzo, quello che nel blocco viene subito dopo l’attenzione.

Perché nessuno parla della feed-forward

C’è una ragione storica. Il paper del 2017 si chiama “Attention Is All You Need” e ha spostato l’attenzione, letteralmente, su un meccanismo nuovo e spettacolare.
La feed-forward invece esisteva già da decenni: è una rete neurale normale, due strati lineari e un’attivazione in mezzo. Nessun titolo da prima pagina.

Però i numeri raccontano un’altra storia.

In un Transformer ogni blocco ha due sotto-strati: uno di attenzione e uno di feed-forward.
Il secondo contiene il quadruplo dei parametri del primo; in un modello grande la sproporzione diventa enorme. Se togli l’attenzione il modello non sa più collegare le parole tra loro, ma se togli la feed-forward non sa più cosa dire.

La metafora che preferisco è quella della riunione. L’attenzione è la parte in cui tutti si ascoltano e si scambiano informazioni. La feed-forward è la parte in cui ognuno torna alla scrivania e rielabora quello che ha sentito. Senza la riunione nessuno si coordina, senza il lavoro alla scrivania non esce niente di nuovo e sono state chiacchiere al vento.

Che cos’è una rete feed-forward, in parole semplici

Una rete feed-forward è un insieme di strati in cui l’informazione va sempre in una direzione: entra, viene trasformata, esce. Niente cicli, niente memoria interna. Si chiama così proprio perché il flusso va avanti e basta.

Il mattone di base è il neurone.
Prende dei numeri in ingresso, li moltiplica per dei pesi, somma tutto e aggiunge una costante. Il risultato passa attraverso una funzione di attivazione, che decide quanto e come quel valore conta. Poi si va al neurone successivo.

Detta così sembra arida, ma è la stessa cosa che fa una ricetta.
Gli ingredienti sono i numeri in ingresso, i pesi sono le dosi, la somma è il mestolo che unisce, l’attivazione è il forno che trasforma la miscela in qualcosa che prima non esisteva.
Cambi le dosi e ottieni un piatto diverso, anche con gli stessi ingredienti.

Un esempio con due numeri

Immagina un ingresso con due valori: 1 e 2. Uno strato con due neuroni ha dei pesi, per esempio [0,5 e 1] per il primo e [2 e meno 0,5] per il secondo.
Il primo neurone calcola 1 per 0,5 più 2 per 1, quindi 2,5.
Il secondo calcola 1 per 2 più 2 per meno 0,5, quindi 1.

Aggiungi le costanti, applica l’attivazione e hai due numeri nuovi: hai cambiato rappresentazione, non hai solo copiato i dati.

Ripeti l’operazione per tre o quattro strati e ottieni una funzione complicata.
È il teorema di approssimazione universale, in versione divulgativa: con abbastanza neuroni e abbastanza strati una rete così può imitare funzioni molto intricate.
In un Transformer questa capacità non serve a imitare un grafico, serve a trasformare un vettore che rappresenta “banca” in un vettore che rappresenta “banca di credito in questa frase”.

Da ricordare. La feed-forward non mescola i token tra loro: lavora su un token alla volta, nello stesso modo per tutti. Il compito di far parlare i token è dell’attenzione, il compito di rielaborare il contenuto è suo.

Dentro il blocco Transformer: la stessa ricetta per ogni token

Qui arriva il dettaglio che sorprende. Nel Transformer la feed-forward è position-wise: viene applicata a ogni posizione separatamente, con gli stessi pesi per tutte.
Il token in prima posizione e quello in ultima passano attraverso la stessa identica rete, in parallelo, senza sapere niente l’uno dell’altro.

È come un ufficio con un solo sportello e una fila di pratiche: ogni pratica viene lavorata dallo stesso impiegato con le stesse istruzioni.
L’impiegato non confronta le pratiche tra loro, le lavora una per una. Il confronto è già avvenuto prima, quando l’attenzione ha fatto circolare le informazioni.

Questa scelta ha un vantaggio pratico enorme: la feed-forward è parallelizzabile al cento per cento. Non c’è nessuna dipendenza tra le posizioni, quindi la GPU lavora su tutta la frase insieme.
Se fosse sequenziale, come nelle vecchie reti ricorrenti, ogni token dovrebbe aspettare il precedente.

Perché si chiama position-wise

Il nome serve a distinguerla da un’altra cosa che potrebbe esistere e che non c’è: una rete che prende tutta la frase in ingresso e produce una trasformazione globale.
La feed-forward non lo fa. Entra un vettore di 768 numeri, esce un vettore di 768 numeri. Questo succede n volte, una per token.

Il risultato è che la stessa parola, in due posizioni diverse, esce trasformata in modo diverso, perché entra diversa: l’attenzione l’ha già arricchita con il contesto. La feed-forward non sa cosa c’è intorno, ma riceve un vettore che lo sa.

L’espansione a quattro volte: dove finiscono i parametri

La struttura tipica è semplicissima: uno strato che espande, un’attivazione in mezzo, uno strato che riporta alla dimensione di partenza. Se il modello lavora a 512 dimensioni, la parte interna sale a 2048 e poi torna a 512. Quattro volte, appunto.

Perché espandere e poi comprimere?
Perché dentro lo spazio grande la rete ha più gradi di libertà per distinguere casi diversi.
È come aprire una valigia in una stanza spaziosa per riordinare i vestiti: nello spazio stretto non ci stanno tutte le combinazioni. La compressione finale è ciò che rende il risultato utilizzabile dal blocco successivo, che si aspetta 512 numeri.

Il conto dei parametri spiega perché questa parte pesa tanto.
Due matrici da d per 4d fanno 8 d quadro parametri per blocco. Con d uguale a 512 sono circa 2 milioni. Con d uguale a 12.288, come in GPT-3, sono 1,2 miliardi per blocco; con 96 blocchi si arriva a 116 miliardi.
Sul totale di 175 miliardi di parametri, è circa il 66%.

Il conto dei parametri, con i numeri di GPT-3 (è sempre utile come esempio)

Vale la pena vederlo scritto, perché è il numero che nessuno si aspetta. 12.288 per 49.152 sono circa 604 milioni per matrice, due matrici fanno 1,2 miliardi, per 96 blocchi fanno 116 miliardi.
L’attenzione, con le sue quattro matrici Q, K, V e output, si ferma intorno ai 58 miliardi.

La feed-forward da sola vale il doppio dell’attenzione, ma nella memoria collettiva non viene mai nominata!

ModelloDimensioneDimensione internaParametri per blocco
BERT-base7683.072circa 4,7 milioni
GPT-2 small7683.072circa 4,7 milioni
GPT-312.28849.152circa 1,2 miliardi
Llama 3 8B4.09614.336circa 176 milioni

Llama 3 merita una nota: usa una variante chiamata SwiGLU, che moltiplica due proiezioni tra loro, quindi i conti cambiano leggermente. La sostanza non cambia: la parte interna è sempre molto più grande di quella di partenza.

Perché senza non linearità il blocco collassa

Qui c’è il punto matematico che vale la pena capire: si spiega con una frase: due moltiplicazioni di matrici in fila sono una sola moltiplicazione di matrici.
Se tra i due strati non metti niente, la rete non può imparare nulla di più di quanto imparerebbe con un unico strato.

L’attivazione è ciò che rompe questa catena.
ReLU, per esempio, azzera i numeri negativi e lascia passare i positivi: introduce una piega nella funzione. Con abbastanza pieghe puoi approssimare curve complicate, senza pieghe hai solo una retta, per quanto lunga.

Nel Transformer originale si usa ReLU, in BERT e GPT si usa GELU, che è una versione più morbida e derivabile.
Nei modelli recenti si usa spesso SwiGLU.

Il principio è sempre lo stesso: senza una non linearità in mezzo, la feed-forward sarebbe un cambio di coordinate inutile.

Attenzione al gergo. “Lineare” qui non vuol dire semplice, vuol dire che rispetta una regola algebrica precisa. Due trasformazioni lineari consecutive si possono sempre fondere in una sola: è per questo che la non linearità è obbligatoria.

Cosa impara davvero: un archivio di pattern

Nel 2021 un gruppo di ricerca ha mostrato che le feed-forward si comportano come memorie chiave-valore. Ogni neurone interno riconosce un pattern e, quando lo vede, spinge l’uscita verso certe direzioni. Non è una metafora: è una descrizione abbastanza letterale di come si comportano i pesi dopo l’addestramento.

Il paragone che funziona è quello dei proverbi. Un proverbio è una scorciatoia: riconosci la situazione, applichi la frase fatta, ottieni una conclusione rapida. La feed-forward accumula migliaia di scorciatoie di questo tipo, alcune banali come “dopo un articolo determinativo arriva spesso un nome”, altre sofisticate come “se il discorso parla di diritto e compare la parola parte, probabilmente è un contratto”.

Un esempio concreto aiuta. In un modello addestrato sull’italiano, uno di questi neuroni potrebbe essersi specializzato nel riconoscere i nomi di città seguìti da “è la capitale di”. Un altro potrebbe reagire a sequenze che indicano una negazione. Un terzo, più astratto, potrebbe attivarsi quando il testo parla di quantità e confronti. Nessuno di questi neuroni “sa” cosa sia una città: ognuno è solo una soglia che, superata, spinge il vettore in una direzione utile alla previsione successiva.

Questo spiega anche una cosa che si osserva nei modelli grandi: la conoscenza enciclopedica sembra risiedere soprattutto qui. Le nozioni su capitali, date, nomi di persona si attivano in questi strati, mentre l’attenzione si occupa di capire a cosa si riferisce il pronome. È una divisione del lavoro, non una regola ferrea.

ReLU, GELU, SwiGLU: le varianti che contano

ReLU è la più semplice: se il numero è negativo diventa zero, altrimenti resta com’è. Funziona, è veloce, ed è quella del paper originale. Ha un difetto: i neuroni che finiscono sempre sotto zero smettono di imparare, perché la derivata è zero e il gradiente non passa.

GELU è una versione addolcita, che invece di tagliare di netto moltiplica il valore per una curva che lo attenua. È quella usata in BERT, GPT-2 e GPT-3, ed è una delle ragioni per cui questi modelli si addestrano meglio dei primi esperimenti con ReLU.

SwiGLU è la variante dei modelli recenti, da Llama in poi: invece di uno strato che espande, ne usa due e li moltiplica tra loro. Costa qualche parametro in più e restituisce un po’ di espressività. Nelle tabelle tecniche la riconosci perché la dimensione interna non è esattamente quattro volte quella del modello.

Quanto costa e perché si presta alle GPU

La feed-forward è la voce più pesante del conto. In fase di addestramento consuma la maggior parte dei calcoli, perché ogni token attraversa due matrici grandi. In fase di generazione è più leggera dell’attenzione sui contesti lunghi, ma resta il grosso del lavoro per token.

Il motivo per cui i progettisti la amano è la sua forma: due prodotti tra matrici, nessuna dipendenza sequenziale, nessun accesso imprevedibile alla memoria. Le GPU sono fatte esattamente per questo. L’attenzione, con la sua matrice di punteggi che cresce col quadrato della lunghezza, è molto più problematica da questo punto di vista.

C’è poi un dettaglio di memoria: i pesi della feed-forward occupano la maggior parte dei file del modello. Quando scarichi un modello da 7 miliardi di parametri, sappi che circa due terzi di quei numeri servono a questa parte qui, non all’attenzione.

Come la riconosci in un modello reale

Se apri la scheda tecnica di un modello, la feed-forward non si chiama così. Cerca la voce “intermediate_size”, oppure “ffn_dim”, oppure “hidden_dim” nella sezione dell’MLP. Quella è la dimensione interna di cui parlavamo: se il modello dichiara 4.096 come dimensione principale e 14.336 come intermediate, hai davanti a te la sua feed-forward.

Il suffisso MLP è un altro indizio. Significa multilayer perceptron, il nome storico di questa struttura. Nei file di configurazione trovi anche il nome dell’attivazione: “gelu”, “gelu_pytorch_tanh”, “silu” oppure “swiglu”. Ogni valore racconta una scelta di progetto e, indirettamente, l’epoca del modello: GELU per la generazione del 2019-2022, SiLU e SwiGLU per quella dal 2023 in avanti.

C’è un dettaglio pratico che vale la pena conoscere. Quando un modello viene “potato” o compresso, la feed-forward è la prima parte a essere sacrificata, perché contiene tanti parametri e alcune sue unità sono ridondanti. Studi del 2019 hanno mostrato che una parte dei neuroni interni può essere eliminata dopo l’addestramento con un impatto minimo sulla qualità. È il segno che questa rete impara molte cose in parallelo e che non tutte servono allo stesso modo.

Un ultimo indizio, il più utile: se leggi che un modello ha “expert” nel nome, come Mixtral o DeepSeek-MoE, sappi che la feed-forward è stata sostituita da più reti uguali e un router che ne attiva solo due o quattro per token. Il resto dell’architettura rimane quello di sempre, attenzione compresa.

Gli errori di lettura più comuni

  • La feed-forward mescola i token? No, lavora su ogni posizione separatamente. A mescolare ci pensa l’attenzione.
  • È un classificatore finale? No, è un passaggio interno che si ripete in ogni blocco. La classificazione, se c’è, arriva alla fine della rete.
  • Serve solo ad aggiungere profondità? Serve a trasformare il contenuto. Senza di lei il modello può solo rimballare le stesse informazioni.
  • Più grande è, meglio è? Non automaticamente. La dimensione interna si sceglie insieme al resto e ha un costo diretto su memoria e velocità.
  • È la stessa cosa dei MoE? No. Nei modelli mixture of experts la feed-forward viene sostituita da più esperti e un meccanismo che ne attiva solo alcuni, ma è una variante, non la regola.

Cosa resta fuori da qui

Restano fuori le connessioni residuali e la layer normalization, che sono l’altra metà del blocco e che ho trattato nell’articolo sull’anatomia. Restano fuori i mixture of experts, che meritano un pezzo a parte; resta fuori il modo in cui questi pesi vengono aggiornati durante l’addestramento, cioè la backpropagation.

Una cosa però portatela a casa: quando leggi che un modello “capisce” o “ragiona”, ricorda che una buona parte di quel lavoro avviene in una rete semplice, ripetuta identica in ogni blocco, che trasforma un vettore alla volta. Non c’è nulla di magico, c’è molta aritmetica ben organizzata.

Domande frequenti

La feed-forward è una rete neurale normale?

Sì. Due strati lineari con un’attivazione in mezzo, come quelle che si studiano nei corsi introduttivi. La differenza è che qui viene applicata a ogni token separatamente e ripetuta in decine di blocchi.

Perché la dimensione interna è quattro volte quella del modello?

È una convenzione del paper originale, ripresa da quasi tutti i modelli. Dare più spazio interno permette di distinguere più casi, con un costo accettabile. Non è una legge fisica: alcune architetture usano rapporti diversi.

Se la feed-forward lavora su un token alla volta, come fa il modello a capire la frase?

La coerenza arriva dall’attenzione, che prima ha già mescolato le informazioni tra le posizioni. La feed-forward riceve un vettore che contiene il contesto e lo rielabora. È una catena, non un colpo solo.

Cosa succede se elimino la feed-forward da un modello addestrato?

Il modello peggiora drasticamente. Perdi la capacità di trasformare il contenuto e di recuperare conoscenza: restano solo le operazioni di mescolamento. È come togliere la cucina da un ristorante e lasciare solo la sala.

La feed-forward è dove il modello memorizza i fatti?

In buona parte sì, secondo le ricerche che la interpretano come memoria chiave-valore. Ma non è un archivio ordinato: è una raccolta di pattern statistici, il che spiega perché a volte recupera un dato sbagliato con grande sicurezza.

Perché i modelli nuovi usano SwiGLU invece di ReLU?

Perché a parità di parametri dà risultati leggermente migliori e si addestra in modo più stabile. È una di quelle ottimizzazioni piccole che, sommate, fanno la differenza su scala grande.

C’entra qualcosa con il perceptron degli anni Cinquanta?

Sì, è un discendente diretto. Il perceptron era un singolo neurone con una soglia, la feed-forward è una pila di neuroni con attivazioni continue. La matematica di base è la stessa, la scala è cambiata.

Quanta parte del modello è feed-forward?

In GPT-3 circa due terzi dei parametri. Nei modelli con SwiGLU la proporzione è simile. È la parte più grande e la meno raccontata.

Per approfondire: anatomia di un blocco Transformer, query, key e value, multi-head attention e le leggi di scala.

Newsletter settimanale con le ultime novità sull’intelligenza artificiale

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

Condividi:

Potrebbero interessarti