手机网站域名哪里注册,长治网站建设培训文件,公司注册流程及条件,宁夏免费建个人网站神经网络的SGD、Momentum、AdaGrad、Adam最优化方法及其python实现一、SGD二、Momentum-动量三、AdaGrad四、Adam一、SGD 右边的值更新左边的值#xff0c;每次更新朝着梯度方向前进一小步。
class SGD:随机梯度下降法#xff08;Stochastic Gradient Des…
神经网络的SGD、Momentum、AdaGrad、Adam最优化方法及其python实现一、SGD二、Momentum-动量三、AdaGrad四、Adam一、SGD 右边的值更新左边的值每次更新朝着梯度方向前进一小步。
class SGD:随机梯度下降法Stochastic Gradient Descentdef __init__(self, lr0.01):self.lr lrdef update(self, params, grads):for key in params.keys():params[key] - self.lr * grads[key]
二、Momentum-动量
SGD实现简单有些问题可能没有效果比如f(x,y)(1/20)x^ 2 y ^2
SGD低效的根本原因梯度的方向没有指向最小值的方向。如果函数形状非均向如呈现延伸状搜索路径就非常低效有可能呈现z字形移动。
Momentum-动量方法公式 v表示物体在梯度方向受的力αv作用是让物体逐渐减速(α小于1常数如0.9之类的数)。
动量法的好处x轴方向受力小但是每一次梯度变化的方向不变速度方向不变一直在这个方向受力往那个方向走的速度会加速。但是y轴受到正反方向的力他们会抵消让y不稳定因此和SGD相比能更快的向x轴方向靠近。
简的来说SGD的话就是他y方向梯度大步子跨的猛的话就z形了动量的目的是梯度大的那块迈步子时候让它考虑到上一次的步子是往哪走的。如果相反方向走的话其实是抵消了一部分v这样的话如果步子跨得猛他也得少一点步子。如下图所示对于f(x,y)(1/20)x^ 2 y ^2用SGD的话m想走到y它在y轴摇摆的厉害但是用动量y轴摇摆抵消了而且x轴速度还增加了多好。 class Momentum:Momentum SGDdef __init__(self, lr0.01, momentum0.9):self.lr lrself.momentum momentumself.v Nonedef update(self, params, grads):if self.v is None:self.v {}for key, val in params.items(): self.v[key] np.zeros_like(val)for key in params.keys():self.v[key] self.momentum*self.v[key] - self.lr*grads[key] params[key] self.v[key]
三、AdaGrad h保存了梯度的平方和圆圈就表示矩阵相乘。
由于乘上根号h分之1参数的元素中变动较大的元素的学习率将变小。
这是一种学习率衰减的手法梯度下降太快了山谷太陡峭了那我就让你走的步子减小这样一来你不容易直接一步跨俩山峰山峰是啥懂得都懂嘿嘿。
class AdaGrad:AdaGraddef __init__(self, lr0.01):self.lr lrself.h Nonedef update(self, params, grads):if self.h is None:self.h {}for key, val in params.items():self.h[key] np.zeros_like(val)for key in params.keys():self.h[key] grads[key] * grads[key]params[key] - self.lr * grads[key] / (np.sqrt(self.h[key]) 1e-7)
四、Adam
结合了Momentum和AdaGrad方法。
看代码去吧
很多人喜欢用Adam哦
class Adam:Adam (http://arxiv.org/abs/1412.6980v8)def __init__(self, lr0.001, beta10.9, beta20.999):self.lr lrself.beta1 beta1self.beta2 beta2self.iter 0self.m Noneself.v Nonedef update(self, params, grads):if self.m is None:self.m, self.v {}, {}for key, val in params.items():self.m[key] np.zeros_like(val)self.v[key] np.zeros_like(val)self.iter 1lr_t self.lr * np.sqrt(1.0 - self.beta2**self.iter) / (1.0 - self.beta1**self.iter) for key in params.keys():#self.m[key] self.beta1*self.m[key] (1-self.beta1)*grads[key]#self.v[key] self.beta2*self.v[key] (1-self.beta2)*(grads[key]**2)self.m[key] (1 - self.beta1) * (grads[key] - self.m[key])self.v[key] (1 - self.beta2) * (grads[key]**2 - self.v[key])params[key] - lr_t * self.m[key] / (np.sqrt(self.v[key]) 1e-7)#unbias_m (1 - self.beta1) * (grads[key] - self.m[key]) # correct bias#unbisa_b (1 - self.beta2) * (grads[key]*grads[key] - self.v[key]) # correct bias#params[key] self.lr * unbias_m / (np.sqrt(unbisa_b) 1e-7)