IA 101

Che cos’è la Discesa del Gradiente?

mm

Che cos’è la Discesa del Gradiente?

Se hai letto come vengono addestrati i network neurali, hai quasi certamente incontrato il termine “discesa del gradiente” prima. La discesa del gradiente è il metodo principale per ottimizzare le prestazioni di un network neurale, riducendo il tasso di perdita/errore della rete. Tuttavia, la discesa del gradiente può essere un po’ difficile da capire per chi è nuovo nel machine learning, e questo articolo cercherà di darti una buona intuizione di come funziona la discesa del gradiente.

La discesa del gradiente è un algoritmo di ottimizzazione. Viene utilizzato per migliorare le prestazioni di un network neurale apportando modifiche ai parametri della rete in modo che la differenza tra le previsioni della rete e i valori attuali/previsti della rete (noti come perdita) sia il più piccolo possibile. La discesa del gradiente prende i valori iniziali dei parametri e utilizza operazioni basate sul calcolo per regolare i loro valori verso i valori che renderanno la rete il più precisa possibile. Non è necessario conoscere molto calcolo per capire come funziona la discesa del gradiente, ma è necessario avere una comprensione dei gradienti.

Che cosa sono i Gradienti?

Supponiamo che ci sia un grafico che rappresenta la quantità di errore che un network neurale commette. La parte inferiore del grafico rappresenta i punti di minimo errore, mentre la parte superiore del grafico è dove l’errore è più alto. Vogliamo spostarci dalla parte superiore del grafico verso la parte inferiore. Un gradiente è solo un modo per quantificare la relazione tra errore e pesi del network neurale. La relazione tra queste due cose può essere rappresentata come una pendenza, con pesi errati che producono più errore. La pendenza della pendenza/gradiente rappresenta quanto velocemente il modello sta imparando.

Una pendenza più ripida significa che si stanno facendo grandi riduzioni dell’errore e il modello sta imparando velocemente, mentre se la pendenza è zero il modello è su un altopiano e non sta imparando. Possiamo spostarci giù per la pendenza verso meno errore calcolando un gradiente, una direzione di movimento (cambio nei parametri della rete) per il nostro modello.

Cambiamo leggermente la metafora e immaginiamo una serie di colline e valli. Vogliamo raggiungere il fondo della collina e trovare la parte della valle che rappresenta la perdita minima. Quando iniziamo in cima alla collina, possiamo fare grandi passi giù per la collina e essere sicuri che stiamo andando verso il punto di minima perdita.

Tuttavia, man mano che ci avviciniamo al punto di minima perdita, i nostri passi devono diventare più piccoli, altrimenti potremmo superare il punto di minima perdita e finire dall’altra parte. Allo stesso modo, è possibile che, regolando i pesi della rete, le regolazioni possano effettivamente portare la rete più lontano dal punto di minima perdita, e quindi le regolazioni devono diventare più piccole nel tempo. Nel contesto della discesa di una collina verso un punto di minima perdita, il gradiente è un vettore/istruzioni che dettagliano il percorso che dobbiamo seguire e quanto grandi devono essere i nostri passi.

Ora che sappiamo che i gradienti sono istruzioni che ci dicono in quale direzione muoverci (quali coefficienti devono essere aggiornati) e quanto grandi devono essere i nostri passi (quanto devono essere aggiornati i coefficienti), possiamo esplorare come viene calcolato il gradiente.

Calcolare i Gradienti e la Discesa del Gradiente

La discesa del gradiente inizia in un punto di alta perdita e, attraverso molte iterazioni, fa passi nella direzione di minima perdita, cercando di trovare la configurazione ottimale dei pesi. Foto: Роман Сузи via Wikimedia Commons, CCY BY SA 3.0 (https://commons.wikimedia.org/wiki/File:Gradient_descent_method.png)

Per eseguire la discesa del gradiente, i gradienti devono essere calcolati per primi. Per calcolare il gradiente, dobbiamo conoscere la funzione di perdita/costo. Useremo la funzione di costo per determinare la derivata. Nel calcolo, la derivata si riferisce semplicemente alla pendenza di una funzione in un punto dato, quindi stiamo essenzialmente calcolando la pendenza della collina in base alla funzione di perdita. Determiniamo la perdita eseguendo i coefficienti attraverso la funzione di perdita. Se rappresentiamo la funzione di perdita come “f”, allora possiamo affermare che l’equazione per calcolare la perdita è la seguente (stiamo semplicemente eseguendo i coefficienti attraverso la nostra funzione di costo scelta):

Perdita = f(coefficiente)

Poi calcoliamo la derivata, o determiniamo la pendenza. Ottenere la derivata della perdita ci dirà in quale direzione è verso l’alto o verso il basso la pendenza, fornendoci il segno appropriato per regolare i nostri coefficienti. Rappresenteremo la direzione appropriata come “delta”.

delta = funzione_derivata(perdita)

Ora abbiamo determinato in quale direzione è verso il basso la pendenza verso il punto di minima perdita. Ciò significa che possiamo aggiornare i coefficienti nei parametri della rete e sperare di ridurre la perdita. Aggiorniamo i coefficienti in base ai coefficienti precedenti meno il cambio di valore appropriato come determinato dalla direzione (delta) e un argomento che controlla la grandezza del cambio (la dimensione del nostro passo). L’argomento che controlla la dimensione dell’aggiornamento è chiamato “tasso di apprendimento” e lo rappresenteremo come “alpha”.

coefficiente = coefficiente – (alpha * delta)

Poi ripetiamo semplicemente questo processo fino a quando la rete non si è convergita intorno al punto di minima perdita, che dovrebbe essere vicino a zero.

È molto importante scegliere il valore giusto per il tasso di apprendimento (alpha). Il tasso di apprendimento scelto non deve essere troppo piccolo o troppo grande. Ricordiamo che man mano che ci avviciniamo al punto di minima perdita, i nostri passi devono diventare più piccoli, altrimenti potremmo superare il punto di minima perdita e finire dall’altra parte. Il punto di minima perdita è piccolo e se la nostra velocità di cambio è troppo grande, l’errore potrebbe aumentare di nuovo. Se le dimensioni dei passi sono troppo grandi, le prestazioni della rete continueranno a oscillare intorno al punto di minima perdita, superandolo da un lato e poi dall’altro. Se questo accade, la rete non si convergerà mai sulla configurazione ottimale dei pesi.

In contrasto, se il tasso di apprendimento è troppo piccolo, la rete potrebbe potenzialmente richiedere un tempo straordinariamente lungo per convergere sui pesi ottimali.

Tipi di Discesa del Gradiente

Ora che capiamo come funziona la discesa del gradiente in generale, analizziamo alcuni dei tipi di discesa del gradiente.

Discesa del Gradiente a Lotti: questo tipo di discesa del gradiente esegue tutti gli esempi di addestramento prima di aggiornare i coefficienti. Questo tipo di discesa del gradiente è probabilmente il più efficiente dal punto di vista computazionale, poiché i pesi vengono aggiornati solo una volta che l’intero lotto è stato elaborato, il che significa che ci sono meno aggiornamenti totali. Tuttavia, se il set di dati contiene un gran numero di esempi di addestramento, la discesa del gradiente a lotti può rendere l’addestramento lungo.

Discesa del Gradiente Stocastica: nella discesa del gradiente stocastica, solo un esempio di addestramento viene elaborato per ogni iterazione della discesa del gradiente e dell’aggiornamento dei parametri. Ciò si verifica per ogni esempio di addestramento. Poiché solo un esempio di addestramento viene elaborato prima che i parametri vengano aggiornati, tende a convergere più velocemente della discesa del gradiente a lotti, poiché gli aggiornamenti vengono eseguiti prima. Tuttavia, poiché il processo deve essere eseguito su ogni elemento del set di addestramento, può richiedere molto tempo per completarlo se il set di dati è grande, quindi l’uso di uno degli altri tipi di discesa del gradiente può essere preferibile.

Discesa del Gradiente a Mini-Lotti: la discesa del gradiente a mini-lotti funziona dividendo l’intero set di dati di addestramento in sottosezioni. Crea mini-lotti più piccoli che vengono eseguiti nella rete e, quando il mini-lotto è stato utilizzato per calcolare l’errore, i coefficienti vengono aggiornati. La discesa del gradiente a mini-lotti rappresenta un compromesso tra la discesa del gradiente stocastica e la discesa del gradiente a lotti. Il modello viene aggiornato più frequentemente rispetto al caso della discesa del gradiente a lotti, il che significa una convergenza leggermente più veloce e più robusta sui parametri ottimali del modello. È anche più efficiente dal punto di vista computazionale rispetto alla discesa del gradiente stocastica

Blogger e programmatore con specializzazioni in Machine Learning e Deep Learning argomenti. Daniel spera di aiutare gli altri a utilizzare il potere dell'AI per il bene sociale.