SGD
将原来的权重W 减去 学习率和偏导数的积
class SGD:
"""随机梯度下降法(Stochastic Gradient Descent)"""
def __init__(self, lr=0.01):
self.lr = lr
def update(self, params, grads):
for key in params.keys():
params[key] -= self.lr * grads[key]
策略:朝着梯度的方向前进
优点:简单易于实现
缺点:效率低
Momentum
class Momentum:
"""Momentum SGD"""
def __init__(self, lr=0.01, momentum=0.9):
self.lr = lr
self.momentum = momentum
self.v = None
def update(self, params, grads):
if self.v is None:
self.v = {}
for key, val in params.items():
self.v[key] = np.zeros_like(val)
"""
In [1]: a = np.arange(24).reshape(4,6)
... b = np.zeros_like(a)
Out [1]: (4, 6) #a.shape
Out [1]: (4, 6) #b.shape
Out [1]: array([[0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0]]) # a_0
生成一个和你所给数组a相同shape的全0数组
"""
for key in params.keys():
self.v[key] = self.momentum*self.v[key] - self.lr*grads[key]
params[key] += self.v[key]
策略:模拟物体物理运动 使变化稳定
优点:可以更快地朝x轴方向靠近
缺点:超参数学习率不好确定
AdaGrad
策略:AdaGrad会为参数的每个元素适当地调整学习率 参数的元素中变动较大(被大幅更新)的元素的学习率将变小
优点:函数的取值高效地向着最小值移动
缺点:如果无止境地学习,更新量就会变为0,完全不再更新(梯度消失)
Adam
Adam算法跑得比SGD更快,却存在两大缺陷:结果可能不收敛、可能找不到全局最优解。也就是说它的泛化能力较差,在解决某些问题上,表现还不如SGD
网友评论