¿Cuál es la diferencia entre el descenso de gradiente basado en el momento y el descenso de gradiente acelerado de Nesterov?

48

Entonces, el descenso de gradiente basado en el impulso funciona de la siguiente manera:

v=self.momentummlrg

donde es la actualización de peso anterior, y g es el gradiente actual con respecto a los parámetros p , l r es la tasa de aprendizaje y s e l f . m o m e n t u m es una constante.mgplrself.momentum

pnew=p+v=p+self.momentummlrg

y el descenso acelerado de gradiente de Nesterov funciona de la siguiente manera:

pnew=p+self.momentumvlrg

que es equivalente a:

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

o

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

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

Entonces, para mí, parece que el descenso acelerado de gradiente de Nesterov solo le da más peso al término lr * g sobre el término de cambio de peso perceptible m (en comparación con el impulso anterior simple). ¿Es correcta esta interpretación?

sidra de manzana
fuente
77
Te pediría que escribieras se pregunta demasiado? LATEX
Rodrigo de Azevedo

Respuestas:

35

La respuesta de Arech sobre el impulso de Nesterov es correcta, pero el código esencialmente hace lo mismo. Entonces, a este respecto, el método de Nesterov da más peso al término , y menos peso al término v .lrgv

Para ilustrar por qué la implementación de Keras es correcta, tomaré prestado el ejemplo de Geoffrey Hinton .
ingrese la descripción de la imagen aquí

El método de Nesterov adopta el enfoque "apuesta-> corrección".
w = w + v El vector marrón es m v (apuesta / salto), el vector rojo es - l r ( w + m v ) (corrección), y el vector verde es m v - l r v=mvlr(w+mv)
w=w+v
mvlr(w+mv) (donde realmente deberíamos movernos a). ( ) es la función de gradiente.mvlr(w+mv)()

El código se ve diferente porque se mueve por el vector marrón en lugar del vector verde , ya que el método de Nesterov solo requiere evaluar lugar de ( w ) . Por eso en cada paso queremos(w+mv)=:g(w)

  1. volver a donde estábamos (10)
  2. siga el vector verde a donde deberíamos estar (02)
  3. hacer otra apuesta (23)

El código de Keras escrito para abreviar es , y hacemos algunas matemáticasp=p+m(mvlrg)lrg

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

1023123

pmvp

dontloo
fuente
2
@youkaichao prueba esto youtube.com/watch?v=LdkkZglLZ0Q
dontloo
13

Me parece que la pregunta del OP ya fue respondida, pero trataría de dar otra explicación (con suerte intuitiva) sobre el momento y la diferencia entre el momento clásico (CM) y el gradiente acelerado (NAG) de Nesterov.


tl; dr
Simplemente salte a la imagen al final.
El razonamiento de NAG_ball es otra parte importante, pero no estoy seguro de que sería fácil de entender sin todo lo demás.



θf(θ)

En otras noticias, últimamente aparecieron estas dos bolas inteligentes:
CM_ball NAG_ball

Resulta (de acuerdo con el comportamiento observado de las bolas, y de acuerdo con el artículo sobre la importancia de la inicialización y el impulso en el aprendizaje profundo , que describe tanto CM como NAG en la sección 2) que cada bola se comporta exactamente como uno de estos métodos , y entonces los llamaríamos "CM_ball" y "NAG_ball":
(NAG_ball está sonriendo, porque recientemente vio el final de la Lección 6c - El método de impulso, por Geoffrey Hinton con Nitish Srivastava y Kevin Swersky , y por eso cree más que nunca que su comportamiento lleva a encontrar un mínimo más rápido).

Así es como se comportan las bolas:


  • θttvttθt=θt1+vt
  • vt
    • vt1
      vt1
      μ0.9μ<1μvt1
      μ


    • ϵϵ>0
      ϵ
      gϵg
  • vt=μvt1ϵg

  • vt=μvt1ϵf(θt1)

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

    Razonamiento de NAG_ball

    • Cualquier salto que ocurra primero, mi Momentum Jump sería el mismo.
      Así que debería considerar la situación como si ya hubiera realizado mi Momentum Jump, y estoy a punto de hacer mi Slope Jump.
    • Ahora, mi Slope Jump comenzará conceptualmente desde aquí, pero puedo elegir si calculo cuál sería mi Slope Jump como si comenzara antes del Momentum Jump, o como si comenzara aquí.
    • θθθ



