DeepLearningBasic - 关于训练集、验证集、测试集的一些理解

    科技2022-08-03  110

    DeepLearningBasic - 关于训练集、验证集、测试集的一些理解

    1. 模型的泛化能力2. 训练集与测试集2.1 训练集2.2 测试集测试集与模型选取 3. 验证集验证集与超参数选取 4. 总结References



    深度学习模型训练需要用到由大量数据组成的数据集,并且一般将数据集分为训练集(training set)、验证集(validation set)、测试集(test set)。接下来,我们要介绍为什么要将数据集划分为以上三个子数据集。

    接下来,我们首先通过模型的泛化能力引出训练集和测试集的概念,



    1. 模型的泛化能力

    将深度学习神经网络模型的训练粗略地分为三个阶段:

    数据收集:根据任务目标,收集大量与任务相关的数据;模型训练:使用收集到的数据通过不断地迭代来训练模型,使得模型能够较好地拟合这些数据;模型部署:将训练好的模型应用到真实的场景中,即实际应用训练的模型。

    但是,上述过程存在一个问题,即一般情况下,我们收集到的数据集容量有限,并不能很好的代表目标任务中的所有数据。对训练数据集拟合较好的模型,并不一定对实际任务中的数据分布也能有较好地拟合,类似于过拟合现象。

    为了量化模型在实际任务中的表现,引入一个概念:泛化误差,指将模型部署在真实场景中后产生的误差。我们总是希望训练得到的模型在真实环境中有着较好地性能表现,即最终的目的是得到的模型的泛化误差越小越好。既然泛化误差是指在模型实际部署后的误差,那么直接使用泛化误差来评估模型的好坏代价太大(即我们不能将一个未经评估的产品投入市场)。那么,我们就需要找到一种评估指标来替代泛化误差来评估模型性能的好坏,用来指导训练,以得到泛化能力更好的模型。



    2. 训练集与测试集

    所以,为了能够评估模型的泛化能力,我们将数据集分为训练集和测试集。在模型训练过程中,测试集不参加训练,即不让模型看到这部分数据,那么就可以将这部分数据作为真实场景中的数据来近似评估模型的泛化能力。

    2.1 训练集

    训练集中的数据用来在迭代过程中通过反向传播算法不断优化神经网络的参数,使得模型尽可能拟合训练集中的数据分布。

    2.2 测试集

    使用训练集训练得到了一个模型,计算该模型在测试集上的误差,并将此误差作为泛化误差的近似,最终的优化目标为让训练得到的模型在测试集上的误差最小。

    测试集与模型选取

    据前述,将数据集划分为训练集和测试集,且深度学习模型训练的流程为:首先在训练集上进行训练,然后在测试集上近似评估模型的泛化能力。对于某一任务,我们根据该流程训练得到了几个不同的模型A、B、C,我们想要比较这几个模型的性能,那么可以将这三个模型分别在测试集上进行测试,得到三个模型的近似泛化误差分别为 [ 0.35 , 0.17 , 0.59 ] [0.35, 0.17, 0.59] [0.35,0.17,0.59],根据泛化误差最小原则,我们自然可以选择在测试集上误差最小的模型B作为要选择的模型。即我们可以在测试集上对比不同模型,从而得到不同模型的性能优劣对比



    3. 验证集

    在学习验证集概念之前,还有一对概念需要了解一下,即深度学习模型训练过程中涉及的两类参数,一类是算法的参数(超参数),另外一类是神经网络的参数(简称为参数)。

    超参数是需要人工指定的参数,这类参数通常很难通过优化算法自动选取最优值; 常见的超参数有神经网络的层数、隐含层神经元的个数、Dropout参数以及其他一些正则化参数等,如果通过训练优化这些参数,则网络会自然的不断加深神经网络层数和隐含层神经元个数,使得模型能够“完美”地拟合训练集数据,但是这类模型一般泛化能力非常差,即出现了过拟合现象。参数是可以通过优化算法经过多轮训练来进行优化取得最优值。

    验证集与超参数选取

    前面我们介绍了深度学习模型具有一类参数为超参数,这类参数不能通过网络训练自行学习优化,需要人工设定。比如对于训练得到的某一模型A,我们选取了多组超参数,记为 α = [ α 1 , α 2 , . . . , α n ] \alpha=[\alpha_1, \alpha_2, ..., \alpha_n] α=[α1,α2,...,αn],我们希望找出最适合当前任务和当前模型的一组超参数。超参数的选取对于模型性能的影响同样很大,我们同样要根据泛化误差最小原则来选取合适的超参数。那么问题来了,我们需要在哪个数据集上来测试具有不同超参数的模型的泛化误差呢?

    前面我们讨论过了,不能通过实际部署,在真实环境中测试具有不同超参数的模型的泛化误差,因为这样代价太大。那么我们是否可以使用测试集来进行评估呢?

    根据之前所说的测试集数据不参与训练过程,即不能让模型看这部分数据。而超参数同样也是参数,也需要在训练过程中通过人工选取进行优化。如果使用测试集作为选取超参数的数据集,那么模型已经见过了这些数据,学习到了这些数据的特征。同样也就会发生在测试集上误差较小,但是在实际部署后,表现却很差的情况。上述情况称为信息泄露。我们使用测试集作为泛化误差的近似,所以不到最后是不能将测试集的信息泄露出去的。

    信息泄露就好比考试题目泄露一样。我们平时做的题相当于训练集,测试集相当于最终的考试,通过最终的考试来检验学生的的学习能力。 如果将测试集信息泄露出去,并通过测试集来调节模型超参数,相当于学生不仅知道了考试题目,还都知道怎么做这些题了(因为通过训练使得模型在测试集上的误差最小,这是调整超参数的目的)。那再拿这些题考试的话,人人都有可能考满分,并没有起到检测学生学习能力的作用。原来我们通过测试集来近似泛化误差,也就是通过考试来检验学生的学习能力,但是由于考试题泄露,此时的考试结果将失去原本的意义。 所以,我们在学习的时候,老师会准备一些小测试来帮助我们查缺补漏,这些小测试也就是要说的验证集。我们通过验证集来作为调整模型超参数的依据,这样不至于将测试集中的信息泄露。



    4. 总结

    将数据集划分训练集、验证集和测试集。在训练集上训练模型,在验证集上评估模型,一旦找到的最佳的参数,就在测试集上最后测试一次,测试集上的误差作为泛化误差的近似。

    根据吴恩达老师的视频中,如果当数据量不是很大的时候(万级别以下)的时候将训练集、验证集以及测试集划分为6:2:2;若是数据很大,可以将训练集、验证集、测试集比例调整为98:1:1;但是当可用的数据很少的情况下也可以使用一些高级的方法,比如留出方,K折交叉验证等。



    References

    文章中部分观点和内容来源于以下文章:

    训练集、验证集和测试集:https://zhuanlan.zhihu.com/p/48976706周志华. 机器学习[M]. 清华大学出版社, 2016.
    Processed: 0.011, SQL: 8