训练集、验证集、测试集的作用
在机器学习或者深度学习中,我们需要了解我们的模型包括什么:1)模型设计:①模型架构(包括模型有多少层,每层有多少个神经元);②可训练权重参数(模型内置参数);2)模型训练的参数(模型外置参数,如学习率、优化策略等等)。训练集(train set) —— 用于模型拟合的数据样本。在训练过程中对训练误差进行梯度下降,进行学习,可训练的权重参数。验证集(validation set)..
在机器学习或者深度学习中,我们需要了解我们的模型包括什么:1)模型设计:①模型架构(包括模型有多少层,每层有多少个神经元);②可训练权重参数(模型内置参数);2)模型训练的参数(模型外置参数,如学习率、优化策略等等)。
训练集(train set) —— 用于模型拟合的数据样本。在训练过程中对训练误差进行梯度下降,进行学习,可训练的权重参数。
验证集(validation set)—— 是模型训练过程中单独留出的样本集,它可以用于调整模型的超参数和用于对模型的能力进行初步评估。
验证集可以用在训练的过程中,一般在训练时,几个epoch结束后跑一次验证集看看效果。(验证得太频繁会影响训练速度)这样做的第一个好处是,可以及时发现模型或者参数的问题,比如模型在验证集上发散啦、出现很奇怪的结果啦(如无穷大)、mAP不增长或者增长很慢啦等等情况,这时可以及时终止训练,重新调参或者调整模型,而不需要等到训练结束。另外一个好处是验证模型的泛化能力,如果在验证集上的效果比训练集上差很多,就该考虑模型是否过拟合了。同时,还可以通过验证集对比不同的模型。在一般的神经网络中, 我们用验证数据集去寻找最优的网络深度(number of hidden layers),或者决定反向传播算法的停止点或者在神经网络中选择隐藏层神经元的数量;
由于验证集是用来”训练”超参数的,尽管验证集的误差通常会比训练集误差小,一般来说验证集比较小会低估泛化误差。所有超参数优化完成之后,泛化误差可能会通过测试集来估计。
在普通的机器学习中常用的交叉验证(Cross Validation) 就是把训练数据集本身再细分成不同的验证数据集去训练模型。
测试集 —— 用来评估模最终模型的泛化能力。但不能作为调参、选择特征等算法相关的选择的依据。
类别 | 验证集 | 测试集 |
是否被训练到 | 否 | 否 |
作用 | 纯粹用于调超参数 | 纯粹为了加试以验证泛化性能 |
使用次数 | 多次使用,以不断调参 | 仅仅一次使用 |
缺陷 | 模型在一次次重新手动调参并继续训练后所逼近的验证集,可能只代表一部分非训练集,导致最终训练好的模型泛化性能不够 | 测试集为了具有泛化代表性,往往数据量比较大,测试一轮要很久,所以往往只取测试集的其中一小部分作为训练过程中的验证集 |
互相转化 | 验证集具有足够泛化性(一般来说,如果验证集足够大到包括大部分非训练集时,也等于具有足够泛化性了) | 验证集具有足够泛化性时,测试集就没有存在的必要了 |
PS:
1)验证集是一定需要的;
1)针对超参的选择我们是根据验证集上的效果来进行调整的,因此验证集可以看做参与到“人工调参”的训练过程;
2)注意训练集、验证集和测试集应该服从同一数据分布,这样我们才能进行玄学调参;
3)测试集的存在只是为了验证我们在训练集和验证集(通常验证集只是非训练集一个小子集)上进行模型的超参和参数训练后,验证我们得到的模型是否具有泛化性能,再做一次确认。如果验证集具有足够泛化代表性,测试集是可以没有的,但验证集是必须有的。
验证集的作用:
在每一步训练之后,计算 validation_data
的分类精度。一旦 validation_data
的分类精度达到饱和,就停止训练。这种策略叫做提前终止(early stopping)。为什么要用 validation_data
而不是 test_data
来防止过拟合呢?通过 validation_data
来选择不同的超参数(例如,训练步数、学习率、最佳网络结构、等等)是一个普遍的策略。我们通过这样的评估来计算和设置合适的超参数值。
当然,上面的解释不能回答为什么我用 validation_data
而不是 test_data
来防止过拟合。如果基于 test_data
的评估结果设置超参数,有可能我们的网络最后是对 test_data
过拟合。也就是说,我们或许只是找到了适合 test_data
具体特征的超参数,网络的性能不能推广到其它的数据集。通过 validation_data
来设置超参数能够避免这种情况的发生。然后,一旦我们得到了想要的超参数,就用 test_data 做最后的精度评估。这让我们相信
test_data的精度能够真正提现网络的泛化能力。换句话说,你能把
validation_data视为帮助我们学习合适超参数的一种训练数据。由于
validation_data和
test_data` 是完全分离开的,所以这种找到优秀超参数的方法被称为分离法(hold out method)
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)