Aggiunto: un corso di Stanford sulle reti neurali,
cs231n , fornisce ancora un'altra forma dei passaggi:
v = mu * v_prev - learning_rate * gradient(x) # GD + momentum
v_nesterov = v + mu * (v - v_prev) # keep going, extrapolate
x += v_nesterov
Ecco la v
velocità aka step aka state, ed mu
è un fattore di momentum, in genere 0,9 o giù di lì. ( v
, x
E learning_rate
possono essere molto lunghi vettori, con numpy, il codice è lo stesso.)
v
nella prima riga è discesa gradiente con quantità di moto;
v_nesterov
estrapola, continua. Ad esempio, con mu = 0.9,
v_prev v --> v_nesterov
---------------
0 10 --> 19
10 0 --> -9
10 10 --> 10
10 20 --> 29
La seguente descrizione ha 3 termini:
solo il termine 1 è semplice discesa gradiente (GD),
1 + 2 indica GD + quantità di moto,
1 + 2 + 3 indica Nesterov GD.
xt→ytyt→xt+1
yt=xt+m(xt−xt−1) - momentum, predittore - gradiente
xt+1=yt+h g(yt)
dove è il gradiente negativo, e è la velocità di apprendimento del passo graduale.gt≡−∇f(yt)h
Combina queste due equazioni in una solo in , i punti in cui vengono valutati i gradienti, inserendo la seconda equazione nel primo e riorganizzando i termini:yt
yt+1=yt
+ h gt - gradiente - momento passo - momentum gradiente
+ m (yt−yt−1)
+ m h (gt−gt−1)
L'ultimo termine è la differenza tra GD con slancio normale e GD con slancio di Nesterov.
Si potrebbero usare termini di momentum separati, diciamo e : - step momentum - momentum gradientemmgrad
+ m (yt−yt−1)
+ mgrad h (gt−gt−1)
Quindi dà un chiaro slancio, Nesterov. amplifica il rumore (i gradienti possono essere molto rumorosi), è un filtro di livellamento IIR.m g r a d = m m g r a d > 0 m g r a d ∼ - .1mgrad=0mgrad=m
mgrad>0
mgrad∼−.1
A proposito, quantità di moto e dimensioni possono variare con il tempo, e , o per componente (ada * coordinate di discesa) o entrambi - più metodi che casi di test.h tmtht
Un diagramma che confronta il momento semplice con il momento di Nesterov su un semplice caso di test 2d, :
(x/[cond,1]−100)+ripple×sin(πx)