cos'è la discesa stocastica del gradiente

Autore

Anna Gutowska

AI Engineer, Developer Advocate

IBM

Cos'è la discesa stocastica del gradiente

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.

Discesa del gradiente

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.

Rappresentazione grafica della convergenza Rappresentazione grafica della convergenza

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.

Minimo locale e globale nello spazio tridimensionale Minimo locale e globale nello spazio tridimensionale

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.

Effetto del tasso di apprendimento sulla convergenza Effetto del tasso di apprendimento sulla convergenza

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).

Da GD a SGD

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".

Varianti della discesa del gradiente

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.

Metodi basati sul momentum:

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

SGD con e senza momentum
  • Discesa del gradiente di momentum: incorpora un termine relativo alla "velocità", una media dei gradienti precedenti che dà maggiore importanza a quelli recenti. Questo approccio riduce gli zigzag (o oscillazioni), aiutando l'algoritmo a muoversi più velocemente nella giusta direzione.

  • NAG (gradiente accelerato di Nesterov): un metodo momentum migliorato che accelera e attenua la convergenza "guardando avanti" verso la direzione dei parametri prima di calcolare il gradiente. In altre parole, anticipa il gradiente futuro e utilizza questa informazione per informare la fase di aggiornamento attuale.3

Metodi del tasso di apprendimento adattivo:

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.

Metodi ibridi:

  • Adam (stima del momento adattivo): combina GD basato sul momentum con RMSProp, tracciando sia i gradienti passati che la media del quadrato dei gradienti.4 Questa combinazione consente un rapido tasso di convergenza anche per set di dati rumorosi e sparsi.3 Inoltre, gli iperparametri predefiniti, come un tasso di apprendimento di 0,001 in molti framework, funzionano bene fin da subito. Per set di dati su larga scala, tuttavia, un SGD con momentum può portare a una migliore generalizzazione. Gli aggiustamenti aggressivi per parametro di Adam possono comportare un overfitting dei dati di training o un assestamento in minimi netti che non generalizzano altrettanto bene.

SGD e altre varianti GD sono utili quando il tempo di addestramento è il collo di bottiglia.5

VarianteDati utilizzati per ogni faseFunzione principaleUso comune
GDTutti i datiStabile ma lentoSet di dati di piccole dimensioni
SGD1 campione per SGD classicoRumoroso ma veloceApprendimento online
Mini-Batch GDPochi esempiEquilibrato e scalabileDeep Learning
MomentumBatch/mini-batchAccelera nella giusta direzioneReti neurali
NAGBatch/mini-batchSlancio verso il futuroConvergenza più rapida
AdaGradMini-lottoTasso di apprendimento adattivoDati sparsi
RMSPropMini-lottoCorrezioni al decadimento di AdaGradRNN, reti profonde
AdamoMini-lottoMomentum + RMSPropScelta predefinita oggi

Capire la matematica

L'obiettivo di SGD è trovare i parametri θ che avvicinano il più possibile le previsioni del nostro modello ai valori reali y . In altre parole, vogliamo minimizzare la funzione di perdita, L(θ) .

Nel caso della regressione lineare, tali parametri sono w (peso) e b (bias). Quindi in questo caso, ridurre al minimo L(θ) equivale a ridurre al minimo  L(w,b) .

 yi^=w·xi+b

L(w,b)=1ni=1n(yi-yi^)2

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 L  che punta in salita:per andare in discesa dobbiamo fare un passo nella direzione opposta.

La regola generale di aggiornamento per un parametro θ  è:

θ:=θ-η·θL(θ)

dov'è η il tasso di apprendimento e θL(θ) dov'è il gradiente della perdita rispetto a θ .

SGD utilizza un solo campione scelto a caso (xi,yi) per approssimare il gradiente:

θL(θ)θ(xi,yi;θ)

Nota, le lettere minuscole (xi,yi;θ) rappresentano la perdita di un singolo esempio di addestramento. Le lettere maiuscole, invece L(θ) 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.

Esempio: regressione lineare con SGD

Finiamo di esaminare l'esempio della regressione lineare con SGD.

