Day 4 学习优化方法

📅 2026/7/16 5:36:54 👁️ 阅读次数 📝 编程学习
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)