當前位置:
首頁 > 知識 > 論機器學習的可重複性危機

論機器學習的可重複性危機

AI 研習社按,機器學習研究者、Jetpac 的 CTO、《The Public Data Handbook》和《The Big Data Glossary for O』Reilly》兩本書的作者 Pete Warden 最近在自己的個人博客上發表了一篇文章,討論了機器學習領域令人頭疼的模型的可重複性問題,廣大研究人員們想必深有同感。AI 科技評論把文章編譯如下。

我最近和朋友聊到,他的初創企業的機器學習模型組織得太糟糕了,在他的團隊成員間基於互相的成果做進一步開發,以及提交給客戶時都出現了嚴重的問題。即便是原作者訓練同一個模型有時也無法得到相似的結果。他希望我能推薦一個解決方案,但我必須承認,我自己的工作也在和類似的問題作鬥爭。這很難向那些非機器學習領域的人解釋,但事實上,當我們嘗試追蹤變化、從零開始重建模型的時候仍然是摸著黑前進的。這種狀況太糟糕了,有時候就好像回到了那個編程的時候沒有源代碼控制的年代。

當我在 90年代中期開始正式編程時,源代碼的變更追蹤和合併的標準是 Microsoft』s Visual SourceSafe。簡單說一下它的使用體驗,它沒有原子登入,所以不能支持多個人編輯同一個文件;網路副本要連夜掃描以避免奇怪的崩潰現象,甚至這還不能保證資料庫在早上還保持完好無損。儘管如此,我仍感覺幸運,有一次面試的地方,我注意到有一面牆,上面貼滿了便利貼,每張對應文件樹中的一個文件。程序員要修改哪個文件的時候就把對應的便利貼摘下來,然後修改完成以後再把它粘回去!

說了這麼多都是為了說明,當提到版本控制,我從來不是一個羞怯的人。我曾經經歷過一些糟糕的系統,如果有需要的話,我現在都還能用 rsync 和鐵絲網去搗鼓出一個解決方案。即便我已經經歷了這麼多風風雨雨,憑良心說,機器學習還是我遇到過的在代碼合併和變更追蹤方面最糟糕的系統。

為了解釋清楚這是為什麼,下面我列舉一個典型的機器學習模型開發周期

研究人員決定嘗試一個新的圖像分類架構。

她從先前的項目里複製粘貼一些代碼來處理她要使用的數據集的輸入。

數據集在網路中的其中一個她的文件夾中,這可能是從 ImageNet 下載的一個數據集,但不確定具體是哪一個。也許不知道什麼時候會有人把其中那些非 JPEG 格式的圖像刪掉,或者做一些其它的小改動,但是這些操作都沒有歷史記錄

她會嘗試很多種稍有區別的想法,改 bug 和稍微調整演算法。這些在她自己的本地電腦上完成,當她想訓練這些模型的時候,她就直接把一大堆源代碼複製到 GPU 集群上。

她會把訓練過程執行很多遍,通常程序在跑的時候,要花幾天或者幾個星期去完成,通常在這期間她還會在自己的本地電腦上修改一些代碼。

可能在集群上跑到快結束的時候出現了 bug,那麼在跑的過程,她需要修改一個文件的代碼,然後把這個改動拷貝到所有的機器上,然後繼續運行程序。

她可能從一個跑出來的程序里拿出部分訓練到的權重,然後在這個新的起點上,運行不同的代碼。

她會記錄所有運行過程得到的權重和對應的評分,然後當她沒有時間做更多實驗的時候就從裡面挑出一組作為最終的模型。這些權重可能來自任何一個跑出來的結果,甚至來自於和她現在手上跑著的代碼非常不同的代碼。

她可能會把最終的程序代碼在源代碼控制中做個登記,不過這是在她的個人文件夾上。

她發表她的結果,附上代碼和訓練權重。

這已經是發生在一位認真負責的研究人員身上的比較樂觀的景象了,同時你想必也已經看出來了,讓另一個人接手把所有這些步驟重複一遍,最終還要得到同樣的結果會有多難。每一個關鍵的地方都是不和諧的點能偷溜進來的機會。事情更詭異的是,ML 框架會為了運行速度犧牲一部分數值計算的精度,所以,如果一個人能奇蹟般地把每一步準確地複製過去,最終結果依然會有細微的差別!