Per un campione (xi,yi) , la previsione è:

 yi^=w·xi+b

La perdita locale è l'errore al quadrato per un campione:

 (xi,yi;w,b)=(yi-(wxi+b))2

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:

 w=-2xi(yi-(wxi+b))

 b=-2(yi-(wxi+b))

Con SGD, aggiorniamo ciascuno di questi parametri, w e b  utilizzando le seguenti regole:

 w:=w-η·(-2xi(yi-(wxi+b)))

 b:=b-η·(-2(yi-(wxi+b)))

Invece di calcolare un forte gradiente medio sull'intero set di dati, SGD utilizza una stima casuale leggera.

Semplice implementazione Python di SGD

Quando si lavora con framework di apprendimento automatico, è possibile utilizzare classi di ottimizzazione SGD integrate. Per esempio, torch.optim.SGD  per PyTorchtf.keras.optimizers.SGD  per Keras integrato in TensorFlow e SGDRegressor  per Scikit-learn.

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 (x,y) . Da lì, calcoleremo la previsione e l'errore. Per questa semplice dimostrazione, proviamo a inserire una semplice riga: y=mx+b . 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.

import numpy as np 
 
def stochastic_gradient_descent(X, y, lr=0.01, epochs=100, tol=1e-6): 
    “”” 
    Perform Stochastic Gradient Descent (SGD) to fit a line y = w*x + b 
     
    Parameters: 
        X (ndarray): Input features 
        y (ndarray): Target values 
        lr (float): Learning rate (step size for updates) 
        epochs (int): Number of iterations through the dataset 
     
    Returns: 
        w (float): Learned weight 
        b (float): Learned bias 
    “”” 
    # Initialize parameters randomly 
    w = np.random.randn() 
    b = np.random.randn() 
     
    n = len(X) 
 
    prev_loss = float(‘inf’) 
     
    for epoch in range(epochs): 
        # Shuffle the data for each epoch 
        indices = np.arange(n) 
        np.random.shuffle(indices) 
         
        for i in indices: 
            xi = X[i] 
            yi = y[i] 
             
            # Prediction 
            y_pred = w * xi + b 
             
            # Compute gradients (derivatives) 
            dw = -2 * xi * (yi - y_pred)   # derivative wrt w 
            db = -2 * (yi - y_pred)        # derivative wrt b 
             
            # Update parameters 
            w -= lr * dw 
            b -= lr * db 
         
        
        # Compute loss at the end of the epoch 
        loss = np.mean((y - (w*X + b))**2) 
         
        # Check stopping condition 
        if abs(prev_loss - loss) < tol: 
            print(f”Stopped early at epoch {epoch+1}”) 
            break 
                 
        prev_loss = loss 
             
    return w, b

Applicazioni di SGD

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.

Conclusione

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.

Soluzioni correlate
IBM watsonx.ai

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.

Scopri watsonx.ai
Soluzioni di intelligenza artificiale

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.

Esplora le soluzioni AI
Consulenza e servizi sull'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.

Esplora i servizi AI
Fai il passo successivo

Ottieni l'accesso completo a funzionalità che coprono l'intero ciclo di vita dello sviluppo dell'AI. Crea soluzioni AI all'avanguardia con interfacce intuitive, workflow e accesso alle API e agli SDK standard di settore.

Esplora watsonx.ai Prenota una demo live
Note a piè di pagina

Bottou, L. (2010). Large-Scale Machine Learning with Stochastic Gradient DescentLechevallier, Y., Saporta, G. (eds) Estratti da COMPSTAT’2010. Physica-Verlag HD. 

Ruder, S. (2016). An overview of gradient descent optimization algorithms

Tian, Y., Zhang, Y., & Zhang, H. (2023). Recent Advances in Stochastic Gradient Descent in Deep LearningMathematics, 11(3), 682. 

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.

Bottou, L. (2012). Stochastic Gradient Descent TricksMontavon, G., Orr, G.B., Müller, KR. (eds) Neural Networks: Tricks of the Trade. Lecture Notes in Computer Science, vol 7700. Springer, Berlino, Heidelberg.