数据集划分
在有监督的机器学习中,经常会说到训练集(train)、验证集(validation)和测试集(test)。如果我们自己已经有了一个大的标注数据集,想要完成一个有监督模型的测试,那么通常使用均匀随机抽样的方式,将数据集划分为训练集、验证集、测试集,这三个集合不能有交集,常见的比例是8:1:11,当然比例是人为的。从这个角度来看,三个集合都是同分布的。
When training multilayer networks, the general practice is to first divide the data into three subsets. The first subset is the training set, which is used for computing the gradient and updating the network weights and biases. The second subset is the validation set. The error on the validation set is monitored during the training process. The validation error normally decreases during the initial phase of training, as does the training set error2. there is no fix criteria to recommend what is the best percent of divided the training data and testing data. Its only depend on the complexity of your situation (Application) how many independent parameter you have chosen. There is no fix criteria as such.
如果是做比赛,官方只提供了一个标注的数据集(作为训练集)以及一个没有标注的测试集,那么我们做模型的时候,通常会人工从训练集中划分一个验证集出来。这时候我们通常不再划分一个测试集,可能的原因有两个:1、比赛方基本都很抠,训练集的样本本来就少;2、我们也没法保证要提交的测试集是否跟训练集完全同分布,因此再划分一个跟训练集同分布的测试集就没多大意义了。
I. 训练集
有了模型后,训练集就是用来训练参数的,说准确点,一般是用来梯度下降的。
II. 验证集
验证集基本是在每个epoch完成后,用来测试一下当前模型的准确率。验证集和训练集,应该是不交叠的。这样选择模型的时候,才可以避免被数据交叠的因素干扰。
这就需要区分一下模型的各种参数了。事实上,对于一个模型来说,其参数可以分为普通参数和超参数。不同超参数组合,就对应着不同的潜在模型。验证集上跑的,实际上却是一个模型集合。验证集的存在,是为了从这一堆可能的模型中,帮你表现最好的那个。总之就是按照验证集的效果,来选超参数,从而决定最终模型。因此,怎么设定验证集,划分多少数据做验证,其实是每个研究者需要独立作出的决策,不应该强行设定为一致。
在不引入强化学习的前提下,那么普通参数就是可以被梯度下降所更新的,也就是训练集所更新的参数。另外,还有超参数的概念,比如网络层数、网络节点数、迭代次数、学习率等等,这些参数不在梯度下降的更新范围内。尽管现在已经有一些算法可以用来搜索模型的超参数,但多数情况下我们还是自己人工根据验证集来调。
那也就是说,从狭义来讲,验证集没有参与梯度下降的过程,也就是说是没有经过训练的;但从广义上来看,验证集却参与了一个“人工调参”的过程,我们根据验证集的结果调节了迭代数、调节了学习率等等,使得结果在验证集上最优。因此,我们也可以认为,验证集也参与了训练。
III. 测试集
那么就很明显了,我们还需要一个完全没有经过训练的集合,那就是测试集,我们既不用测试集梯度下降,也不用它来控制超参数,只是在模型最终训练完成后,用来测试一下最后准确率。
比较模型效能数值结果时,你只能拿不同的模型,在同样的测试集上面比。只有在同样的测试集上,两个(或以上)模型的对比才有效。
IV. 模型对比
一般来说,如果你要强调自己的模型优于其他人,那么就要保证是在同样的训练集上训练出来。
不要考虑对方声称达到了多高准确率。把他提供给你的数据全集,自行切分。之后复现对方的模型,重新跑。之后把你的模型,和复现的对方模型在同样的测试集上做对比,就可以了。
由于某篇文章未提供代码与具体数据切分说明,带来可重复性问题,我们不得不独立复现了其模型,并在测试集完全一致的情况下,进行了比对。