Discesa del gradiente e retropropagazione nel machine learning

Discesa del gradiente e retropropagazione nel machine learning

10 Gennaio 2023 ai 1
discesa del gradiente e retropropagazione

La discesa del gradiente e la retropropagazione sono alleati importantissimi nel machine learning, perché base fondamentale delle reti neurali artificiali (RNA).

In fondo, ogni data scientist lo sa: la selezione del modello corretto per ogni caso d’uso richiede una comprensione approfondita del problema in sé e degli algoritmi necessari per interpretarlo e risolverlo. 

In questo articolo vorrei soffermarmi in particolare sugli algoritmi di discesa del gradiente e di retropropagazione. 

Algoritmi di discesa del gradiente

La discesa del gradiente è un algoritmo di ottimizzazione standard, spesso il primo algoritmo di ottimizzazione ad essere utilizzato quando si addestra il machine learning. 

Innanzi tutto, il gradiente è una misura che quantifica la pendenza di una linea o di una curva. Matematicamente, indica la direzione di salita o discesa di una linea.

L’algoritmo di discesa del gradiente quantifica quindi il movimento verso il basso del gradiente di una linea.

A questa premessa ne aggiungiamo un’altra: un programma computazionale ha la straordinaria capacità di distinguere tra immagini e oggetti all’interno di immagini senza essere esplicitamente informato su quali caratteristiche rilevare.

È utile pensare a una rete neurale come a una funzione che lavora sulla base di un set di dati e ne ricava una previsione in uscita, alle variabili di questa funzione come parametri o pesi del neurone.

Per questi motivi il lavoro principale per risolvere un problema presentato a una rete neurale sarà quello di regolare i valori dei pesi e delle polarizzazioni in modo da approssimare o rappresentare al meglio il set di dati.

Per valutare le prestazioni delle reti neurali, è necessario un meccanismo per quantificare la differenza tra la previsione della rete neurale e il valore effettivo del campione di dati, ottenendo il calcolo di un fattore che influenza la modifica dei pesi e delle polarizzazioni all’interno di una rete neurale.

La discrepanza tra il valore previsto da una rete neurale e il valore effettivo di un campione di dati è facilitato dalla funzione di costo.

La funzione di discesa del gradiente può ad esempio risultare utile se la combiniamo con le funzioni di costo.

Funzione di costo combinata a una funzione di discesa del gradiente

Il punto minimo di una funzione di costo modellata corrisponde alla posizione dei valori dei pesi che determina il valore più basso della funzione di costo. Quanto più piccola è la funzione di costo, tanto migliori sono le prestazioni della rete neurale. Per tal motivo è sempre possibile modificare i pesi della rete a partire dalle informazioni raccolte.

La discesa del gradiente è l’algoritmo utilizzato per guidare le coppie di valori scelti a ogni passo verso un minimo (intendendo con minimo locale i valori minimi dei parametri all’interno di un intervallo o settore specifico della funzione di costo e con minimo globale il valore più piccolo del parametro all’interno dell’intero dominio della funzione di costo).

L’algoritmo di discesa del gradiente orienta la ricerca dei valori che minimizzano la funzione a un minimo locale/globale calcolando il gradiente di una funzione differenziabile e muovendosi nella direzione opposta del gradiente.

La retropropagazione

La retropropagazione è il metodo di regolazione delle uscite dei neuroni (bias, pesi, attivazioni) in modo iterativo per ridurre la funzione di costo. In un’architettura di rete neurale, gli ingressi del neurone, comprese tutte le connessioni precedenti ai neuroni dello strato precedente, determinano la sua uscita.

Il processo matematico iterativo incorporato nella retropropagazione calcola la derivata parziale della funzione di costo rispetto ai pesi, alle polarizzazioni e alle attivazioni dello strato precedente per identificare quali valori influenzano il gradiente della funzione di costo.

La funzione di costo, attraverso il calcolo del gradiente, porta a un minimo locale. In ogni iterazione o fase di addestramento, i pesi della rete sono regolati dal gradiente calcolato, insieme al tasso di apprendimento, che controlla il fattore di modifica dei valori dei pesi. Questo processo viene ripetuto per ogni passo da compiere durante la fase di addestramento di una rete neurale, con l’obiettivo di avvicinarsi ogni volta a un minimo locale.

