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


























