如何更高效的自學機器學習?

胡航科


機器學習的“難”通常不在於數學,因為機器學習本身不需要很高強度的數學計算,而在於 debugging 難的問題。機器學習 debug 要比普通計算機程序難得多:出現問題的情形多,而且調試周期長。本文深入討論了這個難題,提出了在 debug 時需要注意的要點。

在過去的幾年裡,機器學習便捷化方面的技術已經取得了顯著的發展:出現了很多相關的網絡在線課程、精編書籍和架構理論。這些精編課程對前沿科技研究分析,分解成通俗易懂的語言。而架構理論方面則將普通問題抽象化,與構建機器學習系統相結合形成理論系統。這些發展某種程度上能夠使人們打破已有的認知圖示,加強對算法工作原理和計算代碼的理解。

機器學習之難在於debug

儘管如此,機器學習仍是一個相對“難”的問題。毫無疑問,提高機器學習算法是一項艱難的科研課題,需要不斷的創新、反覆的試驗、不懈的韌性。而將現有算法和模式與機器學習貫通運用則更難,這也解釋了為什麼機器學習方面的專業工程師的工資相比普通軟件工程師要高出很多的原因。

這裡的難通常不在於數學計算,機器學習應用本身不需要高強度的數學計算,而在於前面提到的構建系統,包括如何為工具建立圖式以解決實際應用中的問題,這就要對現有算法和模式,兩者權衡以及使用限制充分熟悉。機器學習技術是通過對不同類型的模式(比如課程、課本和論文等)進行應用的過程中,對這些模式進行檢測。當然,這種知識構建形式存在於計算機科學的所有領域,而不僅僅是機器學習領域。一般的軟件工程項目都需要對其他的框架、工具、技術以及設計決策幾方面進行權衡。

機器學習的難點在於根本性的調試(debug)難題。機器學習的調試一般發生在以下兩種情況:1)算法無法運行,或者2)算法運行不太完美。機器學習“難”的獨特性在於,當運行效果不如預期時,想要檢測出哪裡出了問題極其困難。如果這兩種困難同時發生,那麼應用修復、升級以及結果顯示方面的調試周期將會延長。很少會發生計算運行從一開始直到最後,佔用大部分時間去做構建算法的情況。

機器學習相比傳統軟件,調試困難增加了兩個維度

標準的軟件工程中,遇到問題解決方案效果不如預期的情況時,一般有兩種可能:算法問題和實施問題。舉一個簡單的遞歸算法的例子。

通過這種方法,列舉出運行效果不好的故障分析圖,如下:

橫軸列出的是算法設計上可能會出現的問題,縱軸是在算法應用上可能會出現的問題。兩個維度上都有可能出現問題(如多重應用bug),只有保證算法和應用兩方面都精確無誤,才能制定出正確的調試解決方案。

調試過程中,需要憑藉直覺,結合不同的bug(如編譯錯誤提示,程序輸出結果等)信息,去準確判斷問題所在。這些信息和啟發式方法能幫助縮短鎖定範圍,快速處理問題。

機器學習有兩個方面的常見bug:實際模式和數據。最簡單的例子,就如用隨機梯度下降算法訓練邏輯迴歸。這裡,算法準確包含梯度下降更新方程式,應用準確包括對特性和參數更新的精確計算。數據方面的bug包括嘈雜標籤(noisylabels)、預處理過程中由於缺乏監控信號或數據不足導致的錯誤。模式bug包括建模能力的實際限制。比如,下圖展示了在非線性決策邊界中使用線性分類器。

調試過程從2D網格到4D超立方體(這裡只顯示了三個維度),第四個數據維度,我們可以想象成是這些立方體的序列(注意這裡只有一個小立方體是正確的解決方案)。

機器學習極其“難”的原因在於,如果在一個維度上有 n 種錯誤的可能,2D維度中的錯誤就有 n*n 種可能,4D維度中的錯誤就有 n*n*n*n 種可能。這種情況下,依據現有信息,建立直覺去發現bug就顯得尤為重要。

幸運的是,機器學習算法中,有更多的信號可以用於判斷哪裡出了bug,比較重要的有:訓練集和測試集的功能缺失圖(plots)、開發數據集中算法的實際輸出結果,以及算法的中間計算彙總統計。

如何解決延遲的調試周期

另一個導致機器學習調試非常困難的因素是調試周期長。通常,從運行潛在修復功能到得出結果是否可行,需要花上幾個小時甚至幾天的時間。網頁開發中,具備自動更新功能的開發模式可以極大地提高開發效率,因為這意味著可以最大限度地減少開發流程中出現的bug事件。而在機器學習中這很難實現,因為在數據集中訓練算法需要花上幾個小時甚至幾天的時間。而深度學習模式更有可能導致調試周期延長,這就必須要進行“並行”試驗範式。對於機器學習開發人員來說,同時運行多個試驗,是因為算法訓練是開發中的主要難點,通過多程序同時運行以開發指令流水(對於程序開發者而不是應用者)。強制性地多程序同時運行的主要缺點在於順序調試和試驗過程中,不能運用累積經驗。

機器學習通常被歸結為一種直覺開發的藝術,有了這種直覺,在很多維度都可能出現bug(或可以提高)時,可以判斷出了bug(或需要提高)的地方在哪。這是構建機器學習項目的一個重要技巧,即當調試範圍內呈現出的信號,你會開始利用這個信號嘗試判斷問題出在哪。我工作過程中經常會出現類似的情況。

舉例來說,我最早遇到這樣的問題是在訓練神經網絡時,總是出現週期性的訓練功能損失。這些功能損失在經過某些數據時會發生延遲,但很快便返回到一個很高的數值。經過很多的試驗和錯誤之後,我意識到這通常是因為訓練集沒有被正確地隨機化(這看似是一個數據問題,但實際上是一個應用問題),還有一個問題就是,在使用隨機梯度算法時,只處理小部分的數據。

總的來說,快速高效的調試是一個非常需要的技巧,可以應用到現在的機器學習流水線中


Java架構達人


機器學習說到底是一門交叉學科,想自學機器學習,你首先需要弄清楚你需要哪些基本條件,這裡面的條件有多少學習需要的,有的是面試或者工作需要的,首先你需要一個本科以上的學歷,說實話專科學這個不現實,學不好是一方面,找不到工作是另一方面,其次你需要一下基本知識儲備,比如編程能力,統計學基礎、現代基礎、高數基礎等,在這些的基礎上才能說自學機器學習。學習機器學習你需要掌握各種算法,分類、聚類、迴歸等等不僅僅是理論推倒而且是代碼實現,多看書、多讀論文,多寫代碼。


分享到:


相關文章: