深度学习 | 过拟合的来龙去脉

1 过拟合的由来

我们知道,无论是机器学习还是深度学习,都希望达到一个Bias-Variance tradeoff,即偏差和方差的均衡,之前博客中也贴过一个表格:

训练集上模型表现 测试集上模型表现 结论
不好 不好 欠拟合–对应高偏差或者高方差&高偏差
不好 过拟合–对应高方差
完美-适度拟合

以及一张来自NG课堂的图片:
在这里插入图片描述
由上表可以看到,过拟合的由来就是:模型在训练集上表现很好,而在测试集上表现很糟糕,这时候很可能出现了过拟合:即低偏差高方差!也即过拟合的来源!

同时,补充以下破坏了低偏差低方差时候的相应解决方案:

  • 高偏差:

    • 采用更大的神经网络结构
    • 训练次数更多
    • 改变网络结构
  • 低偏差高方差:即过拟合

    • 用更多的数据More Data
    • 正则化Regularization

注:可以做到偏差和方差都降,而且一般更大的网络效果会更好,前提是网络已经正则化了

2 过拟合的原因

之前在:面试 | vivo机器学习提前批面试题 已经总结过,过拟合的原因大概有以下几个:

  • 数据集的原因
    • 训练集和测试集的分布不一样
    • 训练集噪音过大。样本里的噪音数据干扰过大,大到模型过分记住了噪音特征,反而忽略了真实的输入输出间的关系
  • 建模时的“逻辑假设”到了模型应用时已经不能成立了。 任何预测模型都是在假设的基础上才可以搭建和应用的,常用的假设包括:假设历史数据可以推测未来,假设业务环节没有发生显著变化,假设建模数据与后来的应用数据是相似的,等等。如果上述假设违反了业务场景的话,根据这些假设搭建的模型当然是无法有效应用的。
  • 参数太多、模型复杂度高
  • 决策树模型。如果我们对于决策树的生长没有合理的限制和修剪的话,决策树的自由生长有可能每片叶子里只包含单纯的事件数据(event)或非事件数据(no event),可以想象,这种决策树当然可以完美匹配(拟合)训练数据,但是一旦应用到新的业务真实数据时,效果是一塌糊涂。
  • 神经网络模型
    • 迭代次数过多。比如权值学习迭代次数足够多(Overtraining)。拟合了训练数据中的噪声和训练样例中没有代表性的特征。
    • 或者是由于对样本数据,可能存在隐单元的表示不唯一,即产生的分类的决策面不唯一.随着学习的进行, BP算法使权值可能收敛过于复杂的决策面,并至极致。【不太明白】

3 过拟合的表现

前文已经提到,低偏差高方差,即训练集表现优秀,测试集表现糟糕~

4 如何解决?

上面提到的博客中同样提出了解决过拟合的方法,但是没有细说,下面笔者带着大家来深扒一波~

之前的内容重新总结了一下,大概处理方法归为几大类:数据集处理;正则化;集成方法;交叉验证!

  • 数据集处理

    • 增加训练集。即More data。训练集越多,模型过拟合的概率就越小。
    • 重新清洗数据。即进行数据清洗包括处理缺失值等等。导致过拟合的一个原因也有可能是数据不纯导致的,如果出现了过拟合就需要我们重新清洗数据。
  • 正则化

    • L1/L2正则。对模型复杂度进行惩罚。L1范数使得模型留下更少的变量,L2范数会使得模型更多变量系数为0。
    • dropout。这个方法在神经网络里面很常用。dropout方法是ImageNet中提出的一种方法,通俗一点讲就是dropout方法在训练的时候让神经元以一定的概率不工作。具体见下图:
      在这里插入图片描述
    • early stopping。stop的是学习迭代次数。即在模型对训练数据集迭代收敛之前停止迭代来防止过拟合
  • ensemble方法。集成学习算法也可以有效的减轻过拟合。上文也提到,过拟合的本质就是低偏差高方差,要解决过拟合,则一方面降低偏差,一方面要降低方差。 Bagging通过平均多个模型的结果,来降低模型的方差Boosting更多能减小偏差

  • 交叉验证 。详情见之前写的推文:机器学习 | 交叉验证。为什么交叉验证能解决过拟合呢?因为交叉验证能够选择比较好的泛化性的模型,不易于导致过拟合。

