Day 4 学习优化方法
学习优化方法
SGD
代码演示
class SGD: 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]SGD的缺点
动量法(Momentum)
数学原理
代码演示
class Momentum: #初始化 def __init__(self,lr=0.01,momentum=0.9): self.lr=lr self.momentum=momentum self.v=None #更新方法 def update(self,params,grads): #对v进行初始化 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
数学原理
代码演示
class AdaGrad: #初始化 def __init__(self,lr=0.01): self.lr=lr self.h=None #更新方法 def update(self,params,grads): #对h进行初始化 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-8))RMSProp
数学原理
代码演示
只需对之前的数学公式部分稍加更改即可
Adam
数学原理
与
是偏差修正,用来增加训练初期的启动速度。
代码演示
class Adam: #初始化 def __init__(self,lr=0.01,alpha1=0.9,alpha2=0.999): self.lr=lr self.alpha1=alpha1 self.alpha2=alpha2 self.v=None self.h=None self.iter=0 #更新方法 def update(self,params,grads): #对每个v和h进行初始化 if self.v is None: self.v,self.h={},{} for key,val in params.items(): self.v[key]=np.zeros_like(val) self.h[key] = np.zeros_like(val) self.iter+=1 #按照公式改变学习率参数 a=self.lr*np.sqrt(1-self.alpha2**self.iter)/(1-self.alpha1**self.iter) #按照公式更新参数 for key in params.keys(): self.v[key]=self.alpha1*self.v[key]+(1-self.alpha1)*grads[key] self.h[key] = self.alpha2 * self.h[key] +(1 - self.alpha2) * (grads[key]**2) params[key]-=a*self.v[key]/(np.sqrt(self.h[key])+1e-8)