京東電商廣告和推薦的機器學習系統實踐

640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy= 分享內容640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=


大家好,我是來自京東的包勇軍,我今天分享的主題是《京東電商廣告和推薦的機器學習系統實踐》,介紹下我們部門在廣告和推薦系統中應用機器學習算法的實踐經驗,包括淺層模型和深度學習算法的應用,正好也涵蓋了我們這兩年的工作。大綱如下:
640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=
介紹具體工作之前,先跟大家簡單介紹一下我們部門的業務背景。我們是京東數據營銷業務部,主要負責京東的廣告、推薦以及站外引流。包括有京東主站PC端和移動端流量,站外ADX流量以及SEM流量。這些流量接入到我們的系統之後,經過商品和廣告召回,再進行排序,基本所有的推薦系統或廣告系統都是這樣一個流程。

在這裏需要解釋下,今天講的機器學習主要應用在排序階段,主要內容就是機器學習在我們的排序算法中的應用實踐。

我們系統的特點主要有兩個,一是實時在線,二是廣告和推薦的混合系統。這個系統不止是廣告系統,也不止是推薦系統,而是兩者的混合。它對外暴露有實時在線服務接口,目前處理的日請求達到200億次。接下來我們先看看淺層模型時代的工作。
首先講講淺層模型時代機器學習系統的核心問題。
640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=
我總結下來核心問題總共有五個,分別是模型算法,日誌流、訓練系統、特徵系統跟評估。淺層模型算法這塊,相對來說研究的比較透徹,比較固定,我們的分享主要集中在實現層面。算法一般用的比較多的就是lr,因爲廣告和推薦系統的應用場景就是大規模稀疏性特徵建模,所以lr比較適合。
640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=
由於淺層算法變化較少,所以算法的主要優化都集中在特徵上。可能平時看到的以LR爲主要算法的機器學習團隊裏,大部分人都在做人工的特徵挖掘。算法層面,還有一些研究在自動學習組合特徵的算法,比如Fm/ffm,gbdt+lr等,我們用的是FM。

