|
訓(xùn)練集、驗(yàn)證集和測試集,林林總總的數(shù)據(jù)集合類型,到底該怎么選、怎么用?看過這篇教程后,你就能游刃有余地處理它們了。 1 問題 審稿的時(shí)候,不止一次,我遇到作者錯(cuò)誤使用數(shù)據(jù)集合跑模型準(zhǔn)確率,并和他人成果比較的情況。 他們的研究創(chuàng)意有的很新穎,應(yīng)用價(jià)值較高,工作可能也做了著實(shí)不少。 但因?qū)Ρ确椒ㄥe(cuò)誤,得出來的結(jié)果,不具備說服力。幾乎全部都需要返工。 這里,我?guī)湍闶崂硪幌拢撛趺词褂貌煌臄?shù)據(jù)集合:
目的只有一個(gè)——避免你踩同樣的坑。 其實(shí)這個(gè)問題,咱們之前的教程文章,已有涉及。 《如何用 Python 和深度遷移學(xué)習(xí)做文本分類?》一文中,我曾經(jīng)給你布置了一個(gè)類似的問題。 在文章的末尾,我們對(duì)比了當(dāng)時(shí)近期研究中, Yelp 情感分類的最佳結(jié)果。 下表來自于:Shen, D., Wang, G., Wang, W., Min, M. R., Su, Q., Zhang, Y., ... & Carin, L. (2018). Baseline needs more love: On simple word-embedding-based models and associated pooling mechanisms. arXiv preprint arXiv:1805.09843. 注意這里最高的準(zhǔn)確率(Accuracy)數(shù)值,是 95.81 。 我們當(dāng)時(shí)的模型,在驗(yàn)證集上,可以獲得的準(zhǔn)確率,是這個(gè)樣子的: 97.28%,著實(shí)不低??! 于是我問你: 咱們這種對(duì)比,是否科學(xué)? 你當(dāng)時(shí)的答案是什么? 這么久過去了,又看了那么多新的教程和論文,你的答案發(fā)生變化了嗎? 現(xiàn)在咱們公布一下答案吧。 不科學(xué)。 為什么? 因?yàn)閷?duì)比方法有問題。 2 方法 原文中有這樣一句: 這里數(shù)據(jù)集只提供了訓(xùn)練集和“測試集”,因此我們把這個(gè)“測試集”當(dāng)做驗(yàn)證集來使用。 作為演示,數(shù)據(jù)集咱們想怎么用,就可以怎么用。 甚至你把測試集拿來做訓(xùn)練,然后在訓(xùn)練集上跑測試,都沒有人管。 但是寫學(xué)術(shù)論文,聲稱你的模型優(yōu)于已有研究,卻絕不能這么草率。 注意,比較模型效能數(shù)值結(jié)果時(shí),你只能拿不同的模型,在同樣的測試集上面比。 測試集不同,當(dāng)然不可以。 但模型A用測試集,模型B用驗(yàn)證集(與A的測試集數(shù)據(jù)完全一致)比,可以嗎? 很多人就會(huì)混淆了,覺得沒問題啊。既然數(shù)據(jù)都一樣,管它叫做什么名稱呢? 可是請(qǐng)你注意,哪怕A模型用的測試集,就是B模型用的驗(yàn)證集,你也不能把這兩個(gè)集合跑出來的結(jié)果放在一起比較。 因?yàn)檫@是作弊。 你可能覺得我這樣說,頗有些吹毛求疵的意味。 咱們下面就來重新梳理一下,不同數(shù)據(jù)集合的作用。 希望你因此能看清楚,這種似乎過于嚴(yán)苛的要求,其實(shí)是很有道理的。 咱們從測試集開始談,繼而是驗(yàn)證集,最后是訓(xùn)練集。 這樣“倒過來說”的好處,是會(huì)讓你理解起來,更加透徹。 先說測試集吧。 3 測試 只有在同樣的測試集上,兩個(gè)(或以上)模型的對(duì)比才有效。 這就如同參加高考,兩個(gè)人考同樣一張卷子,分?jǐn)?shù)才能對(duì)比。 甲拿A地區(qū)的卷子,考了600分,乙拿B地區(qū)的卷子,考了580分。你能不能說,甲比乙成績高? 不行吧。 為了讓大家更易于比較自己的模型效果,許多不同領(lǐng)域的數(shù)據(jù)集,都已開放了。而且開放的時(shí)候,都會(huì)給你指明,哪些數(shù)據(jù)用于訓(xùn)練,哪些用于測試。 以 Yelp 數(shù)據(jù)為例。 在 AWS 上存儲(chǔ)的 fast.ai 公開數(shù)據(jù)集中,訓(xùn)練集和測試集都已為你準(zhǔn)備好。 你不需要自己進(jìn)行劃分。 大家達(dá)成共識(shí),做研究、寫論文,都用這個(gè)測試集來比拼,就可以。 所以,如果你的研究,是靠著比別人的模型效果來說事兒,那就一定先要弄明白對(duì)方的測試集是什么。 但是,這個(gè)聽起來很容易達(dá)成的目標(biāo),實(shí)踐中卻很容易遇到困難。 因?yàn)橛械娜藢懻撐模矚g把數(shù)據(jù)和代碼藏著掖著,生怕別人用了去。 他們一般只提一下,是在某個(gè)公開數(shù)據(jù)集上切了一部分出來,作為測試集。 測試數(shù)據(jù)集不發(fā)布,切分方法(包括工具)和隨機(jī)種子選取辦法也不公開。 這是非常不靠譜的行為,純屬自娛自樂。 作為嚴(yán)肅的審稿人,根本就不應(yīng)該允許這樣的研究發(fā)表。 因?yàn)闄C(jī)器學(xué)習(xí)研究的數(shù)據(jù)集不開放,便基本上沒有可重復(fù)性(Reproducibility)。 如果你沒有辦法精確重復(fù)他的模型訓(xùn)練和測試過程,那么他想?yún)R報(bào)多高的準(zhǔn)確率,就純憑個(gè)人愛好了。 當(dāng)然,我們不是活在理想世界的。 你在某一個(gè)領(lǐng)域,用機(jī)器學(xué)習(xí)做應(yīng)用研究的時(shí)候,面對(duì)這種無法重復(fù)已發(fā)表論文的情境,該怎么辦? 直接用他聲稱的結(jié)果與你的實(shí)際運(yùn)行結(jié)果比較,你可能是在追逐海市蜃樓。累到氣喘吁吁,甚至懷疑自我的程度,也徒勞無功。 忽視它? 也不行。 審稿人那關(guān)你過不去。 人家會(huì)說,某某研究跟你用的是一樣的數(shù)據(jù),準(zhǔn)確率已經(jīng)達(dá)到98%,你的才96%,有什么發(fā)表的意義呢? 看,左右為難不是? 其實(shí)解決辦法很簡單。 不要考慮對(duì)方聲稱達(dá)到了多高準(zhǔn)確率。把他提供給你的數(shù)據(jù)全集,自行切分。之后復(fù)現(xiàn)對(duì)方的模型,重新跑。 模型架構(gòu),一般都是要求匯報(bào)的,所以這幾乎不是問題。 至于這種復(fù)現(xiàn),越是復(fù)雜的模型,我越推薦你用 PyTorch 。 之后把你的模型,和復(fù)現(xiàn)的對(duì)方模型在同樣的測試集上做對(duì)比,就可以了。 當(dāng)然,論文里要寫上一句: 由于某篇文章未提供代碼與具體數(shù)據(jù)切分說明,帶來可重復(fù)性問題,我們不得不獨(dú)立復(fù)現(xiàn)了其模型,并在測試集完全一致的情況下,進(jìn)行了比對(duì)。 這里多說一句,一定要保證你自己的研究,是可重復(fù)的。 不要怕公布你的代碼和數(shù)據(jù)。它們不是你的獨(dú)門暗器,而是支撐你研究的憑據(jù)。 回看我們前面提到的 Yelp 公開數(shù)據(jù)的例子。 這時(shí)候你會(huì)發(fā)現(xiàn)一個(gè)奇怪的問題——為什么它只有訓(xùn)練集和測試集? 我們一直反復(fù)提到的驗(yàn)證集哪里去了? 4 驗(yàn)證 驗(yàn)證集,就如同高考的模擬考試。 不同于高考,模擬考只是你調(diào)整自己狀態(tài)的指示器而已。 狀態(tài)不夠滿意,你可以繼續(xù)調(diào)整。 當(dāng)然,參加過高考的同學(xué)都有經(jīng)驗(yàn)——這種調(diào)整的結(jié)果(從模擬考到高考),有可能更好,也有可能更糟糕。 回到機(jī)器學(xué)習(xí)上,那就是測試集上檢驗(yàn)的,是你最終模型的性能。 什么叫“最終模型”? 就是你參加高考時(shí)候的狀態(tài)。包括你當(dāng)時(shí)的知識(shí)儲(chǔ)備、情緒心態(tài),以及當(dāng)天的外部環(huán)境(溫度、濕度、東西是否帶齊)等。 最終模型,只有一個(gè)。 就如同每年的高考,你只能參加一回。 考成什么樣兒,就是什么樣。 而驗(yàn)證集上跑的,實(shí)際上卻是一個(gè)模型集合,集合的大小,你可能數(shù)都數(shù)不過來。 因?yàn)檫@里存在著超參數(shù)(hyper-parameter)設(shè)置的問題。不同超參數(shù)組合,就對(duì)應(yīng)著不同的潛在模型。 驗(yàn)證集的存在,是為了從這一堆可能的模型中,幫你表現(xiàn)最好的那個(gè)。 注意這里的表現(xiàn),是指在驗(yàn)證集上的表現(xiàn)。 好比說,有個(gè)超參數(shù)叫做訓(xùn)練輪數(shù)(epochs)。 在同樣的訓(xùn)練集上,訓(xùn)練3輪和訓(xùn)練10輪,結(jié)果可能是不一樣的模型。它們的參數(shù)并不相同。 那么到底是訓(xùn)練3輪好,還是10輪好? 或者二者都不好,應(yīng)該訓(xùn)練6輪? 這種決策,就需要在訓(xùn)練后,在驗(yàn)證集上“是騾子是馬牽出來溜溜”。 如果發(fā)現(xiàn)訓(xùn)練3輪效果更好,那么就應(yīng)該丟棄掉訓(xùn)練6輪、10輪的潛在模型,只用訓(xùn)練3輪的結(jié)果。 這對(duì)應(yīng)著一種機(jī)器學(xué)習(xí)正則化(Regularization)方式——提早停止訓(xùn)練(early stopping)。 其他的超參數(shù)選取,你也可以舉一反三??傊褪前凑镇?yàn)證集的效果,來選超參數(shù),從而決定最終模型。 下一步,自然就是把它交給測試集,去檢驗(yàn)。這個(gè)我們前面已經(jīng)詳細(xì)講解過了。 至于這個(gè)最終選擇模型,在新數(shù)據(jù)集(測試集)上表現(xiàn)如何,沒人能打包票。 所以,回到咱們之前的問題。在《如何用 Python 和深度遷移學(xué)習(xí)做文本分類?》一文中,我故意用驗(yàn)證集上篩選出的最好模型,在驗(yàn)證集上跑出來分?jǐn)?shù),當(dāng)成是測試成績,這顯然是不妥當(dāng)?shù)摹?/p> 你不能把同樣的題做他個(gè)三五遍,然后從中找最高分去跟別人比。 即便你的模擬考,用的是別人的高考真題。兩張卷子完全一樣,也沒有說服力。 所以你看,驗(yàn)證集的目的,不是比拼最終模型效果的。 因此,怎么設(shè)定驗(yàn)證集,劃分多少數(shù)據(jù)做驗(yàn)證,其實(shí)是每個(gè)研究者需要獨(dú)立作出的決策,不應(yīng)該強(qiáng)行設(shè)定為一致。 這就如同我們不會(huì)在高考前去檢查每個(gè)考生,是否做過一樣多的模擬試卷,且試卷內(nèi)容也要一致。 極端點(diǎn)兒說,即便一個(gè)考生沒參加過模擬考,可高考成績突出,你也不能不算他的成績,對(duì)吧? 不過,講到這里,我們就得要把訓(xùn)練集拿進(jìn)來,一起說說了。 5 訓(xùn)練 如果測試集是高考試卷,驗(yàn)證集是模擬考試卷,那么訓(xùn)練集呢? 大概包括很多東西,例如作業(yè)題、練習(xí)題。 另外,我們上高三那時(shí)候(噫吁嚱,已經(jīng)上個(gè)世紀(jì)的事兒了),每周有“統(tǒng)練”,每月有“月考”。也都可以劃定在訓(xùn)練集的范疇。 減負(fù)這么多年以后,現(xiàn)在的高中生應(yīng)該沒有那么辛苦了吧?真羨慕他們。 這樣一對(duì)比,你大概能了解這幾個(gè)集合之間本應(yīng)有的關(guān)系。 學(xué)生平時(shí)練題,最希望的,就是考試能碰到原題,這樣就可以保證不必動(dòng)腦,卻做出正確答案。 所以,出模擬考卷時(shí),老師盡量要保證不要出現(xiàn)學(xué)生平時(shí)練過的題目,否則無法正確估量學(xué)生目前的復(fù)習(xí)備考狀態(tài),噪聲過高容易誤事兒。 驗(yàn)證集和訓(xùn)練集,應(yīng)該是不交疊的。這樣選擇模型的時(shí)候,才可以避免被數(shù)據(jù)交疊的因素干擾。 每個(gè)學(xué)校的模擬考,卻都恨不得能押中高考的題。這樣可以保證本校學(xué)生在高考中,可以“見多識(shí)廣”,取得更高分?jǐn)?shù)。 高考出卷子的老師,就必須盡力保證題目是全新的,以篩選出有能力的學(xué)生,而不是為高校選拔一批“見過題目,并且記住了標(biāo)準(zhǔn)答案”的學(xué)生。 因此,測試集應(yīng)該既不同于訓(xùn)練集,又不同于驗(yàn)證集。 換句話說,三個(gè)數(shù)據(jù)集合,最好都沒有重疊。 學(xué)生應(yīng)該學(xué)會(huì)舉一反三,學(xué)會(huì)的是知識(shí)和規(guī)律。 用知識(shí)和規(guī)律,去處理新的問題。 我們對(duì)機(jī)器模型的期許,其實(shí)也一樣。 在學(xué)術(shù)論文中,你見到的大部分用于機(jī)器學(xué)習(xí)模型對(duì)比的公開數(shù)據(jù)集(例如 fast.ai 公開數(shù)據(jù)集中的 Yelp, IMDB, ImageNet 等),都符合這一要求。 然而,例外肯定是有的。 例如我在 INFO 5731 課程里面給學(xué)生布置的某期末項(xiàng)目備選項(xiàng),來源于某學(xué)術(shù)類數(shù)據(jù)科學(xué)競賽,目標(biāo)是社交媒體醫(yī)學(xué)名詞歸一化。 其中就有數(shù)據(jù),既出現(xiàn)在了訓(xùn)練集,又出現(xiàn)在了驗(yàn)證集,甚至測試集里也會(huì)有。 面對(duì)這種問題,你該怎么辦? 你怎么判斷自己的模型,究竟是強(qiáng)行記住了答案,還是掌握了文本中的規(guī)律? 這個(gè)問題,作為思考題留給你。 我希望在知識(shí)星球中和熱愛學(xué)習(xí)的你,做進(jìn)一步討論。 另外的一個(gè)問題,是訓(xùn)練集要不要和別人的完全一致? 一般來說,如果你要強(qiáng)調(diào)自己的模型優(yōu)于其他人,那么就要保證是在同樣的訓(xùn)練集上訓(xùn)練出來。 回顧深度學(xué)習(xí)的三大要素:
如果你的訓(xùn)練數(shù)據(jù),比別人多得多,那么模型自然見多識(shí)廣。 對(duì)于深度學(xué)習(xí)而言,如果訓(xùn)練數(shù)據(jù)豐富,就可以顯著避免過擬合(Overfitting)的發(fā)生。 GPT-2 模型,就是因?yàn)榫邆淞撕A?Reddit 數(shù)據(jù)做訓(xùn)練,才能傲視其他語言模型(Language Model),甚至以安全為理由,拒絕開放模型。 但是這時(shí)候,你跟別人橫向比較,似乎就不大公平了。 你的架構(gòu)設(shè)計(jì),未必更好。假使對(duì)方用同樣多的數(shù)據(jù)訓(xùn)練,結(jié)果可能不必你差,甚至?xí)鼉?yōu)。 這就如同一個(gè)復(fù)讀了5年的學(xué)生甲,充分利用每一分每一秒,做了比應(yīng)屆生乙多5倍的卷子。結(jié)果在高考的時(shí)候,甲比乙多考了1分(同一張卷子)。 你能說甲比乙更有學(xué)習(xí)能力,學(xué)習(xí)效果更好嗎? 6 小結(jié) 這篇教程里,我為你梳理了機(jī)器學(xué)習(xí)中常見的三種不同數(shù)據(jù)集類別,即:
咱們一一分析了其作用,并且用“考試”這個(gè)大多數(shù)人都參加過,且容易理解的例子做了詮釋。 希望讀過本文之后,你的概念架構(gòu)更為清晰,不再會(huì)誤用它們,避免給自己的研究挖坑。 祝深度學(xué)習(xí)愉快,論文發(fā)表順利哦! 7 作業(yè) 這里給你留一道思考題: 有的時(shí)候,你看到有人把訓(xùn)練集切分固定的一部分,作為驗(yàn)證集。但是另一些時(shí)候,你會(huì)看到有人采用“交叉驗(yàn)證”的方式,即每一輪訓(xùn)練,都動(dòng)態(tài)輪轉(zhuǎn)著,把一部分的數(shù)據(jù),作為驗(yàn)證集。對(duì)吧? 那么問題來了,什么樣的情況下,你應(yīng)該采用第一種方式,即固定分配驗(yàn)證集?什么樣的情況下,你應(yīng)該采用“交叉驗(yàn)證”方式呢?后者的優(yōu)勢(shì)和缺點(diǎn),又各是什么呢? 歡迎你留言回復(fù),寫下自己的判斷標(biāo)準(zhǔn)與原因闡述。咱們一起交流討論。 8 征稿 One more thing …… 這里還有個(gè)征稿啟事。 國際學(xué)術(shù)期刊 Information Discovery and Delivery 要做一期關(guān)于 “Information Discovery with Machine Intelligence for Language” 的特刊(Special Issue)。 本人是客座編輯(guest editor)之一。另外兩位分別是:
征稿的主題包括但不限于:
具體的征稿啟事(Call for Paper),請(qǐng)查看 Emerald 期刊官網(wǎng)的這個(gè)鏈接(http://dwz.win/c2Q)。 |
|
|