Adicionado: um curso de Stanford sobre redes neurais,
cs231n , fornece mais uma forma das etapas:
v = mu * v_prev - learning_rate * gradient(x) # GD + momentum
v_nesterov = v + mu * (v - v_prev) # keep going, extrapolate
x += v_nesterov
Aqui v
está a velocidade, também conhecida como etapa, ou estado, e mu
é um fator de momento, normalmente 0,9. ( v
, x
e learning_rate
pode ser vetores muito longos; com numpy, o código é o mesmo.)
v
na primeira linha há descida gradiente com momento;
v_nesterov
extrapola, continua. Por exemplo, com mu = 0,9,
v_prev v --> v_nesterov
---------------
0 10 --> 19
10 0 --> -9
10 10 --> 10
10 20 --> 29
A descrição a seguir tem três termos: o
termo 1 por si só é descida em gradiente simples (GD),
1 + 2 gera GD + momento,
1 + 2 + 3 gera Nesterov GD.
xt→ytyt→xt+1
yt=xt+m(xt−xt−1) - momento, preditor
xt+1=yt+h g(yt) - gradiente
gt≡−∇f(yt)h
yt
yt+1=yt
+ h gt - gradiente
+ m (yt−yt−1) - momento da etapa
+ m h (gt−gt−1) - momento do gradiente
O último termo é a diferença entre GD com momento simples e GD com momento Nesterov.
mmgrad
+ m (yt−yt−1) - momento da etapa
+ mgrad h (gt−gt−1) - momento do gradiente
mgrad=0mgrad=m
mgrad>0
mgrad∼−.1
mtht
(x/[cond,1]−100)+ripple×sin(πx)