####[當(dāng)當(dāng)]推薦團(tuán)隊(duì)的機(jī)器學(xué)習(xí)實(shí)踐--小團(tuán)隊(duì)撬動(dòng)大數(shù)據(jù)——

小團(tuán)隊(duì)撬動(dòng)大數(shù)據(jù)——當(dāng)當(dāng)推薦團(tuán)隊(duì)的機(jī)器學(xué)習(xí)實(shí)踐-CSDN.NET http://www.csdn.net/article/2015-10-16/2825925

由于機(jī)器學(xué)習(xí)系統(tǒng)的特殊性,構(gòu)建一個(gè)靠譜好用的系統(tǒng)卻并不是件容易的事情。每當(dāng)看到同行們精彩的分享時(shí),我都會(huì)想到,這些復(fù)雜精妙的系統(tǒng),是怎樣構(gòu)建起來的?構(gòu)建過程是怎樣的?這背后是否有一些坑?有一些經(jīng)驗(yàn)?是否可以“偷”來借鑒?

所以我希望做一個(gè)更側(cè)重“面向過程”的分享,與大家分享一下我們?cè)跇?gòu)建系統(tǒng)時(shí)的一些實(shí)踐,一些坑,以及如何從坑里爬出來。


摘要:當(dāng)當(dāng)個(gè)性化推薦開發(fā)經(jīng)理張相於深度分享當(dāng)當(dāng)推薦團(tuán)隊(duì)的機(jī)器學(xué)習(xí)實(shí)踐經(jīng)驗(yàn)。本次分享更側(cè)重“面向過程”——在構(gòu)建系統(tǒng)時(shí)的一些實(shí)踐,一些坑,以及如何從坑里爬出來,以及“小團(tuán)隊(duì)”。
【編者按】當(dāng)當(dāng)個(gè)性化推薦開發(fā)經(jīng)理張相於深度分享當(dāng)當(dāng)推薦團(tuán)隊(duì)的機(jī)器學(xué)習(xí)實(shí)踐經(jīng)驗(yàn),側(cè)重介紹一個(gè)小團(tuán)隊(duì)在構(gòu)建系統(tǒng)時(shí)的一些實(shí)踐,一些坑,以及如何從坑里爬出來。當(dāng)當(dāng)構(gòu)建機(jī)器學(xué)習(xí)系統(tǒng)過程中踩過的坑主要包括:只見模型,不見系統(tǒng);不重視可視化分析工具;過于依賴算法;關(guān)鍵流程和數(shù)據(jù)沒有掌握在自己團(tuán)隊(duì);團(tuán)隊(duì)不夠“全棧”;巨型系統(tǒng)。工具方面,當(dāng)當(dāng)在探索階段選擇的是R和Python,大數(shù)據(jù)階段則主要依靠Hadoop和Spark,目前集群是幾百臺(tái)的規(guī)模。在“全流程構(gòu)建”的不斷迭代中,當(dāng)當(dāng)還總結(jié)提取出的一套特征工程相關(guān)的工具——dmilch。
先說一下我的初衷。機(jī)器學(xué)習(xí)系統(tǒng)現(xiàn)在多紅多NB這件事情我已不必贅述。但是由于機(jī)器學(xué)習(xí)系統(tǒng)的特殊性,構(gòu)建一個(gè)靠譜好用的系統(tǒng)卻并不是件容易的事情。每當(dāng)看到同行們精彩的分享時(shí),我都會(huì)想到,這些復(fù)雜精妙的系統(tǒng),是怎樣構(gòu)建起來的?構(gòu)建過程是怎樣的?這背后是否有一些坑?有一些經(jīng)驗(yàn)?是否可以“偷”來借鑒?
所以我希望做一個(gè)更側(cè)重“面向過程”的分享,與大家分享一下我們?cè)跇?gòu)建系統(tǒng)時(shí)的一些實(shí)踐,一些坑,以及如何從坑里爬出來。
另外,我本次分享更側(cè)重的是“小團(tuán)隊(duì)”,一是因?yàn)楫?dāng)當(dāng)目前做ML的團(tuán)隊(duì)確實(shí)還比較小,其次是因?yàn)閾?jù)我了解并不是每個(gè)企業(yè)都像BAT那樣陣容龐大整齊。所以小團(tuán)隊(duì)的經(jīng)歷和實(shí)踐或許會(huì)有獨(dú)特的借鑒意義,希望這次分享能從不一樣的角度給大家提供一些參考。

今天分享的實(shí)踐經(jīng)歷來自當(dāng)當(dāng)推薦組的ML小團(tuán)隊(duì)。


