Test / Validation 帶給中文使用者的困惑 Q&A

Q:看到有人說「如果現在有新資料,可以拿Test進去跑模型,並拿新資料來驗證。」這說法正確嗎?Test不是不能拿去跑模型?

A:不得不說,這段話聽起來真的超順耳的,但這邊講的「驗證」並非指「Validation」,可能被「驗證」這兩個中文字困惑了,縱使中文語意很通順,但他實際要表達的是「可以將原本的Test改成Validation或Train,重新去做模型,並拿新的資料當成新的Test。」

但當然前提是新的資料有Y_real,另外這屬於「舊資料都拿去跑模型,新資料都拿來看模型好不好」的邏輯思維,以偷懶的角度(像我)會直接把新資料當validation就好,train和test都不用動。

Q:所以模型處理可以不必有Validation,但一定要有Test?

A:正確,一定需要公正客觀第三方,來看訓練出來的模型準確度(Testing Accuracy)如何,同時又因為它必須具備Y_real,所以第一次跑模型,拿到的資料,不能全部都做成Train或Train + Validation,而一定要保留Test。但後續有新資料,就能視狀況自由運用舊資料了。

Q:應該要建置Validation Dataset嗎?

A:理論上,我們測越多的模型、測越多的參數、建置越完善的反饋模型,就能找到更棒的模型及參數配置,但人的一生有限,你希望窮盡一生只為了找到眼前更棒的模型嗎?所以這很視需求而定,如果在穩定的產業下,經驗豐富的數據分析師,已經習慣幾個很不錯的模型和參數配置,新資料來就不見得需要每次都得轉變成Validation Dataset去找更好的模型。

但換個角度想是,模型就再也不會進步了,所以應該這樣問:在你的時空背景裡,讓模型進步是必要的嗎?有足夠的軟硬體、好的效能、穩定且充分的新資料來源,可以讓你看到模型進步嗎?這權衡的是Validation運作下去的效益,不然單純比較模型正確性,當然有Validation Dataset去反饋訓練,理論上Test準確度會較高。

Q:所以如果我看到Testing Accuracy很不好,而回頭改模型,是不行的?

A:對,不行。理論上這樣只是把模型改得更符合Test而已,對未來的新資料並沒有幫助。

Q:但如果不透過觀察Testing Accuracy,每次回頭改模型,那我該怎麼知道要往什麼方向去修正模型?

A:當你有這樣的考量,你就需要做Validation Dataset,每次觀察Validation Dataset的Accuracy,去試圖修正你的模型,並觀察每次的修正,是否有帶動Validation Accuracy的改善?如果有,再觀察Testing Accuracy是否也有同步改善。如果兩個數值是同步改善的,那姑且就能先相信這樣的改善方向正確,但也有機率會發生,你只是剛好做到了同時over-fitting Validation和Test的改善罷了。這種時候就得等新資料來當新的Test才能發現了。
(註:這裡得看實際到底運作什麼模型,但本文不細究各模型,不然談不完,光釐清Validation和Test已經一長篇了。)

Q:之前你曾經遇過完全把Validation和Test搞反的主管,你為什麼沒有糾正他?

A:不要說業界主管了,我還遇過教機器學習的老師搞反的……。但有時候我覺得可能非戰之罪,因為中文語意上真的很容易講出這句話「拿新資料來驗證」,對啊,沒錯啊,我有新資料我確實可以驗證原本的模型是不是真的有做好啊,但隨後你可能馬上聽到他說「把新資料拿來test看看 」……。

哇靠所以新資料到底是要進Validation還是進Test,你搞得我好亂啊!Validation的X可以拿來修模型,Test的X不行欸!甚至連我想看著Test Accuracy回頭去修模型都不行欸!

Q:那當老師提到「驗證」或「test」的時候,到底該怎麼區別?

A:我覺得就直接問,老師你說的「驗證」,指的是把新資料進「Validation Dataset」嗎?老師可能會很慌張地發現自己無意間說出了非常會誤導的字眼,他可能會回你:「喔不是不是!我這邊說的『驗證』不是Validation,我意思是能拿來看模型『好不好』,換句話說我意思是可以拿來進『Test Dataset』。」這時候你就清楚了,但我知道台灣學生都不太愛發問,於是就會一直困惑住自己。