下面分开详细来说一下:

4.1 获取更多的数据 More data

比如下图中关于猫的图片,可以通过下面的方式进行数据扩充:

  • 图片旋转
  • 随意裁剪图片
  • 图片的其余处理
    在这里插入图片描述

优点:成本低。 我们这么做基本没有花费,代价几乎为零,除了一些对抗性代价。以这种方式扩增算法数据,进而正则化数据集,减少过拟合比较廉价。

即获取更多的数据可以有效避免过拟合。

4.2 正则化

关于L1/L2正则是机器学习和深度学习都有的方法,而dropout和early stopping是深度学习特有的处理方式!

4.2.1 L1/L2/Frobenius 弗罗贝尼乌斯范数正则

先上公式:

机器学习L1/L2范数正则:
在这里插入图片描述
这时候就要问了,什么叫L1/L2范数呢?以及L0范数?

L0/L1范数

  • L0范数:向量中非0元素(指变量的非0系数)的个数
  • L1范数:向量中各元素(指每个变量的系数)绝对值之和,也称为稀疏规则算子(目的:特征选择+可解释性更好)。

问题:为什么用L1范数而不用L0范数?

  • L0范数不好求。L0范数很难进行优化求解。属于NP难问题
  • L1范数好求。L1范数是L0范数的最优凸近似,更易优化求解。
    在这里插入图片描述

L2范数

  • 定义:向量各元素(这里指每个变量的不同系数)的平方和然后求平方根
  • L2范数越小,则向量的每个元素都很小,接近于0,但不会等于0
  • L2范数的好处:
    • 可以防止过拟合,提升泛化能力。(越小的参数说明模型越简单,越简单的模型则越不容易产生过拟合现象)
    • 有助于处理condition number(矩阵稳定性或者敏感度的度量;1附近较好,远大于1不好)不好的情况下矩阵求逆困难的问题
    • 补充1:什么叫 ill-condition 问题 :假设我们有个方程组AX=b,我们需要求解X。如果A或者b稍微的改变,会使得X的解发生很大的改变,那么这个方程组系统就是ill-condition的,反之就是well-condition的。
    • 补充2:condition number定义:即矩阵A的行列式乘以A的逆的行列式在这里插入图片描述
  • 优化和求解变得稳定快速。
  • L1/L2范数比较:
    • L1会趋向于产生少量特征,其余特征均为0(Lasso);L2会选择更多特征,接近于0(Ridge)。
    • 下降速度见下图:
      在这里插入图片描述
    • 模型空间限制见下图:
      在这里插入图片描述

深度学习Frobenius 弗罗贝尼乌斯范数正则:即将每个神经元的权重平方求和
在这里插入图片描述
上面就是L1/L2,Frobenius 弗罗贝尼乌斯范数正则化的原理,细心的小伙伴肯定发现了,这三个范数中都有一个超参数,即 λ \lambda !这个超参数有什么作用呢?要解释这个问题可以首先考虑一个问题:即为什么基于这三种范数的正则化可以防止过拟合?

机器学习中:


  • λ = 0 \lambda=0 时,完全过拟合!因为只考虑降低偏差了!
  • λ \lambda 很大时,出于整体要很小的目标,这时候参数就会很少了,很有可能会出现欠拟合的情况!
  • 于是在 λ \lambda 从很小的数开始逐渐递增的时候,肯定能在中间的某一个 λ \lambda 处实现刚好拟合!这样就能解决过拟合问题!完美!

深度学习中:类似机器学习


在这里插入图片描述

4.2.2 dropout

