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