过拟合的原因以及解决办法(深度学习)

过拟合:模型在训练集上表现的非常好,但在测试集的数据下表现很差。

具体观察loss函数就是,train loss一直降低,而test loss先降低,而后随着epoach的增加,而不断增加。

这张图可以清楚地帮你了解你的模型是否过拟合。

 

过拟合的原因:

1.训练数据太少(比如只有几百组)

2.模型的复杂度太高(比如隐藏层层数设置的过多,神经元的数量设置的过大),举个简单的例子,你的模型是高射炮,结果你的数据是蚊子,这不就很扯淡了吗。

过拟合的解决方案:

解决过拟合问题有两个方向:

降低参数空间的维度或者降低每个维度上的有效规模(effective size)。

  1. 降低参数数量的方法包括greedy constructive learning、剪枝和权重共享等。
  2. 降低每个参数维度的有效规模的方法主要是正则化,如权重衰变(weight decay)和早停法(early stopping)等。
     

1.降低模型的复杂度

这也是最重要的一步,为了降低模型的复杂度,我们可以减少神经元的个数,减少隐藏层的层数(网络深度),尝试将复杂的网络结构一步步更换为较简单的网络结构。

或者尝试使用传统的机器学习模型(比如随机森林,高斯过程回归,梯度提升回归树之类的模型)。

2.训练集增加更多的数据

深度学习适应的场景往往就是大数据集,对于小样本,过拟合现象的产生往往是不可避免的。通过增加数据只能缓解过拟合,并不能避免。

3.数据增强

使用数据增强可以生成多幅相似图像。这可以帮助我们增加数据集规模从而减少过拟合。因为随着数据量的增加,模型无法过拟合所有样本,因此不得不进行泛化。

计算机视觉领域通常的做法有:翻转、平移、旋转、缩放、改变亮度、添加噪声等等

音频数据增强方法有:增加噪音、增加混响、时移、改变音调和时间拉伸。

4.L1与L2正则化

在Loss Function(损失函数)中加入一个正则化项(其实就是penalty)。常见的有L1正则化与L2正则化。

L1正则化的目的是使权重的绝对值最小化,公式如下:

 L2正则化的目的是使得权重的平方最小化,公式如下:

pytorch的官方库仅支持L2正则化,即通过设置weight_decay(权重衰减系数)的值,若过拟合现象比较严重,可以设置该值为100或者1000或者更大的值。

opt_adam = torch.optim.Adam(model.parameters(), lr=LR,weight_decay=100.0)

L1正则化与L2正则化的对比如下表所示:

L1正则化L2正则化
L1惩罚权重绝对值的总和L2惩罚权重平方和的总和
L1适合简单,可解释的模型L2比较适合学习复杂的数据模式
L1受数据极端值的影响比较小L2受极端值的影响比较大

如果数据过于复杂以至于无法准确地建模,那么L2是更好的选择,因为它能够学习数据中呈现的内在模式。

而当数据足够简单,可以精确建模的话,L1更合适。对于大多数CV问题,L2正则化几乎总是可以给出更好的结果。

然而L1不容易受到离群值的影响。所以正确的正则化选项取决于我们想要解决问题的场景。

5.Drop out

Dropout 是一种避免神经网络过拟合的正则化技术。不同于像L1和L2这样的正则化技术通过修改代价函数来减少过拟合。它使用丢弃法修改神经网络本身,在训练的每一次迭代过程中随机地丢弃神经网络中的某些神经元。

当我们丢弃不同神经元集合的时候,就等同于训练不同的神经网络。不同的神经网络会以不同的方式发生过拟合,所以丢弃的净效应将会减少过拟合的发生。

 如上图所示,丢弃法被用于在训练神经网络的过程中随机丢弃神经网络中的神经元。这种技术被证明可以减少很多问题的过拟合,这些问题包括图像分类、图像切割、词嵌入、语义匹配等问题。

 6.early stopping

当我们训练深度学习神经网络的时候,通常希望能获得最好的泛化性能(generalization performance,即可以很好地拟合数据)。

