2018年07月21日更新
最近在看keras作者写的Deep Learning with Python,其中说到了如何使用validation data的问题。这里我总结一下。
every time you use feedback from your validation process to tune your model, you leak information about the validation process into the model. Repeated just a few times, this is innocuous; but done systematically over many iterations, it will eventually cause your model to overfit to the validation process (even though no model is directly trained on any of the validation data). This makes the evaluation process less reliable.
首先Keras的fit函数中,传入的validation data并不用于更新权重,只是用是来检测loss和accuracy等指标的。但是!作者说了,即使模型没有直接在validation data上训练,这也会导致信息泄露,模型会对validation data逐渐熟悉。所以这里我简单总结一下比较方便的data split方法。
用sklearn的train_test_split来把数据分割为training data和test data.
用keras的模型fit时,不要使用validation_data这个参数(因为我们也没有准备validatoin data),而是直接使用validation_split这个参数,把training data中的一部分用来作为validation data就行了。
上面两步的目的是用来调参的,必须在validation data上进行验证,输出loss。
调参:更改layer,unit,加dropout,使用L2正则化,添加新feature等等
等调参结束后,拿着我们满意的参数,再一次在整个training data上进行训练,这一次就不用validation_split了。因为我们已经调好了参数,不需要观察输出的loss。
训练完之后,用model.evaluate()在test data上进行预测。
2017年07月07日
上一周把一篇论文重新用keras实现了一遍,源代码是用java写的。
结果竟然发现得分比原文高出了4个百分点的。我猜测可能是keras里再fit函数中设置的validation data被用于梯度下降,即更新权重上了。
于是为了确认自己想法开始找相关资料,终于在一个issue下找到了解答。
先说答案吧,fit 函数中的validation data并不用于更新权重。
想看讨论过程的可以戳这里,Test data being used for validation data
解释
@KeironO take a close look at what @neggert said : "The validation set is checked during training to monitor progress, and possibly for early stopping, but is never used for gradient descent."
Indeed, the data set fed to the argument "validation_data" of model.fit() in Keras is never used for training. Using test data for this validation is SAFE.
fit函数中不论是设置了validation_split还是validation_data,这部分用于validation的数据并不会被用来调整参数,不会被用于更新权重。
回顾
说实话以前用sklearn很多,一直没有怎么重视这个问题,validation dataset究竟有没有用来提高模型的效果。可见还是自己在某些概念上没有搞清楚。
比如说这个What is the difference between validation set and test set?讨论帖里,大家都说Validation set is used for tuning the parameters of a model。
我更同意后者的意见。这里总结一下,不论是哪一个NN模型,validation data都应该只用来检测training时的效果,而不应该被用于更新权重上。不然的话观测到的效果就不真实了,就像是拿test data来做training一样,会过拟合。
Validation set is mostly used to look out for overfitting on the train dataset during training.
对于validation data来说,主要就是为了防止过拟合。比如说在训练过程中,查看模型在validation data上的accuracy,如果训练了10轮,发现accuracy都没提高,我们就可以及时停止训练,这个技巧被称为early stopping,可以防止模型过度训练。
总结
有些概念在新手阶段很容易被混淆,这个时候就应该多看看Stack Overflow或github issue里找找相关讨论(撕逼)帖,看看那些contributor如何解释。Test data being used for validation data应该是我看过的撕逼最凶的一个帖子了,不过大家都是就事论事,这种氛围特别好。我等吃瓜群众在看热闹的同时还能学到知识,真是赚到了:)