补充:关于神经网络的斯坦福大学课程
cs231n给出了另一种形式的步骤:
v = mu * v_prev - learning_rate * gradient(x) # GD + momentum
v_nesterov = v + mu * (v - v_prev) # keep going, extrapolate
x += v_nesterov
这里v
是速度又称步态,mu
是动量因子,通常为0.9左右。(v
,x
并且learning_rate
可以是很长的向量;对于numpy,代码是相同的。)
v
第一行是具有动量的梯度下降;
v_nesterov
推断,继续前进。例如,当mu = 0.9时,
v_prev v --> v_nesterov
---------------
0 10 --> 19
10 0 --> -9
10 10 --> 10
10 20 --> 29
以下描述包含3个术语:
单独的术语1是平面梯度下降(GD),
1 + 2给出GD +动量,
1 + 2 + 3给出Nesterov GD。
xt→ytyt→xt+1
yt=xt+m(xt−xt−1) -动量,预测因子
xt+1=yt+h g(yt) -渐变
gt≡−∇f(yt)h
yt
yt+1=yt
+ h gt -渐变
+ m (yt−yt−1) -动力
+ m h (gt−gt−1) -梯度动量
最后一项是具有平坦动量的GD和具有Nesterov动量的GD之间的差异。
mmgrad
+ m (yt−yt−1) -动力
+ mgrad h (gt−gt−1) -梯度动量
mgrad=0mgrad=m
mgrad>0
mgrad∼−.1
mtht
(x/[cond,1]−100)+ripple×sin(πx)