各位同学上一节课我们讲解了over-fitting,under-fitting的概念,我们也讲了,怎么检测over-fitting,under-fitting以及怎么减少over-fitting,under-fitting?其中最主要针对的是over-fitting这个概念,

我们这节课来讲一下,通过Train-Val-Test可以检测出,是不是over-fitting?

交叉论证的机器学习方法_数据


让我们回顾一下上一节课中间这幅图就是一个比较接近于原来数据的一个模态,然后左边的话是我们预估的模型的一个复杂度,或者是一个capacity少于我们真实的一个capacity,然后右边的是更常见的就是我们的模型的表达能力强,导致它会过度的去拟合每一个带噪声的数据,现在我们来看一下怎么检测呢?我们上节课讲了一个例子,就是说让你模仿的能力很强的时候,你会把train data set的每一个loss都会减少掉,这样子它会导致对于没有在train data set的数据集或者数据他会产生很大的loss,利用这种现象,我们就可以把data set划分为一个train data set and test data set,

交叉论证的机器学习方法_ci_02


通过你划分了以后,你首先我们在train data set上面做一个training,他training的时候,他就会去学习这一个train data set的一个模式,因为train data set的和test data set都是来自于同一个数据集,所以他们的真实的分布肯定是一样的,当我们在train data set下面学到一个分布以后,我们要检测它是不是over-fitting的呢?就是说我们在test的时候也做一个精度和loss的检测,如果我们发现他的training上面表现非常好,但是她在test上面表现会很差,那这种情况还说明了它是over-fitting呢?我们来看一个简单的实现over-fitting的例子,其实我们之前所有的实验都已经用到了这个思想。

交叉论证的机器学习方法_交叉论证的机器学习方法_03

只是我们没有跟大家说而已,一般来说,我们会有一个training data set,train_loader以及会有个test_dataloader,然后我们的数据集是全部sample自training_dataloader的,也就是我们这里的x和y是全部sample至这个数据集,然后我们会隔一段时间做一次测试,也就是我们之前讲那个测试,我们做测试的目的是为了什么,大家回答一下我们做错事的目的是看他有没有over-fitting?我们要选取他在over-fitting之前的一个最好的模型的参数,大家记住我们这里的test是用来选择模型的参数,也就是说是用来防止over-fitting 的,然后我们这里test,他并不是真实的test,其实我们这里的test,他应该叫另外一个名字叫做什么叫做validation?只是说当你只有两个Set的时候,我们一般把validation也叫做test,这就就是一个命名的一个这样的区别,但要注意区分一。

想就知道这个意思,以后你不管别人是用validation set还是用test set告诉你,你知道是那个意思,就是说这个东西它都是用来挑选一个模型的参数,提前的终止你这个training,防止over-fitting,然后我们后面会讲,如果training-val同时出现的时候,这三个数据集又分别承担了不同的功能,让我们来看一下,如果我们都有一个training_dataloader和一个test_dataloader的时候,我们所有的数据集都是来自于training_dataloader对吗?我们就在data,target,是用在送到这个模型里面,是用来做一个backward的,然后我们每隔一段时间,比如说我们training完一个epoch以后,我们这个时候需要检测一次,我们检测一次的目的就需要提前知道是不是已经over-fitting了,如果已经over-fitting了,我们就取最好的一次的状态,用来作为当前模型优化出来一个最终的状态,over-fitting的检测来我们就是在数据sample到data_loader里面来,然后再检测一个精度或者检测一个test的loss,然后根据这个test_loss的一个情况来识别他是不是已经over-fitting了?我们一般最简单的认为是什么呢?我们一般最简单使用的选取这个test_acc最高的那一个点在那一个点停止掉,然后我们选取最高的那一个点的状态,作为我们模型的一个最终状态,

交叉论证的机器学习方法_ci_04


然后这幅图他之前其实已经看过了,我们在讲test的时候已经看过了,就是说,比如说到达这一个点的时候,我们发现了什么?我们发现红色的这一条线,也就是我们的test曲线,然后蓝色的这一条线是我们的一个training的曲线,到了这一大点之前,他都是没有over-fitting的,也就是说,training和test 的performance都随着你的training的时间进行,都会慢慢的下降,让到达某一个临界点的时候,你的training会慢慢的变得over-fitting挺会导致你的training模型会过分的去拟合你training的每一个模式,会导致你的泛化能力会变得更差,这样子的话,从这个点开始,你会越training发现你的performance是越差,甚至会出现这种情况就急剧恶化,慢慢的逐渐提升的一个这样情况,然后我们一般选模型是怎么选取的?我们会观察你这个test的performance,我们在你training的时候会间隔一段时间来观察你的test performance当我们会观察到你最好的一个状态,比如说在这里,我会观察这个状态对吗?因此我们会把这个状态保存起来,也是这个状态的,w和b的一些具体的参数值保存起来,然后等你training完以后,你发现你training到这个时候,你已经确认他确实已经是over-fitting了,那我们就把这个当前的状态给保存起来,作为这个模型training的一个最好状态,我们使用这个training point是交给了客户去做一个预测。是做一个他们的对应的一个本来开始那个应用,

交叉论证的机器学习方法_机器学习_05

现在我们来看一下另外一种情况就是什么呢?

