大數(shù)據(jù):“人工特征工程+線性模型”的盡頭
標簽:大數(shù)據(jù)機器學習特征工程11年的時候我加入百度,在鳳巢使用機器學習來做廣告點擊預測。當時非常驚訝于過去兩年內訓練數(shù)據(jù)如此瘋狂的增長。大家都在熱情的談特征,每次新特征的加入都能立即得到AUC的提升和收入的增長。大家堅信特征才是王道,相信還會有源源不斷的特征加入,數(shù)據(jù)規(guī)模還會成倍的增長。我也深受感染,堅定的相信未來兩年數(shù)據(jù)至少還會長十倍,因此一切的工作都圍繞這個假設進行?,F(xiàn)在兩年過去了,回過頭來看,當時的預測是正確的嗎?
數(shù)據(jù)的飛速增長,給模型訓練帶來極大壓力。事實上,11年的時候模型訓練已經是新特征上線的主要障礙了。憑著年輕的沖動,和對分布式系統(tǒng)和數(shù)值算法優(yōu)化的一點點知識,我頭腦一熱就開始設計下一代模型訓練系統(tǒng)了。目標是在同樣的資源下,能容納當前十倍的數(shù)據(jù)。項目是在情人節(jié)立項,取了一個好玩的名字,叫darlin【吐槽1】,這個系統(tǒng)應該是百度使用率***的機器學習訓練系統(tǒng)之一了。一個重要問題是,它會像前任一樣在兩年后成為性能瓶頸嗎?
目前看來,以上兩個問題的答案都是否定的。
【吐槽1】意思是distributed algorithm for linear problems。更好玩的是,計算核心模塊叫heart,絡通訊模塊叫telesthesia。數(shù)據(jù)是用類似bigtable的格式,叫cake,因為切起來很像蛋糕。開發(fā)的時候開玩笑說,以后上線了就會時不時聽人說“darlin”,是 不是會很有意思?可惜全流量上線后我就直奔CMU了,沒享受到這個樂趣:)
我們首先討論特征。特征是機器學習系統(tǒng)的原材料,對最終模型的影響是毋庸置疑的。如果數(shù)據(jù)被很好的表達成了特征,通常線性模型就能達到滿意的精度。一個使用機器學習的典型過程是:提出問題并收集數(shù)據(jù),理解問題和分析數(shù)據(jù)繼而提出抽取特征方案,使用機器學習建模得到預測模型。第二步是特征工程,如果主要是人來完成的話,我們稱之為人工特征工程(human feature engineering)。舉個例子,假設要做一個垃圾郵件的過濾系統(tǒng),我們先收集大量用戶郵件和對應的標記,通過觀察數(shù)據(jù)我們合理認為,標題和正文含有“交友“、”發(fā)票“、”免費促銷“等關鍵詞的很可能是垃圾郵件。于是我們構造bag-of-word特征。繼而使用線性logisitic regression來訓練得到模型,最終把模型判斷成是垃圾郵件的概率大于某個值的郵件過濾掉。
就這樣搞定啦?沒有。特征工程是一個長期的過程。為了提升特征質量,需要不斷的提出新特征。例如,通過分析bad case,不久我們便發(fā)現(xiàn),如果郵件樣式雜亂含有大量顏色文字和圖片,大概率是垃圾郵件。于是我們加入一個樣式特征。又通過頭腦風暴,我們認為如果一個長期使用中文的人收到俄語的郵件,那估計收到的不是正常郵件,可以直接過濾掉。于是又加入字符編碼這一新特征。再通過苦苦搜尋或買或央求,我們得到一個數(shù)據(jù)庫包含了大量不安全ip和發(fā)信地址,于是可以加入不安全來源這一新特征。通過不斷的優(yōu)化特征,系統(tǒng)的準確性和覆蓋性不斷的提高,這又驅使我們繼續(xù)追求新特征。
由此可以看出,特征工程建立在不斷的深入理解問題和獲取額外的數(shù)據(jù)源上。但問題是,通常根據(jù)數(shù)據(jù)人能抽象出來的特征總類很有限。例如,廣告點擊預測,這個被廣告投放公司做得最透徹的問題,目前能抽象出來的特征完全可以寫在一張幻燈片里。好理解的、方便拿來用的、干凈的數(shù)據(jù)源也不會很多,對于廣告無外乎是廣告本身信息(標題、正文、樣式),廣告主信息(行業(yè)、地理位置、聲望),和用戶信息(性別、年齡、收入等個人信息,cookie、session等點擊信息)。KDD CUP2013騰訊提供了廣告點擊預測的數(shù)據(jù),就包含了其中很多。所以最終能得到的特征類數(shù)上限也就是數(shù)百。另外一個例子是,google使用的數(shù)據(jù)集里每個樣本含有的特征數(shù)平均不超過100,可以推斷他們的特征類數(shù)最多也只是數(shù)百。