我們的團(tuán)隊(duì)負(fù)責(zé)當(dāng)當(dāng)推薦/廣告中機(jī)器學(xué)習(xí)系統(tǒng)從0開始的搭建、調(diào)優(yōu)、維護(hù)和改進(jìn)。除計(jì)算平臺(tái)為其他團(tuán)隊(duì)負(fù)責(zé)維護(hù)以外,ML pipeline中的每個(gè)環(huán)節(jié)均要負(fù)責(zé)。生產(chǎn)的模型用于部分推薦模塊和部分廣告模塊的排序。


分享開始之前,有必要闡明一下本次分享的定位。如上圖所示,本次分享不涉及這些內(nèi)容,對(duì)此有需求的同學(xué)可參考CSDN上其他精彩的分享。


上面這些,是本次分享所涉及到的,其中“面向過程”是本次的重點(diǎn)。分享的人群定位如下:


無論你處于構(gòu)建機(jī)器學(xué)習(xí)系統(tǒng)的哪個(gè)階段,如果能從本次分享有所收獲,或者有所啟發(fā),那筆者帶著“長假后綜合癥”做的這個(gè)PPT就沒白忙活……


這是我們本次分享的大綱:先簡單談一下我對(duì)“小團(tuán)隊(duì)”的一些認(rèn)識(shí),再花主要的時(shí)間和大家分享一下當(dāng)當(dāng)?shù)男F(tuán)隊(duì)機(jī)器學(xué)習(xí)實(shí)踐。接著我會(huì)總結(jié)一些我們實(shí)踐中猜到的坑,以及從這些坑中學(xué)到的東西。然后我會(huì)以一些參考文獻(xiàn)為例,做一些對(duì)未來工作和可能方向的展望。最后是問答環(huán)節(jié)。
簡論小團(tuán)隊(duì)
首先談?wù)勎覍?duì)小團(tuán)隊(duì)的認(rèn)識(shí)。

為什么會(huì)出現(xiàn)小團(tuán)隊(duì)?這個(gè)問題乍一看有點(diǎn)像是句廢話,因?yàn)槊總€(gè)團(tuán)隊(duì)都是從小到大發(fā)展起來的。這沒錯(cuò),但是機(jī)器學(xué)習(xí)的團(tuán)隊(duì)還是有一些屬于自己的特點(diǎn)的。

相比一些功能性系統(tǒng),機(jī)器學(xué)習(xí)系統(tǒng)的特點(diǎn)之一是不確定性,也就是這個(gè)系統(tǒng)搭起來的效果,是無法從開頭就量化的。這導(dǎo)致決策層在投入上比較謹(jǐn)慎,不會(huì)在剛開始就投入太多人。
這方面人才確實(shí)比較稀缺,招聘難。簡歷看著漂亮的挺多,有實(shí)際能力或經(jīng)驗(yàn)的其實(shí)很少。本著寧缺毋濫的原則,小而精的團(tuán)隊(duì)是一個(gè)更好的選擇。


小團(tuán)隊(duì)做系統(tǒng)的挑戰(zhàn)在哪里?這是我們關(guān)心的首要問題。小團(tuán)隊(duì)挑戰(zhàn)的本質(zhì)其實(shí)就是兩個(gè)字:人少。從這個(gè)根本限制會(huì)衍生出多個(gè)具體的挑戰(zhàn)。

首先是對(duì)單兵能力的高要求。這很容易理解,人少就意味著每個(gè)人都需要發(fā)揮很大的作用,因此對(duì)單兵能力要求比較高。對(duì)于這個(gè)問題,其實(shí)沒有太多好的辦法,主要就是外部招聘和內(nèi)部培養(yǎng)。
其次是在系統(tǒng)開發(fā)過程中,大家一般都需要交叉負(fù)責(zé)多個(gè)任務(wù),這既是對(duì)個(gè)人能力的挑戰(zhàn),也是對(duì)協(xié)作能力挑戰(zhàn)。但是另一方面,這其實(shí)是對(duì)員工最好的培養(yǎng),能夠讓大家以最快的速度成長。
再次就是方向和需求選擇的問題。因?yàn)槿松伲栽跊Q定下一步行動(dòng)時(shí),需要非常謹(jǐn)慎,盡量減少無產(chǎn)出的投入。這有時(shí)確實(shí)是一種限制,但是換個(gè)角度來看,這“逼迫”我們把精力集中在最重要的部分,好鋼都是用在刀刃上。
最后一點(diǎn),就是單點(diǎn)風(fēng)險(xiǎn)較高。由于每個(gè)人都負(fù)責(zé)了比較多的部分,所以每個(gè)人的離職、休假等異動(dòng),都會(huì)對(duì)系統(tǒng)造成較大影響。這個(gè)問題同樣主要是通過內(nèi)部培養(yǎng)和外部招聘來解決,不過還有一個(gè)方法,就是用有挑戰(zhàn)的事情留住人。哪種方法好使,就要看具體環(huán)境的具體情況了。

這樣一看,小團(tuán)隊(duì)挑戰(zhàn)不小,但是反過來看,小團(tuán)隊(duì)也有一些獨(dú)特的優(yōu)勢(shì)。


