Backpropagation: come una rete neurale impara dai propri errori

Dietro ogni modello che "impara" c'è un solo algoritmo, ideato decenni fa. Un viaggio nella backpropagation senza formule pesanti, con una discesa in montagna nella nebbia.

Ogni volta che un modello di intelligenza artificiale «impara» qualcosa — a riconoscere un tumore in una radiografia, a completare una frase, a distinguere una foto di gatto da una di volpe — sotto il cofano gira lo stesso identico algoritmo. Non uno simile: lo stesso. Si chiama backpropagation, è stato reso popolare da un articolo del 1986 firmato tra gli altri da Geoffrey Hinton, e a quasi quarant’anni di distanza nessuno è riuscito a sostituirlo. Vale la pena capire come funziona, perché è sorprendentemente comprensibile: è una procedura per imparare dai propri errori, resa sistematica.

Una rete neurale è una macchina piena di manopole

Partiamo da cosa deve imparare. Una rete neurale è, spogliata del misticismo, una lunga catena di moltiplicazioni e somme. I numeri per cui moltiplica si chiamano pesi, e sono l’unica cosa che la rete può cambiare: l’architettura è fissa, i dati sono quelli che sono. Immaginate un mixer da studio di registrazione con milioni di manopole (i modelli linguistici attuali ne hanno miliardi). All’inizio le manopole sono in posizioni casuali e dalla macchina esce rumore: la rete vede la foto di un gatto e risponde «volpe, ne sono sicura al 92%».

Addestrare la rete significa una cosa sola: trovare la posizione giusta per ogni manopola. Il problema è che le manopole sono milioni e girano tutte insieme, e l’effetto di ciascuna dipende da come sono girate le altre. Provare a caso è fuori discussione: non basterebbe l’età dell’universo.

Il gradiente, ovvero scendere una montagna nella nebbia

Serve prima un modo per misurare quanto la rete sta sbagliando. Lo fa la funzione di perdita (loss): un numero unico che riassume la distanza tra le risposte della rete e le risposte giuste. Perdita alta, rete pessima; perdita vicina a zero, rete addestrata. L’addestramento diventa così un problema di minimizzazione: trovare la combinazione di pesi che rende la perdita più bassa possibile.

Qui entra l’analogia più utile di tutto il deep learning. Immaginate di essere in montagna, di notte, con una nebbia fitta. Dovete raggiungere il fondovalle ma vedete solo il metro di terreno intorno ai vostri piedi. La strategia sensata è una: sentite da che parte il terreno scende più ripidamente, e fate un passo in quella direzione. Poi ricominciate. Il gradiente è esattamente questo: per ogni manopola, dice in che direzione e con quanta decisione girarla per far scendere la perdita. La discesa lungo il gradiente (gradient descent) è la sequenza dei passi.

Bello, ma resta il problema pratico: come si calcola la pendenza rispetto a milioni di manopole contemporaneamente, senza provarle una per una? È qui che la backpropagation smette di essere filosofia e diventa ingegneria.

Andata e ritorno

Ogni ciclo di apprendimento ha due fasi, come un viaggio con ritorno.

Il forward pass è l’andata: l’input (la foto del gatto) entra nel primo strato, ogni strato trasforma quello che riceve e passa il risultato al successivo, fino all’uscita («volpe, 92%»). Alla fine si confronta l’uscita con la risposta giusta e si calcola la perdita. Fin qui la rete ha solo sbagliato; non ha ancora imparato niente.

Il backward pass è il ritorno, ed è la parte geniale. L’errore viaggia all’indietro, dall’uscita verso l’ingresso, e a ogni strato risponde a una domanda precisa: quanta colpa di questo errore è tua? Lo strato finale la calcola direttamente. Lo strato precedente la riceve già parzialmente elaborata e deve solo aggiungere il proprio contributo. E così via fino al primo strato. Ogni peso della rete riceve il suo certificato di responsabilità: «hai contribuito all’errore così tanto, e per ridurlo devi girare in questa direzione».

Forward pass e backward pass input strato nascosto output forward: dati → previsione backward: errore → correzioni errore andata (calcolo) ritorno (attribuzione di colpa)

