機器學習研究重現難,難於上青天

機器學習研究重現難,難於上青天

導讀:可重現性 / 一致性是計算科學研究的一項基本要求,機器學習也不例外。

機器學習研究論文毫無疑問是一筆寶貴的資產。這些論文可以用來啟發未來的研究;它們可以成為對學生有用的教學工具;它們可以為工業界的應用研究人員提供指導。也許最重要的是,它們可以幫助我們回答那些有關人類存在的最基本的問題:比如,學習到底是什麼意思?人類的存在意味著什麼?雖然可重現性在科學研究中並不總能夠做到,但它是提高研究質量的有力標準。如果研究結果可重現,那就證明這個研究結果有可能更穩健、更有意義,至少排除了許多由實驗者帶來的錯誤(比如弄虛作假或偶然得出的結果)。

然而,現有的很多機器學習研究結果要麼不可重現,要麼難以重現。如何確保研究成果的可靠性和可重現性,是很多機器學習研究者致力於解決的問題。甚至在 2017 年的 ICML 上,還專門組織了一場名為“Reproducibility in Machine Learning”的 Workshop,以探討機器學習研究結果的可重現性和可複製性問題。

為什麼機器學習研究重現起來那麼難?來看看在谷歌 TensorFlow 團隊研究深度學習的工程師 Pete Warden 怎麼說。

機器學習研究重現難,難於上青天

Pete Warden 的文章發出後,很多正在研究機器學習的工程師、研究員紛紛表示贊同,包括谷歌大腦研究員、SketchRNN 的爸爸 David Ha(@hardmaru)也默默轉發了他的推文。

我有個朋友創辦了一家機器學習初創公司,最近,他碰到了一些麻煩。他們的機器學習模型雜亂無章,當他的團隊想基於這些模型構建一些東西或把它們展示給客戶時,出現了嚴重的問題。有時候,即使是模型原作者都無法正常地運行自己創建的模型,或者得到與之前同樣的結果。他向我求助,希望我給他建議一個解決方案,但我不得不承認,我在工作中也正遭遇著同樣的問題。向不瞭解機器學習的人解釋這些東西真的很難,我們最後還是回到了那個不使用代碼版本控制系統的年代,並從頭開始訓練模型,儘管有時候覺得這樣做簡直糟透了。

我從 90 年代中期開始我的代碼生涯,那個時候,微軟的 Visual SourceSafe 是標準的代碼版本控制系統。為了提供良好的體驗,它不支持提交代碼原子操作,所以多個開發者不能同時修改同一個文件。在晚上的時候需要進行掃描和拷貝,避免出現意外的衝突,但即使是這樣,也無法保證在早上的時候數據庫是完整的。只能說我足夠幸運,我所在的團隊準備了一面牆,他們在牆上貼上便條,每張便條對應項目裡的一個文件。當某個開發人員想要修改某個文件時,就拿走對應的便條,等改完了再把便條放回去。

可以說,在版本控制系統面前,我是毫無畏懼的。我曾經使用過一些非常糟糕的系統,如果有必要,我甚至可以使用同步工具自己搗鼓出一些解決方案。但即使是這樣,在機器學習開發的變更跟蹤和協作這個問題上,我可以非常坦誠地說,我也是束手無措。

為了解釋這個問題,先來看看典型的機器學習模型生命週期:

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

  • 她從之前的項目拷貝了一些代碼用於處理輸入數據集。

  • 數據集存放在網絡上的某個文件目錄下,有可能是從 ImageNet 上下載下來的,但不清楚是哪個目錄。在某個時候,可能有人移除了部分非 JPEG 格式的圖像,或者做了其他一些細微的修改,但沒有留下任何修改歷史。

  • 她想方設法修復 bug,並調整算法。這些變更都發生在她的本地機器上,為了訓練模型,她需要把大量的代碼拷貝到 GPU 集群上。

  • 她反覆訓練了幾次模型,並在本地機器上繼續修改代碼,因為訓練一次模型需要幾天甚至幾周的時間。

  • 在訓練接近尾聲時可能出現了 bug,她就在趕緊修改了其中一個文件,並把它拷貝到集群的機器上。

  • 她可能將某一次訓練得到的半成品權重用在了新的訓練上,而新的訓練是基於剛修改過的代碼。

  • 因為時間的關係,她評估了這幾次的訓練結果,並選擇其中一個作為最終要發佈的模型,但這個模型有可能是使用不同的代碼訓練出來的。

  • 她把代碼提交到版本控制系統的個人目錄下。

  • 她把代碼和模型發佈出來。

