77 votos

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

Así que el descenso de gradiente basado en el momento funciona como sigue:

$v=\beta m-\eta g$

donde $m$ es la actualización del peso anterior, y $g$ es el gradiente actual con respecto a los parámetros $p$ , $\eta$ es la tasa de aprendizaje, y $\beta$ es una constante.

$p_{new} = p + v = p + \beta m - \eta g$

y el descenso de gradiente acelerado de Nesterov funciona como sigue:

$p_{new} = p + \beta v - \eta g$

lo que equivale a:

$p_{new} = p + \beta (\beta m - \eta g ) - \eta g$

o

$p_{new} = p + \beta^2 m - (1 + \beta) \eta g$

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

Así que a mí me parece que el descenso de gradiente acelerado de Nesterov sólo da más peso a la $\eta g$ sobre el término de cambio de peso anterior m (en comparación con el impulso simple). ¿Es correcta esta interpretación?

51voto

dontloo Puntos 334

La respuesta de Arech sobre el impulso de Nesterov es correcta, pero el código hace esencialmente lo mismo. Así que, en este sentido, el método Nesterov da más peso a la $lr \cdot g$ plazo, y menos peso a la $v$ plazo.

Para ilustrar por qué la implementación de Keras es correcta, tomaré prestado el ejemplo de Geoffrey Hinton ejemplo .
enter image description here

El método Nesterov adopta el enfoque "apuesta->corrección".
$v' = m \cdot v - lr \cdot \nabla(w+m \cdot v)$
$w' = w + v'$
El vector marrón es $m \cdot v$ (apuesta/salto), el vector rojo es $-lr \cdot \nabla(w+m \cdot v)$ (corrección), y el vector verde es $m \cdot v-lr \cdot \nabla(w+m \cdot v)$ (a donde deberíamos mudarnos). $\nabla(\cdot)$ es la función de gradiente.

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 sólo requiere evaluar $\nabla(w+m \cdot v) =: g$ en lugar de $\nabla(w)$ . Por lo tanto, en cada paso queremos

  1. volver a donde estábamos $(1 \rightarrow 0)$
  2. seguir el vector verde hasta donde deberíamos estar $(0 \rightarrow 2)$
  3. hacer otra apuesta $(2 \rightarrow 3)$

El código de Keras escrito para abreviar es $p' = p + m \cdot (m \cdot v - lr \cdot g) - lr \cdot g$ y hacemos algunos cálculos

$\begin{align} p' &= p - m \cdot v + m \cdot v + m \cdot (m \cdot v - lr \cdot g) - lr \cdot g\\ &= p - m \cdot v + m \cdot v - lr \cdot g + m \cdot (m \cdot v - lr \cdot g)\\ &= p - m \cdot v + (m \cdot v-lr \cdot g) + m \cdot (m \cdot v-lr \cdot g) \end{align}$

y eso es exactamente $1 \rightarrow 0 \rightarrow 2 \rightarrow 3$ . En realidad el código original toma un camino más corto $1 \rightarrow 2 \rightarrow 3$ .

El valor real estimado (vector verde) debe ser $p - m \cdot v$ que debería estar cerca de $p$ cuando el aprendizaje converge.

37voto

Nini Michaels Puntos 31

Me parece que la pregunta del OP ya fue respondida, pero trataría de dar otra explicación (espero que intuitiva) sobre el momento y la diferencia entre el Momento Clásico (CM) y el Gradiente Acelerado de Nesterov (NAG).


tl;dr
Basta con pasar a la imagen del final.
El razonamiento de NAG_ball es otra parte importante, pero no estoy seguro de que sea fácil de entender sin el resto.


Tanto CM como NAG son métodos para elegir el siguiente vector $\theta$ en el espacio de los parámetros, para encontrar el mínimo de una función $f(\theta)$ .

En otras noticias, últimamente han aparecido estas dos salvajes bolas sensibles:
CM_ball NAG_ball

