模型训练[训练集、验证集、过拟合、欠拟合]
- 在不断补充训练数据集的过程中,发现纯粹增加数据集并不会使得模型效果单向地变好,如果是多目标检测模型的话,常会出现精度变低的现象
- 本文想总结在模型训练时的一些注意事项,比如训练集与验证机+测试集的数量分割占比,模型如果出现过拟合或者欠拟合时该采取什么措施改善,还有就是多目标检测时样本标签数量的不平衡性?
- 后边再有问题慢慢补充吧
1. 数据集分割
- 一般情况下,我们会在模型训练前将数据集分为训练集,验证集和测试集三部分:
bash
#-------各自作用------------
训练集:用于训练模型,找出最佳的w 和b 。
验证集:用以确定模型超参数,选出最优模型。
测试集:仅用于对训练好的最优函数进行性能评估。
- 训练集,顾名思义,用于模型来进行特征提取与分析训练,然后验证集Val与测试集test的区别如下:
- 我们将上述3个概念贯穿于机器学习的全过程,从而加深理解:
bash
#--------------------训练过程-------------------------
1.确定模型的一组超参数
2.用训练集训练该模型,找到使损失函数最小的最优函数。
3.在验证集上对最优函数的性能进行度量。
4.重复1、2、3步,直到搜索完指定的超参数组合。
5.选择在验证集上误差最小的模型,并合并训练集和验证集作为整体训练模型,找到最优函数。
6.在测试集上对最优函数的泛化性能进行度量。
-
在实际训练中,这3个部分占比该是多少呢?对训练结果的影响如何?
-
- 测试集只用一次,可以不用单独分割数据,有没有均可。
-
- 如果数据集数量较少,比如几百张或者几千张(数据场景比较复杂),需在保证在训练集足够的基础上,尽量分配给验证集一些比重,以便对调整合适的超参数。此时,训练集:验证机可以是[6:4]或者[7:3]等。
-
- 如果数据集达到万张或者几万张,那两个比重可以[8:2]或者[9:1]来分
-
- 测试集可有可无,验证集必须要有,且数据划分应随机划分,需要正验证集中的数据种类肯定要包含训练集中的数据种类或者场景变化情况
- 后续补充...
-
2. 过拟合与欠拟合
- 过拟合 :
是指学习时选择的模型所包含的参数过多,以至于出现这一模型对已知数据预测的很好,但对未知数据预测得很差的现象。这种情况下模型可能只是记住了训练集数据,而不是学习到了数据特征。 - 欠拟合 :
模型描述能力太弱,以至于不能很好地学习到数据中的规律。产生欠拟合的原因通常是模型过于简单。
我们要知道机器学习的根本问题是解决优化和泛化的问题。
- 优化 :
是指调节模型以在训练数据上得到最佳性能。 - 泛化 :
是指训练好的模型在前所未见的数据(测试集)上的性能好坏。
2.1 如何应对过拟合?
-
最优方案:
-
- 增加源头数据数量
-
- 数据增强
-
-
次优方案:
调节模型允许存储的信息量或者对模型允许存储的信息加以约束,该类方法也称为正则化。即:
-
- 调节模型大小
-
- 约束模型权重,即权重正则化(在机器学习中一般使用 L2正则化)
-
- 随机失活(Dropout)
-
-
L2正则化:
L2正则损失对于大数值的权值向量进行严厉惩罚,鼓励更加分散的权重向量,使模型倾向于使用所有输入特征做决策,此时的模型泛化性能好!
-
Dropout 随机失活
随机失活使得每次更新梯度时参与计算的网络参数减少了,降低了模型容量,所以能防止过拟合。
2.2 应对欠拟合?
-
- 增加新特征,可以考虑加入进特征组合、高次特征,来增大假设空间。
-
- 添加多项式特征,这个在机器学习算法里面用的很普遍,例如将线性模型通过添加二次项或者三次项使模型泛化能力更强。
-
- 减少正则化参数,正则化的目的是用来防止过拟合的,但是模型出现了欠拟合,则需要减少正则化参数。
-
- 使用非线性模型,比如核SVM 、决策树、深度学习等模型 。
-
- 调整模型的容量(capacity),通俗地,模型的容量是指其拟合各种函数的能力。
-
- 容量低的模型可能很难拟合训练集;使用集成学习方法,如Bagging ,将多个弱学习器Bagging。
3. 目标检测中的数据类别不均衡问题
-
在进行模型训练时,不同需求下的数据集可能标注的标签类别数量不平衡
-
由于某些类别数量较少,模型预测结果可能会偏向数量多的类别,从而导致数量低的类别识别率低,召回率低
-
改善方法:
-
- 自造数据,彩图时尽量保证类别数量差不多
-
- 程序优化:重采样
-