FM的好處就是,可以通過因式分解減少數據稀疏性,從而有效學習特徵組合。原來的模型特徵組合可能是N方的規模。N個特徵,N乘N就是N的平方,通過因式分解可以把每個特徵表示成向量,特徵組合通過特徵向量的點積來完成,整個模型大小就變成了N×K,K是向量大小,但平時使用時要注意資源消耗問題,假如K是8,這個模型可能會膨脹8倍,所以不能單純追求效果,要綜合平衡收益和資源。
640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=
前面講到淺層模型的主要優化方向是特徵,那特徵系統的主要問題是什麼呢?最主要的經常遇到的就是線上線下特徵一致性問題。這就是說,離線試驗模型拿到的樣本跟線上預估模型特徵有很大diff。根據我們之前的經驗,修復這個bug,速度漲了10%,京東廣告部門的點擊率也有了大幅度提升,所以說在業務指標上能帶來數量級的提升。
640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=
淺層模型時代的特徵系統架構演化,通常來說,第一版的業務模塊已經逐漸成熟,已經進入機器學習優化階段。因爲機器學習算法都是離線的,很自然的就會開發一個離線特徵抽取模塊,可以看到一個很明顯的diff,也就是說離線跟在線是不同的代碼,樣本之間有很大不同。
640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=
爲了解決這個問題,我們可能會設計一個通用的library,線上線下同一份代碼,雖然解決了代碼不一致,但實際上問題並沒有真正解決,離線拿到的訓練數據是落下來的日誌,這個日誌和在線數據源實際是不同的,在線是從數據庫或詞典,經過一些複雜的業務邏輯處理,最終落下來的,兩者之間實際上處理過程是不同的,所以線上跟線下數據源還是有很大不同的。
640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=
我們最終的解決方案是,把線上處理完的特徵直接落下來給離線訓練使用,,徹底保證一致性。
640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=
這三種方案介紹完之後,各自的優缺點是什麼呢?第一版是初級階段的選擇,不展開。其實,第二版方案之所以會存在,是因爲第二版的開發迭代效率很高。因爲策略調研都是是離線研究人員驅動,先有離線代碼後有在線代碼,特徵優化可以回溯歷史數據,週期短。至於第三種方案,加一個特徵獲取訓練數據需要上線到生成環境,可能一個累計一個月的時間,才能把數據補充完整,然後進行訓練模型,時間成本會很高。儘管有這樣的問題,但從我們歷史上踩過的很多坑來看,我們還是建議採用第三種方案。用在線代碼推動特徵升級,對開發能力可能有一定要求,雖然犧牲了一些開發效率,但最終能夠保證策略效果。
640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=
接下來,我們講一下淺層模型時代的效果評估,評估大家經常遇到的問題就是評估結論不可信。比如,某一天,算法工程師說,我這個算法升級離線評估漲了很多,於是開始花費大量人力推動工程化上線的工作,但上線之後,確發現業務指標並沒有漲,回頭再看,發現離線的評估數據有問題,或者是評估工具出了問題。所以,我們最終提出的方案是用在線系統評估離線指標,解決線上實現和線下評估脫節的問題,一般來說,大部分團隊可能對評估這塊的規範化不是很重視,經常是一些離線的工具互相拷貝。
640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=
我們的方案叫在線旁路評估系統,第一將在線predictor服務直接作爲離線inference工具,第二將在線日誌流作爲離線評估數據。離線測試模型接入在線predictor集羣,經過各指標的計算,做一個報表呈現。引入該系統之後的架構圖如下所示:
640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=
紅線標註的地方可以看到,評估和在線應用服務都共用一個集羣,precitor集羣,在這之中我們加了proxy作爲服務的接入接口,這個方案的收益如下所示:
640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=
最大的收益就是結論可比可信了,整個迭代效率得到了很大提升,避免了數據diff跟工具bug的干擾。所以,如果某個算法工程師說,現在他的算法效果很好,我們就可以把這個他的離線模型推到我們的評估平臺上,我們可以自動給出所有評估指標,AUC或預估分佈一目瞭然,然後跟基線做對比,好壞就很清楚了。這個旁路評估還解決了大家平時可能不太注意,經常會犯的問題,就是在線實時服務模型中的評估穿越問題。 我跟大家解釋一下穿越問題,一般的模型評估大家通常是把數據拆分,比如分成10份,8份拿來做訓練,一份做validation,另一份拿來做測試。然後我再看一下訓練模型的測試效果,如果效果好,我認爲泛化效果好,但在實時服務模型中,這種評估是有問題的,大家可以看下面的兩張圖:

