Day 4 学习优化方法
学习优化方法SGD代码演示class SGD: def __init__(self,lr0.01): self.lrlr def update(self,params,grads): for key in params.keys(): params[key]-self.lr*grads[key]SGD的缺点动量法Momentum数学原理代码演示class Momentum: #初始化 def __init__(self,lr0.01,momentum0.9): self.lrlr self.momentummomentum self.vNone #更新方法 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,lr0.01): self.lrlr self.hNone #更新方法 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,lr0.01,alpha10.9,alpha20.999): self.lrlr self.alpha1alpha1 self.alpha2alpha2 self.vNone self.hNone self.iter0 #更新方法 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.iter1 #按照公式改变学习率参数 aself.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)