Hinzugefügt: Ein Stanford-Kurs über neuronale Netze,
cs231n , bietet noch eine andere Form der Schritte:
v = mu * v_prev - learning_rate * gradient(x) # GD + momentum
v_nesterov = v + mu * (v - v_prev) # keep going, extrapolate
x += v_nesterov
Hier v
ist die Geschwindigkeit oder der Schritt oder der Zustand und mu
ein Impulsfaktor, typischerweise 0,9 oder so. ( v
, x
Und learning_rate
kann sehr lang sein , Vektoren, mit numpy, wird der Code das gleiche ist.)
v
in der ersten Zeile ist die Gefälleabnahme mit Impuls;
v_nesterov
extrapoliert, macht weiter. Zum Beispiel mit mu = 0.9,
v_prev v --> v_nesterov
---------------
0 10 --> 19
10 0 --> -9
10 10 --> 10
10 20 --> 29
Die folgende Beschreibung hat 3 Terme:
Term 1 allein ist ein einfacher Gradientenabstieg (GD),
1 + 2 ergeben GD + Impuls,
1 + 2 + 3 ergeben Nesterov GD.
xt→ytyt→xt+1
yt=xt+m(xt−xt−1) - Impuls, Prädiktor
xt+1=yt+h g(yt) - Gefälle
gt≡−∇f(yt)h
yt
yt+1=yt
+ h gt - Gefälle
+ m (yt−yt−1) - Schritt Schwung
+ m h (gt−gt−1) - Gradientenimpuls
Der letzte Term ist der Unterschied zwischen GD mit normalem Impuls und GD mit Nesterov-Impuls.
mmgrad
+ m (yt−yt−1) - Schritt Schwung
+ mgrad h (gt−gt−1) - Gradientenimpuls
mgrad=0mgrad=m
mgrad>0
mgrad∼−.1
mtht
(x/[cond,1]−100)+ripple×sin(πx)