Qual è la differenza tra la discesa gradiente basata sul momento e la discesa gradiente accelerata di Nesterov?


48

Quindi la discesa gradiente basata sul momento funziona come segue:

v=self.momentummlrg

dove è il precedente aggiornamento del peso e è il gradiente corrente rispetto ai parametri , è la velocità di apprendimento e è una costante.g p l r s e l f . m o m e n t u mmgplrself.momentum

pnew=p+v=p+self.momentummlrg

e la discesa accelerata del gradiente di Nesterov funziona come segue:

pnew=p+self.momentumvlrg

che equivale a:

pnew=p+self.momentum(self.momentummlrg)lrg

o

pnew=p+self.momentum2m(1+self.momentum)lrg

fonte: https://github.com/fchollet/keras/blob/master/keras/optimizers.py

Quindi a me sembra che la discesa accelerata del gradiente di Nesterov dia solo più peso al termine lr * g rispetto al termine di variazione del peso precedente m (rispetto al semplice momento storico). Questa interpretazione è corretta?


7
Chiedendoti di digitare sarebbe chiedere troppo? LATEX
Rodrigo de Azevedo,

Risposte:


35

La risposta di Arech sul momento di Nesterov è corretta, ma il codice essenzialmente fa la stessa cosa. Quindi, a questo proposito, il metodo Nesterov dà più peso al termine e meno peso al termine .vlrgv

Per illustrare perché l'implementazione di Keras è corretta, prenderò in prestito l' esempio di Geoffrey Hinton .
inserisci qui la descrizione dell'immagine

Il metodo Nesterov adotta l'approccio di "scommessa-> correzione". Il vettore marrone è (gamble / jump), il vettore rosso è (correzione), e il vettore verde è (dove dovremmo effettivamente spostarci). è la funzione gradiente.
w = w + v m v - l r ( w + m v ) m v - l r ( w + m v ) ( )v=mvlr(w+mv)
w=w+v
mvlr(w+mv)mvlr(w+mv)()

Il codice appare diverso perché si sposta dal vettore marrone anziché dal vettore verde , poiché il metodo Nesterov richiede solo la valutazione di invece di . Pertanto in ogni passaggio che vogliamo(w+mv)=:g(w)

  1. tornare al punto in cui eravamo(10)
  2. segui il vettore verde dove dovremmo essere(02)
  3. fare un'altra scommessa(23)

Il codice di Keras scritto in breve è , e facciamo alcuni calcolip=p+m(mvlrg)lrg

p=pmv+mv+m(mvlrg)lrg=pmv+mvlrg+m(mvlrg)=pmv+(mvlrg)+m(mvlrg)

e questo è esattamente . In realtà il codice originale prende un percorso più breve . 1023123

Il valore stimato effettivo (vettore verde) dovrebbe essere , che dovrebbe essere vicino a quando l'apprendimento converge.pmvp


2
@youkaichao prova questo youtube.com/watch?v=LdkkZglLZ0Q
dontloo il

13

Mi sembra che alla domanda del PO sia già stata data una risposta, ma proverei a dare un'altra spiegazione (si spera intuitiva) sullo slancio e la differenza tra il momento classico (CM) e il gradiente accelerato di Nesterov (NAG).


tl; dr
Basta saltare all'immagine alla fine.
Il ragionamento di NAG_ball è un'altra parte importante, ma non sono sicuro che sarebbe facile da capire senza tutto il resto.



CM e NAG sono entrambi metodi per scegliere il prossimo vettore nello spazio dei parametri, al fine di trovare un minimo di una funzione .θf(θ)

In altre notizie, recentemente sono comparse queste due palle senzienti selvagge:
CM_ball NAG_ball