首先就是團(tuán)隊(duì)易于凝聚。這也是任何小團(tuán)隊(duì)的天然優(yōu)勢(shì)。
其次是易于協(xié)作。很多事情不需要開會(huì),轉(zhuǎn)身幾句話就可以搞定。
再次是迭代速度的優(yōu)勢(shì)。由于流程所涉及的事情全部由少數(shù)幾個(gè)人負(fù)責(zé),不需要協(xié)調(diào)過多的資源,那么只要這幾個(gè)人使勁,迭代速度就會(huì)快起來。
最后一點(diǎn),也是非常重要的一點(diǎn),就是團(tuán)隊(duì)的成長。由于大家都要負(fù)責(zé)很多事情,那么成長速度自然就會(huì)很快,同時(shí)個(gè)人的成就感也會(huì)比較高,如果調(diào)配得當(dāng),會(huì)讓整個(gè)團(tuán)隊(duì)處于一種非常有活力的積極狀態(tài)。

當(dāng)當(dāng)推薦機(jī)器學(xué)習(xí)實(shí)踐
下面我們花一些時(shí)間來分享一下當(dāng)當(dāng)?shù)臋C(jī)器學(xué)習(xí)團(tuán)隊(duì)是如何撬動(dòng)機(jī)器學(xué)習(xí)系統(tǒng)這塊大石頭的。


上圖所示的是我們推薦后臺(tái)的整體架構(gòu)。從上面的架構(gòu)簡圖中可以看出,機(jī)器學(xué)習(xí)系統(tǒng)是作為一個(gè)子系統(tǒng)存在的,與推薦作業(yè)平臺(tái)(生成推薦結(jié)果的離線作業(yè)平臺(tái))發(fā)生直接互動(dòng)。
這幾個(gè)架構(gòu)圖只是讓大家知道機(jī)器學(xué)習(xí)系統(tǒng)在在整個(gè)推薦系統(tǒng)中的位置和作用,不是本次分享的重點(diǎn),沒必要一定看懂。

這一頁的架構(gòu)圖是上一頁圖中紅框中部分的細(xì)節(jié)放大。從圖中可以看出,機(jī)器學(xué)習(xí)系統(tǒng)是在結(jié)果排序中發(fā)揮作用的。關(guān)于這個(gè)架構(gòu)的細(xì)節(jié)我在這里不做展開,感興趣的同學(xué)可參照美團(tuán)的同學(xué)前段時(shí)間的分享,是比較類似的架構(gòu)。

上面的架構(gòu)圖是上一頁架構(gòu)中紅框部分的進(jìn)一步展開,也就是機(jī)器學(xué)習(xí)系統(tǒng)本身的一個(gè)架構(gòu)簡圖。有經(jīng)驗(yàn)的同學(xué)能看出來,這張簡圖中包括了機(jī)器學(xué)習(xí)系統(tǒng)的主要流程部件。
后面我們會(huì)說到這一套系統(tǒng)是如何搭建起來的,經(jīng)歷的過程是怎樣的。系統(tǒng)初始階段,是一個(gè)探索的階段。這個(gè)階段的意義在于,搞明白你的問題究竟是不是一個(gè)適合用ML技術(shù)解決的問題。
機(jī)器學(xué)習(xí)很厲害,但不是萬能的,尤其是某些需要強(qiáng)人工先驗(yàn)的領(lǐng)域,可能不是最合適的方案,尤其不適合作為系統(tǒng)啟動(dòng)的方案。在這個(gè)階段,我們使用的工具是R和Python。


上頁右側(cè)的圖中,紅色框住的部分是可以用R來解決的,藍(lán)色框住的部分是用Python更合適的,綠色框住的部分是兩者都需要。
為什么選擇R和Python呢?
先說R。

是因?yàn)镽的全能性,堪稱數(shù)據(jù)科學(xué)界的瑞士軍刀。
是因?yàn)镽已經(jīng)流行很多年了,屬于成熟的工具,遇到問題容易找到解決方案。
當(dāng)時(shí)(2013年)sklearn之類的還不夠完善好用,而且有問題也不容易找到解決方案。

再說Python。

Python的開發(fā)效率高,適合快速開發(fā)、迭代,當(dāng)然要注意工程質(zhì)量。
Python的文本處理能力較強(qiáng),適合處理文本相關(guān)的特征。
Python和Hadoop以及Spark等計(jì)算平臺(tái)的結(jié)合能力較強(qiáng),在數(shù)據(jù)量擴(kuò)張時(shí)具有可擴(kuò)展性。

不過,R的部分現(xiàn)在其實(shí)也可以用Python來替代,因?yàn)橐詓klearn,Pandas,Theano等為代表的工具包都已經(jīng)更加成熟。
但是當(dāng)過了初期探索的階段,到了大數(shù)據(jù)量的系統(tǒng)時(shí),R就不再適合了。主要原因就是兩個(gè):可處理數(shù)據(jù)量小和處理速度慢。

第一個(gè)是因?yàn)榧兊腞只支持單機(jī),并且數(shù)據(jù)必須全部載入內(nèi)存,這顯然對(duì)于大數(shù)據(jù)處理是個(gè)很明顯的障礙,不過現(xiàn)在的一些新技術(shù)對(duì)這一問題或許會(huì)有所緩解,但是我們沒有嘗試過。
其次就是計(jì)算速度相對(duì)慢,這當(dāng)然指的也是在大數(shù)據(jù)量下的速度。

所以,如架構(gòu)圖中左邊,一旦到了大數(shù)據(jù)量階段,以****Hadoop****和Spark****為代表的工具們就會(huì)登上舞臺(tái),成為主要使用的工具
過了初期探索、驗(yàn)證的階段后,就要進(jìn)入工程迭代的步驟了。


如圖所示的是我們開發(fā)的一個(gè)典型流程。
驗(yàn)證通過之后,就進(jìn)入下一個(gè)重要環(huán)節(jié),我稱之為“全流程構(gòu)建”,指的是將要構(gòu)建的ML系統(tǒng),以及后面的使用方,全部構(gòu)建起來,形成一個(gè)完整的開發(fā)環(huán)境。
這里需要強(qiáng)調(diào)的是“完整”,也就是不只是要搭建起ML模型相關(guān)的樣本、特征、訓(xùn)練等環(huán)節(jié),后面使用模型的環(huán)節(jié),例如排序展示等,也要一同搭建起來。關(guān)于這一點(diǎn)在后面還會(huì)再次提到。
如果是初次構(gòu)建系統(tǒng),那么“全流程構(gòu)建”將會(huì)花費(fèi)比較長的時(shí)間完成。但這一步是后面所有工作的基石,投入的時(shí)間和精力都是值得的。
這個(gè)步驟完成之后,一個(gè)系統(tǒng)其實(shí)就已經(jīng)構(gòu)建好了 ,當(dāng)然是一個(gè)只有型沒有神的系統(tǒng),因?yàn)槊總€(gè)部分可能都是完全未優(yōu)化的,而且有的部分可能是只有軀殼沒有內(nèi)容。
之后就進(jìn)入優(yōu)化迭代這個(gè)“無間道”了,這部分的工作就是不斷尋找可以優(yōu)化的點(diǎn),然后嘗試各種解決方案,做線下驗(yàn)證,如何覺得達(dá)到上線標(biāo)準(zhǔn),就做線上AB。在系統(tǒng)流程構(gòu)建起來之后,后面基本就是在不停的在這個(gè)迭代中輪回。(無間道的本來含義是指18層地獄的第18層,寓意著受苦的無限輪回。)


其實(shí)這個(gè)開發(fā)流程,特別像蓋房子的流程,先要打地基,之后建一個(gè)毛坯房,之后就是不斷裝修,各種驗(yàn)工,直到可以入住。住進(jìn)去一段時(shí)間可能覺得哪里又不滿意了,或者又出現(xiàn)了什么新的、更漂亮的裝修方法,那可能又會(huì)再次裝修。如此反復(fù)。直到有一天你發(fā)財(cái)了,要換房子了,那也就是系統(tǒng)整體重構(gòu)、升級(jí)的時(shí)候了。


這一頁介紹的我們使用的工具,都是一些市面上常見的主流工具,除了dmilch這套工具。
dmilch(milch為德語牛奶的意思):Dangdang MachIne Learning toolCHain是我們?cè)诓粩嗟锌偨Y(jié)提取出的一套特征工程相關(guān)的工具。包含了一些特征處理的常用工具,例如特征正則化、歸一化,常用指標(biāo)計(jì)算等。和linkedin前段時(shí)間開源出來的FeatureFu目的類似,都是為了方便特征處理,但是角度不同。

