鱼书学习4

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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值