數(shù)學(xué)不好,能學(xué)好機(jī)器學(xué)習(xí)嗎?
01 “機(jī)器學(xué)習(xí)好學(xué)嗎?”
這是我最常聽到的一個問題,以前我的回答也簡單明了,就兩個字,好學(xué)。不過,現(xiàn)在我感覺自己好像草率了一點(diǎn)。機(jī)器學(xué)習(xí)還是“好學(xué)”的,但再加一個“學(xué)習(xí)”,不但會變得有點(diǎn)拗口,也讓問題更加復(fù)雜了。
也許有同學(xué)不太同意,說機(jī)器學(xué)習(xí)得先學(xué)好數(shù)學(xué),數(shù)學(xué)難道還有好學(xué)的嗎?
這種觀點(diǎn)很有代表性,里面包含了兩個問題。第一個問題是,機(jī)器學(xué)習(xí)真得先學(xué)好數(shù)學(xué)嗎?而另一個問題則是,數(shù)學(xué)是不是一定都很難學(xué)?
先說這個機(jī)器學(xué)習(xí)吧,我們老是“機(jī)器學(xué)習(xí)機(jī)器學(xué)習(xí)”地掛在嘴邊,好像專門有項(xiàng)什么技術(shù)就叫這個名字。實(shí)際上呢,機(jī)器學(xué)習(xí)只是一個大框,里面裝滿了各種模型算法,從原理到結(jié)構(gòu),可能都完全不是一回事。所以,最開始我理解的學(xué)習(xí)機(jī)器學(xué)習(xí),就是學(xué)習(xí)各種模型算法到底都是怎么一回事。
難不難呢?我的回答是,可以很難,也可以沒這么難,根據(jù)你不同的學(xué)習(xí)目標(biāo),至少有三種難度可以選擇:
第一種,如果你想要學(xué)完之后開發(fā)一種新的模型算法,或者給現(xiàn)有的算法模型增加某種設(shè)計(jì)以提升性能,這種最難,放眼全世界能做到的人都不太多。
第二種,從數(shù)學(xué)層面掌握機(jī)各種器學(xué)習(xí)算法的原理和邏輯,通常包括了解各類數(shù)學(xué)名詞術(shù)語、推導(dǎo)各種公式等等。這比第一種就是簡單太多了,很多開設(shè)了機(jī)器學(xué)習(xí)課程的高校就是朝著這個目標(biāo)制定教學(xué)計(jì)劃的,不過門檻還是挺高的,畢竟要學(xué)數(shù)學(xué),而數(shù)學(xué)距離可鹽可甜確實(shí)還有點(diǎn)遠(yuǎn)。
第三種,就是掌握機(jī)各種器學(xué)習(xí)算法的原理和邏輯??粗偷诙N一樣,就是少了“從數(shù)學(xué)層面”這五個字。有什么差別呢?
差別可大了,這一種著眼于問題,最想知道的是怎樣選擇合適的模型來解決問題,學(xué)習(xí)的內(nèi)容變成了不同的模型有哪些不同的效果,面對問題又該怎樣兵來將擋水來土掩。第二種我們說學(xué)習(xí)難度就已經(jīng)大大減少,而這第三種和第二種相比,更是折上又打了骨折,難度差別比“買保時捷”和“買保時捷模型”還大。
更重要的是,許多人想學(xué)機(jī)器學(xué)習(xí),想學(xué)的不是數(shù)學(xué)公式,恰恰正是怎樣使用,有時還是帶著問題學(xué),看看在機(jī)器學(xué)習(xí)這里能不能淘到一把趁手的工具。所以我說,機(jī)器學(xué)習(xí)好學(xué)。
02 如何從解決問題的角度學(xué)習(xí)機(jī)器學(xué)習(xí)
如果學(xué)機(jī)器學(xué)習(xí)是為了解決問題,那自然希望學(xué)習(xí)成本越低越好,學(xué)習(xí)時間越短越好。而我們也都知道,數(shù)學(xué)就是個時間黑洞,多少時間扔進(jìn)去都不一定能聽到個響,這也是不少人不太敢碰機(jī)器學(xué)習(xí)的現(xiàn)實(shí)原因。
既然這樣我們就要問了,有沒有不學(xué)數(shù)學(xué)也能用機(jī)器學(xué)習(xí)解決問題的方法呢?
還真有,而且方法不止一種。
第一種,也是比較常見的一種,就是調(diào)包。
軟件工程里面有一項(xiàng)很重要的思想,叫“封裝”,你只管根據(jù)定義好的接口調(diào)用就行了,算法對來說就是一個黑箱。機(jī)器學(xué)習(xí)領(lǐng)域同樣已經(jīng)有一些封裝良好的第三方庫,譬如說無人不曉的Scikit-Learn,你完全不用接觸任何一點(diǎn)模型的數(shù)學(xué)原理,要做的只有三件事,準(zhǔn)備數(shù)據(jù)、把數(shù)據(jù)fit給模型、讓模型predict。
這里的fit和predict,就是封裝好的接口。如果你翻開一本機(jī)器學(xué)習(xí)的書,基本沒啥公式都是代碼,告訴你這個怎么用那個怎么用,那就屬于這一種。
這種方法簡單是簡單,就是讓人有點(diǎn)不放心,加上我們程序員自帶的疑心病屬性,不出問題還好,出了問題那一定都是第三方庫的問題,所以大家覺得還是得知道一點(diǎn)機(jī)器學(xué)習(xí)的基本原理,不能做純粹的調(diào)包俠。
那有沒有繞過數(shù)學(xué)也能了解機(jī)器學(xué)習(xí)原理和邏輯的辦法呢?
有,這就是第二種方法。
如果你只是把機(jī)器學(xué)習(xí)當(dāng)作莫得感情的工具人,那你要學(xué)習(xí)的重點(diǎn),是機(jī)器學(xué)習(xí)模型的選擇和組合上。前面我們說了,機(jī)器學(xué)習(xí)是一個框,里面堆滿了各種奇形怪狀的模型算法,也就是說,這是一只工具箱。
那我們就應(yīng)該給予它工具箱應(yīng)有的尊重,了解工具箱里的工具都有什么功能,然后根據(jù)我們眼前要去處理的問題,選擇一款工具,或者組合使用多款工具,最終解決問題?;叵胍幌拢阍诠ぞ呦淅镎衣萁z批,只會考慮哪支更合適,應(yīng)該不會想先要了解它們的鑄造工藝。
當(dāng)然,理想很豐滿現(xiàn)實(shí)很骨感,機(jī)器學(xué)習(xí)模型畢竟不是螺絲批,想要完全不碰數(shù)學(xué),又能準(zhǔn)確選擇所需要的模型,如果你真的去嘗試你就會發(fā)現(xiàn),其實(shí)難度很大,肯定得首先有一批已經(jīng)了解了機(jī)器學(xué)習(xí)的數(shù)學(xué)背景的,又愿意從工具的角度看待機(jī)器學(xué)習(xí)的前人去積累一些學(xué)習(xí)材料。
現(xiàn)在市面上基本沒有從這個角度撰寫的教材,我自己嘗試寫了一本書叫《機(jī)器學(xué)習(xí)算法的數(shù)學(xué)原理和Python實(shí)現(xiàn)》,就是想給大家多一種機(jī)器學(xué)習(xí)的學(xué)習(xí)方向選擇。
03 機(jī)器學(xué)習(xí)工程
回到開篇的問題,機(jī)器學(xué)習(xí)好學(xué)嗎?
嗯......不太好說。
是的,這是我現(xiàn)在的答案。機(jī)器學(xué)習(xí)沒有變,是我變了,準(zhǔn)確來說,我對“機(jī)器學(xué)習(xí)”這四個字的理解變了。前面在介紹機(jī)器學(xué)習(xí)的時候,我是怎么說的?我說,機(jī)器學(xué)習(xí)是一個大框,里面裝滿了各種模型算法。這就是我此前對機(jī)器學(xué)習(xí)的理解。
這個說法對不對呢?
嗯......不太好說。也許不至于一千個人眼里有一千個機(jī)器學(xué)習(xí),但不同人對機(jī)器學(xué)習(xí)確實(shí)存在不同的理解。所以,回答好不好學(xué)這個問題,也需要充分考慮上下文。最早我是通過書本了解到的機(jī)器學(xué)習(xí),所以對我來說,我的理解和書本很相近。
但對于另一些朋友,他們是在生產(chǎn)環(huán)境中聽到的機(jī)器學(xué)習(xí),譬如有人告訴他,這個問題用機(jī)器學(xué)習(xí)效果更好,所以,它們更傾向于把“機(jī)器學(xué)習(xí)”看作是一種方法,使用機(jī)器學(xué)習(xí)就是增加一個工作環(huán)節(jié),上游的工作環(huán)節(jié)產(chǎn)生的一些數(shù)據(jù),經(jīng)過“機(jī)器學(xué)習(xí)”的加工處理之后,能夠形成一些產(chǎn)品來推送給下游的工作環(huán)節(jié)。
這些朋友對機(jī)器學(xué)習(xí)的理解,也許太務(wù)實(shí)了,但也許反而更接近機(jī)器學(xué)習(xí)在生產(chǎn)環(huán)境中真實(shí)的樣子。沒準(zhǔn)現(xiàn)實(shí)還會更現(xiàn)實(shí)一點(diǎn),甚至可能根本就沒什么上游下游,只不過是老板告訴你他需要什么,至于怎么達(dá)到,采用什么手段,需要建立怎樣的上下游配套,全得你自己去想。
前一陣我聽幾個朋友在那討論參加數(shù)據(jù)競賽到底對學(xué)習(xí)機(jī)器學(xué)習(xí)有沒有幫助,當(dāng)時我第一反應(yīng)是奇怪,怎么會沒幫助呢?后來我才搞明白了,大家是覺得數(shù)據(jù)競賽太理想,要是老板也能像數(shù)據(jù)競賽那樣準(zhǔn)備好數(shù)據(jù)集、標(biāo)明數(shù)據(jù)字段含義,還把要達(dá)到的評價指標(biāo)都事先告訴了你,那只能說明一點(diǎn),他不是老板,你才是老板。
問題就出在這里。現(xiàn)在市面的機(jī)器學(xué)習(xí)教材,偏理論的也好,偏編程的也好,書的篇章組織大概都是這一章介紹一個模型,下一章又介紹一個模型,基本上都是用各種模型串起了整本書。不妨想象一下,假設(shè)你找到一本教材,這本書也真的好,你也真的很努力,知識都理解了,那你能夠說已經(jīng)學(xué)會機(jī)器學(xué)習(xí)了嗎?
不好說。為什么不好說?因?yàn)槿绻阋鉀Q的是老師提出的問題,那應(yīng)該沒有問題,但如果你要解決的是老板提出的問題,估計(jì)你會一臉懵,感覺無從下手,然后懷疑自己學(xué)了個假的機(jī)器學(xué)習(xí)。我已經(jīng)見過太多這樣的例子了。
為什么呢?
學(xué)了機(jī)器學(xué)習(xí)卻不知道實(shí)際該怎么用,咋一聽好像不可思議,其實(shí)就和學(xué)開車一樣。
如果駕校教的也都是汽車本身,譬如說汽車的結(jié)構(gòu)是什么、發(fā)動機(jī)是什么、變速箱是什么,你記住了各種各樣的專業(yè)術(shù)語和各種角度的結(jié)構(gòu)視圖,現(xiàn)在請你開車上路,你同樣無法避免手忙腳亂。為什么呢?很簡單,因?yàn)槟銓W(xué)的叫汽修而不叫駕駛,自然搞不懂開車該先踩油門還是先松離合。
在這一點(diǎn)上,機(jī)器學(xué)習(xí)和軟件工程很像。很多人都以為搞開發(fā)就是敲代碼,學(xué)了軟件工程才知道編程的其中一個環(huán)節(jié)。
學(xué)界都喜歡提新概念占坑,為了便于大家理解,這里我也提一個新概念,叫“機(jī)器學(xué)習(xí)工程”,就是希望告訴大家,很多人理解的“機(jī)器學(xué)習(xí)”,其實(shí)應(yīng)該叫“機(jī)器學(xué)習(xí)工程”,而模型訓(xùn)練只是機(jī)器學(xué)習(xí)工程的其中一個環(huán)節(jié)。
04 如何建立機(jī)器學(xué)習(xí)工程
軟件工程有個軟件生命周期,分好幾個階段,機(jī)器學(xué)習(xí)同樣也有這么個生命周期,建立一項(xiàng)機(jī)器學(xué)習(xí)工程,至少也需要完成以下幾步:
第一步,是數(shù)據(jù)采集
我們在學(xué)習(xí)機(jī)器學(xué)習(xí)時,肯定都要用到數(shù)據(jù)集,但大家千萬別有一個印象,覺得數(shù)據(jù)集和超市里的大米一樣,天然就躺在那里。大米要人來種,數(shù)據(jù)集同樣需要人來整理,工作還不止一步。
首先你得設(shè)計(jì)數(shù)據(jù)字段,沒錯,數(shù)據(jù)競賽中你只需要理解數(shù)據(jù)字段,而真到了自己建立機(jī)器學(xué)習(xí)工程,連字段都是得自己首先設(shè)計(jì)。
接著,你得采集數(shù)據(jù)。這項(xiàng)工作不容易,采集什么數(shù)據(jù),怎么采,采好以后怎樣用,又怎樣管理,這一系列大大小小的問題完全可以寫一本書。譬如說網(wǎng)上公開數(shù)據(jù),你需要使用爬蟲,而公司內(nèi)部數(shù)據(jù),你可能又得另外辦法,甚至可能需要建設(shè)數(shù)據(jù)基礎(chǔ)設(shè)施,譬如說現(xiàn)在經(jīng)常上熱搜的數(shù)據(jù)中臺。
第二步,是數(shù)據(jù)清洗
好了,假設(shè)你已經(jīng)克服重重困難,知道自己需要什么數(shù)據(jù),也順利把數(shù)據(jù)都采集回來,那么接下來很重要的一步,是數(shù)據(jù)清洗。這一點(diǎn)和做菜很像,食材你得洗干凈了才下鍋,不然可能吃壞肚子。
數(shù)據(jù)也一樣,野生的數(shù)據(jù)有各種問題,最常見的就是缺失值,屬于概率性事件,早晚都是要面對的。怎么處理呢,大家研究出來了很多方法,但沒有萬金油,都得具體問題具體分析。
除了缺失值,其它更怪異的問題還有很多,譬如說還有離群點(diǎn)、異常值這些,這些就好比你群發(fā)調(diào)查表,總會有一群人堅(jiān)持不懈地在“性別”一欄填“漢族”一樣。
第三步,是特征工程,有人也稱之為數(shù)據(jù)探索
這一步很重要,作用簡單來說,就是爭取讓數(shù)據(jù)的特點(diǎn)更加突出,能夠明顯提升模型的性能。
以前有個說法,叫數(shù)據(jù)決定了機(jī)器學(xué)習(xí)性能的天花板,而模型只是逼近這個天花板?,F(xiàn)在好像改了一點(diǎn),說是特征工程決定了性能的天花板,而參數(shù)調(diào)優(yōu)只是逼近這個天花板。不管怎樣吧,這一步很重要,也非常需要經(jīng)驗(yàn)。內(nèi)容就非常多了,真的需要一本書才能講清楚。
第四步,是模型訓(xùn)練
這就不多說了,到了這里,才總算看到我們熟悉的景色,現(xiàn)在大家應(yīng)該能夠更清楚,為什么感覺學(xué)懂了機(jī)器學(xué)習(xí),到了真的要去建立機(jī)器學(xué)習(xí)工程,照樣會一臉懵,感覺無從下手,懷疑自己學(xué)了個假的機(jī)器學(xué)習(xí)。
第五步,是模型部署
一般來說,走到這一步,你手上就已經(jīng)有了一個模型了,當(dāng)然,這個模型是不是能發(fā)揮作用,達(dá)到你或者你老板想要的預(yù)期目標(biāo),沒達(dá)到又該怎么辦,這都是需要另外討論的問題。
假設(shè)你很順利,模型也很爭氣,那現(xiàn)在你就可以把模型部署上線,讓模型在生產(chǎn)環(huán)境發(fā)揮作用。別以為這一步只是儀式性的,同樣有許多工程問題和奇葩狀況在前面等待著你,就不具體展開了。
以上只是將機(jī)器學(xué)習(xí)工程要做的事簡要地列了一下,主要是想讓大家明白“機(jī)器學(xué)習(xí)”不只是機(jī)器學(xué)習(xí),還包括了一系列一點(diǎn)不亞于軟件工程的復(fù)雜工序,我們姑且稱之為機(jī)器學(xué)習(xí)工程。
從學(xué)術(shù)角度看待機(jī)器學(xué)習(xí),和從機(jī)器學(xué)習(xí)工程看待機(jī)器學(xué)習(xí),可能會讓你產(chǎn)生截然不同的理解和視野,自然也會對能力提出不同的要求。