這一頁介紹幾個(gè)我們在工作流程中的關(guān)鍵點(diǎn)。其實(shí)小團(tuán)隊(duì)在這個(gè)方面是有著天然優(yōu)勢(shì)的,所以我們的中心思想就是“小步快跑”
第一個(gè)關(guān)鍵點(diǎn)就是改動(dòng)之間的串行性。這或許是機(jī)器學(xué)習(xí)這種算法類系統(tǒng)的獨(dú)有特點(diǎn),多個(gè)改進(jìn)一起上的話,有時(shí)就無法區(qū)分究竟是什么因素起到了真正的作用,就像一副中藥一樣,不知道起效的是什么,而我們希望的是能把真正的“青蒿素”提取出來。
第二點(diǎn)就是項(xiàng)目推進(jìn)機(jī)制。我們大概每周會(huì)有一到兩次的會(huì)議討論,主要內(nèi)容是驗(yàn)證改進(jìn)效果,方案討論等,并當(dāng)場確認(rèn)下一步的動(dòng)作。
技術(shù)人員其實(shí)是不喜歡開會(huì)的,那為什么每周還有開呢?我認(rèn)為最重要的一個(gè)目的就是讓大家參與討論,共同對(duì)項(xiàng)目負(fù)責(zé),共同成長。承擔(dān)的工作有分工,但是在討論時(shí)無分工,每個(gè)人都要對(duì)系統(tǒng)有想法,有建議。這也能確保大家互相吸收自己不熟悉的地方,更有利于成長。
還有一個(gè)不得不說的話題就是關(guān)于新技術(shù)的嘗試。如果沿用我們之前的蓋房子的例子,新技術(shù)就好比高大上的家具擺設(shè)之類的,家里沒個(gè)一兩件鎮(zhèn)宅的,都不好意思跟人打招呼。
這方面我們的經(jīng)驗(yàn)是,先把已有的技術(shù)吃透,用透,再說新技術(shù),不遲。例如推薦中的協(xié)同過濾算法,一般會(huì)在購買、瀏覽、評(píng)論、收藏等不同數(shù)據(jù),不同維度都去加以計(jì)算,看哪個(gè)效果更好。當(dāng)把熟悉的技術(shù)的價(jià)值都“榨取”干了之后,再嘗試新技術(shù)也不遲。
還有一點(diǎn)很重要,就是別人的技術(shù),未必適合你。不同公司的業(yè)務(wù)場景,數(shù)據(jù)規(guī)模,數(shù)據(jù)特點(diǎn)都不盡相同,對(duì)于他人提出的新技術(shù),要慎重采納。
我們?cè)?jīng)滿懷信心的嘗試過某國際大廠的某技術(shù),但是反復(fù)嘗試都沒有得到好的效果,反而徒增了很大的復(fù)雜性。后來和一些同行交流之后發(fā)現(xiàn)大家也都沒有得到好的效果。所以外國的月亮,有可能只是在外國比較圓。上什么技術(shù),還是要看自己系統(tǒng)所在的土壤適合種什么樣的苗。
這部分結(jié)束之前我簡單介紹一下我們的模型在推薦廣告上上線后的效果:推薦首屏點(diǎn)擊率提升了15%~20%。廣告的點(diǎn)擊率提升了30%左右,RPM提升了20%左右。可以看出效果還是很明顯的。
那些年,我們踩過的坑
下面進(jìn)入今天分享的下一個(gè)重要環(huán)節(jié),那就是我們踩過的各種坑。
“前事不忘,后事之師”,坑或許是每個(gè)分享中最有價(jià)值的一部分。我們?cè)跇?gòu)建系統(tǒng)時(shí)也踩過很多坑,在這里和大家分享幾個(gè)我認(rèn)為比較大的坑,希望對(duì)大家有所幫助。我會(huì)先介紹幾個(gè)坑,之后再說一下我們從坑里爬出來的感覺、收獲。
只見模型,不見系統(tǒng)。
如果要把我們踩過的坑排個(gè)名,這個(gè)坑一定是第一名。因?yàn)槿绻暨M(jìn)了這個(gè)坑,那么指導(dǎo)你系統(tǒng)方向的依據(jù)有可能完全是錯(cuò)的。
具體來說,這個(gè)問題指的是在構(gòu)建系統(tǒng)時(shí),我們一開始基本只關(guān)注機(jī)器學(xué)習(xí)模型的好壞,AUC如何,NE如何,但是沒有關(guān)注這個(gè)模型到了線上的最終效果是如何。這樣做的后果是,我們覺得模型從指標(biāo)等各方面來看已經(jīng)非常好了,但是一上線發(fā)現(xiàn)完全沒有效果。因?yàn)槲覀兒雎粤四P褪潜蝗绾问褂玫?,一直在閉門造成一樣的“優(yōu)化”模型,最后的效果自然不會(huì)好。
那正確的姿勢(shì)是怎樣的呢?從我們的經(jīng)驗(yàn)來看,在系統(tǒng)搭建的初期,就要明確地知道:你構(gòu)建的不是一個(gè)模型,而是一個(gè)以模型為中心的系統(tǒng)。時(shí)刻要知道模型出來之后要干什么,要怎么用,這種大局觀非常重要。
模型雖然是系統(tǒng)的中心,但不是系統(tǒng)的全部。在系統(tǒng)設(shè)計(jì)、開發(fā)、調(diào)優(yōu)的各個(gè)階段,都要從系統(tǒng)的角度去看問題,不能眼里只有模型,沒有系統(tǒng)(產(chǎn)品)。否則可能等你調(diào)出一個(gè)AUC=0.99的模型的時(shí)候,一抬頭發(fā)現(xiàn)已經(jīng)和系統(tǒng)越走越遠(yuǎn)了。
所以,做機(jī)器學(xué)習(xí)系統(tǒng)要注意模型和系統(tǒng)并重,如果只看到模型而看不到系統(tǒng),很可能會(huì)做出指標(biāo)漂亮但是沒有實(shí)效的“花瓶系統(tǒng)”來。
不重視可視化分析工具
這是一個(gè)開始很容易被忽視,但是到后期會(huì)導(dǎo)致你很難受的一個(gè)問題(這里指的是非深度學(xué)習(xí)的系統(tǒng))。
因?yàn)闄C(jī)器學(xué)習(xí)系統(tǒng)某種程度上是個(gè)黑盒子,所以我們的精力會(huì)習(xí)慣性地集中在參數(shù)、模型這些東西上,本能地覺得模型的內(nèi)部工作是不需要關(guān)心的。但是我們的經(jīng)驗(yàn)是,如果只關(guān)注黑盒子的外面,完全不關(guān)心里面,那么如果模型效果不好,那么將很難定位到問題的所在。反過來,如果效果好了,也會(huì)有點(diǎn)莫名其妙,就好比你家?guī)臒艉鋈蛔约毫亮?,或者電視機(jī)忽然自己開了,總會(huì)讓人很不踏實(shí)。
這個(gè)問題上我們的感觸是很深的。我們最早在做系統(tǒng)的時(shí)候,發(fā)現(xiàn)效果不好,其實(shí)是沒有太多章法能夠幫助定位問題的。只能是把各種特征來回特征,樣本處理上變一下花樣,如果效果好了,就好了,不好,接著折騰。
后來我們做了一套web頁面,上面把每條樣本、每個(gè)case的特征及其參數(shù),樣本的出現(xiàn)次數(shù),在候選集里的排序等等,全部展示出來。如同把整個(gè)系統(tǒng)加模型給做了一次解剖,希望能夠盡量多地看到系統(tǒng)的內(nèi)部細(xì)節(jié),對(duì)于分析問題有很大幫助。
這個(gè)系統(tǒng)幫了我們很大的忙,雖然也不能算是“有章法”的做法,但是把很多東西呈現(xiàn)在你面前之后,你會(huì)發(fā)現(xiàn)有些東西和你想的不一樣,也會(huì)發(fā)現(xiàn)一些你壓根不會(huì)想到的東西。這對(duì)于機(jī)器學(xué)習(xí)這種有點(diǎn)像黑盒子的系統(tǒng)來說,尤為寶貴。到現(xiàn)在,這個(gè)系統(tǒng)是我們每次效果驗(yàn)證時(shí)非常依賴的一個(gè)東西,可以說是我們的另一雙眼睛。
過于依賴算法
這個(gè)坑相信很多同學(xué)也遇到過。我就舉一個(gè)例子吧。我們當(dāng)時(shí)遇到一個(gè)文本處理的問題,要過濾掉大量無關(guān)無用的文本詞匯。一開始上了很多各種算法,各種調(diào)優(yōu),但是遲遲得不到滿意的效果。
最后我們亮出了絕招:人肉過濾。具體說就是三個(gè)人花了三天時(shí)間純?nèi)斯ぐ盐谋具^了一遍(幾千個(gè)上萬個(gè)詞),效果立竿見影。當(dāng)時(shí)那個(gè)問題,或許是存在效果更好的算法的,但是從系統(tǒng)、工程角度整體衡量一下,還是人工的ROI最高。
所以雖然機(jī)器學(xué)習(xí)是以算法為主的系統(tǒng),但是也不能思維僵化,凡事都只想著用算法解決,有的地方,還是小米加步槍比較合適。
關(guān)鍵流程和數(shù)據(jù)沒有掌握在自己團(tuán)隊(duì)
這個(gè)坑,可以說不是一個(gè)容易發(fā)現(xiàn)的坑,尤其是在系統(tǒng)初期,是比較隱蔽的。我們也是在吃了一些虧之后才發(fā)現(xiàn)這個(gè)問題的。
在很多公司里,前端展示,日志收集等工作是有專門的團(tuán)隊(duì)負(fù)責(zé)的,而諸如推薦廣告這樣的團(tuán)隊(duì)是直接拿來用的。這樣做的好處很明顯,可以讓機(jī)器學(xué)習(xí)團(tuán)隊(duì)專注于本職工作,但是不好的一面是,他們收集到的數(shù)據(jù)并不總是我們期望得到的。
舉個(gè)例子。我們一開始使用的曝光數(shù)據(jù)是兄弟團(tuán)隊(duì)幫我們做的,但是我們拿來之后發(fā)現(xiàn)和其他數(shù)據(jù)不太對(duì)的上,找了很久才找到問題。這個(gè)問題直接影響到我們拿到的樣本的正確與否,所以對(duì)我們的影響非常的大。
那造成這個(gè)問題的原因是什么呢?其實(shí)并不是兄弟團(tuán)隊(duì)不認(rèn)真,而是他們并不完全理解我們對(duì)數(shù)據(jù)的需求,他們也不使用該數(shù)據(jù),所以數(shù)據(jù)的質(zhì)量就會(huì)有風(fēng)險(xiǎn)。吃了這一虧之后,我們現(xiàn)在把這部分工作也拿來自己做,這樣數(shù)據(jù)正確與否我們可以全程監(jiān)控,出了問題也可以自己內(nèi)部解決,不用協(xié)調(diào)各種資源。
團(tuán)隊(duì)不夠“全?!?/strong>
這個(gè)坑是一個(gè)比較復(fù)雜的坑。在上一個(gè)坑中,我提到我們發(fā)現(xiàn)了數(shù)據(jù)質(zhì)量有問題,之后自己做了這部分曝光收集的工作。但是定位問題原因和自己接手并不是在數(shù)據(jù)一有問題的時(shí)候就做到的。原因既簡單又殘酷:我們組里當(dāng)時(shí)沒有前端人才。
因?yàn)槠毓鈫栴}涉及到從瀏覽器到后臺(tái)系統(tǒng)的一系列動(dòng)作,而前端是這些動(dòng)作的第一個(gè)環(huán)節(jié)。但是我們?cè)诮M件機(jī)器學(xué)習(xí)團(tuán)隊(duì)的時(shí)候,并沒有意識(shí)到這里面會(huì)有前端什么事,以為有后臺(tái)+模型的人就夠了。所以導(dǎo)致我們面對(duì)這個(gè)問題比較無力。直到后來有一位有著豐富前端經(jīng)驗(yàn)的同事加入我們組,我們才定位到問題,并且做出了自己接手的決定。
這個(gè)問題給我們的教訓(xùn)是:組建團(tuán)隊(duì)的時(shí)候要更謹(jǐn)慎一些,要從更系統(tǒng)的角度看待,不能說做機(jī)器學(xué)習(xí)就只招算法工程師,這樣會(huì)導(dǎo)致團(tuán)隊(duì)級(jí)的短板,為一些問題埋下伏筆。
不過有的問題在遇到之前可能也難以預(yù)測,所以這個(gè)坑確實(shí)比較復(fù)雜。
巨型系統(tǒng)
最后一個(gè)坑,當(dāng)然也要留給一個(gè)大坑。這個(gè)坑我稱之為“巨型系統(tǒng)”。
巨型系統(tǒng)是什么意思呢?簡單來說,就是把整個(gè)系統(tǒng)做成“一個(gè)”系統(tǒng),而不是分模塊做成多個(gè)子系統(tǒng)。做成一個(gè)系統(tǒng)的含義就是系統(tǒng)內(nèi)部的模塊之間有著高耦合性,強(qiáng)關(guān)聯(lián)性,樣本、特征、訓(xùn)練、預(yù)測等等全部粘在一起,無法分離。這樣做的后果是什么?
直接舉例子。我們第一版的系統(tǒng),光上線就上了得有一周。而且之后的維護(hù)相當(dāng)困難,想改東西非常困難。為什么會(huì)做成這樣的,我的反思是:在學(xué)習(xí)理論的時(shí)候,就想當(dāng)然得把樣本、特征、訓(xùn)練這個(gè)pipeline當(dāng)做一套東西了,這種思維直接反應(yīng)到系統(tǒng)里就是一個(gè)巨型系統(tǒng)。或許在你只有十幾個(gè)特征,幾百條樣本的時(shí)候沒有問題。但是當(dāng)你特征漲到幾百萬,樣本漲到幾千萬的時(shí)候,就需要好好想一下,你的系統(tǒng)是不是有點(diǎn)大得失控了。
那更好的做法是什么呢?我們后來的解決方法是:大系統(tǒng)小做?!按笙到y(tǒng)小做”這個(gè)說法不是我發(fā)明的,是今年春節(jié)后(或者是去年)看到微信團(tuán)隊(duì)在說搶紅包系統(tǒng)架構(gòu)時(shí)說到的一個(gè)概念。我覺得這個(gè)說法提煉得很好,表示非常贊同。這個(gè)做法的意思就是,雖然你的系統(tǒng)很龐大,很復(fù)雜,但是做的時(shí)候還是要做好模塊分離,這樣利于開發(fā),也利于擴(kuò)展、維護(hù)。
機(jī)器學(xué)習(xí)系統(tǒng)的特點(diǎn)在于,剛開始你可能用的特征什么的都很少,所以覺得一個(gè)系統(tǒng)里就可以搞定,但是做著做著,需要對(duì)特征做各種變換,樣本做各種處理,系統(tǒng)會(huì)在不知不覺中變得龐大,而如果你只關(guān)注模型的話,很容易造出一個(gè)無法維護(hù)的巨型系統(tǒng)來。
萬里長征剛起步
我們的團(tuán)隊(duì)在經(jīng)歷了剛剛這許多“坑”之后,一個(gè)系統(tǒng)可以說是搭建起來了,但是這只是萬里長征的第一步。對(duì)于我們?nèi)绱?,其?shí)對(duì)于機(jī)器學(xué)習(xí)系統(tǒng)這個(gè)新事物,本身也有著不同于傳統(tǒng)軟件系統(tǒng)的諸多復(fù)雜之處,還有很多的挑戰(zhàn)需要去解決。我在這里用兩篇參考文獻(xiàn)簡單介紹一下這些復(fù)雜之處,以及面對(duì)的挑戰(zhàn)。有興趣深入了解的同學(xué)可以找文章具體看看。

