在配置训练、验证和测试数据集的过程中做出正确决策会在很大程度上帮助大家创建高效的神经网络。在训练神经网络时,我们需要做出很多决策,比如,神经网络分多少层,每层含有多少个隐藏单元,学习率是多少,各层采用哪些激活函数。创建新应用的过程中,我们不可能从一开始就准确预测出这些信息,和其他超参数。实际上,应用机器学习是一个高度迭代的过程,通常在项目启动是,我们会先有一个初步想法,比如构建一个含有特定层数,隐藏单元数量或者数据集个数等的神经网络,然后编程并运行这些代码,通过运行和测试得到该神经网络或配置信息的运行结果。你可能会根据输出结果重新完善自己的想法,改变策略,或者为了找到更好的神经网络不断迭代更新自己的方案。
创建高质量的训练数据集、验证集和测试集也有助于提高循环效率。
假设这是训练数据,我用一个长方形表示(如下图所示),我们通常会将这些数据划分成几部分,一部分作为训练集,一部分作为简单交叉验证集(hold-out cross validation),有时候也被称为development set,最后一部分称为测试集。接下来,我们开始对训练集执行训练算法,通过验证集或者简单交叉验证集选择最好的模型。经过充分验证,我们选定了最终模型,然后就可以在测试集上进行评估,无偏评估算法的运行状况。
在机器学习发展的小数据量时代,常见的做法是将所有数据三七分,即70%验证集,30%测试集。如果没有明确设置验证集,也可以按照60%训练集,20%验证集,20%测试集来划分,这是前几年机器学习领域普遍认可的最好的实践方法。如果只有100条、1000条或者1万条数据,那么按照上述比例划分是非常合理的;但是在大数据时代,我们的数据量可能在百万级别,那么验证集和测试集占数据总量的比例会趋向于变得更小,因为验证集的目的就是验证不同的算法更有效。因此验证集要足够大才能评估多个不同的算法,并迅速判断出哪种算法更有效,我们可能不需要拿出20%的数据作为验证集,比如我们有100万条数据,那么取1万条数据便足以进行评估,找出其中表现最好的1-2种算法。同样地,根据最终选择的分类器,测试集的主要目的是正确评估分类器的性能,所以如果拥有百万数据,我们只需要1000条数据便足以评估单个分类器性能。因此,假设我们拥有100万条数据,我们可以取其中1万条作为验证集,1万条作为测试集;对于更大数据集的,训练集的比例可以占到更大。
对于训练集和验证集/测试集分布不一致的情况,比如说训练集是网上下载的图片,验证集/测试集是用户上传的图片,两者分辨率、清晰度等可能差别比较大
要确保验证集和测试集的数据来自同一分布,这样才会使机器学习算法训练的更加快,更加好
最后一点,就算没有测试集也没关系,测试集的目的是对最终选定的神经网络系统做出无偏估计,如果不需要无偏估计,也可以不设置测试集。所以如果只有验证集,没有测试集,我们要做的就是在训练集上训练,尝试不同的模型框架,在验证集上评估这些模型,然后迭代并选出适用的模型,因为验证集中已经涵盖了测试集数据,其不再提供无偏性能估计,当然,如果你不需要无偏估计,就再好不过了
在机器学习中,如果只有一个训练集和一个验证集,而没有独立的测试集,遇到这种情况,训练集还被人们称为训练集,而验证集则被称为测试集,不过在实际应用中,人们只是把测试集当做简单交叉验证集使用。
总结来说,搭建训练验证集和测试集能够加速神经网络的集成,也可以更加有效的衡量算法的偏差和方差,从而帮助我们更加有效地选择合适的方法来优化算法。