参数更新方法

时间:2022-10-17 14:31:48
代码实现

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

如果预到的地点梯度比较大,更新就比较快,如果梯度比较小就更新比较慢

  1. x_ahead = x + mu * v   通过上一次的动量v估计本次的位置,
  1. v = mu * v - learning_rate * d x_ahead  通过估计的位置计算梯度,
  2. 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)