第一篇是Google Research****的一篇paper****,講的是機(jī)器學(xué)習(xí)技術(shù)債。題目也很有意思,可以翻譯為:“機(jī)器學(xué)習(xí):高利息的技術(shù)債信用卡”。
這篇文章主要說的是機(jī)器學(xué)習(xí)系統(tǒng)的搭建非常地復(fù)雜,如果缺乏經(jīng)驗(yàn),或者不夠謹(jǐn)慎,在許多環(huán)節(jié)就容易“欠債”,這些債務(wù)當(dāng)時(shí)覺得影響不大,但是由于“利息”很高,到后來會(huì)讓你還起來很痛苦。
上圖是我看了文章之后根據(jù)文章自己整理的,技術(shù)債的幾個(gè)具體維度。這幾個(gè)維度和我們自己的實(shí)踐也是高度吻合的,當(dāng)時(shí)看文章也是滿膝蓋的箭。
例如圖中右上提到的“子系統(tǒng)邊界模糊”,和我之前說過的“巨型系統(tǒng)”有類似之處,說的也是系統(tǒng)內(nèi)部無分割。
再例如右下提到的“system-level spaghtti(系統(tǒng)級(jí)意大利面)”。意大利面代碼常用來指代亂成一團(tuán)的代碼,由于機(jī)器學(xué)習(xí)系統(tǒng)一般都是在探索中搭建起來的,不像其他系統(tǒng)那樣完全設(shè)計(jì)好再搭建,所以很容易產(chǎn)生意大利面代碼。
如果能在搭系統(tǒng)之前參照這些維度加以考慮,那么系統(tǒng)的開發(fā)、升級(jí)和維護(hù)會(huì)輕松很多。相信這些經(jīng)驗(yàn)也是Google這樣的巨頭公司摔了很多坑總結(jié)出來的。巨頭尚且如此,對(duì)我們來說自然也不簡單。