Andata in teal: i dati attraversano la rete e producono una previsione. Ritorno in terracotta: l’errore risale la rete strato per strato, assegnando a ogni peso la sua quota di responsabilità.

La regola della catena, senza lacrime

Il meccanismo matematico che rende possibile il viaggio di ritorno si chiama regola della catena (chain rule), e l’idea è domestica. Se un aumento del prezzo della farina fa salire il costo del pane, e il costo del pane fa salire il prezzo del vostro pranzo, allora potete calcolare l’effetto della farina sul pranzo moltiplicando i due effetti intermedi. Non serve rifare l’analisi da zero: basta concatenare gli effetti locali.

Una rete neurale è una catena lunghissima di questi passaggi, e ogni strato conosce perfettamente il proprio effetto locale. La backpropagation concatena tutti questi effetti locali all’indietro. L’unica formula che vale la pena vedere è la regola di aggiornamento finale:

peso_nuovo = peso_vecchio − η × gradiente

Leggiamola da destra a sinistra. Il gradiente è la pendenza calcolata dal backward pass: dice in che direzione l’errore cresce. Il segno meno dice di andare nella direzione opposta: vogliamo scendere, non salire. E η (eta) è il learning rate, la lunghezza del passo: quanto coraggiosamente giriamo la manopola a ogni ciclo.

Perché è efficiente (il dettaglio che tutti saltano)

Il modo ingenuo di calcolare l’effetto di ogni peso sarebbe: cambia il peso di pochissimo, rifai girare tutta la rete, guarda come cambia la perdita. Con un milione di pesi servirebbero un milione di esecuzioni complete per un solo passo di apprendimento. La backpropagation ottiene lo stesso risultato con due passaggi in tutto — un’andata e un ritorno — perché è organizzata per riusare i calcoli: la colpa attribuita allo strato 10 è l’ingrediente principale per calcolare quella dello strato 9, che serve per lo strato 8, e così via. Nessun conto viene fatto due volte.

La backpropagation non è la matematica dell’apprendimento. È la contabilità dell’errore, tenuta in modo che nessun calcolo vada sprecato.

È questa efficienza, non un’idea matematica nuova (la regola della catena ha tre secoli), ad aver reso praticabile il deep learning. Quando nel 2012 le GPU hanno incontrato la backpropagation su grandi dataset, i tempi di addestramento sono crollati e il settore è ripartito.

Dove le cose vanno storte

Il learning rate, quella η, è il parametro più delicato di tutto il processo, e i suoi fallimenti sono istruttivi.

  • Passo troppo lungo: lo scalatore nella nebbia fa balzi di dieci metri e scavalca il fondovalle, ritrovandosi sul pendio opposto, più in alto di prima. La perdita oscilla o esplode invece di scendere.
  • Passo troppo corto: passi da un millimetro. La direzione è giusta, ma l’addestramento richiede un tempo geologico e magari si ferma nella prima conca che incontra, scambiandola per il fondovalle.
  • Gradiente che svanisce: nelle reti molto profonde, la colpa che risale strato per strato viene moltiplicata a ogni passaggio per numeri piccoli; dopo trenta strati è ridotta quasi a zero, e i primi strati non imparano più nulla. Buona parte delle invenzioni architetturali moderne — dalle connessioni residue alla normalizzazione — sono trucchi per tenere vivo questo segnale durante il ritorno.

Perché vi riguarda

Se lavorate con modelli di machine learning, la backpropagation è il motivo per cui i vostri iperparametri si chiamano come si chiamano e i vostri addestramenti falliscono come falliscono: saperla leggere trasforma il debugging da rito magico a diagnosi. Se invece l’AI la usate soltanto, portatevi via questo: un modello non «capisce» di aver sbagliato. Riceve un numero, lo propaga all’indietro con una contabilità spietata e sposta milioni di manopole di un soffio, milioni di volte. Quella che chiamiamo intelligenza artificiale è, alla base, la versione industrializzata del più umano dei metodi: sbagliare, misurare lo sbaglio e correggersi un poco alla volta.

I commenti sono riservati agli iscritti.

Accedi per commentare