你們好,我是來自京東的包勇軍,我今天分享的主題是《京東電商廣告和推薦的機器學習系統實踐》,介紹下咱們部門在廣告和推薦系統中應用機器學習算法的實踐經驗,包括淺層模型和深度學習算法的應用,正好也涵蓋了咱們這兩年的工做。大綱以下:
介紹具體工做以前,先跟你們簡單介紹一下咱們部門的業務背景。咱們是京東數據營銷業務部,主要負責京東的廣告、推薦以及站外引流。包括有京東主站PC端和移動端流量,站外ADX流量以及SEM流量。這些流量接入到咱們的系統以後,通過商品和廣告召回,再進行排序,基本全部的推薦系統或廣告系統都是這樣一個流程。
在這裏須要解釋下,今天講的機器學習主要應用在排序階段,主要內容就是機器學習在咱們的排序算法中的應用實踐。
咱們系統的特色主要有兩個,一是實時在線,二是廣告和推薦的混合系統。這個系統不止是廣告系統,也不止是推薦系統,而是二者的混合。它對外暴露有實時在線服務接口,目前處理的日請求達到200億次。接下來咱們先看看淺層模型時代的工做。
首先講講淺層模型時代機器學習系統的核心問題。
我總結下來核心問題總共有五個,分別是模型算法,日誌流、訓練系統、特徵系統跟評估。淺層模型算法這塊,相對來講研究的比較透徹,比較固定,咱們的分享主要集中在實現層面。算法通常用的比較多的就是lr,由於廣告和推薦系統的應用場景就是大規模稀疏性特徵建模,因此lr比較適合。
因爲淺層算法變化較少,因此算法的主要優化都集中在特徵上。可能平時看到的以LR爲主要算法的機器學習團隊裏,大部分人都在作人工的特徵挖掘。算法層面,還有一些研究在自動學習組合特徵的算法,好比Fm/ffm,gbdt+lr等,咱們用的是FM。
FM的好處就是,能夠經過因式分解減小數據稀疏性,從而有效學習特徵組合。原來的模型特徵組合多是N方的規模。N個特徵,N乘N就是N的平方,經過因式分解能夠把每一個特徵表示成向量,特徵組合經過特徵向量的點積來完成,整個模型大小就變成了N×K,K是向量大小,但平時使用時要注意資源消耗問題,假如K是8,這個模型可能會膨脹8倍,因此不能單純追求效果,要綜合平衡收益和資源。
前面講到淺層模型的主要優化方向是特徵,那特徵系統的主要問題是什麼呢?最主要的常常遇到的就是線上線下特徵一致性問題。這就是說,離線試驗模型拿到的樣本跟線上預估模型特徵有很大diff。根據咱們以前的經驗,修復這個bug,速度漲了10%,京東廣告部門的點擊率也有了大幅度提高,因此說在業務指標上能帶來數量級的提高。
淺層模型時代的特徵系統架構演化,一般來講,初版的業務模塊已經逐漸成熟,已經進入機器學習優化階段。由於機器學習算法都是離線的,很天然的就會開發一個離線特徵抽取模塊,能夠看到一個很明顯的diff,也就是說離線跟在線是不一樣的代碼,樣本之間有很大不一樣。
爲了解決這個問題,咱們可能會設計一個通用的library,線上線下同一份代碼,雖然解決了代碼不一致,但實際上問題並無真正解決,離線拿到的訓練數據是落下來的日誌,這個日誌和在線數據源實際是不一樣的,在線是從數據庫或詞典,通過一些複雜的業務邏輯處理,最終落下來的,二者之間實際上處理過程是不一樣的,因此線上跟線下數據源仍是有很大不一樣的。
咱們最終的解決方案是,把線上處理完的特徵直接落下來給離線訓練使用,,完全保證一致性。
這三種方案介紹完以後,各自的優缺點是什麼呢?初版是初級階段的選擇,不展開。其實,第二版方案之因此會存在,是由於第二版的開發迭代效率很高。由於策略調研都是是離線研究人員驅動,先有離線代碼後有在線代碼,特徵優化能夠回溯歷史數據,週期短。至於第三種方案,加一個特徵獲取訓練數據須要上線到生成環境,可能一個累計一個月的時間,才能把數據補充完整,而後進行訓練模型,時間成本會很高。儘管有這樣的問題,但從咱們歷史上踩過的不少坑來看,咱們仍是建議採用第三種方案。用在線代碼推進特徵升級,對開發能力可能有必定要求,雖然犧牲了一些開發效率,但最終可以保證策略效果。
接下來,咱們講一下淺層模型時代的效果評估,評估你們常常遇到的問題就是評估結論不可信。好比,某一天,算法工程師說,我這個算法升級離線評估漲了不少,因而開始花費大量人力推進工程化上線的工做,但上線以後,確發現業務指標並無漲,回頭再看,發現離線的評估數據有問題,或者是評估工具出了問題。因此,咱們最終提出的方案是用在線系統評估離線指標,解決線上實現和線下評估脫節的問題,通常來講,大部分團隊可能對評估這塊的規範化不是很重視,常常是一些離線的工具互相拷貝。
咱們的方案叫在線旁路評估系統,第一將在線predictor服務直接做爲離線inference工具,第二將在線日誌流做爲離線評估數據。離線測試模型接入在線predictor集羣,通過各指標的計算,作一個報表呈現。引入該系統以後的架構圖以下所示:
紅線標註的地方能夠看到,評估和在線應用服務都共用一個集羣,precitor集羣,在這之中咱們加了proxy做爲服務的接入接口,這個方案的收益以下所示:
最大的收益就是結論可比可信了,整個迭代效率獲得了很大提高,避免了數據diff跟工具bug的干擾。因此,若是某個算法工程師說,如今他的算法效果很好,咱們就能夠把這個他的離線模型推到咱們的評估平臺上,咱們能夠自動給出全部評估指標,AUC或預估分佈一目瞭然,而後跟基線作對比,好壞就很清楚了。這個旁路評估還解決了你們平時可能不太注意,常常會犯的問題,就是在線實時服務模型中的評估穿越問題。 我跟你們解釋一下穿越問題,通常的模型評估你們一般是把數據拆分,好比分紅10份,8份拿來作訓練,一份作validation,另外一份拿來作測試。而後我再看一下訓練模型的測試效果,若是效果好,我認爲泛化效果好,但在實時服務模型中,這種評估是有問題的,你們能夠看下面的兩張圖:
第一張圖是穿越方式,第二張圖是不穿越的方式。你們能夠看到在時間維度上,不穿越是指在時間維度上,把訓練數據跟評估數據徹底切割開,緣由是在線實時服務模型中,數據變化很是快,因此泛化性要求會更高。好比廣告中的新廣告,或者推薦中的新興趣點,其實是拿截止昨天的全部歷史數據訓練模型來預估今天的新數據,至關於拿歷史數據預估新數據。假如是這種穿越的評估方式,其實是拿歷史數據預估歷史數據。因此在線實時服務模型對泛化性要求更高,若是用穿越的方式評估,每每獲得的數據會很是不靠譜,就會致使離線效果不錯,上線以後效果很很差,這就是穿越問題。
講完了評估,來看訓練系統,這部分的相關論文比較多。總結一下,淺層模型訓練系統的核心問題就是,大數據的效率問題。那這個問題怎麼解決,我總結了以下幾個方案:分別是採樣,分佈式訓練,增量算法,Online learning算法。咱們用的訓練系統是VW,VW是微軟的一個研發人員開源的分佈式訓練平臺,咱們對此進行了升級定製。另外業界目前研究比較多的是Online learning,它的好處在於時效性比較好,由於原來的假設實際上分佈是靜態的,Online learning的假設分佈其實是變化的,由於它是Online的方式,因此至關於state track。咱們也在某些產品上線了nline learning算法。那問題是什麼呢?問題是增長了系統複雜度,須要增長了實時計算系統,另外更新頻繁,從架構層面來講,增長了和其餘數據流系統的耦合。因此常常遇到的問題就是,某一天業務指標大跌,其餘部門可能會找過來講,你這個模型的更新時間點是什麼,你就會被動的捲入到這種很瑣碎的查問題的事情中。並且,特徵跟算法升級很是麻煩,緣由是Online learning模型一直在更新,一旦特徵算法升級以後,這種模型結構就會徹底變掉,就要從新訓練這個模型。
再講講多目標優化,剛纔提到的這個系統其實是廣告和推薦的混合系統。在2014年,咱們主要的優化方向是廣告收入,就是eCpm=pCtr*bid,pCtr是經過機器學習進行點擊率預估,到2015年咱們的目標就變了。
咱們的目標變成了廣告收入加GMV,除了掙錢之外,咱們很重視用戶體驗,也重視對公司貢獻的總體價值。因此RankingFunction就變成了pCtr1*(a*pValue+b*pGmv),這個方案變成了三個模型,系統變得複雜了。多模型方案的問題實際上就是,分目標優化,策略升級不一樣步。好比pCtr優化之後,評估下來漲了1%,但因爲模型跟模型之間不一樣步,因此上線以後,跟PValue和PGmv一結合,由於另外兩個沒有優化,因此線上收益可能就變成了千分之一,致使效果很是不顯著。 另外一個問題就是點擊後的數據,實際上很是稀疏,因此Gmv預估很是不許。咱們採用的One model方案實際上就是多目標優化。
收入跟GMV一塊兒建模放在一個模型裏,這樣總體架構會很是簡單。保證策略同步,優化一個模型,能夠一併優化其餘模型。另外,訓練數據會更充分,不但有一跳的標誌,還有二跳的標誌,有點擊有GMV標註,該算法是Pairwise和Pointwise算法的結合,就是Combine regression and rank。能夠看一下Loss, Rank Loss保證了不一樣label的序關係,在rare events場景裏,還能提高regression的效果。Regression Loss擬合絕對值,保持分佈穩定,用於廣告的二價計費。自上線以後,點擊跟GMV就獲得了大幅度的提高,並且總體架構很是簡單。
淺層模型時代講的偏多的是系統實現的工做,雖然是淺層模型,但實際上在深度學習階段,工具仍是繼續複用的。從淺層模型過渡到深度學習,你們確定有過這樣的思考,爲何引入深度學習?
首先LR是線性模型,但它怎麼作非線性建模呢?咱們會經過加特徵,或者各類特徵組合的方式來作。經過增長模型維度,把低維線性不可分問題變爲高維可分。一些特徵組合好比FM或GBDT+LR,其實是一個深度爲2或深度爲3的模型。而咱們都知道,在大數據的背景下,DNN其實是一個更通用的算法,它的工具和研究也會更多。 第二個緣由是原來的算法優化更多的是手工方式,主要依賴於人工堆特徵。深度學習其實是經過算法方式來作,把人工特徵工程變成了Feature Learning的過程,算法優化也由人工驅動變成了數據和算法驅動。這就是引入深度學習兩個最大的收益,那麼在推薦系統或者廣告系統中引入深度學習面臨的問題是什麼?
第一個就是現有算法如何平滑過渡,咱們作了一年多的工做,怎麼把以前的特徵和效果平滑的過渡過來,離散特徵如何建模,其實作推薦的應該都知道,像這種特徵是離散的值,而且規模大到billion級別,DNN算法實際稠密的矩陣預算,向量的大小是有限的,把億級別的向量歸入其中進行訓練,工程實現是一個很難的問題。咱們用到的稀疏連續離散特徵的建模方法,有以下兩種:
一是離散特徵數值化方法,把特徵的離散值映射到連續型的數值空間,這其中有兩種方法,一是Embedding方法,相關文章比較多你們能夠搜一下,另一個是稀疏樣本轉稠密向量表示,還有一個方法是CNN方法,就是把文本轉爲圖像,經過CNN的方法來進行學習。
文本轉圖像的方式就是把樣本的文本當圖像處理,好比1-of-n encoding方案,就是把文本的one hot表示矩陣當作圖來處理,或者第二個方案embedding的方式,把文本word的embedding向量組成矩陣,能夠看一下第二個圖,每一個單詞都表示成向量,這個向量多是經過其餘方式渠道來的也能夠是隨機初始化的,通過卷積,再進行pooling等步驟,就是CNN的文本轉圖像的方法。
CNN方法的效果仍是比較明顯的,離線評估指標有明顯的提高,但問題是,在線開銷很是大,評估下來大概對比淺層模型有10倍的機器開銷。在線須要作大量的優化,總體的性價比會很是低。
看圖,訓練樣本label 以後,有四個特徵,C1是特徵類,V1是特徵取值,C1好比說用戶的地域,V1就是具體的城市,好比北京或者上海。這個向量化以後是一個巨大的稀疏向量。稀疏樣本轉稠密表示的方法思路是,每個特徵類做爲稠密向量的一維,而後把特徵類的特徵取值映射到連續值。特徵取值能夠是後驗點擊率,或者直接用以前LR預先訓練的特徵權重。
總結一下,用LR模型做爲特徵連續值的方法,咱們叫LR to DNN的方法,步驟是把LR樣本先訓練獲得LR模型,把LR樣本用LR model轉換,把原來離散的向量變成連續值,獲得連續的稠密向量,DNN就可以處理了,把DNN樣本進行訓練,獲得DNN model。這個方法的效果如何呢?
效果對比以前淺層的FM模型,AUC漲了2%。問題就是權重很是不穩定,由於第一層的輸入來源是LR model,實際上跟DNN model是分開訓練的,因此LR跟DNN之間的權重關係會很是不穩定,LR一波動,DNN層的效果就會跟着波動。另外一個問題是,當我作進一步優化時,好比加特徵,基本上是不可能的,緣由就是在LR層加一個特徵,要先驗證LR模型的效果,上線落日誌,落日誌以後再訓練DNN model,整個週期會很是長,爲了解決LR和DNN分開訓練的問題,咱們用了一個新算法:
DenseDNN with LR embedding,把LR和DNN合併到同一個網絡裏進行訓練。你們看如上的示意圖,第一層仍是LR樣本,就是0/1表示的巨大向量,通過embedding的過程,把離散值映射成連續值,通過全鏈接而後到目標,訓練時這個梯度還會反向傳播到embedding,LR和DNN的參數會同步更新。
該方法的問題在於第二步跟第三步之間其實是全鏈接,因此輸入的向量大小實際上不能太大,只能到million級別。假如是1000萬到100維的全鏈接,整個空間能夠達到10億的參數規模,這個訓練基本是不可行的。
咱們提出了進一步優化思路,叫SparseDNN with LR embedding,具體作法就是在embedding後追加pooling,仔細看這個圖跟前面一張圖很接近,惟一的區別就是增長了pooling層。pooling其實是很快的,咱們基於pooling的思想把相同類別的特徵合併,到這層後,10億可能就降了幾百維的規模。 這個算法,實際上跟前面的LR to DNN算法是徹底兼容的, LR to DNN的LR層其實是特徵值的累加操做。SparseDNN整個算法包括LR層,在一個網絡裏訓練,而且支持的參數規模更大了,能夠達到billion的級別,解決了稀疏性特徵的問題。
對比Lr to Dnn,SparseDNN AUC累計提高2%到3%,並且無權重波動,系統穩定;Training together,無各類穿越問題;此外,One model統一結構,系統簡單,更易繼續優化擴展,離散特徵和連續特徵都能接入到一個網絡中,咱們還歸入了圖像的embedding,行爲的embedding接入。
咱們研究了不少開源的框架,包括caffe,torch,petuum,DMTK,tensorflow等等,之因此不使用開源框架,是由於開源框架針對咱們的應用存在一些問題,咱們有10億的稀疏特徵,150億樣本,網絡通信徹底支撐不住;多機支持上,GPU不能解決IO負載大的問題,另外,開源系統都是針對圖像和語音領域,參數規模小,廣泛採用的AllReduce方案,模型全量同步,每次模型分發都對全部結點進行分發,因此一會兒就被打滿了,通信開銷很是大。還有,對稀疏性支持,大規模稀疏矩陣運算也不能很好的支持。
因此,咱們基於開源框架,自研了分佈式訓練系統,Theano+ParameterServer架構,儘可能複用現有的開源框架,咱們深度定製了Theano以支持大規模稀疏矩陣運算,ParameterServer做爲參數交換機制。在系統性能方面,10億稀疏特徵,5層神經網絡,150億樣本,4小時就能夠完成訓練。最後的系統,就是這樣的效果。 今天的分享到此結束,謝謝你們!web