在許多現實例子中,研究人員不會記筆記或者準確記住她做過什麼,所以就算是她本人也不能再現模型。就算她能,模型框架的代碼也會隨著時間變化,有時甚至是很徹底的,所以為了讓一切正常工作,她還需要給整個系統做快照。當我接觸那些 ML 研究人員,希望他們幫我重現模型結果時,他們對於需要花費的時間都相當大方,但即便在這些原作者的幫助下,我也還是常常需要花費數月的時間。

為什麼這些很重要?有幾個朋友聯繫我說,為了在自己的論文里復現別人發表的模型,他們花費了很多精力。如果他們不能得到和原作者相同的準確性,那他們怎麼能說自己得到了新的結果是進步?同時很顯然地,在依賴模型的產品系統中,如果你不能重建這些模型來適應改變的需求設計和平台要求,這也會令人擔心。從這個角度上看,你的模型就從技術債務上的高利率信用卡變得更像某種高利貸放貸人了。同時這對於研究實驗也是令人窒息的,因為既然改代碼和訓練數據都是很難撤回的操作,那麼要試更多的變數似乎是一個困境,就像在沒有源代碼控制的時候修改代碼一樣會增加實驗中改變變數花費的精力。

也不全是沮喪和厄運的消息,這個圈子裡也有一些關於復現的值得注意的努力。其中一個我最喜歡的是 Toby Boyd 團隊領導 the TensorFlow Benchmarks 的項目。他們團隊的使命是,不僅要準確展現出如何在各種不同的平台上以很高的訓練速度訓練出一些頂級的模型,同時還要保證這些模型訓練完畢之後可以達到預期的準確率。我曾見過他為了讓模型達到那種精度付出了很多心血,由於我上面列出的任何一個步驟中發生一點變化都會影響到結果,而且也沒有什麼簡單的方法可以發現背後的原因是什麼,即便有原作者參與幫忙。所以他仍在努力。這也是一個沒有止境的工作,因為來自 TensorFlow 的,GPU 驅動的,甚至數據集上的變化,都能對準確性產生微妙的影響。通過這項工作,Toby 的團隊幫我們找到並且修好了由於模型上的 TensorFlow 的改變而產生的 bug 和追蹤到由外部依賴項造成的問題,但這仍然只能覆蓋到相對很少的一部分平台和模型。

我還知道一些其他的團隊在認真考慮把模型用在生產上,花了和復現別人的模型差不多的時間精力保證他們的訓練結果能被別人復現,但問題在於這仍舊是一個非常手動的過程。沒有什麼東西可以等同於源代碼控制,甚至為了未來能成功再次運行模型應該採用什麼樣的訓練流程都沒有公認的最佳做法。。對此我也沒有解決方案,但為了方便討論,在這裡列舉了一些我覺得可能有用的原則:

研究人員能容易地將新的想法加進去,不用付出很大的「過程稅」。如果這不能實現,他們就不會使用它。理想情況下,系統會有效促進生產。

如果負責的研究人員出車禍了(劃掉)或者建立自己的初創公司之後就離開了,其它的人第二天就能把原來的事情接過來並訓練所有他們至今創造的模型,而且得到相同的結果。

應該存在某種方法能找到包含針對某一特定模型的所有需要訓練的參數,按照這種方法能夠不拖泥帶水地公開分享構建模型需要的參數。

為了再現結果,代碼、訓練數據和整個平台的信息都需要準確地記錄下來。

我已經在開源社區和初創公司里看到了一些嘗試解決這些問題的有趣嘗試,對我個人而言,我巴不得馬上就能減少自己花在處理這些相關問題上的時間,但我也不期待短期能完全解決這個問題。無論我們想出什麼都會對我們處理模型的方法產生變化,同樣的,源代碼控制意味著對我們個人編程過程也是一個大的改變。將來我們的訓練的一致性和教育這個圈子的後輩的效果一定會和我們想出來的工具一樣繁榮,我都等不及看到這些了。

原文地址:

https://petewarden.com/2018/03/19/the-machine-learning-reproducibility-crisis/

4 月 AI 求職季

8 大明星企業

10 場分享盛宴

20 小時獨門秘籍

4.10-4.19,我們準時相約!

新人福利

關注 AI 研習社(okweiwu),回復1領取

【超過 1000G 神經網路 / AI / 大數據資料】

不知道如何開始機器學習?這有份初學者指南!


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 AI研習社 的精彩文章:

用Keras 實現的神經網路機器翻譯
類Keras的PyTorch 深度學習框架——PyToune

TAG:AI研習社 |