這已經是當研究人員足夠小心謹慎時的一種比較樂觀的情況了,但你已經可以想象到,如果換了另外一個人,要重複上面這些步驟,並保證得到同樣的結果,會有多難。上述的每一個步驟都有可能出現不一致,更何況機器學習框架有時候會在性能和數字準確性之間做出權衡,就算真的有人可以按部就班地重複上述的步驟,仍然會出現不一樣的結果。

大多數情況下,研究人員可能沒有記下自己都做了些什麼,所以無法生成同樣的模型。即使她記下了所有步驟,並再次執行這些步驟,但因為框架會隨時發生變化,她必須記錄下這個系統的快照,才有可能做到與之前的模型保持一致。我曾經找研究人員幫忙,讓他們重新生成模型,他們很慷慨,但通常需要花上幾個月時間,即使他們是模型的原作者。

為什麼一致性這麼重要?我有幾個朋友跟我說,他們在寫論文時不知道該如何重現模型。如果他們無法得到與原作者一樣的準確率,那麼該如何說服別人自己的新方法是對原有方法的改進呢?如果你沒有辦法為了應對變更的需求或平臺完全重建一個模型,那麼重度依賴生產系統已有的模型也是很正常的。在進行研究實驗時,這也是個大問題,因為代碼變更和訓練數據很難進行回滾。在嘗試執行上述的那些步驟時,可能存在更多的風險,這就好比不使用版本控制系統會增加代碼變更所帶來的成本。

當然,事情也不是那麼悲觀,社區正在這方面做出努力,以解決模型的一致性問題。其中我最喜歡的是由 Toby Boyd 領導的 TensorFlow Benchmarks 系項目(https://www.tensorflow.org/performance/benchmarks)。這個團隊的使命不僅是要實現如何在多平臺上快速訓練當前的一些主流模型,而且要讓這些模型達到足夠高的準確率。我曾親眼目睹他揮汗如雨地為提高模型準確性而做出努力,因為上述的那些步驟都有可能影響結果,而且沒有簡單的調試方法,即使有模型原作者的幫助也無濟於事。而且這看起來就像是一項無止境的工作,TensorFlow 框架在變化,GPU 驅動器在變化,數據集在變化,這些都會影響到結果。Toby 的團隊可以幫助我們發現和修復因 TensorFlow 的變更引起的 bug,並找出由外部依賴導致的問題,但要把規模擴大仍然很困難。

我也知道有些團隊對於在生產系統中使用機器學習模型非常小心翼翼,他們為了確保訓練模型的一致性花了很多時間和精力,但問題是,這一過程仍然是手動進行的。現在還不存在一種版本控制系統或被大家一致認可的最佳實踐,可以確保模型在未來仍然可以產出相同的結果。我暫時也想不到更好的辦法,不過在這裡拋磚引玉一下,在嘗試解決這個問題時,還是有一些原則可以遵循的:

  • 新想法需要足夠容易被研究人員所理解,不需要研究人員花費太多時間和精力,否則的話,他們可能壓根不願意使用這些系統。理想情況下,這些系統應該要能幫助他們大大提升效率。

  • 如果某個研究人員不小心被車撞了(大誤,劃掉)出走去搞創業了,需要保證,哪怕是第二天新加入的研究員也能夠重新訓練他們之前創建好的模型,並得到相同的結果。

  • 應該存在某種打包方式,將訓練某個模型所需的元素打成包,這個包可以被共享出來,並且不會露模型作者不希望暴露的歷史細節。

  • 為了重現結果,代碼、訓練數據和整個平臺需要被準確地記錄下來。

我已經看到一些開源社區和初創公司正致力於解決這個問題。我也迫不及待地想要用我的餘生來解決這個問題,但在短期內難有完整的解決方案。在訓練模型這件事情上,我們需要一次變革,就像版本控制系統的出現給我們的編碼流程帶來的鉅變那樣。

在嘗試重現機器學習研究結果的過程中,你踩過哪些坑?對於機器學習結果難以重現,你是否也想吐槽?歡迎留言分享你的看法。


歡迎點擊關注GermsTech,這裡有最酷的IT、互聯網資訊~


分享到:


相關文章: