算法基础:过拟合、欠拟合发生的原因以及解决办法

机器学习和深度学习中,模型都可能发生过拟合和欠拟合的问题,这些问题产生的原因需要根据具体的情况进行分析,但是简单来说,过拟合产生的原因在于使用了过于复杂的模型去拟合比较简单的数据,而欠拟合刚好相反,使用了简单的模型去拟合复杂的数据分布。作者对于这两个概念理解不深,本文总结也只是拾人牙慧,写作的目的也只是作为总结之用,将之前学过的知识留下痕迹。

1.过拟合

1.1 过拟合概念及产生原因分析

在统计学习中,建立数据挖掘或者机器学习模型的时候,实现假设所用的数据满足独立同分布的条件,也就是可以利用当前已有的数据对未来的数据进行推测,训练时也是使用历史数据来进行模型的训练,随后利用训练好的模型对未知样本进行预测,但是问题在于训练数据和测试数据可能并不满足独立同分布的假设,或者可能用于模型训练的数据量过少,并不足以对整个数据集的分布进行估计,也有可能是对模型进行了过度训练,使得模型甚至对数据集中的噪声都进行了拟合,基于此模型可能发生过拟合,使得模型的泛化能力弱。其过程可见下图:

在这里插入图片描述

通过上图可以看出,随着模型训练的进行,模型的复杂度会增加,此时模型在训练数据集上的训练误差会逐渐减小,但是在模型的复杂度达到一定程度时,模型在验证集上的误差反而随着模型的复杂度增加而增大。此时便发生了过拟合,即模型的复杂度升高,但是该模型在除训练集之外的数据集上却不起作用。
为了防止过拟合,我们需要用到一些method,如:early stopping、数据集扩增(Data augmentation)、正则化(Regularization)、Dropout等

1.2 防止过拟合的方法

  • 减少特征维数,实质上也是减小loss,降低模型的复杂度
  • 交叉验证,通过交叉验证得到更优的模型参数
  • bagging,随机森林等方法可以减小模型的方差
early stopping

对模型进行训练迭代的过程就是对模型中的参数进行学习更新的过程,这个参数更新的过程往往使用梯度下降的方法来完成。early stopping的方法就是在模型在对训练数据集完全收敛之前停止对参数的更新从而防止过拟合。
early stopping的具体做法是,当一个epoch完成之后计算模型对于validation data的prediction accurary,当predication accuracy不在提高的时候,便停止训练。直观上来讲,当模型的predication accuracy不再提高时,模型的性能也就不再被优化,继续训练只会增加训练时间。但是问题的关键在于**如何判定模型的predication accuracy不再提高了呢?**一般的做法是:记录模型到当前epoch的最佳predication accuracy,当随后的10个epoch(或者其他N个epoch)的predication accuracy都不再提高时,便认为达到了early stopping的停止条件。

数据增强

有时候拥有更多的数据往往胜过一个好的模型。基于独立同分布的假设前提,更多的数据也就意味这训练所使用的数据和真实数据之间的分布往往更加接近。因此基于已有的数据,通过一定的策略和方法得到更多分布相同或者近似的数据往往也是缓解过拟合的有效方法。
数据增强的方法包括:

  • 从数据源头得到更多的数据
  • 复制原有数据并加上随机噪声
  • 重采样的方法
  • 根据已有的数据拟合出数据分布的参数,利用该分布产生更多数据
正则化