就像我也曾經很省略地說過「Validation確實不是拿來建Model」,但我的意思其實是「當這次拿到新資料且不需要重新處理Validation階段時,Validation確實可以不用進Model去反饋訓練,可以當作Test。」

對啦其實我知道我這樣講很有語病,因為當我決定Validation資料要當作Test用時,其實已經沒有所謂「Validation資料」了,它就是單純的「新資料」罷了,後面提到習慣動作會再補充說明這個。

Q:還是想問你為什麼沒有糾正那個主管?讓他知道自己錯了?

A:那你不是當場讓他很沒面子嗎?(笑)……好啦應該說,慣用中文的人,會誤把Validation和Test搞混,把「驗證」和「測試」搞混,在我認為非常合理,甚至不能苛責他們,就說了你問絕大多數沒碰過模型的人,他們肯定都回答你「先測試,再驗證」。所以我心裡並沒有覺得這是【非改不可、非釐清不可】的事情,甚至放寬心胸來看,那不過就是一個專有名詞定義罷了。我還看過把網路共用資料夾稱為資料庫的呢……

另外,如果當場我糾正他,那接著的討論會非常麻煩,因為如果對方接受糾正,那麼……當他很順地在描述「所以我們的Validation……」,你會無法確定他還在原本的錯誤,他講其實是Test,還是他已經有改過來,他講的真的是Validation?所以當下都不應該糾正,反而應該順著他的思路,我們也將Validation和Test反過來講,會議才能順利進行。

真的要糾正,也是整場會議結束後,甚至只剩下自己跟主管獨處時,再試著討論這件事。而且也不要劈頭就說「你講反了」,盡可能委婉地說「其實通常拿來做反饋模型的資料集,我們比較會把他稱為是Validation,也就是驗證資料集,而不是測試資料集,不過無妨,各家公司有自己慣用的專有名詞名稱,是很常見的,只是網路上大多會把這個功能的資料集稱為Validation啦~(輕鬆帶過,但也暗示他可以去多了解)」

Q:為什麼你很常把新資料直接當作驗證資料(Validation Dataset)?

A:還是特別強調一下,這並不是唯一解。我之所以很常直接把新資料當驗證資料,大概幾個原因:首先如前面所說這是我的慣用做法,不同人會有風格上的差異,新資料當驗證資料的好處,在於我不必重新調整我的Train和Test,又可以直接嘗試看能不能找到好的模型跟參數配置,所以新資料先進Validation通常是我習慣上的第一動作。

但接著,我真的會重新去跑「找模型和找參數配置」的程式嗎?有時候我想想一跑要好幾天甚至幾週,我就懶了,那這時候已經寫進Validation的新資料怎辦?不怎辦,就直接當Test,和Test合併後去看準確率就好,或是直接替換掉Test,單看新資料的準確率如何?如果還不差,那「找模型和找參數配置」的程式我就肯定更懶得去跑了。

另外還有一個原因,在不同期間,模型的改善勢必有新資料進來,模型運作不該只有單一期間,跑完就了事,模型必須長時間不斷優化,所以我一直把新資料當成是模型運作的其中一環。那問題來了,單一期間如果我們已經定義完 Train / Test / Validation,那新資料要把它稱為什麼?所以在我習慣上,我並不會在第一個期間就做Validation,而只有Train / Test,會等新資料進來,再重新來找好的模型或參數配置,這也是你很常見到我會直接把新資料叫做Validation的原因,姑且當作小馬個人風格吧!

其實還有一個私人因素,我一直覺得「測試」和「驗證」在中文語意上存在與機器學習定位上的矛盾,畢竟我是慣用中文的人,我會試著想讓這之間沒有矛盾(縱使這個想法不太對,所以說這是私人情感因素),那當我現在只有train / test,爾後我又把新資料直接作為validation,欸嘿~你看,我是不是達成了「先測試,再驗證」的合理性呢?

再講下去好像變成哲學討論了,那我們今天就先到這囉。

如果看完最後一個QA,發現自己變得更混淆,請先忽略最後一個QA,這只是小馬我私人對於模型處理上的習慣定義與任性為之,更往前的內容才是實質客觀上的討論。