Si scopre (in base al comportamento osservato delle palline e in base all'importanza dell'inizializzazione e della dinamica dell'apprendimento profondo , che descrive sia CM che NAG nella sezione 2) che ogni pallina si comporta esattamente come uno di questi metodi , e così li chiameremmo "CM_ball" e "NAG_ball":
(NAG_ball sorride, perché ha recentemente visto la fine della lezione 6c - Il metodo momentum, di Geoffrey Hinton con Nitish Srivastava e Kevin Swersky , e quindi crede più che mai che il suo comportamento porta a trovare un minimo più veloce.)

Ecco come si comportano le palle:

  • Invece di rotolare come normali palle, saltano tra i punti nello spazio dei parametri.
    Sia la - una palla nello spazio dei parametri e sia il -esimo salto della palla . Quindi saltare tra i punti nello spazio dei parametri può essere descritto da .θttvttθt=θt1+vt
  • Non solo saltano invece di tirare, ma anche i loro salti sono speciali: ogni salto è in realtà un doppio salto, che è la composizione di due salti: vt
    • Momentum Jump: un salto che utilizza lo slancio di , l'ultimo doppio salto. Una piccola frazione dello slancio di viene persa a causa dell'attrito con l'aria. Sia la frazione del momento che rimane (le palle sono abbastanza aerodinamiche, quindi di solito ). Quindi il Momentum Jump è uguale a . (In entrambi CM e NAG, è un iperparametro chiamato "coefficiente di quantità di moto".)vt1
      vt1
      μ0.9μ<1μvt1
      μ
    • Slope Jump - un salto che mi ricorda il risultato di mettere una palla normale su una superficie - la palla inizia a rotolare nella direzione della pendenza più ripida verso il basso, mentre più la pendenza è ripida, maggiore è l'accelerazione.
      Allo stesso modo, il Slope Jump è nella direzione del pendio più ripido verso il basso (la direzione opposta al gradiente), e più grande è il gradiente, più il salto è lontano.
      Il Slope Jump dipende anche da , il livello di entusiasmo della palla (naturalmente, ): più la palla è desiderosa, più il Slope Jump la prenderebbe. (In entrambi CM e NAG, è un iperparametro chiamato "tasso di apprendimento".) Siaϵϵ>0
      ϵ
      gessere il gradiente nella posizione iniziale del Salto in pendenza. Quindi il Slope Jump è uguale a .ϵg
  • Quindi per entrambe le palle il doppio salto è uguale a: L'unica differenza tra le palle è l'ordine dei due salti nel doppio salto.
    vt=μvt1ϵg
  • CM_ball non pensava che avesse importanza, quindi decise di iniziare sempre con il Slope Jump.
    Pertanto, il doppio salto di CM_ball è:
    vt=μvt1ϵf(θt1)
  • Al contrario, NAG_ball ci ha pensato per un po 'di tempo, quindi ha deciso di iniziare sempre con il Momentum Jump.
    Pertanto, il doppio salto di NAG_ball è:

    vt=μvt1ϵf(θt1+μvt1)

    Il ragionamento di NAG_ball

    • Qualunque sia il salto che viene prima, il mio Momentum Jump sarebbe lo stesso.
      Quindi dovrei considerare la situazione come se avessi già fatto il mio Momentum Jump e sto per fare il mio Slope Jump.
    • Ora, il mio Slope Jump inizierà concettualmente da qui, ma posso scegliere se calcolare quale sarebbe il mio Slope Jump come se fosse iniziato prima del Momentum Jump o come se fosse iniziato qui.
    • Pensare in questo modo chiarisce che quest'ultimo è meglio, come generalmente, il gradiente ad un certo punto indica approssimativamente la direzione da al minimo (con la magnitudine relativamente giusta), mentre il gradiente ad alcuni è meno probabile che l'altro punto ti indichi nella direzione da al minimo (con la magnitudine relativamente giusta).θθθ

Infine, ieri ho avuto la fortuna di osservare ognuna delle palline che saltano in uno spazio di parametri unidimensionale.
Penso che guardare le loro posizioni mutevoli nello spazio dei parametri non sarebbe di grande aiuto per ottenere l'intuizione, poiché questo spazio dei parametri è una linea.
Quindi, invece, per ogni palla ho disegnato un grafico bidimensionale in cui l'asse orizzontale è . Quindi ho disegnato usando un pennello nero e ho anche disegnato ogni palla nelle sue prime posizioni, insieme ai numeri per mostrare l'ordine cronologico delle posizioni. Infine, ho disegnato frecce verdi per mostrare la distanza nello spazio dei parametri (ovvero la distanza orizzontale nel grafico) di ciascun salto del momento e del salto della pendenza.θ
f(θ)7

Esempio di CM_ball vs NAG_ball


Appendice 1 - Una dimostrazione del ragionamento di NAG_ball

In questa ipnotizzante gif di Alec Radford , puoi vedere NAG esibirsi probabilmente meglio di CM ("Momentum" nella gif).
(Il minimo è dove si trova la stella e le curve sono linee di contorno . Per una spiegazione delle linee di contorno e del perché sono perpendicolari alla sfumatura, vedere i video 1 e 2 del leggendario 3Blue1Brown .)

NAG meglio di CM (Momentum)

Un'analisi di un momento specifico dimostra il ragionamento di NAG_ball:

CM vs NAG in un momento specifico

  • La (lunga) freccia viola è la sottofase del momento.
  • La freccia rossa trasparente è la sottofase di gradiente se inizia prima della sottofase di slancio.
  • La freccia nera è la sottofase di gradiente se inizia dopo la sottofase di slancio.
  • CM sarebbe finito nel bersaglio della freccia rosso scuro.
  • Il NAG sarebbe finito nel bersaglio della freccia nera.

Appendice 2 - cose / termini che ho inventato (per amor dell'intuizione)

  • CM_ball
  • NAG_ball
  • Doppio salto
  • Momentum Jump
  • Momento perso a causa dell'attrito con l'aria
  • Slope Jump
  • L'entusiasmo di una palla
  • Ieri osservando le palle

Appendice 3 - Termini che non ho inventato


1
Trovo la parte da "Ecco come si comportano le palle: ..." a "per indicarti la direzione da θ al minimo (con la magnitudine relativamente giusta)." eccellente come spiegazione della differenza.
Poete Maudit,

12

Io non la penso così.

C'è una buona descrizione delle proprietà di Nesterov Momentum (aka Nesterov Accelerated Gradient) in, ad esempio, Sutskever, Martens et al. "Sull'importanza dell'inizializzazione e dello slancio nell'apprendimento profondo" 2013 .

La differenza principale è nel momento classico che prima correggi la tua velocità e poi fai un grande passo in base a quella velocità (e poi ripeti), ma nel momento di Nesterov fai prima un passo nella direzione della velocità e poi fai una correzione su un vettore di velocità basato in una nuova posizione (quindi ripetere).

cioè momento classico:

vW(t+1) = momentum.*Vw(t) - scaling .* gradient_F( W(t) )
W(t+1) = W(t) + vW(t+1)

Mentre lo slancio di Nesterov è questo:

vW(t+1) = momentum.*Vw(t) - scaling .* gradient_F( W(t) + momentum.*vW(t) )
W(t+1) = W(t) + vW(t+1)

In realtà, questo fa un'enorme differenza nella pratica ...


5

Aggiunto: un corso di Stanford sulle reti neurali, cs231n , fornisce ancora un'altra forma dei passaggi:

v = mu * v_prev - learning_rate * gradient(x)   # GD + momentum
v_nesterov = v + mu * (v - v_prev)              # keep going, extrapolate
x += v_nesterov

Ecco la vvelocità aka step aka state, ed muè un fattore di momentum, in genere 0,9 o giù di lì. ( v, xE learning_ratepossono essere molto lunghi vettori, con numpy, il codice è lo stesso.)

vnella prima riga è discesa gradiente con quantità di moto; v_nesterovestrapola, continua. Ad esempio, con mu = 0.9,

v_prev  v   --> v_nesterov
---------------
 0  10  -->  19
10   0  -->  -9
10  10  -->  10
10  20  -->  29

La seguente descrizione ha 3 termini:
solo il termine 1 è semplice discesa gradiente (GD),
1 + 2 indica GD + quantità di moto,
1 + 2 + 3 indica Nesterov GD.

xtytytxt+1

yt=xt+m(xtxt1) - momentum, predittore - gradiente
xt+1=yt+h g(yt)

dove è il gradiente negativo, e è la velocità di apprendimento del passo graduale.gtf(yt)h

Combina queste due equazioni in una solo in , i punti in cui vengono valutati i gradienti, inserendo la seconda equazione nel primo e riorganizzando i termini:yt

yt+1=yt
+ h gt - gradiente - momento passo - momentum gradiente
+ m (ytyt1)
+ m h (gtgt1)

L'ultimo termine è la differenza tra GD con slancio normale e GD con slancio di Nesterov.


Si potrebbero usare termini di momentum separati, diciamo e : - step momentum - momentum gradientemmgrad
+ m (ytyt1)
+ mgrad h (gtgt1)

Quindi dà un chiaro slancio, Nesterov. amplifica il rumore (i gradienti possono essere molto rumorosi), è un filtro di livellamento IIR.m g r a d = m m g r a d > 0 m g r a d- .1mgrad=0mgrad=m
mgrad>0
mgrad.1

A proposito, quantità di moto e dimensioni possono variare con il tempo, e , o per componente (ada * coordinate di discesa) o entrambi - più metodi che casi di test.h tmtht


Un diagramma che confronta il momento semplice con il momento di Nesterov su un semplice caso di test 2d, :
(x/[cond,1]100)+ripple×sin(πx)

inserisci qui la descrizione dell'immagine

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.