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