文|水石頭
在和劉同學(xué)長(zhǎng)談之后,我再次對(duì)前一段時(shí)間的想法進(jìn)行了反思,結(jié)合聊天中的新感受,整理在這里。
(注:標(biāo)題里的算法,指機(jī)器學(xué)習(xí)算法,或者說(shuō)“算法工程師”這個(gè)職位名稱里的“算法”,不是“算法與數(shù)據(jù)結(jié)構(gòu)”里的那個(gè)算法。誰(shuí)能告訴我有沒有什么更好的名字來(lái)區(qū)別這它們,或許是“機(jī)器學(xué)習(xí)算法”與“傳統(tǒng)算法”?)
算法與算法工程師
先來(lái)一段我在知乎里回答“做算法工程師是一種怎樣的體驗(yàn)?”的答案(其中的思想并非原創(chuàng),而是山寨自新加坡某大學(xué)一門Quantitative Investment課程的ppt)
理想中的算法工程師:提出假設(shè)->收集數(shù)據(jù)->訓(xùn)練模型->解釋結(jié)果。
實(shí)際中的算法工程師:提出假設(shè)->收集數(shù)據(jù)->預(yù)處理->預(yù)處理->訓(xùn)練模型->調(diào)試->調(diào)試->重新收集數(shù)據(jù)->預(yù)處理->收集更多數(shù)據(jù)->調(diào)試->調(diào)試->調(diào)試->…->放棄。
這個(gè)答案被點(diǎn)了幾十個(gè)贊,在24個(gè)答案中排在第二位,說(shuō)明具有一定的普遍性。排名第一的有100+贊,而他的觀點(diǎn)是:每天最重要的就是跑數(shù)據(jù)!
這不是段子,而是事實(shí)。為什么“高大上”的算法工程師實(shí)際上是個(gè)數(shù)據(jù)民工,要尋找這種理想與現(xiàn)實(shí)的差距的原因,首先要理解一個(gè)事實(shí):只有人能夠理解數(shù)據(jù),機(jī)器不能。
不管我們用什么機(jī)器學(xué)習(xí)算法——無(wú)論是LR,SVM,k-means,EM——對(duì)于它們來(lái)說(shuō),輸入數(shù)據(jù)都是一堆浮點(diǎn)數(shù)組成的矩陣而以(如果說(shuō)的更本質(zhì)一點(diǎn),只是一堆01序列)。如果有一個(gè)特征是“小時(shí)”,而它出現(xiàn)了25,任何一個(gè)智商正常的人類都能明白,這是一個(gè)錯(cuò)誤,然后在數(shù)據(jù)清洗的時(shí)候把這樣的數(shù)據(jù)排除。但是機(jī)器就無(wú)法理解這一點(diǎn)。要具備小時(shí)的概念,又要理解什么是時(shí)間,一天有多少個(gè)小時(shí)…機(jī)器怎么能自動(dòng)化完成這樣的數(shù)據(jù)清洗工作?更進(jìn)一步,如果人發(fā)現(xiàn)“小時(shí)”這個(gè)特征中大部分?jǐn)?shù)據(jù)是0到12,而混入少量13(但13的數(shù)量又不是太少以至不能被當(dāng)成離群點(diǎn)排除),人就會(huì)懷疑,是不是使用了12小時(shí)制而13是一個(gè)錯(cuò)誤。機(jī)器目前是無(wú)法做到這一點(diǎn)的。
再說(shuō)人肉特征。一個(gè)是特征變換,比如需要一個(gè)特征是某兩列數(shù)據(jù)的比率,這種除法是線性模型不能涵蓋的。當(dāng)然可以增大模型的假設(shè)空間,但是太小涵蓋不了需要的變換,太大又容易過(guò)擬合。另一個(gè)是加特征,比如我認(rèn)為點(diǎn)擊率和屏幕分辨率有關(guān)系。于是我去找屏幕分辨率數(shù)據(jù)加入特征,如果沒有還要想辦法采集。這些機(jī)器都做不了。
但是,人一但把數(shù)據(jù)準(zhǔn)備好,接下來(lái)就是機(jī)器學(xué)習(xí)算法發(fā)揮的時(shí)候了。但是,算法工程師的主要工作不在這里,這是因?yàn)檐浖袀€(gè)特點(diǎn),可以近乎無(wú)成本的復(fù)制。只要這個(gè)世界上有一個(gè)人實(shí)現(xiàn)了LR(知識(shí)產(chǎn)權(quán)的問(wèn)題這里不考慮,更何況開源軟件很多),其他需要用LR的人都可以拿過(guò)來(lái)用了。顯然,這些算法工程師們也正是這么做的。
然而,等算法輸出結(jié)果以后,又需要人的工作了——怎樣用結(jié)果解釋實(shí)際問(wèn)題,應(yīng)用到業(yè)務(wù)中去。顯然這個(gè)過(guò)程和前面數(shù)據(jù)清洗、人肉特征的性質(zhì)類似,都是只有人能完成,機(jī)器做不到的任務(wù)。
做過(guò)數(shù)學(xué)建模的同學(xué)對(duì)這個(gè)過(guò)程可能很熟悉——如何把一個(gè)問(wèn)題描述成數(shù)學(xué)問(wèn)題,再如何把結(jié)果應(yīng)用到實(shí)際問(wèn)題上。這有點(diǎn)類似于通信中的“最后一公里”問(wèn)題,主干網(wǎng)的光纖建設(shè)的很強(qiáng)大,而最終用戶的接入?yún)s成了一個(gè)麻煩事。對(duì)于機(jī)器學(xué)習(xí)的應(yīng)用問(wèn)題來(lái)說(shuō),算法和相應(yīng)的軟件包都是標(biāo)準(zhǔn)化、通用化的,像骨干網(wǎng);而數(shù)據(jù)如何“接入”,則是只能由人完成。因?yàn)?,只有人能夠理解?shù)據(jù)。
技術(shù)與技術(shù)人員
這個(gè)問(wèn)題可以推廣到整個(gè)計(jì)算機(jī)領(lǐng)域。把算法工程師代換成程序員,把機(jī)器學(xué)習(xí)算法代換成軟件,這個(gè)觀點(diǎn)就變成了:大部分程序員所解決的,是通用的計(jì)算機(jī)工具和具體的實(shí)際業(yè)務(wù)之間的“最后一公里”接入問(wèn)題。
為什么這么說(shuō),我們先來(lái)看歷史:計(jì)算機(jī)技術(shù)發(fā)展了幾十年,程序員的入門門檻是逐步降低的。最初的程序,要在裸機(jī)上寫匯編。后來(lái)有了unix,c語(yǔ)言,程序員至少不用親自調(diào)度進(jìn)程了。java出現(xiàn)之后,連內(nèi)存都不用管了。而(世界上最偉大的)php出現(xiàn)之后,網(wǎng)絡(luò)編程的門檻進(jìn)一步降低,任何人都可以在短時(shí)間內(nèi)搭建一個(gè)網(wǎng)站。