但是所有的标准深度学习神经网络结构如全连接多层感知机(MLP)都很容易过拟合:当网络在训练集上表现越来越好,错误率越来越低的时候,实际上在某一刻,它在测试集的表现已经开始变差。如下图所示:

早停法(early stopping)是一种被广泛使用的方法。在很多案例上都比正则化的方法要好。图1是我们经常看到论文中出现的图,也是使用早停法出现的一个结果。

其基本含义是在训练中计算模型在测试集上的表现,当模型在测试集的表现开始下降的时候,停止训练,这样就能避免继续训练导致过拟合的问题。其主要步骤如下:

  1. 将原始的训练数据集划分成训练集和验证集
  2. 只在训练集上进行训练,并每个一个周期计算模型在验证集上的误差,例如,每15次epoch(mini batch训练中的一个周期)
  3. 当模型在验证集上的误差比上一次训练结果差的时候停止训练
  4. 使用上一次迭代结果中的参数作为模型的最终参数

 然而,在现实中,模型在验证集上的误差不会像上图那样平滑,而是可能像下图一样:

也就是说,模型很有可能在验证集上的表现可能咱短暂的变差之后有可能继续变好。

但是,并不是所有的误差曲线都像上图一样,有可能在出现第一次最低点之后,后面再也没有比当前最低点更低的情况了。所以我们看到,早停法主要是训练时间和泛化错误之间的权衡。尽管如此,也有某些停止标准也可以帮助我们寻找更好的权衡。

停止标准的选择规则:

一般情况下,“较慢”的标准会相对而言在平均水平上表现略好,可以提高泛化能力。然而,这些标准需要较长的训练时间。其实,总体而言,这些标准在系统性的区别很小。主要选择规则包括:

  1.     除非较小的提升也有很大价值,负责选择较快的停止标准
  2.     为了最大可能找到一个好的方案,使用GL标准
  3.     为了最大化平均解决方案的质量,如果网络只是过拟合了一点点,可以使用PQ标准,否则使用UP标准

7.数据清洗

其中包括把数据异常值去除掉。

8.使用集成学习方法

把多个模型集成在一起,降低单个模型的过拟合风险。

9.批量正则化(Batch Normalization)

就是将卷积神经网络的每层之间,加上将神经元的权重调成标准正态分布的正则化层,这样可以让每一层的训练都从相似的起点出发。

而对权重进行拉伸,等价于对特征进行拉伸,在输入层等价于数据增强。注意正则化层是不需要训练的。

  • 70
    点赞
  • 541
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
过拟合机器学习中常见的问题,其产生的主要原因是模型过于复杂,导致在训练数据上表现良好,但在测试数据上表现差。下面分别介绍过拟合产生的原因解决办法。 1. 过拟合的产生原因 - 训练数据量过少:当训练数据量过少时,模型容易记住训练数据,而无法泛化到新的数据上。 - 模型复杂度过高:当模型过于复杂时,容易出现过拟合现象,因为模型在训练数据上可以达到很高的准确率,但在测试数据上表现很差。 - 特征选取不当:当特征选取不当时,容易出现过拟合现象,因为模型在训练数据上可以达到很高的准确率,但在测试数据上表现很差。 2. 过拟合解决办法 - 增加训练数据量:增加训练数据可以减少过拟合风险,因为模型可以更好地学习到数据的真实分布,从而提高泛化能力。 - 减少模型复杂度:减少模型的复杂度可以减少过拟合风险,因为简单的模型更加容易泛化。 - 正则化:正则化是一种常用的降低模型复杂度的方法,其主要思想是在损失函数中加入正则化项,使得模型参数的值更加平滑,从而减少对训练数据的过拟合。 - 交叉验证:交叉验证可以帮助我们评估模型的泛化能力,从而减少过拟合风险。常见的交叉验证方法包括K折交叉验证和留一交叉验证等。 - 集成学习:通过集成多个模型的预测结果,可以减少单个模型的过拟合风险,提高整体的泛化能力。例如,可以使用Bagging、Boosting等方法来进行集成学习。 总之,解决过拟合的方法有很多种,需要根据具体情况选择合适的方法来解决。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值