第一張圖是穿越方式,第二張圖是不穿越的方式。大家可以看到在時間維度上,不穿越是指在時間維度上,把訓練數據跟評估數據完全切割開,原因是在線實時服務模型中,數據變化非常快,所以泛化性要求會更高。比如廣告中的新廣告,或者推薦中的新興趣點,實際上是拿截止昨天的所有歷史數據訓練模型來預估今天的新數據,相當於拿歷史數據預估新數據。假如是這種穿越的評估方式,實際上是拿歷史數據預估歷史數據。所以在線實時服務模型對泛化性要求更高,如果用穿越的方式評估,往往得到的數據會非常不靠譜,就會導致離線效果不錯,上線之後效果很不好,這就是穿越問題。
640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=
講完了評估,來看訓練系統,這部分的相關論文比較多。總結一下,淺層模型訓練系統的核心問題就是,大數據的效率問題。那這個問題怎麼解決,我總結了如下幾個方案:分別是採樣,分佈式訓練,增量算法,Online learning算法。我們用的訓練系統是VW,VW是微軟的一個研發人員開源的分佈式訓練平臺,我們對此進行了升級定製。另外業界目前研究比較多的是Online learning,它的好處在於時效性比較好,因爲原來的假設實際上分佈是靜態的,Online learning的假設分佈實際上是變化的,因爲它是Online的方式,所以相當於state track。我們也在某些產品上線了nline learning算法。那問題是什麼呢?問題是增加了系統複雜度,需要增加了實時計算系統,另外更新頻繁,從架構層面來說,增加了和其他數據流系統的耦合。所以經常遇到的問題就是,某一天業務指標大跌,其他部門可能會找過來說,你這個模型的更新時間點是什麼,你就會被動的捲入到這種很瑣碎的查問題的事情中。而且,特徵跟算法升級非常麻煩,原因是Online learning模型一直在更新,一旦特徵算法升級之後,這種模型結構就會完全變掉,就要重新訓練這個模型。
640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=
再講講多目標優化,剛纔提到的這個系統實際上是廣告和推薦的混合系統。在2014年,我們主要的優化方向是廣告收入,就是eCpm=pCtr*bid,pCtr是通過機器學習進行點擊率預估,到2015年我們的目標就變了。
640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=
我們的目標變成了廣告收入加GMV,除了掙錢以外,我們很重視用戶體驗,也重視對公司貢獻的整體價值。所以RankingFunction就變成了pCtr1*(a*pValue+b*pGmv),這個方案變成了三個模型,系統變得複雜了。多模型方案的問題實際上就是,分目標優化,策略升級不同步。比如pCtr優化以後,評估下來漲了1%,但由於模型跟模型之間不同步,所以上線之後,跟PValue和PGmv一結合,因爲另外兩個沒有優化,所以線上收益可能就變成了千分之一,導致效果非常不顯著。 另一個問題就是點擊後的數據,實際上非常稀疏,所以Gmv預估非常不準。我們採用的One model方案實際上就是多目標優化。
640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=
收入跟GMV一起建模放在一個模型裏,這樣整體架構會非常簡單。保證策略同步,優化一個模型,可以一併優化其他模型。另外,訓練數據會更充分,不但有一跳的標誌,還有二跳的標誌,有點擊有GMV標註,該算法是Pairwise和Pointwise算法的結合,就是Combine regression and rank。可以看一下Loss, Rank Loss保證了不同label的序關係,在rare events場景裏,還能提升regression的效果。Regression Loss擬合絕對值,保持分佈穩定,用於廣告的二價計費。自上線之後,點擊跟GMV就得到了大幅度的提升,而且整體架構非常簡單。
640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=
淺層模型時代講的偏多的是系統實現的工作,雖然是淺層模型,但實際上在深度學習階段,工具還是繼續複用的。從淺層模型過渡到深度學習,大家肯定有過這樣的思考,爲什麼引入深度學習?
640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=
首先LR是線性模型,但它怎麼做非線性建模呢?我們會通過加特徵,或者各種特徵組合的方式來做。通過增加模型維度,把低維線性不可分問題變爲高維可分。一些特徵組合比如FM或GBDT+LR,實際上是一個深度爲2或深度爲3的模型。而我們都知道,在大數據的背景下,DNN實際上是一個更通用的算法,它的工具和研究也會更多。 第二個原因是原來的算法優化更多的是手工方式,主要依賴於人工堆特徵。深度學習實際上是通過算法方式來做,把人工特徵工程變成了Feature Learning的過程,算法優化也由人工驅動變成了數據和算法驅動。這就是引入深度學習兩個最大的收益,那麼在推薦系統或者廣告系統中引入深度學習面臨的問題是什麼?
640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=
第一個就是現有算法如何平滑過渡,我們做了一年多的工作,怎麼把之前的特徵和效果平滑的過渡過來,離散特徵如何建模,其實做推薦的應該都知道,像這種特徵是離散的值,並且規模大到billion級別,DNN算法實際稠密的矩陣預算,向量的大小是有限的,把億級別的向量納入其中進行訓練,工程實現是一個很難的問題。我們用到的稀疏連續離散特徵的建模方法,有如下兩種:
640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=
一是離散特徵數值化方法,把特徵的離散值映射到連續型的數值空間,這其中有兩種方法,一是Embedding方法,相關文章比較多大家可以搜一下,另外一個是稀疏樣本轉稠密向量表示,還有一個方法是CNN方法,就是把文本轉爲圖像,通過CNN的方法來進行學習。
640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=
文本轉圖像的方式就是把樣本的文本當圖像處理,比如1-of-n encoding方案,就是把文本的one hot表示矩陣當做圖來處理,或者第二個方案embedding的方式,把文本word的embedding向量組成矩陣,可以看一下第二個圖,每個單詞都表示成向量,這個向量可能是通過其他方式渠道來的也可以是隨機初始化的,經過卷積,再進行pooling等步驟,就是CNN的文本轉圖像的方法。
640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=
CNN方法的效果還是比較明顯的,離線評估指標有明顯的提升,但問題是,在線開銷非常大,評估下來大概對比淺層模型有10倍的機器開銷。在線需要做大量的優化,整體的性價比會非常低。

