2018年07月21日更新
最近在看keras作者寫的Deep Learning with Python莉擒,其中說到了如何使用validation data的問題立莉。這里我總結(jié)一下椎扬。
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函數(shù)中,傳入的validation data并不用于更新權(quán)重寞秃,只是用是來檢測loss和accuracy等指標(biāo)的适刀。但是穷蛹!作者說了土陪,即使模型沒有直接在validation data上訓(xùn)練,這也會導(dǎo)致信息泄露肴熏,模型會對validation data逐漸熟悉鬼雀。所以這里我簡單總結(jié)一下比較方便的data split方法。
- 用sklearn的
train_test_split
來把數(shù)據(jù)分割為training data和test data. - 用keras的模型fit時蛙吏,不要使用
validation_data
這個參數(shù)(因為我們也沒有準(zhǔn)備validatoin data)取刃,而是直接使用validation_split
這個參數(shù)蹋肮,把training data中的一部分用來作為validation data就行了。 - 上面兩步的目的是用來調(diào)參的璧疗,必須在validation data上進行驗證坯辩,輸出loss。
- 調(diào)參:更改layer崩侠,unit漆魔,加dropout,使用L2正則化却音,添加新feature等等
- 等調(diào)參結(jié)束后改抡,拿著我們滿意的參數(shù),再一次在整個training data上進行訓(xùn)練系瓢,這一次就不用
validation_split
了阿纤。因為我們已經(jīng)調(diào)好了參數(shù),不需要觀察輸出的loss夷陋。 - 訓(xùn)練完之后欠拾,用
model.evaluate()
在test data上進行預(yù)測。
2017年07月07日
上一周把一篇論文重新用keras實現(xiàn)了一遍骗绕,源代碼是用java寫的藐窄。
結(jié)果竟然發(fā)現(xiàn)得分比原文高出了4個百分點的。我猜測可能是keras里再fit函數(shù)中設(shè)置的validation data被用于梯度下降酬土,即更新權(quán)重上了荆忍。
于是為了確認自己想法開始找相關(guān)資料,終于在一個issue下找到了解答撤缴。
先說答案吧刹枉,fit 函數(shù)中的validation data并不用于更新權(quán)重。
想看討論過程的可以戳這里屈呕,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函數(shù)中不論是設(shè)置了validation_split還是validation_data微宝,這部分用于validation的數(shù)據(jù)并不會被用來調(diào)整參數(shù),不會被用于更新權(quán)重凉袱。
回顧
說實話以前用sklearn很多,一直沒有怎么重視這個問題侦铜,validation dataset究竟有沒有用來提高模型的效果专甩。可見還是自己在某些概念上沒有搞清楚钉稍。
比如說這個What is the difference between validation set and test set?討論帖里涤躲,大家都說Validation set is used for tuning the parameters of a model。
而在這個whats is the difference between train, validation and test set, in neural networks?回答里贡未,You're not adjusting the weights of the network with validation data set.
我更同意后者的意見种樱。這里總結(jié)一下蒙袍,不論是哪一個NN模型,validation data都應(yīng)該只用來檢測training時的效果嫩挤,而不應(yīng)該被用于更新權(quán)重上害幅。不然的話觀測到的效果就不真實了,就像是拿test data來做training一樣岂昭,會過擬合以现。
Validation set is mostly used to look out for overfitting on the train dataset during training.
對于validation data來說,主要就是為了防止過擬合约啊。比如說在訓(xùn)練過程中邑遏,查看模型在validation data上的accuracy,如果訓(xùn)練了10輪恰矩,發(fā)現(xiàn)accuracy都沒提高记盒,我們就可以及時停止訓(xùn)練,這個技巧被稱為early stopping外傅,可以防止模型過度訓(xùn)練纪吮。
總結(jié)
有些概念在新手階段很容易被混淆,這個時候就應(yīng)該多看看Stack Overflow或github issue里找找相關(guān)討論(撕逼)帖栏豺,看看那些contributor如何解釋彬碱。Test data being used for validation data應(yīng)該是我看過的撕逼最兇的一個帖子了,不過大家都是就事論事奥洼,這種氛圍特別好巷疼。我等吃瓜群眾在看熱鬧的同時還能學(xué)到知識,真是賺到了:)