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 )$ :