正则化是指在对模型的目标函数或者代价函数进行优化时,在函数后面添加一个正则项,一般正则项有L1正则项和L2正则项

  • L1正则
    L1正则是基于L1范数,即在目标函数后面加上参数的L1范数和项,即参数绝对值和项,即:
    C = C 0 + λ ∑ ∣ w ∣ C=C0+λ∑|w| C=C0+λw
    其中C0代表原始的代价函数,λ就是正则项系数,权衡正则项与C0项的比重。后面那一项即为L1正则项。
    在计算梯度时,w的梯度变为:
    ∂ C ∂ w = ∂ C 0 ∂ w + λ s g n ( w ) ∂C∂w=∂C0∂w+λsgn(w) Cw=C0w+λsgn(w)
    其中,sgn是符号函数,那么便使用下式对参数进行更新: w : = w + α ∂ C 0 ∂ w + β λ s g n ( w ) w:=w+α∂C0∂w+βλsgn(w) w:=w+αC0w+βλsgn(w)
    对于有些模型,如线性回归中(L1正则线性回归即为Lasso回归),常数项b的更新方程不包括正则项,即:
    b : = b + α ∂ C 0 ∂ b b:=b+α∂C0∂b b:=b+αC0b
    其中,梯度下降算法中,α<0,β<0,而在梯度上升算法中则相反。
    从上式可以看出,当w为正时,更新后w会变小;当w为负时,更新后w会变大;因此L1正则项是为了使得那些原先处于零(即|w|≈0)附近的参数w往零移动,使得部分参数为零,从而降低模型的复杂度(模型的复杂度由参数决定),从而防止过拟合,提高模型的泛化能力。
    其中,L1正则中有个问题,便是L1范数在0处不可导,即|w|在0处不可导,因此在w为0时,使用原来的未经正则化的更新方程来对w进行更新,即令sgn(0)=0

  • L2正则
    L2正则是基于L2范数,即在目标函数后面加上参数的L2范数和项,即参数的平方和项,即: C=C0+λ∑|ww|
    其中C0代表原始的代价函数,λ就是正则项系数,权衡正则项与C0项的比重。后面那一项即为L2正则项。
    L2正则化中使用下式对模型参数进行更新:
    w : = w + α ∂ C 0 ∂ w + β λ w w:=w+α∂C0∂w+βλw w:=w+αC0w+βλw
    对于有些模型,如线性回归中(L2正则线性回归即为Ridge回归,岭回归),常数项b的更新方程不包括正则项,即:
    b : = b + α ∂ C 0 ∂ b b:=b+α∂C0∂b b:=b+αC0b
    其中,梯度下降算法中,α<0,β<0,而在梯度上升算法中则相反。
    从上式可以看出,L2正则项起到使得参数w变小加剧的效果,但是为什么可以防止过拟合呢?一个通俗的理解便是:更小的参数值w意味着模型的复杂度更低,对训练数据的拟合刚刚好(奥卡姆剃刀),不会过分拟合训练数据,从而使得不会过拟合,以提高模型的泛化能力。
    在这里需要提到的是,在对模型参数进行更新学习的时候,有两种更新方式,mini-batch (部分增量更新)与 full-batch(全增量更新),即在每一次更新学习的过程中(一次迭代,即一次epoch),在mini-batch中进行分批处理,先使用一部分样本进行更新,然后再使用一部分样本进行更新。直到所有样本都使用了,这次epoch的损失函数值则为所有mini batch的平均损失值。设每次mini batch中样本个数为m,那么参数的更新方程中的正则项要改成:
    λm∑w|w| λ2m∑ww2 这里不太明白
    而full-batch即每一次epoch中,使用全部的训练样本进行更新,那么每次的损失函数值即为全部样本的误差之和。更新方程不变。

Dropout

在神经网络的训练中,通过随机删除一些隐藏的神经元,同时保持输入层与输出层神经元个数的不变,从而按照BP神经网络的方法对网络中的参数进行更新,被删除的神经元参数不更新,在下一次的迭代更新中又随机的删除一些神经元,如此一直到训练结束。

2.欠拟合

2.1 欠拟合概念及产生原因分析

pass

2.2欠拟合解决方法

  • 增加新的特征
  • 尝试非线性模型,比如SVM,DNN,决策树等
  • 如果又正则项,则可以考虑减小正则项的参数
  • boosting,boosting方法往往又更小的bias,如gradient boosting
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值