Resulta (según el comportamiento observado de las bolas, y según el documento 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 por eso los llamaríamos "CM_ball" y "NAG_ball":
(NAG_ball está sonriendo, porque recientemente vio el final de Conferencia 6c - El método del momento, por Geoffrey Hinton con Nitish Srivastava y Kevin Swersky y, por tanto, 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:

  • En lugar de rodar como las bolas normales, saltan entre puntos del espacio paramétrico.
    Dejemos que $\theta_t$ ser una bola de $t$ -en el espacio de los parámetros, y que $v_t$ sea el de la pelota $t$ -a salto. Entonces, los saltos entre puntos en el espacio de los parámetros pueden ser descritos por $\theta_t=\theta_{t-1}+v_t$ .
  • No sólo saltan en lugar de rodar, sino que además sus saltos son especiales: Cada salto $v_t$ es en realidad un Doble Salto, que es la composición de dos saltos:

    • Salto de impulso - un salto que utiliza el impulso de $v_{t-1}$ El último salto doble.
      Una pequeña fracción del impulso de $v_{t-1}$ se pierde debido a la fricción con el aire.
      Dejemos que $\mu$ sea la fracción de impulso que queda (las bolas son bastante aerodinámicas, por lo que normalmente $0.9 \le \mu <1$ ). Entonces el Salto de Momento es igual a $\mu v_{t-1}$ .
      (Tanto en CM como en NAG, $\mu$ es un hiperparámetro llamado "coeficiente de impulso").

    • Slope Jump - un salto que me recuerda el resultado de poner una pelota normal en una superficie - la pelota empieza a rodar en la dirección de la pendiente más pronunciada hacia abajo, mientras que cuanto más pronunciada sea la pendiente, mayor será la aceleración.
      Del mismo modo, el Salto de Pendiente se produce en la dirección de la pendiente más pronunciada hacia abajo (la dirección opuesta al gradiente), y cuanto mayor sea el gradiente, mayor será el salto.
      El salto en pendiente también depende de $\epsilon$ El nivel de afán de la pelota (naturalmente, $\epsilon>0$ ): Cuanto más ansiosa esté la pelota, más lejos la llevará el salto en pendiente.
      (Tanto en CM como en NAG, $\epsilon$ es un hiperparámetro llamado "tasa de aprendizaje").
      Dejemos que $g$ sea el gradiente en el lugar de inicio del Salto de Pendiente. Entonces el Salto en Pendiente es igual a $-\epsilon g$ .

  • Así que para ambas bolas el Doble Salto es igual a: $$v_t=\mu v_{t-1} -\epsilon g$$ La única diferencia entre las bolas es el orden de los dos saltos en el doble salto.
  • CM_ball pensó que no importaba, por lo que decidió empezar siempre con el Salto en Pendiente.
    Así, el doble salto de CM_ball es: $$v_{t}=\mu v_{t-1}-\epsilon\nabla f\left(\theta_{t-1}\right)$$
  • Por el contrario, NAG_ball se lo pensó durante un tiempo y luego decidió empezar siempre con el salto de impulso.
    Por lo tanto, el doble salto de NAG_ball es: $$v_{t}=\mu v_{t-1}-\epsilon\nabla f\left(\theta_{t-1}+\mu v_{t-1}\right)$$

    El razonamiento de NAG_ball

    • Sea cual sea el salto que se produzca primero, mi salto de impulso será el mismo.
      Por lo tanto, debo considerar la situación como si ya hubiera hecho mi salto de impulso y estuviera a punto de hacer mi salto en pendiente.
    • Ahora, mi Salto en Pendiente va a empezar conceptualmente desde aquí, pero puedo elegir si calcular lo que sería mi Salto en Pendiente como si empezara antes del Salto en Impulso, o como si empezara aquí.
    • Si lo pensamos así, queda bastante claro que esto último es mejor, ya que generalmente, el gradiente en algún punto $\theta$ aproximadamente te señala la dirección de $\theta$ a un mínimo (con la magnitud relativamente correcta), mientras que el gradiente en algún otro punto es menos probable que apunte en la dirección de $\theta$ al mínimo (con la magnitud relativamente correcta).

Finalmente, ayer tuve la suerte de observar cada una de las bolas saltando en un espacio de parámetros unidimensional.
Creo que mirar sus posiciones cambiantes en el espacio de parámetros no ayudaría mucho a ganar intuición, ya que este espacio de parámetros es una línea.
Así que, en su lugar, para cada bola he trazado un gráfico bidimensional en el que el eje horizontal es $\theta$ .
Entonces dibujé $f(\theta)$ utilizando un pincel negro, y también dibujó cada bola en su $7$ primeros puestos, junto con los números para mostrar el orden cronológico de los puestos.
Por último, dibujé flechas verdes para mostrar la distancia en el espacio de los parámetros (es decir, la distancia horizontal en el gráfico) de cada Salto de Momento y Salto de Pendiente.

CM_ball vs NAG_ball example


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

En este hipnótico gif de Alec Radford En el caso de la NAG, se puede ver un rendimiento posiblemente mejor que el de la CM ("Momentum" en el gif).
(El mínimo es donde está la estrella, y las curvas son líneas de contorno . Para una explicación sobre las curvas de nivel y por qué son perpendiculares al gradiente, vea los vídeos 1 y 2 por el legendario 3Azul1Marrón .)

NAG better than CM (Momentum)

Un análisis de un momento concreto demuestra el razonamiento de NAG_ball:

CM vs NAG in a specific moment

  • La flecha (larga) de color púrpura es el paso secundario 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 momento.
  • CM terminaría en el objetivo de la flecha roja oscura.
  • NAG acabaría en el objetivo de la flecha negra.

Apéndice 2 - cosas/términos que me he inventado (por intuición)

  • CM_ball
  • NAG_ball
  • Doble salto
  • Salto de impulso
  • Pérdida de impulso debido a la fricción con el aire
  • Salto en pendiente
  • El afán de una pelota
  • Yo observando las bolas ayer

Anexo 3 - términos que no he inventado

15voto

Philip Puntos 11

No lo creo.

Hay una buena descripción de las propiedades del Momento Nesterov (también conocido como Gradiente Acelerado Nesterov) en, por ejemplo, Sutskever, Martens et al. "On the importance of initialization and momentum in deep learning" 2013 .

La principal diferencia es que en el impulso clásico primero se corrige la velocidad y luego se da un gran paso en función de esa velocidad (y luego se repite), pero en el impulso de Nesterov primero se da un paso en la dirección de la velocidad y luego se hace una corrección de un vector de velocidad en función de la nueva ubicación (y luego se repite).

es decir, el momento clásico:

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

Mientras que 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 supone una gran diferencia en la práctica...

11voto

MattSayar Puntos 723

Añadido: un curso de Stanford sobre redes neuronales, cs231n , da 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í v es la velocidad aka paso aka estado, y mu es un factor de impulso, normalmente 0,9 o así. ( v , x y learning_rate pueden ser vectores muy largos; con numpy, el código es el mismo).

v en la primera línea es el descenso de gradiente con impulso; v_nesterov extrapola, sigue adelante. 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 por sí solo es un simple descenso de gradiente (GD),
1 + 2 dan GD + impulso,
1 + 2 + 3 dan a Nesterov GD.

La DG de Nesterov suele describirse como la alternancia de pasos de impulso $x_t \to y_t$ y pasos de gradiente $y_t \to x_{t+1}$ :

$\qquad y_t = x_t + m (x_t - x_{t-1}) \quad $ -- impulso, predictor
$\qquad x_{t+1} = y_t + h\ g(y_t) \qquad $ -- gradiente

donde $g_t \equiv - \nabla f(y_t)$ es el gradiente negativo, y $h$ es el tamaño de los pasos, es decir, la tasa de aprendizaje.

Combine estas dos ecuaciones a una en $y_t$ sólo, los puntos en los que se evalúan los gradientes, introduciendo la segunda ecuación en la primera, y reordenando los términos:

$\qquad y_{t+1} = y_t$
$\qquad \qquad + \ h \ g_t \qquad \qquad \quad $ -- gradiente
$\qquad \qquad + \ m \ (y_t - y_{t-1}) \qquad $ -- paso de impulso
$\qquad \qquad + \ m \ h \ (g_t - g_{t-1}) \quad $ -- momento de gradiente

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


Se podrían utilizar términos de impulso separados, por ejemplo $m$ y $m_{grad}$ :
$\qquad \qquad + \ m \ (y_t - y_{t-1}) \qquad $ -- paso de impulso
$\qquad \qquad + \ m_{grad} \ h \ (g_t - g_{t-1}) \quad $ -- momento de gradiente

Entonces $m_{grad} = 0$ da un impulso sencillo, $m_{grad} = m$ Nesterov.
$m_{grad} > 0 $ amplifica el ruido (los gradientes pueden ser muy ruidoso),
$m_{grad} \sim -.1$ es un filtro de suavización IIR.

Por cierto, el impulso y el tamaño de los pasos pueden variar con el tiempo, $m_t$ y $h_t$ , o por componente (descenso de coordenadas ada*), o ambos -- más métodos que casos de prueba.


Un gráfico que compara el momento simple con el momento Nesterov en un caso de prueba simple en 2d,
$(x / [cond, 1] - 100) + ripple \times sin( \pi x )$ :

enter image description here

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X