In buona sostanza, propagando gli errori all’indietro attraverso la rete, la derivata parziale del gradiente dell’ultimo strato (lo strato più vicino a quello di uscita) viene utilizzata per calcolare il gradiente del penultimo strato.

La propagazione degli errori attraverso gli strati e l’utilizzo della derivata parziale del gradiente di uno strato precedente nello strato corrente avviene fino al raggiungimento del primo strato della rete (lo strato più vicino a quello di ingresso).

Tipi di algoritmi di discesa del gradiente

L’invio di dati alle reti neurali per la modifica dei pesi mediante la retropagazione e la discesa del gradiente avviene in varie forme.

Questi sono i tre metodi di calcolo più comune nella discesa del gradiente:

1) Discesa del gradiente in lotti (BGD)

Si definisce la discesa del gradiente in lotti, o Batch Gradient Descent (BGD). Questa tipologia è efficiente dal punto di vista computazionale perché non modifica i parametri del modello con la stessa frequenza di altre varianti di discesa del gradiente. Poiché per l’addestramento di un modello sono necessari tutti i set di dati, il BGD non è efficiente dal punto di vista della memoria.

2) Discesa del gradiente stocastica (SGD)

La discesa del gradiente stocastica (Stochastic Gradient Descent, SGD) funziona prendendo un singolo punto di dati dal dataset di addestramento e calcolando il gradiente sulla base di quel singolo punto di dati, anziché ripetere attraverso ogni dato dell’insieme di addestramento e poi muoversi verso un minimo locale.

È un metodo molto più rapido del precedente perché si calcola il gradiente su una singola istanza di dati anziché sull’intero set di dati.

Però lo svantaggio c’è: gli aggiornamenti all’interno dello spazio dei parametri durante l’utilizzo della discesa del gradiente possono presentare molto rumore. Quando si selezionano i punti di dati dal set di addestramento per calcolare i gradienti a ogni passo, la natura casuale di SGD rende il risultato rumoroso, e quindi per avere un valore ottimale dei parametri serve iterare sui dati di addestramento un numero specifico di volte. Così si ha la garanzia che i dati di addestramento vengano rimescolati all’inizio della discesa del gradiente.

Il rumore porta a valori ambigui dei parametri per risolvere la funzione di costo. Tuttavia, se il tempo a disposizione è sufficiente, la discesa stocastica del gradiente convergerà verso un minimo locale. 

La natura casuale e imprevedibile di SGD nell’assegnazione dei valori dei parametri a ogni passo lo rende superiore a BGD nell’evitare i minimi locali e nel trovare il minimo globale.

Tuttavia, i valori dei parametri del BGD sono più vicini al minimo globale, quindi sappi che dovrai fare sempre un compromesso.

3) Discesa del gradiente Mini-Batch 

Consideriamo un approccio unico per combinare i punti di forza di SGD e BGD.

L’algoritmo di discesa del gradiente Mini Batch calcola i gradienti utilizzando campioni di dati multipli selezionati in modo casuale dal set di allenamento, proprio come SGD. Tuttavia, quando calcola i gradienti, non include l’intero set di dati, quindi non è proprio BGD. Prima ho parlato di compromesso, e una soluzione come il mini-batch è proprio questo.

Rispetto a BGD, Mini Batch GD utilizza una quantità minima di dati per il calcolo dei gradienti, ma è più lento di SGD.

Un vantaggio fondamentale della discesa del gradiente Mini Batch rispetto a SGD è che riduce il rumore nello spazio dei parametri. 

In conclusione

Come si è visto, ho voluto dare solo un’idea generale dei concetti di discesa del gradiente e di retropropagazione, ma se vuoi calare questi concetti nella pratica puoi benissimo usare TensorFlow, oppure PyTorch, che aiutano nell’implementazione degli algoritmi di addestramento e ottimizzazione. 

In generale comunque credo che sia sempre il caso di conoscere la radice matematica dietro i tool che usiamo. Solo così possiamo davvero dire di padroneggiare la scienza dei dati.

 

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *