本篇是看完吴恩达老师DL的课,写来当笔记看的,若有错误与疑虑,请指正或提出。
训练集(Training set)的作用:更新模型参数。
验证集(开发集)(Dev set) 的作用:评估训练得到的多种不同模型或者是带着不同参数的同一模型的效果,再根据模型在验证集的效果对模型进行选择和调参(因此可以说验证集也参与了训练),使得模型效果在验证集达到最优,最后选出效果最好的模型。
测试集(Test set) 的作用:对最终筛选出来模型的泛化能力进行评价。测试集最重要的是未知,即用一个学习集之外的数据集来对模型的效果进行评估,看看模型能否给出合适的输出;就像是用一张你平时刷题没刷到过的题组成的卷子,来检验你对知识的掌握情况,这样才合理嘛。
另外,我想提一下这个: 对于测试集的作用,Ng原话是:对最终选定模型的性能进行无偏估计。我刚看课程时是云里雾里的,后面发现对于测试集作用,两句话其实是一个意思。
下面为个人理解:无偏估计(概率论的东西),就是估计量的期望值等于被估计量的真实值。最重要的是这一句:样本均值的期望是总体均值的无偏估计。证明如下:(专门开个word写一遍。。)
上面是纯概率论的东西,现在把它代入到深度学习里面。把模型的性能评价指标(误差、准确度什么的)当成是随机变量X,在有n个数据的测试集上,你计算n个数据得到的n个指标值(即上面的X1~Xn),再除以n,不就得到样本均值的期望了(这里的样本是指标的值,不是指数据集里的那种样本)。根据样本均值的期望是总体均值的无偏估计,所以计算测试集上的性能评价指标平均值其实就是在对模型的总体性能做无偏估计,这个过程同时也是在对模型泛化性能进行评价。
一切试图提升效果的改变都会导致过拟合。比如对训练集的过拟合:你用梯度下降的方式对模型参数进行多次的调整,来降低train loss,经过多次调整后,模型对于训练集的拟合效果会特别好,然而对于验证集的拟合可能效果就不是特别好(就是泛化能力差),这就导致了过拟合。 亦或者是验证集的过拟合:你每次训练完若干批样本后,要用验证集对模型性能进行评估,然后多次调整超参数,让模型在验证集上的性能变得更好,这其实会在超参数层面的过拟合了。
二者都有对模型效果进行评估的作用,它们最重要的区别在于对于模型是否未知。在用验证集进行人工调参的过程中,验证集对于模型是已知的。验证集在被反复使用,用于让模型朝着对验证集拟合甚至过拟合的方向前进,所以测试集的数据是肯定不能和验证集的数据混杂在一起的:混杂在一起就好比就是你把期末考试的题(未知)泄露到期末考前模拟题(已知)里面,这样期末考出来成绩虚高(在这个泄露数据的测试集里,模型性能指标好),学生可能没真正掌握知识点(泛化能力差,导致对于学习集之外的样本可能给不出合适的输出);而测试集仅仅使用一次来评价你调整完的最终模型的性能。
以下都是Ng课上提到的thumb rules:
比如对识别猫这一任务,你训练的图片可能是高像素、经过后期处理的;而你的验证样本和测试样本来源于用户手机随手拍的模糊猫图,这就导致样本分布不匹配的问题。而验证集是用来对多个模型性能进行评估和对模型性能进一步优化,我们是选择在验证集上效果最好的模型作为最终模型,并在测试集上进行模型性能评估。因此,要保证验证样本和测试样本来自同一分布。
测试集不是必要的,训练集和验证集才是必要的。你要通过训练集让模型不断地学习新东西,然后用验证集来判断模型效果的好坏,然后调整模型,多次迭代得到最终模型。你得到最终模型靠的是训练集和验证集,测试集只不过是对你最终模型的效果进行评估而已。
- Coursera 吴恩达 DeepLearning.ai
- 知乎群神的各抒己见:https://www.zhihu.com/question/265443164