1. 参数的更新方法
1.1 随机梯度下降法
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类,可以按如下方式进行神经网络的参数的更新
network=TwoLayerNet()
optimizer=SGD()
for i in range(10000):
x_batch,t_batch=get_mini_batch
grads=network.gradient(x_batch,t_batch)
params=network.params
optimizer.update(params,grads)
1.2 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):
if self.v=None
self.v={}
for key,val in params.items():
self.v[key]=np.zeros_like(val)
for key in params.key():
self.v[key]=self.momentum*self.v[key]-self.lr*grads[key]
params[key]+=self.v[key]
初始化时,v中什么都不保存。当调用update,v会以字典型变量的形式保存与参数结构相同的数据。
1.3 AdaGrad
学习率的衰减,就是一开始多学,逐渐少学。
AdaGrad针对一个一个的参数,赋予其定制的值。
class AdaGrad:
def __init__(self,lr=0.01):
self.lr=lr
self.h=None
def update(self,params,grads):
if self.h is None
self.h={}
for key,val in params.items():
self.h[key]=np.zeros_like(val0
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)
最后一行加上了微小值1e-7,防止将0作为除数的情况。
1.4 Adam
融合了Momentum(参照小球在碗中滚动的物理规则)和AdaGrad(为参数的每个元素适当地调整更新不发)。此外,进行超参数的“偏置矫正”也是Adam的特征。
Adam会设置3个超参数,一个是学习率,另外两个是一次momentum的系数β1和二次momentum的系数β2。