zoukankan      html  css  js  c++  java
  • 神经网络防止过拟合的方法

     知乎上的回答:https://www.zhihu.com/question/59201590

    深度学习防止过拟合的方法

     

    过拟合即在训练误差很小,而泛化误差很大,因为模型可能过于的复杂,使其”记住”了训练样本,然而其泛化误差却很高,在传统的机器学习方法中有很大防止过拟合的方法,同样这些方法很多也适合用于深度学习中,同时深度学习中又有一些独特的防止过拟合的方法,下面对其进行简单的梳理.

    1. 参数范数惩罚

    范数正则化是一种非常普遍的方法,也是最常用的方法,假如优化:

    minObj(θ)=L(y,f(x))+αG(θ)


    其中L为经验风险,其为在训练样本上的误差,而G为对参数的惩罚,也叫结构风险.α是平衡两者,如果太大则对应的惩罚越大,如过太小,甚至接近与0,则没有惩罚.
    最常用的范数惩罚为L1,L2正则化,L1又被成为Lasso:

    ||w||1=|w1|+|w2|+...


    即绝对值相加,其趋向于是一些参数为0.可以起到特征选择的作用.
    L2正则化为:

    ||w||2=w12+w22+...


    其趋向与,使权重很小.其又成为ridge.
    关于更多可以参考:机器学习中的范数规则化之(一)L0、L1与L2范数

    2. 数据增强

    让模型泛化的能力更好的最好办法就是使用更多的训练数据进行训练,但是在实践中,我们拥有的数据是有限的,解决这一问题可以人为的创造一些假数据添加到训练集中.
    一个具体的例子:
    在AlexNet中,将256*256图像随机的截取224*224大小,增加了许多的训练样本,同时可以对图像进行左右翻转,增加样本的个数,实验的结果可以可降低1%的误差.

    在神经网络中输入噪声也可以看做是数据增强的一种方式.

    3. 提前终止

    如下图所示(图片来源deep learning),当随着模型的能力提升,训练集的误差会先减小再增大,这样可以提前终止算法减缓过拟合现象.关于算法的具体流程参考deep learning.

    这里写图片描述

    提前终止是一种很常用的缓解过拟合的方法,如在决策树的先剪枝的算法,提前终止算法,使得树的深度降低,防止其过拟合.

    4. 参数绑定与参数共享

    在卷积神经网络CNN中(计算机视觉与卷积神经网络 ),卷积层就是其中权值共享的方式,一个卷积核通过在图像上滑动从而实现共享参数,大幅度减少参数的个数,用卷积的形式是合理的,因为对于一副猫的图片来说,右移一个像素同样还是猫,其具有局部的特征.这是一种很好的缓解过拟合现象的方法.

    同样在RNN中用到的参数共享,在其整条时间链上可以进行参数的共享,这样才使得其能够被训练.

    5. bagging 和其他集成方法

    其实bagging的方法是可以起到正则化的作用,因为正则化就是要减少泛化误差,而bagging的方法可以组合多个模型起到减少泛化误差的作用.

    在深度学习中同样可以使用此方法,但是其会增加计算和存储的成本.

    6. Dropout

    Dropout提供了一种廉价的Bagging集成近似,能够训练和评估指数级数量的神经网络。dropout可以随机的让一部分神经元失活,这样仿佛是bagging的采样过程,因此可以看做是bagging的廉价的实现.
    但是它们训练不太一样,因为bagging,所有的模型都是独立的,而dropout下所有模型的参数是共享的.

    通常可以这样理解dropout:假设我们要判别一只猫,有一个神经元说看到有毛就是猫,但是如果我让这个神经元失活,它还能判断出来是猫的话,这样就比较具有泛化的能力,减轻了过拟合的风险.

    7. 辅助分类节点(auxiliary classifiers)

    在Google Inception V1中,采用了辅助分类节点的策略,即将中间某一层的输出用作分类,并按一个较小的权重加到最终的分类结果中,这样相当于做了模型的融合,同时给网络增加了反向传播的梯度信号,提供了额外的正则化的思想.

    8. Batch Normalization

    在Google Inception V2中所采用,是一种非常有用的正则化方法,可以让大型的卷积网络训练速度加快很多倍,同事收敛后分类的准确率也可以大幅度的提高.

    BN在训练某层时,会对每一个mini-batch数据进行标准化(normalization)处理,使输出规范到N(0,1)的正太分布,减少了Internal convariate shift(内部神经元分布的改变),传统的深度神经网络在训练是,每一层的输入的分布都在改变,因此训练困难,只能选择用一个很小的学习速率,但是每一层用了BN后,可以有效的解决这个问题,学习速率可以增大很多倍.

    未完待续…

    参考资料:

      1. deep learning
      2. tensorflow实战
      3. 机器学习中的范数规则化之(一)L0、L1与L2范数
       1. data augmentation: 这点不需要解释太多,所有的过拟合无非就是训练样本的缺乏和训练参数的增加。
        一般要想获得更好的模型,需要大量的训练参数,这也是为什么CNN网络越来越深的原因之一,而如果训练样本缺乏多样性,
         那再多的训练参数也毫无意义,因为这造成了过拟合,训练的模型泛化能力相应也会很差。大量数据带来的特征多样性有助于充分利用所有的训练参数。
         data augmentation的手段一般有:
         1)收集更多数据  
         2)对已有数据进行crop,flip,加光照等操作 
         3)利用生成模型(比如GAN)生成一些数据。
     
     
        2. weight decay: 常用的weight decay有L1和L2正则化,L1较L2能够获得更稀疏的参数,但L1零点不可导。
         在损失函数中,weight decay是放在正则项(regularization)前面的一个系数,正则项一般指示模型的复杂度,
         所以weight decay的作用是调节模型复杂度对损失函数的影响,若weight decay很大,则复杂的模型损失函数的值也就大。
     
     
        3. 提前终止: 提前停止其实是另一种正则化方法,就是在训练集和验证集上,一次迭代之后计算各自的错误率,当在验证集上的错误率最小,
         在没开始增大之前停止训练,因为如果接着训练,训练集上的错误率一般是会继续减小的,但验证集上的错误率会上升,这就说明模型的泛化能力开始变差了,
         出现过拟合问题,及时停止能获得泛化更好的模型。
         如下图(左边是训练集错误率,右图是验证集错误率,在虚线处提前结束训练):
     
        4. dropout : CNN训练过程中使用dropout是在每次训练过程中随机将部分神经元的权重置为0,即让一些神经元失效,这样可以缩减参数量,避免过拟合。
          关于dropout为什么有效,有两种观点:
         1)每次迭代随机使部分神经元失效使得模型的多样性增强,获得了类似多个模型ensemble的效果,避免过拟合 
    博客。
     
       转自:http://blog.csdn.net/leo_xu06/article/details/71320727
     
     
     
  • 相关阅读:
    MVC4中Ajax.BeginForm OnSuccess 不执行以及控制器返回JsonResult 提示下载的原因
    string.Equals 比较2个字符串是否相同忽略大小写
    [转载]mvc使用JsonResult返回Json数据
    [转载]深入理解ASP.NET MVC之ActionResult
    [转载]自定义ASP.NET MVC Html辅助方法 TagBuilder
    [转载]AOP面向方面编程
    [转载]ASP.NET MVC 3的分部视图
    适配 iOS尺寸
    IOS Bug分析
    苹果一些乱七八糟流程整理
  • 原文地址:https://www.cnblogs.com/bonelee/p/8993812.html
Copyright © 2011-2022 走看看