https://github.com/hsmyy/zhihuzhuanlan/blob/master/momentum.ipynb
1、梯度下降法
加大梯度下降的步长
继续加大步长
2、动量更新
Momentum改进自SGD算法,让每一次的参数更新方向不仅仅取决于当前位置的梯度,还受到上一次参数更新方向的影响。
v = mu * v - learning_rate * dx # integrate velocity
x += v # integrate position
3、NAG
如果预到的地点梯度比较大,更新就比较快,如果梯度比较小就更新比较慢
- x_ahead = x + mu * v 通过上一次的动量v估计本次的位置,
- v = mu * v - learning_rate * d x_ahead 通过估计的位置计算梯度,
- x += v
4、Adagrad
cache += dx**2
x += - learning_rate * dx / (np.sqrt(cache) + eps)
这个方法其实是动态更新学习率的方法,其中cache将每个梯度的平方和相加,而更新学习率的本质是,如果求得梯度距离越大,那么学习率就变慢,而eps是一个平滑的过程,取值通常在(10^-4~10^-8 之间)
gt,i=∇θJ(θi)是目标函数对参数的梯度,ϵ是平滑项,防止除零操作,一般取值1e−8
Adagrad的一大优势时可以避免手动调节学习率,比如设置初始的缺省学习率为0.01,然后就不管它,另其在学习的过程中自己变化。当然它也有缺点,就是它计算时要在分母上计算梯度平方的和,由于所有的参数平法必为正数,这样就造成在训练的过程中,分母累积的和会越来越大。
5、RMSprop
cache = decay_rate * cache + (1 - decay_rate) * dx**2
x += - learning_rate * dx / (np.sqrt(cache) + eps)
6、Adam
m = beta1*m + (1-beta1)*dx
v = beta2*v + (1-beta2)*(dx**2)
x += - learning_rate * m / (np.sqrt(v) + eps)