圖1
因此,新數(shù)據(jù)源和新特征的獲得會越來越難。然而,模型的精度并不是隨著特征的增長而線性提高。很多情況是指數(shù)。隨著人工特征工程的深入,投入的人力和時間越來越長,得到的新特征對系統(tǒng)的提升卻越來越少。最終,系統(tǒng)性能看上去似乎是停止增長了。Robin曾問過我老大一個問題:“機器學習還能持續(xù)為百度帶來收益嗎?” 但時候我的***反應是,這個商人!現(xiàn)在想一想,Robin其實挺高瞻遠矚。
另外一個例子是IBM的Watson。從下圖中可以看出,雖然每次性能的提升基本都是靠引入了新數(shù)據(jù)和新特征,但提升幅度是越來越小,也越來越艱難。

圖2
這解釋了***個問題,為什么特征數(shù)量的漲幅比當初預計的要少很多。一個特征團隊,5個經驗豐富的大哥加上10個動手強的小弟,幾個月就能把可能的特征發(fā)掘得差不多,然后再用1、2年把特征全部做進系統(tǒng)。再然后呢?就會被發(fā)現(xiàn)有點后續(xù)無力了,進入中年穩(wěn)定期了。
接下來討論模型訓練,因為不想被跨國追捕所以主要用google sibyl?來舉例子。Sibyl是一個線性分類器,支持多種常見loss,例如logistc loss,square loss,hingle loss。還可以使用l2罰,或者l1罰來得到稀疏模型。Sibyl每天要被運行數(shù)百次,被廣泛應用在google的搜索,gmail,youtube等應用上。由于這些應用直接關系到用戶體驗和收入,通常需要得到收斂精度很高而且收斂點穩(wěn)定的模型。因為一個有著數(shù)百億項的模型,如果收斂不夠,即使只是少數(shù)特征上權重計算誤差過大,也很容易引起bad case。同時,應用也希望模型的輸出在一段時間是穩(wěn)定的。
Sibyl使用parallel boosting,而darin用了一個更生僻的算法。后來聽說了linkedin,yahoo,facebook的算法之后,狠下心survey了一些古老的優(yōu)化論文,發(fā)現(xiàn)雖然大家名字各不相同,但其實都等價的【吐槽2】。在合適算法下,收斂到所要求的精度通常只需要數(shù)十論迭代。而且隨著數(shù)據(jù)量的增大迭代數(shù)還會進一步降低。更多的,在online/incremental的情況下,還能更進一步大幅減少。 #p#
【吐槽2】在嘗試過ml人最近一些年做的一系列算法后發(fā)現(xiàn),它們真心只是研究目的:(
然后是工程實現(xiàn)。google有強大的底層支持,例如GFS,Mapreduce,BigTable,最近幾年更是全部更新了這一套。所以sibyl的實現(xiàn)應該是相當輕松。但即使是從0開始,甚至不借助hadoop和mpi,也不是特別復雜。純C開發(fā),只是用GCC的情況下,代碼量也只是數(shù)萬行。主要需要考慮的是數(shù)據(jù)格式,計算,和網絡通訊。數(shù)據(jù)格式首先考慮壓縮率,可以大量節(jié)省I/O時間,其次是空間連續(xù)性(space locality)。但通常數(shù)據(jù)都遠超last level cache,也不需要顧慮太多。計算可以用一些常見小技巧,例如少用鎖,線程分配的計算量要盡量均勻(稀疏數(shù)據(jù)下并不容易),double轉float,甚至是int來計算,buffer要管理好不要不斷的new和delete,也不要太浪費內存。網絡稍微復雜一點,要大致了解集群的拓撲結構,注意不要所有機器同時大量收發(fā)打爆了交換機,從而引起大量重傳(這個經常發(fā)生),盡量少的做集群同步。
考察了幾個公司的系統(tǒng)性能后,可以認為現(xiàn)在state-of-the-art的性能標準是,100T數(shù)據(jù),通常包含幾千億樣本,幾百億特征,200臺機器,收斂精度要求大致等于L-BFGS 150輪迭代后的精度,可以在2小時內訓練完成。如果用online/incremental模式,時間還可以大幅壓縮。例如,使用67T數(shù)據(jù)和1000核,Sibyl在不到一個小時可以完成訓練。
這回答了前面的第二個問題。假設特征不會突增,那么數(shù)據(jù)的主要增長點就是樣本的累積。這只是一個線性的增長過程,而硬件的性能和規(guī)模同時也在線性增長。目前來看效率已經很讓人滿意。所以一個有著適當優(yōu)化算法和良好工程實現(xiàn)的系統(tǒng)會勝任接下來一兩年的工作。
在人工特征工程下,隨著可用的新數(shù)據(jù)源和新特征的獲取越來越困難,數(shù)據(jù)的增長會進入慢速期。而硬件的發(fā)展使得現(xiàn)有系統(tǒng)能完全勝任未來幾年內的工作量,因此人工特征工程加線性模型的發(fā)展模式進入了后期:它會隨著數(shù)據(jù)和計算成本的降低越來越普及,但卻無法滿足已經獲得收益而希求更多的人的期望。
所以,然后呢?我來拋磚引玉:)
還是先從特征開始。正如任何技術一樣,機器學習在過去20年里成功的把很多人從機械勞動里解救了出來,是時候再來解救特征專家們了。因為線性分類系統(tǒng)有足夠的性能來支撐更多的數(shù)據(jù),所以我們可以用它來做更加復雜的事情。一個簡單的想法是自動組合特征,通過目標函數(shù)值的降低或者精度的提升來啟發(fā)式的搜索特征的組合。此外,Google最近的deep learning項目【吐槽3】展現(xiàn)另外一種可能,就是從原始數(shù)據(jù)中構造大量的冗余特征。這些特征雖然質量不如精心構造的特征來得好,但如果數(shù)量足夠多,極有可能得到比以前更好的模型。他們使用的算法結合了ICA和sparse coding的優(yōu)點,從100x100圖片的原始pixel信息中抽取上十億的特征。雖然他們算法現(xiàn)在有嚴重的scalability的問題,但卻可以啟發(fā)出很多新的想法。 #p#
【吐槽3】中文介紹請見余老師的文章。我個人覺得這個項目更多是關于提取特征。引用Quoc來CMU演講時說的兩點。一、為了減少數(shù)據(jù)通訊量和提升并行效率,每一層只與下層部分節(jié)點相連。因此需要多層來使得局部信息擴散到高層。如果計算能力足夠,單層也可能是可以的。二、如果只使用DL來得到的特征,但用線性分類器來訓練,還可以提升訓練精度。
模型方面,線性模型雖然簡單,但實際上是效果最差的模型。鑒于計算能力的大量冗余,所以是時候奔向更廣闊的天空了。在廣告點擊預測那個例子里,數(shù)據(jù)至少可以表示成一個四緯的張量:展現(xiàn) x廣告 x 廣告主 x 用戶。線性模型簡單粗暴把它壓成了一個2維矩陣,明顯丟掉了很多信息。一個可能的想法是用張量分解(現(xiàn)在已經有了很高效的算法)來找出這些內在的聯(lián)系。另一方面,點擊預測的最終目的是來對廣告做排序,所以這個本質是一個learning to rank的問題,而不是一個簡單的分類問題。例如可以嘗試boosted decision tree。
再有,最近大家都在談神經網絡。多層神經網絡理論上可以逼近任何一個函數(shù),但由于計算復雜、參數(shù)過多、容易過擬合等特點被更加簡單的kernel svm取代了。但現(xiàn)在的數(shù)據(jù)規(guī)模和計算能力完全不同當年,神經網絡又再一次顯示它的威力,hinton又再一次走向了職業(yè)生涯的***。微軟的語音實時翻譯是一個很好的樣例。反過來說,有多少人真正試過百億樣本級別kernel svm?至少,據(jù)小道消息說,多項式核在語音數(shù)據(jù)上效果很好。
我的結論是,大數(shù)據(jù)時代,雖然人工特征工程和線性模型將會被更廣泛的事情,但它只是大數(shù)據(jù)應用的起點。而且,我們應該要邁過這個起點了。