深度学习中常见的过拟合方法

前言

机器学习的主要挑战在于在未见过的数据输入上表现良好,这就是泛化(generalization)能力。由于我们的机器学习模型都是从训练集中学习参数得到的,如何确保其在测试集上表现良好呢?

量化模型在训练集和测试集上的表现,分别成为训练误差(training error)和测试误差(test error),后者也称为泛华误差(generalization error)。理想的模型就是在最小化训练误差的同时,最小化泛化误差。

如果我们的训练集和测试集都是随机生成的,不服从任何分布,那么这个模型将会注定在测试集上表现糟糕,事实上,将不会有任何模型可能在其上表现地明显优于随机猜测。因此,训练集和测试集通常都假设为独立同分布

我们能观察到的训练误差和泛化误差之间的直接关系就是,训练误差的期望等于测试误差的期望。举个例子:假设我们从p(x, y)中重复采样生成训练集和测试集,对于固定的模型参数W,训练误差的期望等于泛化误差的期望,因为此时测试集和训练集只是名字不同而已,其实其还都是满足数据生成分布的。 

但是在实际的应用过程中,不会去固定参数,然后去采样两个数据集。我们先采样训练集,然后减小训练误差得到参数后,再在测试集中验证,这个过程中,就会发生测试误差的期望大于训练误差的期望的情况。以下是决定机器学习算法效果是否好的因素:

  1. 降低训练误差。 
  2. 缩小训练误差与测试误差之间的差距

这俩个因素分别对应了机器学习的两个大挑战:欠拟合(underfitting)过拟合(overfitting)。欠拟合指的是模型的训练误差过大,过拟合指的是训练误差与测试误差的差距过大。

通过调节机器学习模型的容量,可以控制模型是否偏于过拟合还是欠拟合,容量从本质上说是描述了整个模型的拟合能力的大小。如果容量不足,模型将不能够很好地表示数据,表现为欠拟合;如果容量太大,那么模型就很容易过分拟合数据,因为其记住了不适合与测试集的训练集特性,表现为过拟合。因此控制好模型的容量是一个关键问题。通常, 泛化误差是一个关于模型容量的 U 形曲线函数 :


在传统的机器学习方法中有多防止过拟合的方法,同样这些方法很多也适合用于深度学习中,同时深度学习中又有一些独特的防止过拟合的方法,下面对其进行简单的梳理。

一、参数范数惩罚

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


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

1.1 L1-范数规则化

从L0-范数说起, L0-范数是指向量中非0的元素的个数。如果用L0范数来规则化一个参数矩阵W的话,就是希望W的大部分元素都是0。换句话说,就是让参数W是稀疏的。看到稀疏两字,一般人会问“稀疏”不都是通过L1-范数来实现的吗?L1-范数为什么可以实现稀疏?为什么大家都用L1范数去实现稀疏,而不是L0范数呢?原因有二:

  1. 一是因为L0范数很难优化求解(NP难问题)
  2. 二是L1范数是L0范数的最优凸近似,而且它比L0范数要容易优化求解。


L1-范数又被成为Lasso regularization,有个美称叫“稀疏规则算子 。为什么L1范数会使权值稀疏?为什么要稀疏?让我们的参数稀疏有什么好处呢?

  1. 实现特征的自动选择。一般来说,xi(特征向量)的大部分元素(具体的特征)都是和最终的输出yi没有关系或者不提供任何信息的,在最小化目标函数的时候,考虑xi这些“没用”的特征后,虽然可以获得更小的训练误差,但在预测新的样本时,这些“没用”的信息反而会被考虑,从而干扰了对正确yi的预测。稀疏规则化算子的引入就是为了完成特征自动选择的光荣使命,它会学习地去掉这些“没用”的特征,也就是把这些特征对应的权重置为0。
  2. 模型更容易解释。例如患某种病的概率是y,然后我们收集到的数据x是1000维的,也就是我们需要寻找这1000种因素到底是怎么影响患上这种病的概率的。假设我们这个是个回归模型:y=w1*x1+w2*x2+…+w1000*x1000+b(当然了,为了让y限定在[0,1]的范围,一般还得加个Logistic函数)。通过学习,如果最后学习到的w*就只有很少的非零元素,例如只有5个非零的wi,那么我们就有理由相信,这些对应的特征在患病分析上面提供的信息是巨大的,决策性的。也就是说,患不患这种病只和这5个因素有关,那医生就好分析多了。但如果1000个wi都非0,医生面对这1000种因素,累觉不爱。

1.2 L2-范数规则化

L2-范数规则化也很常用。在回归里面,有人把有它的回归叫“岭回归”(Ridge Regression),有人也叫它“权值衰减weight decay”。这用的很多吧,因为它的强大功效是改善机器学习里面一个非常重要的问题:过拟合。

L2-范数是指向量各元素的平方和然后求平方根。我们让L2-范数的规则项||W||2最小,可以使得W的每个元素都很小,都接近于0,但与L1范数不同,它不会让它等于0,而是接近于0,这里是有很大的区别的哦。越小的参数说明模型越简单,越简单的模型则越不容易产生过拟合现象。

通过L2-范数,我们可以实现了对模型空间的限制,从而在一定程度上避免了过拟合。

二、数据增强

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

三、提取终止

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


四、集成方法(ensemble methods)

Ensemble methods就是组合多个模型起到减少泛化误差的作用. 在深度学习中同样可以使用此方法,但是其会增加计算和存储的成本.关于集成方法的介绍,参考:http://blog.csdn.net/guoyunfei20/article/details/78021907

五、Dropout

Dropout提供了一种廉价的Bagging集成近似,能够训练和评估指数级数量的神经网络。dropout可以随机的让一部分神经元失活,这样仿佛是bagging的采样过程,因此可以看做是bagging的廉价的实现。
通常可以这样理解dropout:假设我们要判别一只猫,有一个神经元说看到有毛就是猫,但是如果我让这个神经元失活,它还能判断出来是猫的话,这样就比较具有泛化的能力,减轻了过拟合的风险.

六、辅助分类节点(auxiliary classifiers)

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

七、Batch Normalization

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

原博客地址:https://blog.csdn.net/guoyunfei20/article/details/78247815


猜你喜欢

转载自blog.csdn.net/yxdd1gbk/article/details/80066031
今日推荐