看圖,訓練樣本label 之後,有四個特徵,C1是特徵類,V1是特徵取值,C1比如說用戶的地域,V1就是具體的城市,比如北京或者上海。這個向量化之後是一個巨大的稀疏向量。稀疏樣本轉稠密表示的方法思路是,每一個特徵類作爲稠密向量的一維,然後把特徵類的特徵取值映射到連續值。特徵取值可以是後驗點擊率,或者直接用之前LR預先訓練的特徵權重。
640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=
總結一下,用LR模型作爲特徵連續值的方法,我們叫LR to DNN的方法,步驟是把LR樣本先訓練得到LR模型,把LR樣本用LR model轉換,把原來離散的向量變成連續值,得到連續的稠密向量,DNN就能夠處理了,把DNN樣本進行訓練,得到DNN model。這個方法的效果如何呢?
640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=
效果對比之前淺層的FM模型,AUC漲了2%。問題就是權重非常不穩定,因爲第一層的輸入來源是LR model,實際上跟DNN model是分開訓練的,所以LR跟DNN之間的權重關係會非常不穩定,LR一波動,DNN層的效果就會跟着波動。另一個問題是,當我做進一步優化時,比如加特徵,基本上是不可能的,原因就是在LR層加一個特徵,要先驗證LR模型的效果,上線落日誌,落日誌之後再訓練DNN model,整個週期會非常長,爲了解決LR和DNN分開訓練的問題,我們用了一個新算法:
640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=
DenseDNN with LR embedding,把LR和DNN合併到同一個網絡裏進行訓練。大家看如上的示意圖,第一層還是LR樣本,就是0/1表示的巨大向量,經過embedding的過程,把離散值映射成連續值,經過全連接然後到目標,訓練時這個梯度還會反向傳播到embedding,LR和DNN的參數會同步更新。
640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=
該方法的問題在於第二步跟第三步之間實際上是全連接,所以輸入的向量大小實際上不能太大,只能到million級別。假如是1000萬到100維的全連接,整個空間可以達到10億的參數規模,這個訓練基本是不可行的。
我們提出了進一步優化思路,叫SparseDNN with LR embedding,具體做法就是在embedding後追加pooling,仔細看這個圖跟前面一張圖很接近,唯一的區別就是增加了pooling層。pooling實際上是很快的,我們基於pooling的思想把相同類別的特徵合併,到這層後,10億可能就降了幾百維的規模。 這個算法,實際上跟前面的LR to DNN算法是完全兼容的, LR to DNN的LR層實際上是特徵值的累加操作。SparseDNN整個算法包括LR層,在一個網絡裏訓練,並且支持的參數規模更大了,可以達到billion的級別,解決了稀疏性特徵的問題。
640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=
對比Lr to Dnn,SparseDNN AUC累計提升2%到3%,而且無權重波動,系統穩定;Training together,無各種穿越問題;此外,One model統一結構,系統簡單,更易繼續優化擴展,離散特徵和連續特徵都能接入到一個網絡中,我們還納入了圖像的embedding,行爲的embedding接入。
640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=
我們研究了很多開源的框架,包括caffe,torch,petuum,DMTK,tensorflow等等,之所以不使用開源框架,是因爲開源框架針對我們的應用存在一些問題,我們有10億的稀疏特徵,150億樣本,網絡通訊完全支撐不住;多機支持上,GPU不能解決IO負載大的問題,另外,開源系統都是針對圖像和語音領域,參數規模小,普遍採用的AllReduce方案,模型全量同步,每次模型分發都對所有結點進行分發,所以一下子就被打滿了,通訊開銷非常大。還有,對稀疏性支持,大規模稀疏矩陣運算也不能很好的支持。
640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=
所以,我們基於開源框架,自研了分佈式訓練系統,Theano+ParameterServer架構,儘量複用現有的開源框架,我們深度定製了Theano以支持大規模稀疏矩陣運算,ParameterServer作爲參數交換機制。在系統性能方面,10億稀疏特徵,5層神經網絡,150億樣本,4小時就可以完成訓練。最後的系統,就是這樣的效果。 今天的分享到此結束,謝謝大家!


640?wx_fmt=jpeg&tp=webp&wxfrom=5&wx_lazy
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章