【神经网络中:常见的几种参数更新方法(SGD、Momentum、AdaGrad、Adam、RMSProp、Adadelta)权值初始值、Batch Norm、过拟合、抑制过拟合】

1 训练数据(training_data)、验证数据(validation_data)、测试数据(testing_data)的区分
  训练数据:模型参数(权重和偏置)的学习,建立模型
  验证数据:模型超参数性能的评估(超参数:模型算法本身设置的参数如学习率、epoch、batch_size、初始权值、卷积核个数和大小等等)
  测试数据:评估模型的泛化性能
2 常见的几种参数更新方法:

  SGD(随机梯度下降法)、Momentum(动量法)、AdaGrad(基于学习率衰减)、Adam(结合Momentum和AdaGrad)、RMSProp(改进了AdaGrad中出现更新为0的情况)、Adadelta(AdaGrad的发展)

(1)SGD:

w=w-lr*grads[w];

η为学习率;SGD的缺点:如果损失函数非均向则其搜索最小值的过程非常低效

#SGD更新参数: w=w-lr*grads
class SGD:
    def __init__(self,lr=0.1):
        self.lr=lr

    def update(self,params,grads):
        for key in params.keys():
            params[key]-=self.lr*grads[key]


(2)Momentum:

v=\alpha *v-lr*grads[w];

w=w+v;

参数α设定为0.9之类的值,初始化时v为空值;减弱了SGD方法的低效问题

#动量法更新参数 :w=w+v;  v=momentum*v-lr*grads
class Momentum:
    def __init__(self,lr=0.1,momentum=0.9):
        self.lr=lr
        self.momentum=momentum
        self.v=None
    def update(self,params,grads):
        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]


(3)AdaGrad:

h=h+grads[w]*grads[w],

w=w-\frac{lr}{\sqrt{h+\epsilon }}*grads[w];

h保存了以前所有梯度值的平方和,通过1/h**(1/2)调整参数的学习率,如果一直更新会出现更新为0的情况,因为AdaGrad记录过去所有的梯度平方和,随着学习的深入,更新量的变化会越来越小直至完全不更新

#AdaGrad法更新参数 :h=h+grads*grads :w=w-lr*grads/(h)^(1/2)
class AdaGrad:
    def __init__(self,lr=0.1):
        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(val)
        for key in params.keys():
            self.h+=grads[key]*grads[key]
            params[key]-=self.lr*grads[key]/(np.sqrt(self.h)+1e-7)


(4)Adam:

     结合Momentum和AdaGrad;具体如下:

   m=\beta1 *m+(1-\beta1)*grad[w]

   v=\beta2 *v+(1-\beta2)*grad[w]*grad[w]

   m=\frac{m}{1-\beta 1}

   v=\frac{v}{1-\beta 2}

   w=w-\frac{lr}{\sqrt{v}+\epsilon }*m

其中常用β1=0.9,β2=0.999,微小值epsilon防止分母出现0

(5)RMSProp:

   RMSProp是对AdaGrad的改进,相对于AdaGrad,RMSProp增加了一个衰减系数控制累计梯度平方和,具体如下:

     h=ρh+(1-ρ)*grads[w]*grads[w];

     w=w-lr/((h+α)**(1/2))*grads[w]; 其中α为微小值防止分母出现0

(6)Adadelta :

      AdaGrad的发展,和RMSProp类似,但是多了一个状态变量\triangle x,用其代替了RMSProp中的学习率lr ,具体如下: 

    S_{t}=\gamma *S_{t-1}+(1-\gamma)*g_{t}*g_{t}

    g^{*}=\sqrt{\frac{\triangle x_{t-1}+\epsilon }{S_{t}+\epsilon }}*g_{t} 

    x_{t}=x_{t-1}-g^{*}_{t}

    \triangle x_{t}=\gamma *\triangle x_{t-1}+(1-\gamma)*g^{*}_{t}*g^{*}_{t}
    总的来说:没有哪一种方法能在所有问题上都表现的最好,需要根据具体问题选择适当的方法
3 权值初始值:

 

    一般设为标准差为某个值的高斯分布;初始值的选取会影响激活函数输出值的分布,不合适的初始值会产生梯度消失的问题
(1)Xavier 权重初始值:n为前一层节点数,初始值为标准差为:1/np.sqrt(n)的高斯分布,适用于sigmoid,tanh等曲线激活函数
(2)Relu初始值:标准差为:np.sqrt(2/n)的高斯分布
(3)std初始值;标准差为0.01的高斯分布
4 Batch Norm

   调整激活值(激活函数输出值)的分布使其具有适当的广度,具体为向神经网络中插入数据正规化的层
(1)可以加快学习速度
(2)不那么依赖初始值
(3)抑制过拟合
   以mnin batch(批量数据)为单位进行均值为0,方差为1的正规化
 vb=1/m*np.sum(xi);方差a^2=1/m*np.sum(xi-vb)^2
 xi=(xi-vb)/np.sqrt(a^2+10e-7)
   正规化后进行缩放和平移变换:yi=γ*xi+B;初始γ=1,b=0
5 过拟合:

  模型对于训练数据拟合程度高,对于未出现在训练数据中的其他数据拟合程度低,即模型泛化性能差,,一般由下面两种原因造成:
(1)模型有大量参数,表现力强;
(2)训练数据少
6 抑制过拟合(正则化:给损失函数加上某种限制,抑制过拟合)
(1)权值衰减:为损失函数加上权重的某种范数(L1或L2)
(2) Dropout:学习的过程中随机删除神经元的方法;训练时,随机选出隐藏层的神经元,然后将其删除,被删除的神经元不再进行信号的传递

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冲冲冲@chong

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值