当前位置:   article > 正文

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

momentum过拟合

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的缺点:如果损失函数非均向则其搜索最小值的过程非常低效

  1. #SGD更新参数: w=w-lr*grads
  2. class SGD:
  3. def __init__(self,lr=0.1):
  4. self.lr=lr
  5. def update(self,params,grads):
  6. for key in params.keys():
  7. params[key]-=self.lr*grads[key]


(2)Momentum:

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

w=w+v;

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

  1. #动量法更新参数 :w=w+v; v=momentum*v-lr*grads
  2. class Momentum:
  3. def __init__(self,lr=0.1,momentum=0.9):
  4. self.lr=lr
  5. self.momentum=momentum
  6. self.v=None
  7. def update(self,params,grads):
  8. if self.v is None:
  9. self.v={}
  10. for key,val in params.items():
  11. self.v[key]=np.zeros_like(val)
  12. for key in params.keys():
  13. self.v[key]=self.momentum*self.v[key]-self.lr*grads[key]
  14. 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记录过去所有的梯度平方和,随着学习的深入,更新量的变化会越来越小直至完全不更新

  1. #AdaGrad法更新参数 :h=h+grads*grads :w=w-lr*grads/(h)^(1/2)
  2. class AdaGrad:
  3. def __init__(self,lr=0.1):
  4. self.lr=lr
  5. self.h=None
  6. def update(self,params,grads):
  7. if self.h is None:
  8. self.h={}
  9. for key,val in params.items():
  10. self.h[key]=np.zeros_like(val)
  11. for key in params.keys():
  12. self.h+=grads[key]*grads[key]
  13. 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}

    xt=γxt1+(1γ)gtgt
    总的来说:没有哪一种方法能在所有问题上都表现的最好,需要根据具体问题选择适当的方法
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:学习的过程中随机删除神经元的方法;训练时,随机选出隐藏层的神经元,然后将其删除,被删除的神经元不再进行信号的传递

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/码创造者/article/detail/886598
推荐阅读
相关标签
  

闽ICP备14008679号