La discesa del gradiente stocastico (SGD) è un algoritmo di ottimizzazione comunemente usato per migliorare le prestazioni dei modelli di machine learning. È una variante del tradizionale algoritmo di discesa del gradiente, ma con una modifica chiave: invece di fare affidamento sull'intero set di dati per calcolare il gradiente in ogni fase, SGD utilizza un singolo campione di dati alla volta.
La discesa del gradiente (GD) è un algoritmo di ottimizzazione che minimizza iterativamente una funzione obiettivo. Nel contesto del machine learning (ML), la discesa del gradiente è fondamentale per migliorare le prestazioni dei modelli di apprendimento supervisionato durante la fase di formazione. I modelli di machine learning, come le reti neurali, sono complessi, non lineari e ad alta dimensionalità. Pertanto, a differenza della regressione, non esiste un'equazione normale per tali modelli in grado di calcolare i pesi ottimali. Invece, possono essere utilizzati, tra gli altri, metodi di approssimazione come le varianti della discesa del gradiente, i metodi di Newton e la massimizzazione delle aspettative.
Ogni modello ha una funzione di perdita, a volte chiamata funzione di costo. Questa funzione misura la distanza tra le previsioni di un modello e i punti dati reali. Consideriamolo come una misura di quanto siano "sbagliate" le previsioni del modello. Ad esempio, l'errore quadratico medio spesso funge da funzione di perdita nei problemi di regressione. La fase di addestramento del modello è progettata per trovare i valori dei parametri che riducono al minimo questa perdita. Per questo motivo, la discesa del gradiente è spesso la tecnica di ottimizzazione più utilizzata nell'addestramento. L'algoritmo calcola il gradiente (o pendenza) della perdita rispetto ai parametri del modello. Con questo gradiente, si fa poi un passo nella direzione opposta per ridurre la perdita. Il tasso di apprendimento (noto anche come dimensione del passo o alfa) è la dimensione dei passaggi e rimane fisso per tutti i parametri del modello. Questo processo si ripete fino a quando il modello non raggiunge una convergenza vicina al minimo.
La convergenza si verifica idealmente al minimo globale. Nella seguente visualizzazione, possiamo vedere che il valore della perdita è inferiore come minimo locale rispetto all'area immediatamente circostante, ma non necessariamente il più basso complessivo. Il minimo globale è il valore più basso assoluto della funzione di perdita nell'intero dominio, che rappresenta la migliore soluzione possibile per il problema.
Se il tasso di apprendimento non è abbastanza piccolo, l'algoritmo spesso convergerà su un minimo locale. Un tasso ben selezionato è fondamentale per ridurre al minimo la funzione di perdita e raggiungere la convergenza al minimo globale.
Questa visualizzazione illustra l'effetto del tasso di apprendimento sulla convergenza. Una velocità di apprendimento ridotta porta a una convergenza lenta ma stabile (a sinistra), mentre una velocità di apprendimento elevata può causare overshooting e instabilità (a destra).
Il principale elemento di differenziazione tra la discesa del gradiente tradizionale e la discesa del gradiente stocastico è che SGD aggiorna i pesi del modello utilizzando un singolo esempio di addestramento alla volta. L'esempio viene scelto in modo casuale a ogni iterazione.1 La discesa del gradiente utilizza l'intero set di dati di addestramento per calcolare il gradiente prima di ogni aggiornamento dei parametri. Questa differenza nell'utilizzo dei dati è ciò che rende SGD molto meno costoso dal punto di vista computazionale e più facile da scalare per set di dati di grandi dimensioni. In alternativa, il comportamento di convergenza di SGD è più rumoroso del rumore di GD perché l'unico datapoint di esempio potrebbe non essere una buona rappresentazione del set di dati. Questa rappresentazione errata aggiorna i punti in una direzione leggermente "sbagliata". Tuttavia, questa casualità è ciò che rende SGD più veloce e talvolta migliore per i problemi di ottimizzazione non convessa perché può sfuggire ai minimi locali poco profondi o ai punti di sella.
In senso stretto, SGD è stato originariamente definito per aggiornare i parametri utilizzando esattamente un campione di allenamento alla volta. Nell'uso moderno, il termine "SGD" è usato in modo approssimativo per indicare "discesa del gradiente in minibatch", una variante di GD in cui vengono utilizzati piccoli batch di dati di addestramento alla volta. Il vantaggio principale dell'utilizzo di sottoinsiemi di dati piuttosto che di un singolo campione è un livello di rumore inferiore, perché il gradiente è uguale alla media delle perdite dal minibatch. Per questo motivo, la discesa del gradiente in minibatch è l'impostazione predefinita nel deep learning. Al contrario, l'SGD rigido è raramente utilizzato nella pratica. Inoltre, questi termini sono confusi dalla maggior parte delle librerie di machine learning come PyTorch e TensorFlow: gli ottimizzatori sono spesso chiamati "SGD", anche se in genere utilizzano minibatch.
La seguente illustrazione fornisce una descrizione più chiara di come l'aumento della dimensione del campione dei dati di addestramento riduca le oscillazioni e il "rumore".
Esistono molte altre varianti di GD che si basano sulla discesa del gradiente di base aggiungendo meccanismi per migliorare la velocità, la stabilità e la convergenza.
Accumulando momentum nelle dimensioni con gradienti costanti e smorzando gli aggiornamenti nelle dimensioni con gradienti mutevoli, il momentum aiuta la SGD a convergere più velocemente e con meno oscillazioni.2
I metodi di tasso di apprendimento adattivo, come AdaGrad e RMSProp, sono unici in quanto adattano individualmente il tasso di apprendimento per ogni parametro. Questo approccio è in contrasto con i metodi SGD, che utilizzano un tasso di apprendimento fisso per tutti i parametri.
AdaGrad (algoritmo di gradiente adattivo): adatta il tasso di apprendimento per ogni parametro in base ai suoi gradienti precedenti. Le caratteristiche che appaiono meno spesso hanno tassi di apprendimento più elevati, mentre le caratteristiche frequenti hanno tassi più bassi. Questo approccio fa sì che le caratteristiche poco frequenti vengano apprese più rapidamente rispetto a SGD. Il tasso di apprendimento adattivo è un ottimo metodo per l'elaborazione del linguaggio naturale (NLP) e i sistemi di raccomandazione con dati sparsi, in cui c'è una grande discrepanza nella frequenza delle caratteristiche.2
RMSProp (Root Mean Square Propagation): un'altra tecnica di ottimizzazione adattiva del tasso di apprendimento che scala il tasso di apprendimento per ogni parametro utilizzando una media mobile dei gradienti quadratici recenti. La conoscenza passata del gradiente viene scartata e viene conservata solo la conoscenza attuale del gradiente.4 La velocità di apprendimento diventa maggiore per i parametri con gradienti piccoli e minore per quelli con gradienti grandi. Questo metodo elimina il problema della diminuzione del tasso di apprendimento con AdaGrad. RMSProp aiuta a mantenere stabile l'addestramento nel deep learning, soprattutto per modelli come le reti neurali ricorrenti (RNN), e funziona bene su problemi in cui l'obiettivo continua a cambiare, come nell'apprendimento per rinforzo.
SGD e altre varianti GD sono utili quando il tempo di addestramento è il collo di bottiglia.5
| Variante | Dati utilizzati per ogni fase | Funzione principale | Uso comune |
|---|---|---|---|
| GD | Tutti i dati | Stabile ma lento | Set di dati di piccole dimensioni |
| SGD | 1 campione per SGD classico | Rumoroso ma veloce | Apprendimento online |
| Mini-Batch GD | Pochi esempi | Equilibrato e scalabile | Deep Learning |
| Momentum | Batch/mini-batch | Accelera nella giusta direzione | Reti neurali |
| NAG | Batch/mini-batch | Slancio verso il futuro | Convergenza più rapida |
| AdaGrad | Mini-lotto | Tasso di apprendimento adattivo | Dati sparsi |
| RMSProp | Mini-lotto | Correzioni al decadimento di AdaGrad | RNN, reti profonde |
| Adamo | Mini-lotto | Momentum + RMSProp | Scelta predefinita oggi |
L'obiettivo di SGD è trovare i parametri che avvicinano il più possibile le previsioni del nostro modello ai valori reali . In altre parole, vogliamo minimizzare la funzione di perdita, .
Nel caso della regressione lineare, tali parametri sono (peso) e (bias). Quindi in questo caso, ridurre al minimo equivale a ridurre al minimo .
Un'analogia comunemente usata quando si insegna la discesa del gradiente è che GD è come camminare in discesa su una montagna fino a raggiungere una valle (la perdita minima). Immaginiamo il gradiente della funzione di perdita che punta in salita:per andare in discesa dobbiamo fare un passo nella direzione opposta.
La regola generale di aggiornamento per un parametro è:
dov'è il tasso di apprendimento e dov'è il gradiente della perdita rispetto a .
SGD utilizza un solo campione scelto a caso per approssimare il gradiente:
Nota, le lettere minuscole rappresentano la perdita di un singolo esempio di addestramento. Le lettere maiuscole, invece indicano la funzione di perdita complessiva (la media di tutte le perdite individuali nel set di dati). Questo errore globale è ciò che stiamo davvero cercando di ridurre al minimo durante la formazione.
Finiamo di esaminare l'esempio della regressione lineare con SGD.
Per un campione , la previsione è:
La perdita locale è l'errore al quadrato per un campione:
Ora, durante la retropropagazione, i parametri del modello vengono aggiornati utilizzando la regola della catena, che calcola i gradienti della funzione di perdita rispetto a ciascun parametro.5 I gradienti (derivati) sono:
Con SGD, aggiorniamo ciascuno di questi parametri, e utilizzando le seguenti regole:
Invece di calcolare un forte gradiente medio sull'intero set di dati, SGD utilizza una stima casuale leggera.
Quando si lavora con framework di apprendimento automatico, è possibile utilizzare classi di ottimizzazione SGD integrate. Per esempio,
A scopo di apprendimento, esaminiamo da zero una semplice implementazione Python di SGD.
Ribadiamo che il nostro obiettivo è trovare i migliori parametri (pesi del modello) che minimizzano la funzione di perdita (una misura di quanto siano sbagliate le nostre previsioni). Aggiorneremo un campione alla volta o in batch molto piccoli.
Per iniziare, possiamo inizializzare i valori dei parametri (pesi) in modo casuale. Successivamente, possiamo selezionare un punto dati casuale . Da lì, calcoleremo la previsione e l'errore. Per questa semplice dimostrazione, proviamo a inserire una semplice riga: . La fase successiva del processo è la retropropagazione, in cui i gradienti della funzione di perdita vengono calcolati rispetto ai parametri. Questi gradienti (derivati) vengono quindi utilizzati per aggiornare i parametri durante il processo di ottimizzazione SGD. Poiché il gradiente punta alla direzione di aumento della funzione di perdita, SGD sottrae ogni gradiente dal rispettivo valore del parametro corrente. Possiamo pensare a tutto questo come a un movimento nella direzione opposta al gradiente per diminuire la funzione di perdita. Da qui la "discesa" nel nome discesa del gradiente stocastico. Ripetiamo questi passaggi fino a un numero fisso di epoche o quando la perdita è inferiore alla tolleranza. Quest'ultimo significherebbe che la perdita difficilmente cambia, e miglioreremo più la funzione oggettiva. In altre parole, ci fermiamo quando l'algoritmo converge.
SGD è il metodo di ottimizzazione più comune per l'addestramento di neural networks profonde. Nel deep learning, un subset di machine learning nel più ampio campo della data science, l'obiettivo è che i computer simulino il complesso processo decisionale del cervello umano. I modelli ML tradizionali utilizzano reti neurali semplici costituite da uno o due strati, mentre i modelli di deep learning utilizzano tre o più livelli. In genere, sono necessari centinaia o migliaia di strati per addestrare i modelli. Dato che SGD ha facilità di scalare per set di formazione di grandi dimensioni, è spesso l'approccio ideale per l'addestramento delle reti neurali. Altre applicazioni dell'addestramento SGD includono la regressione ridge, la regressione logistica regolarizzata e l'ottimizzazione della funzione hinge loss utilizzata nelle macchine a vettori di supporto (SVM) con un kernel lineare.
SGD è una variante di GD che riduce al minimo la funzione di perdita di un modello di machine learning utilizzando un singolo campione di dati alla volta. Questo approccio è diverso da GD, che dipende dall'intero set di dati in ogni fase per calcolare il gradiente. Esistono diverse altre varianti GD che possono essere raggruppate come metodi di apprendimento adattivi o basati sul momentum. La discesa del gradiente di momentum e il gradiente accelerato di Nesterov sono esempi del primo caso. Questi metodi utilizzano il momentum accumulato nelle dimensioni con gradienti coerenti e attenuano gli aggiornamenti nelle dimensioni con gradienti che cambiano. In questo modo, SGD può convergere più velocemente e con meno oscillazioni. I metodi di velocità di apprendimento adattivo come AdaGrad e RMSProp adattano la velocità di apprendimento per ciascun parametro individualmente, a differenza del SGD tradizionale, che utilizza una velocità di apprendimento fissa. Inoltre, metodi ibridi come Adam offrono una potente alternativa combinando i punti di forza di GD e RMSProp basati sul momentum.
Addestra, convalida, adatta e implementa le funzionalità di AI generativa, foundation model e machine learning con IBM watsonx.ai, uno studio aziendale di nuova generazione per builder AI. Crea applicazioni AI in tempi ridotti e con una minima quantità di dati.
Metti l'AI al servizio della tua azienda grazie all'esperienza leader di settore e alla gamma di soluzioni di IBM nel campo dell'AI.
Reinventa i flussi di lavoro e le operazioni critiche aggiungendo l'AI per massimizzare le esperienze, il processo decisionale in tempo reale e il valore di business.
1 Bottou, L. (2010). Large-Scale Machine Learning with Stochastic Gradient Descent. Lechevallier, Y., Saporta, G. (eds) Estratti da COMPSTAT’2010. Physica-Verlag HD.
2 Ruder, S. (2016). An overview of gradient descent optimization algorithms.
3 Tian, Y., Zhang, Y., & Zhang, H. (2023). Recent Advances in Stochastic Gradient Descent in Deep Learning. Mathematics, 11(3), 682.
4 Haji, S. H., & Abdulazeez, A. M. (2021). Comparison of optimization techniques based on gradient descent algorithm: A review. PalArch’s Journal of Archaeology of Egypt/Egyptology, 18(4), 2715-2743.
5 Bottou, L. (2012). Stochastic Gradient Descent Tricks. Montavon, G., Orr, G.B., Müller, KR. (eds) Neural Networks: Tricks of the Trade. Lecture Notes in Computer Science, vol 7700. Springer, Berlino, Heidelberg.