接下來這篇文章是現(xiàn)在在FB****的SGD****大牛Leon Bottou****在ICML 2015****上做的一個(gè)tutorial。題目叫:Two big challenges in machine learning,是一篇比較偏系統(tǒng)實(shí)踐的文章,說的是機(jī)器學(xué)習(xí)面臨的兩個(gè)新的挑戰(zhàn)。
第一點(diǎn)就非常地駭人聽聞:機(jī)器學(xué)習(xí)破壞了軟件工程。但是仔細(xì)想來,確實(shí)如此。機(jī)器學(xué)習(xí)系統(tǒng)的開發(fā)流程大多是探索式、漸進(jìn)式的,這一點(diǎn)和傳統(tǒng)的軟件工程非常不同,這就給系統(tǒng)開發(fā)者們提出了挑戰(zhàn)。我覺得以后很可能會(huì)出現(xiàn)專門的“機(jī)器學(xué)習(xí)系統(tǒng)架構(gòu)師”職位。
第二點(diǎn)說的是當(dāng)前的實(shí)驗(yàn)方式方法也遇到了極限。這一點(diǎn)乍一看是說科學(xué)實(shí)驗(yàn)的,其實(shí)不然。機(jī)器學(xué)習(xí)系統(tǒng)開發(fā)由于是探索式的,所以在開發(fā)中要經(jīng)常做各種實(shí)驗(yàn),驗(yàn)證各種效果,這個(gè)整體方法框架,也是需要精心設(shè)計(jì)的。顯然在Bottou看來,目前的方法都不太合適。

張相於
當(dāng)當(dāng)個(gè)性化推薦開發(fā)經(jīng)理
86年生人,人民大學(xué)本科碩士畢業(yè),現(xiàn)任當(dāng)當(dāng)個(gè)性化推薦開發(fā)經(jīng)理。從事推薦系統(tǒng)、機(jī)器學(xué)習(xí)系統(tǒng)等方面工作,并關(guān)注互聯(lián)網(wǎng)金融、反欺詐、風(fēng)險(xiǎn)控制等機(jī)器學(xué)習(xí)技術(shù)的新應(yīng)用。
聯(lián)系方式:zhangxiangyu@dangdang.com

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容