因为我们刚刚的spliting就只有划分为一个training_set还有一个test _set对吗?就是画完两个,但实际上更常用的,或者说标准的概念来讲是三个这样的概念。是什么意思呢?我们除了有训练集来训练网络,用test用来挑选参数以外,我们还新增了一个概念,我们新概念就叫做validation,新增了validation这个概念以后,我们的tset他就不是用来做模型的参数挑选了,我们把原来tset的功能换成validation为了什么。原来的tset做模型的参数的挑选,使用来停提前的停止这个training提前的防止over-fitting。现在我们把那一部分的功能交给validation,其实也就是validation是用来挑选模型参数的,Test是真真实实交给客户,客户在验收的时候看一下你这个性能怎么样?为什么要这么划分?

我跟他讲一下,因为我们的validation我们也刚刚讲了,就是用来挑选模型参数的,对吗?你肯定会挑选validation上面performance最好的对不对?如果客户拿的跟你一样的大赛的,如果客户也是用validation的dataset去测试模型的话,他是不是也会得到一个比较好的表现?因为你为什么因为你就是用这个数据去挑选这个模型的参数的,那么他很有可能如果客户跟你拿到一样的数据集的话,他去做测试的时候,她几乎是跟你会得到一样完全一样的这样表现这样子的话,他就会怀疑你有没有做tricking怎么做tricking?你可以做一个作弊的方法,就是说如果你有客户的数据集,或者是客户的数据和你数据是一样的话,你可以不遵行training和validation这种设置

什么意思、你甚至可以把validation当成trainingset,也用训练,懂吗?

因为这个数据集都有了,怎么做取决于你对吗?你有的时候会为了取得一个很好的表现,然后你会欺骗客户,你就把原来用来做validation的set,用来做training这样子的话,你会完完全全的over-fitting掉,因为你现在已经没有validation set或者是你的validation set已经掺和进了你的training dataset的,也就是说,你把外面带橙色的这一部分和你的training dataset合并在一起,然后一起用来training ,然后一起用来做validation这样子的话,肯定会出现over-fitting,这种情况有个好处是什么呢?因为你的客户用来做的测试集和你的数据集是一样的,或者说是你的一部分,那么很有可能客户拿到的这个效果就是客户拿回去以后,然后你的模型回去测试以后他会得到一个很好的结果,因为它的数据集已经被你train过了,这个时候客户为了防止你作弊

他会单独来抽一份数据集出来不给你看到,也就是说你不知道这一份数据集叫什么,你也不知道他什么样子,所以这份数据集叫做test set,就是客户手中的一部分set,然后你的话,你会拿到一个大概是80%的样子,这个set你会把它切分成,对吗?你会把它切成什么样子?
validation对不对?你这两份数据集集合在一起,用来挑选模型,但是你因为没有这部分的数据,所以的话,你没办法作弊,你就只能老老实实地发了我们的标准设定用validation来挑选模型的参数来挑了一个比较好的,具有泛化能力的误差,然后你期待他能够在客户的test中能取得了很好表现,这是为什么我们要设计这三个set的一个初衷,大家想一下,为什么单独再设置一个test set,而且一般来说tset set是一般都不会给你的,但是我们做research的时候,我们就直接拿到了一个完完整的数据集,我们可以人为的做切分,以后做产品,或者说我们做比赛,比如说我们打kaggle比赛的时候,我们test都不会给你的,因为它会防止你作弊,懂吗?它会防止你作弊的话,他会把你的有一部分数据集抽出来,不给你用,然后你也拿不到,你只会得到一个最终的结果,就比如说你把这个training好的模型你用validation set选择好了,一个比较好的一个trick point,你把这个网络的参数作为一个模型交给这个客户或交给这个比赛的一个组委会的时候,组委会汇总这个test set上面sample出data来training你这个performance,然后这个performance才会返回给你,但是你如果你利用这个performance,你可以再来挑选模型,对不对?你是不是可以这样子?因为他会即使你拿不了这一份数据,你也可以利用他给你的performance。

再一次挑选模型,为了防止这种情况出现,我们在交接的时候,或者是说你比较的时候你都会有一个提交的一个限制数量就比如说,你一天只能提交三次,因为你你想一下,你要用他test performance来人为的挑选模型的参数的话,你是不是可能要试很多次?如果你一天只能提交一次一天只能提交三次的话,你这样子的基本上很大程度上使用test performance的模型的参数,所以的话,大家这里稍微总结一下,我们使用首先使用train dataset来update这个参数对不对update后用validation set来选择我们再来个时间点,请指教,然后选择哪一个时间戳上面的一个参数你怎么得了一个参数θ?然后我们会在test set做一个测试,因为你数据集你得不到你没办法作弊,你只会返回给你一个最终结果让你拿到这个结果以后,从理论上面来讲,你拿了几个test set里的一个精度以后你是不能做任何事情的,如果你用了这个acc,你人为来反馈了,你再去挑选你的模型的参数就是你这个acc的反馈,你的那个挑选的话,那是不是从这种情况下面来讲?你test的功能和你validation的功能是不是有点类似啊?再回忆一下我们的validation set就是用来挑选模型参数的对吗?如果你交给了一个组,比你发现你的比赛成绩不好,你用这个结果再来挑选你的模型参数的话,这个时候test的功能和你validation的功能是不是接近一致了?那这种情况就叫做数据污染,因为你已经利用人为这个先验知识去挑选这个参数和某种产品上讲,就是一种作弊。