什么叫dropout呢?

  • 前向传播的时候,让某个神经元的激活值以一定的概率p停止工作
  • 这样可以使模型泛化性更强,因为它不会太依赖某些局部的特征,如下图所示:
    在这里插入图片描述

那如何实现呢? 可以在两个步骤中分别实现

  • 模型训练阶段【推荐】
    • 大概分为三步:初始化参数引入概率;随机失活;缩放处理
    • 缩放处理是除以keep-prob 即留下来的概率在这里插入图片描述
  • 模型预测阶段
    • 缩放处理是乘以p,即对应上面的keep-prob。
    • 具体见下图:
      在这里插入图片描述
  • 为什么是乘以p而不是像上面一样除以p呢? 即为啥两个阶段的缩放方式不同?
    • 这是因为是在不同的阶段进行dropout处理! 【很重要】
    • 其实本质都是一样,都是为了让失活后的神经元的整体的期望和未失活之前保持一致,进而缩放处理。
    • 为什么乘以p呢?因为我们训练的时候会随机的丢弃一些神经元,但是预测的时候就没办法随机丢弃了。如果丢弃一些神经元,这会带来结果不稳定的问题,也就是给定一个测试数据,有时候输出a有时候输出b,结果不稳定,这是实际系统不能接受的,用户可能认为模型预测不准。那么一种“补偿”的方案就是每个神经元的权重都乘以一个p,这样在“总体上”使得测试数据和训练数据是大致一样的。比如一个神经元的输出是x,那么在训练的时候它有p的概率参与训练,(1-p)的概率丢弃,那么它输出的期望是px+(1-p)0=px。因此测试的时候把这个神经元的权重乘以p可以得到同样的期望

为什么dropout能起到处理过拟合的作用呢?

  • 取平均的作用。dropout掉不同的隐藏神经元就类似在训练不同的网络,随机删掉一半隐藏神经元导致网络结构已经不同,整个dropout过程就相当于对很多个不同的神经网络取平均。而不同的网络产生不同的过拟合,一些互为“反向”的拟合相互抵消就可以达到整体上减少过拟合。
  • 减少神经元之间复杂的共适应关系。 dropout导致两个神经元不一定每次都在一个网络中出现。这样权值的更新不再依赖于有固定关系的隐含节点的共同作用,阻止了某些特征仅仅在其它特定特征下才有效果的情况。迫使网络去学习更加鲁棒的特征 ,这些特征在其它的神经元的随机子集中也存在。换句话说假如我们的神经网络是在做出某种预测,它不应该对一些特定的线索片段太过敏感,即使丢失特定的线索,它也应该可以从众多其它线索中学习一些共同的特征。从这个角度看dropout就有点像L1,L2正则,减少权重使得网络对丢失特定神经元连接的鲁棒性提高
  • Dropout类似于性别在生物进化中的角色。物种为了生存往往会倾向于适应这种环境,环境突变则会导致物种难以做出及时反应,性别的出现可以繁衍出适应新环境的变种,有效的阻止过拟合,即避免环境改变时物种可能面临的灭绝

4.2.3 early stopping

首先还是灵魂拷问:什么是early stopping?

  • 早停法,停止的是训练模型!
  • 为了防止过拟合而采取的提前停止模型训练。

那么如何实现呢?

神经网络中具体的做法如下:

  1. 切分数据集。首先将训练数据划分为训练集和验证集(划分比例为2:1);
  2. 训练模型。在训练集上进行训练,并且在验证集上获取测试结果(比如每隔5个epoch测试一下),随着epoch的增加,如果在验证集上发现测试误差上升,则停止训练
  3. 将停止之后的权重作为网络的最终参数

为什么不能一直训练下去呢? 而非要提前停止?因为一直训练下去测试集上的准确率会下降!为什么会下降?可能有两个原因:

  • 过拟合
  • 学习率过大导致不收敛

参考

猜你喜欢

转载自blog.csdn.net/qq_27782503/article/details/94024066
今日推荐