機器學習難在哪?
機器學習難,并不是因為數學難,而是因為選擇什么工具及Debug難。快速有效Debug是現代機器學習中的必備技能,但機器學習的Debug相比普通程序要難很多:候選錯誤空間大、調試周期長。
機器學習已經被廣泛應用,教程、文章、開源代碼到處都是,有些時候只需要你對機器學習算法稍有了解就可以在實際中很好的應用。
但是機器學習還是非常難:
-
推動機器學習研究進步的科學本身很困難,需要創新、實驗和堅持;
-
把已知的機器學習模型應用到實際工作中也是一件困難的事情;
-
市場上的機器學習工程師比普通的軟件工程師也要昂貴一些。
困難并不是來自于數學,因為機器學習的相關實現并不要求很高的數學基礎。困難來自于:
-
選擇什么樣的機器學習工具
這要求對每個算法和模型的優劣勢都了如指掌,這個技能可以通過學過這些模型(課程、教程、Paper等)來獲得。當然這類知識構建的困難是計算機所有領域都存在的,不僅僅是機器學習。
-
機器學習很難調試
這種困難表現在兩方面:
1)算法不work;
2)算法work,但并未足夠好。
機器學習獨有的特征是:查找上面問題的原因是“指數”難度的。通常,機器學習算法的Debug都需要很長的時間,很多bug用小數據量很難重現,而且往往在迭代的后期才能出現。很少有算法可以一次成功,所以更多的時間花在調模型上。
指數級困難的調試
在標準的軟件工程范疇中,當一個解決方案不如期望時,通常考慮兩個方面的出錯:算法和實現。
用以下簡單的遞歸算法為例:
def recursion(input): if input is endCase: return transform(input) else: return recursion(transform(input))
當算法不如預期好時,我們可以枚舉所有失敗的case,這個例子中的網格搜索(Grid Search)如下圖所示:
橫軸是一些算法設計可能出問題的case,縱軸是算法實現上可能出問題的case。接下來的debug過程就是組合你對這個bug收集到的信號,比如編譯器錯誤、程序輸出以及你的直觀認識等。這些信號和先驗知識幫助在上圖上進行剪枝。
在機器學習范疇中,還有額外兩個維度:真正適用的模型、數據。為了圖示這兩個維度,使用隨機梯度下降(Stochastic Gradient Descent,SGD)訓練邏輯回歸(Logistic Regression,LR)是最簡單的例子:
-
算法的正確性包括梯度下降更新等式;
-
實現的正確性包括特征和參數更新的正確計算;
-
數據中的bug包括噪聲標注,預處理中的錯誤,沒有選對特征,或者沒有足夠的數據。
-
模型中的bug可能是模型的描述能力不足,例如你選擇了線性分類器來處理非線性問題。
我們的Debug過程從二維網格擴展到了四維超立方體(上圖為了清晰,只畫了其中三維),第四維數據維可以可視化為下面的立體序列( 注 :一個正確的解答只有一個立方體)。
指數級難度的說法是指在2D空間,可能的錯誤方式數量是
n*n ,而在4D空間則為 n*n*n*n 。因此根據手頭已有信息分析哪里出錯的直覺成為機器學習基本功。幸運的是,機器學習算法有更多的信息可供使用,例如:訓練集合和測試集合上的Loss分析,應用數據上的真實輸出,算法中間輸出的統計分析。
延遲的Debug周期
機器學習Debug難的第二個因素是Debug周期很長。通常需要花費幾十個小時甚至幾十天來實現一個潛在的bug fix以及通過實際的輸出判斷是否成功。自動更新在機器學習領域往往不太現實,因為在訓練集上跑一次的時間很長,Deep Learning模型尤其如此。Debug周期太長使得機器學習不得不采用并行模式,從而需要接觸軟件開發者并不熟悉的指令并行之類。
機器學習終極目標往往落在建立直覺上,這種直覺是說根據現有信息能很快判斷哪里出了問題,有什么辦法可以改進等。這是你不斷參與機器學習項目實踐積累的最關鍵技術:你開始將一些信息與Debug空間中的疑似問題建立關聯。
在原作的工作中,有很多這樣的例子,例如,訓練神經網絡時碰到的早期問題周期性地反映在Loss函數中,Loss本來應該下降,但每次都跳回到一個更高的值,經過反復實驗,最終學到這是因為數據集沒有很好隨機化,當你使用小batch SGD時這是個問題。
總之,快速有效Debug是現代機器學習中的必備技能。
來自:http://mp.weixin.qq.com/s?__biz=MjM5NDE4MTc2OA==&mid=2447696591&idx=1&sn=bec8a75de74dd379b99f6008e6b1af07