Spiegazione dei picchi nella perdita di allenamento rispetto alle iterazioni con Adam Optimizer


16

Sto addestrando una rete neurale usando i) SGD e ii) Adam Optimizer. Quando utilizzo SGD normale, ottengo una perdita di allenamento regolare rispetto alla curva di iterazione come mostrato di seguito (quella rossa). Tuttavia, quando ho usato Adam Optimizer, la curva di perdita dell'allenamento presenta alcuni picchi. Qual è la spiegazione di questi picchi?

Dettagli del modello:

14 nodi di input -> 2 layer nascosti (100 -> 40 unità) -> 4 unità di output

Sto usando i parametri di default per Adam beta_1 = 0.9, beta_2 = 0.999, epsilon = 1e-8e batch_size = 32.

i) Con SGD ii) Con AdamCon SGD Con Adamo


Per un preavviso, abbassare il tasso di apprendimento iniziale può aiutare ad eliminare i picchi in Adam
grassetto

Risposte:


12

I picchi sono una conseguenza inevitabile della discesa del gradiente mini-batch in Adam ( batch_size=32). Alcuni mini-batch hanno dati "sfortunati" sfortunati per l'ottimizzazione, inducendo quei picchi che vedi nella tua funzione di costo usando Adam. Se provi la discesa del gradiente stocastico (come nel caso dell'uso batch_size=1), vedrai che ci sono ancora più picchi nella funzione di costo. Lo stesso non accade in (Full) Batch GD perché utilizza tutti i dati di training (ovvero la dimensione del batch è uguale alla cardinalità del set di training) in ogni epoca di ottimizzazione. Come nella tua prima immagine, il costo sta diminuendo monotonicamente senza intoppi, sembra che il titolo ( i) con SGD sia sbagliato e tu stia usando (Full) Discesa gradiente discendente invece di SGD.

Nel suo fantastico corso di Deep Learning a Coursera , Andrew Ng spiega dettagliatamente questo usando l'immagine qui sotto:

Funzioni di costo


2
"SGD ... utilizza tutti i dati di allenamento". Ne sei sicuro? Questo significa che i pesi vengono aggiornati dopo che tutti i dati sono stati trasmessi, ma questo si chiama gd a batch completo, non sgd. Lo stocastico implica il minibatch
Alex,

Grazie @Alex per aver segnalato il mio errore, l'ho già risolto e migliorato la risposta con riferimento per ulteriori informazioni.
lavagna,

@xboard - No, sto usando la discesa gradiente mini-batch per la prima.
Abdul Fatir,

7

Ho trascorso una folle quantità di tempo a eseguire il debug esplodendo gradienti e comportamenti simili. La tua risposta dipenderà dalla funzione di perdita, dai dati, dall'architettura, ecc. Ci sono centinaia di ragioni. Ne citerò alcuni.

  • Perdita-dipendente. Le perdite di perdite di dati personali devono essere tagliate, in caso contrario, potrebbero essere valutate in prossimità log(0)di previsioni / valori erratici errati nel set di dati, causando gradienti che esplodono. La maggior parte dei pacchetti (torcia, tensorflow ecc.) Implementa il clipping di default per le loro perdite.
  • Valori anomali nel set di dati.
  • εy=(X-u)/(S+ε)Sεy
  • Il batch finale in un'epoca può essere piccolo se l'insieme di dati non è divisibile per dimensione batch. Nel dataloader torcia c'è una bandiera drop_last. Small batchsize = varianza elevata

Ora, perché lo vedi con Adam e non con SGD? Chiaramente hai raggiunto una perdita inferiore con Adam. Come notato in precedenza, se il 99,9% del set di dati ha optima in un punto tranne qualche osservazione, questa potrebbe essere l'osservazione che grida "NO" e salta fuori dai minimi locali quando viene selezionata casualmente in un batch. Se lo vedi ad ogni dataset_size//batch_size+1passo, è probabilmente dovuto al fatto che il batch finale è piccolo. Scommetto che vedrai anche un picco di SGD se gli permetti di raggiungere una perdita inferiore.

Bonus: la tua riduzione molto rapida con l'ottimizzazione del momento (Adam) potrebbe significare che un livello (livello di input? Livello di output?) È inizializzato fuori scala (a pesi grandi / piccoli).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.