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í v
está el estado de velocidad, también conocido como paso, y mu
es un factor de impulso, típicamente 0,9 más o menos. ( v
, x
Y learning_rate
pueden ser vectores muy largas; con numpy, el código es el mismo.)
v
en la primera línea es el descenso en gradiente con impulso;
v_nesterov
extrapola, 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.
xt→ytyt→xt+1
yt=xt+m(xt−xt−1) - impulso, predictor
xt+1=yt+h g(yt) - gradiente
gt≡−∇f(yt)h
yt
yt+1=yt
+ h gt - gradiente
+ m (yt−yt−1) - impulso de paso
+ m h (gt−gt−1) - impulso gradiente
El último término es la diferencia entre GD con impulso simple y GD con impulso de Nesterov.
mmgrad
+ m (yt−yt−1) - impulso de paso
+ mgrad h (gt−gt−1) - impulso gradiente
mgrad=0mgrad=m
mgrad>0
mgrad∼−.1
mtht
(x/[cond,1]−100)+ripple×sin(πx)