θ
f(θ)7

Ejemplo de CM_ball vs NAG_ball


Apéndice 1 - Una demostración del razonamiento de NAG_ball

En este fascinante gif de Alec Radford , puedes ver que NAG se desempeña posiblemente mejor que CM ("Momentum" en el gif).
(El mínimo es dónde está la estrella y las curvas son líneas de contorno . Para obtener una explicación sobre las líneas de contorno y por qué son perpendiculares al gradiente, vea los videos 1 y 2 del legendario 3Blue1Brown ).

NAG mejor que CM (Momentum)

Un análisis de un momento específico demuestra el razonamiento de NAG_ball:

CM vs NAG en un momento específico

  • La flecha morada (larga) es el subpaso de impulso.
  • La flecha roja transparente es el subpaso de gradiente si comienza antes del subpaso de impulso.
  • La flecha negra es el subpaso de gradiente si comienza después del subpaso de impulso.
  • CM terminaría en el blanco de la flecha roja oscura.
  • NAG terminaría en el blanco de la flecha negra.

Apéndice 2 - cosas / términos que inventé (por el bien de la intuición)

  • CM_ball
  • NAG_ball
  • Doble salto
  • Momentum Jump
  • Momento perdido debido a la fricción con el aire.
  • Salto en pendiente
  • Ansia de una pelota
  • Yo observando las bolas ayer

Apéndice 3 - términos que no inventé

Oren Milman
fuente
1
Encuentro la parte de "Aquí es cómo se comportan las bolas: ..." a "para apuntar en la dirección de θ a un mínimo (con la magnitud relativamente correcta)". excelente como explicación de la diferencia.
Poete Maudit
12

No lo creo.

Hay una buena descripción de las propiedades de Nesterov Momentum (también conocido como Gradiente Acelerado de Nesterov) en, por ejemplo, Sutskever, Martens et al. "Sobre la importancia de la inicialización y el impulso en el aprendizaje profundo" 2013 .

La principal diferencia es que en el momento clásico primero corrige su velocidad y luego da un gran paso de acuerdo con esa velocidad (y luego repite), pero en el momento de Nesterov primero da un paso en la dirección de la velocidad y luego realiza una corrección a un vector de velocidad basado en nueva ubicación (luego repita).

es decir, impulso clásico:

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

Si bien el impulso de Nesterov es este:

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

En realidad, esto hace una gran diferencia en la práctica ...

Arech
fuente
5

Agregado: un curso de Stanford sobre redes neuronales, cs231n , ofrece otra forma de los pasos:

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

Aquí vestá el estado de velocidad, también conocido como paso, y mues un factor de impulso, típicamente 0,9 más o menos. ( v, xY learning_ratepueden ser vectores muy largas; con numpy, el código es el mismo.)

ven la primera línea es el descenso en gradiente con impulso; v_nesterovextrapola, continúa. Por ejemplo, con mu = 0.9,

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

La siguiente descripción tiene 3 términos: el
término 1 solo es descenso de gradiente simple (GD),
1 + 2 da GD + impulso,
1 + 2 + 3 da Nesterov GD.

xtytytxt+1

yt=xt+m(xtxt1) - impulso, predictor
xt+1=yt+h g(yt) - gradiente

gtf(yt)h

yt

yt+1=yt
+ h gt - gradiente
+ m (ytyt1) - impulso de paso
+ m h (gtgt1) - impulso gradiente

El último término es la diferencia entre GD con impulso simple y GD con impulso de Nesterov.


mmgrad
+ m (ytyt1) - impulso de paso
+ mgrad h (gtgt1) - impulso gradiente

mgrad=0mgrad=m
mgrad>0
mgrad.1

mtht



(x/[cond,1]100)+ripple×sin(πx)

ingrese la descripción de la imagen aquí

denis
fuente