【恩墨學院】深度學習在美團點評推薦平臺排序中的運用

恩墨學院發表於2018-04-19

潘暉


美團點評作為國內最大的生活服務平臺,隨著業務的飛速發展,美團點評的使用者和商戶數在快速增長。在這樣的背景下,透過對推薦演算法的最佳化,打造一個高精準性、高豐富度且讓使用者感到欣喜的推薦系統成為重中之重。為了達到這個目的,我們在不停的嘗試將新的演算法、新的技術進引入到現有的框架中。


本文由美團點評技術團隊微信公眾號授權轉發。


引言



自2012年ImageNet大賽技驚四座後,深度學習已經成為近年來機器學習和人工智慧領域中關注度最高的技術。在深度學習出現之前,人們藉助SIFT、HOG等演算法提取具有良好區分性的特徵,再結合SVM等機器學習演算法進行影像識別。然而SIFT這類演算法提取的特徵是有侷限性的,導致當時比賽的最好結果的錯誤率也在26%以上。卷積神經網路(CNN)的首次亮相就將錯誤率一下由26%降低到15%,同年微軟團隊釋出的論文中顯示,透過深度學習可以將ImageNet 2012資料集的錯誤率降到4.94%。


隨後的幾年,深度學習在多個應用領域都取得了令人矚目的進展,如語音識別、影像識別、自然語言處理等。鑑於深度學習的潛力,各大網際網路公司也紛紛投入資源開展科研與運用。因為人們意識到,在大資料時代,更加複雜且強大的深度模型,能深刻揭示海量資料裡所承載的複雜而豐富的資訊,並對未來或未知事件做更精準的預測。


美團點評作為一直致力於站在科技前沿的網際網路公司,也在深度學習方面進行了一些探索,其中在自然語言處理領域,我們將深度學習技術應用於文字分析、語義匹配、搜尋引擎的排序模型等;在計算機視覺領域,我們將其應用於文字識別、影像分類、影像質量排序等。本文就是筆者所在團隊,在借鑑了Google在2016年提出的Wide & Deep Learning 的思想上,基於自身業務的一些特點,在大眾點評推薦系統上做出的一些思考和取得的實踐經驗。

 

點評推薦系統介紹



與大部分的推薦系統不同,美團點評的場景由於自身業務的多樣性,使得我們很難準確捕獲使用者的興趣點或使用者的實時意圖。而且我們推薦的場景也會隨著使用者興趣、地點、環境、時間等變化而變化。點評推薦系統主要面臨以下幾點挑戰:


·         業務形態多樣性:除了推薦商戶外,我們還根據不同的場景,進行實時判斷,從而推出不同形態的業務,如團單、酒店、景點、霸王餐等。

·         使用者消費場景多樣性:使用者可以選擇在家消費:外賣,到店消費:團單、閃惠,或者差旅消費:預定酒店等。


針對上述問題,我們定製了一套完善的推薦系統框架,包括基於機器學習的多選品召回與排序策略,以及從海量大資料的離線計算到高併發線上服務的推薦引擎。推薦系統的策略主要分為召回和排序兩個過程,召回主要負責生成推薦的候選集,排序負責將多個演算法策略的結果進行個性化排序。


 召回層 :我們透過使用者行為、場景等進行實時判斷,透過多個召回策略召回不同候選集。再對召回的候選集進行融合。候選集融合和過濾層有兩個功能,一是提高推薦策略的覆蓋度和精度;另外還要承擔一定的過濾職責,從產品、運營的角度制定一些人工規則,過濾掉不符合條件的Item。下面是一些我們常用到的召回策略:


·         User-Based 協同過濾:找出與當前User X最相似的N個User,並根據N個User對某Item的打分估計X對該Item的打分。在相似度演算法方面,我們採用了Jaccard Similarity:


 Oracle 實戰

·         Model-Based 協同過濾:用一組隱含因子來聯絡使用者和商品。其中每個使用者、每個商品都用一個向量來表示,使用者u對商品i的評價透過計算這兩個向量的內積得到。演算法的關鍵在於根據已知的使用者對商品的行為資料來估計使用者和商品的隱因子向量。

·         Item-Based 協同過濾:我們先用word2vec對每個Item取其隱含空間的向量,然後用Cosine Similarity計算使用者u用過的每一個Item與未用過Item i之間的相似性。最後對Top N的結果進行召回。

·         Query-Based:是根據Query中包含的實時資訊(如地理位置資訊、WiFi到店、關鍵詞搜尋、導航搜尋等)對使用者的意圖進行抽象,從而觸發的策略。

·         Location-Based:移動裝置的位置是經常發生變化的,不同的地理位置反映了不同的使用者場景,可以在具體的業務中充分利用。在推薦的候選集召回中,我們也會根據使用者的實時地理位置、工作地、居住地等地理位置觸發相應的策略。


 排序層 :每類召回策略都會召回一定的結果,這些結果去重後需要統一做排序。點評推薦排序的框架大致可以分為三塊:


·         離線計算層:離線計算層主要包含了演算法集合、演算法引擎,負責資料的整合、特徵的提取、模型的訓練、以及線下的評估。

·         近線實時資料流:主要是對不同的使用者流實施訂閱、行為預測,並利用各種資料處理工具對原始日誌進行清洗,處理成格式化的資料,落地到不同型別的儲存系統中,供下游的演算法和模型使用。

·         線上實時打分:根據使用者所處的場景,提取出相對應的特徵,並利用多種機器學習演算法,對多策略召回的結果進行融合和打分重排。


具體的推薦流程圖如下:


Oracle 實戰


從整體框架的角度看,當使用者每次請求時,系統就會將當前請求的資料寫入到日誌當中,利用各種資料處理工具對原始日誌進行清洗,格式化,落地到不同型別的儲存系統中。在訓練時,我們利用特徵工程,從處理過後的資料集中選出訓練、測試樣本集,並藉此進行線下模型的訓練和預估。我們採用多種機器學習演算法,並透過線下AUC、NDCG、Precision等指標來評估他們的表現。線下模型經過訓練和評估後,如果在測試集有比較明顯的提高,會將其上線進行線上AB測試。同時,我們也有多種維度的報表對模型進行資料上的支援。


深度學習在點評推薦排序系統中應用



對於不同召回策略所產生的候選集,如果只是根據演算法的歷史效果決定演算法產生的Item的位置顯得有些簡單粗暴,同時,在每個演算法的內部,不同Item的順序也只是簡單的由一個或者幾個因素決定,這些排序的方法只能用於第一步的初選過程,最終的排序結果需要藉助機器學習的方法,使用相關的排序模型,綜合多方面的因素來確定。

 


1現有排序框架介紹



Oracle 實戰


到目前為止,點評推薦排序系統嘗試了多種線性、非線性、混合模型等機器學習方法,如邏輯迴歸、GBDT、GBDT+LR等。透過線上實驗發現,相較於線性模型,傳統的非線性模型如GBDT,並不一定能線上上AB測試環節對CTR預估有比較明顯的提高。而線性模型如邏輯迴歸,因為自身非線性表現能力比較弱,無法對真實生活中的非線性場景進行區分,會經常對歷史資料中出現過的資料過度記憶。下圖就是線性模型根據記憶將一些歷史點選過的單子排在前面:


Oracle 實戰


從圖中我們可以看到,系統在非常靠前的位置推薦了一些遠距離的商戶,因為這些商戶曾經被使用者點過,其本身點選率較高,那麼就很容易被系統再次推薦出來。但這種推薦並沒有結合當前場景給使用者推薦出一些有新穎性的Item。為了解決這個問題,就需要考慮更多、更復雜的特徵,比如組合特徵來替代簡單的“距離”特徵。怎麼去定義、組合特徵,這個過程成本很高,並且更多地依賴於人工經驗。


而深度神經網路,可以透過低維密集的特徵,學習到以前沒出現過的一些Item和特徵之間的關係,並且相比於線性模型大幅降低了對於特徵工程的需求,從而吸引我們進行探索研究。


在實際的運用當中,我們根據Google在2016年提出的Wide & Deep Learning模型,並結合自身業務的需求與特點,將線性模型元件和深度神經網路進行融合,形成了在一個模型中實現記憶和泛化的寬深度學習框架。在接下來的章節中,將會討論如何進行樣本篩選、特徵處理、深度學習演算法實現等。

 


2樣本的篩選



資料及特徵,是整個機器學習中最重要的兩個環節,因為其本身就決定了整個模型的上限。點評推薦由於其自身多業務(包含外賣、商戶、團購、酒旅等)、多場景(使用者到店、使用者在家、異地請求等)的特色,導致我們的樣本集相比於其他產品更多元化。我們的目標是預測使用者的點選行為。有點選的為正樣本,無點選的為負樣本,同時,在訓練時對於購買過的樣本進行一定程度的加權。而且,為了防止過擬合/欠擬合,我們將正負樣本的比例控制在10%。最後,我們還要對訓練樣本進行清洗,去除掉Noise樣本(特徵值近似或相同的情況下,分別對應正負兩種樣本)。


同時,推薦業務作為整個App首頁核心模組,對於新穎性以及多樣性的需求是很高的。在點評推薦系統的實現中,首先要確定應用場景的資料,美團點評的資料可以分為以下幾類:


·         使用者畫像:性別、常駐地、價格偏好、Item偏好等。

·         Item畫像:包含了商戶、外賣、團單等多種Item。其中商戶特徵包括:商戶價格、商戶好評數、商戶地理位置等。外賣特徵包括:外賣平均價格、外賣配送時間、外賣銷量等。團單特徵包括:團單適用人數、團單訪購率等。

·         場景畫像:使用者當前所在地、時間、定位附近商圈、基於使用者的上下文場景資訊等。



3深度學習中的特徵處理



機器學習的另一個核心領域就是特徵工程,包括資料預處理,特徵提取,特徵選擇等。


1.  特徵提取:從原始資料出發構造新的特徵的過程。方法包括計算各種簡單統計量、主成分分析、無監督聚類,在構造方法確定後,可以將其變成一個自動化的資料處理流程,但是特徵構造過程的核心還是手動的。

2.  特徵選擇:從眾多特徵中挑選出少許有用特徵。與學習目標不相關的特徵和冗餘特徵需要被剔除,如果計算資源不足或者對模型的複雜性有限制的話,還需要選擇丟棄一些不重要的特徵。特徵選擇方法常用的有以下幾種:


Oracle 實戰


特徵選擇開銷大、特徵構造成本高,在推薦業務開展的初期,我們對於這方面的感覺還不強烈。但是隨著業務的發展,對點選率預估模型的要求越來越高,特徵工程的巨大投入對於效果的提升已經不能滿足我們需求,於是我們想尋求一種新的解決辦法。


深度學習能自動對輸入的低階特徵進行組合、變換,得到高階特徵的特性,也促使我們轉向深度學習進行探索。深度學習“自動提取特徵”的優點,在不同的領域有著不同的表現。例如對於影像處理,畫素點可以作為低階特徵輸入,透過卷積層自動得到的高階特徵有比較好的效果。在自然語言處理方面,有些語義並不來自資料,而是來自人們的先驗知識,利用先驗知識構造的特徵是很有幫助的。


因此,我們希望藉助於深度學習來節約特徵工程中的巨大投入,更多地讓點選率預估模型和各輔助模型自動完成特徵構造和特徵選擇的工作,並始終和業務目標保持一致。下面是一些我們在深度學習中用到的特徵處理方式:

 

組合特徵


對於特徵的處理,我們沿用了目前業內通用的辦法,比如歸一化、標準化、離散化等。但值得一提的是,我們將很多組合特徵引入到模型訓練中。因為不同特徵之間的組合是非常有效的,並有很好的可解釋性,比如我們將"商戶是否在使用者常駐地"、"使用者是否在常駐地"以及"商戶與使用者當前距離"進行組合,再將資料進行離散化,透過組合特徵,我們可以很好的抓住離散特徵中的內在聯絡,為線性模型增加更多的非線性表述。組合特徵的定義為:


Oracle 實戰


歸一化


歸一化是依照特徵矩陣的行處理資料,其目的在於樣本向量在點乘運算或其他核函式計算相似性時,擁有統一的標準,也就是說都轉化為“單位向量”。在實際工程中,我們運用了兩種歸一化方法:


Min-Max:


Oracle 實戰


Min是這個特徵的最小值,Max是這個特徵的最大值。


Cumulative Distribution Function(CDF):CDF也稱為累積分佈函式,數學意義是表示隨機變數小於或等於其某一個取值x的機率。其公式為:


Oracle 實戰


在我們線下實驗中,連續特徵在經過CDF的處理後,相比於Min-Max,CDF的線下AUC提高不足0.1%。我們猜想是因為有些連續特徵並不滿足在(0,1)上均勻分佈的隨機函式,CDF在這種情況下,不如Min-Max來的直觀有效,所以我們線上上採用了Min-Max方法。


快速聚合


為了讓模型更快的聚合,並且賦予網路更好的表現形式,我們對原始的每一個連續特徵設定了它的super-liner和sub-liner,即對於每個特徵x,衍生出2個子特徵:

Oracle 實戰

實驗結果表示,透過對每一個連續變數引入2個子特徵,會提高線下AUC的表現,但考慮到線上計算量的問題,並沒有線上上實驗中新增這2個子特徵。



4最佳化器(Optimizer)的選擇



在深度學習中,選擇合適的最佳化器不僅會加速整個神經網路訓練過程,並且會避免在訓練的過程中困到鞍點。文中會結合自己的使用情況,對使用過的最佳化器提出一些自己的理解。

 

Stochastic Gradient Descent (SGD)


SGD 是一種常見的最佳化方法,即每次迭代計算Mini-Batch的梯度,然後對引數進行更新。其公式為:

Oracle 實戰

缺點是對於損失方程有比較嚴重的振盪,並且容易收斂到區域性最小值。

 

Momentum


為了克服SGD振盪比較嚴重的問題,Momentum將物理中的動量概念引入到SGD當中,透過積累之前的動量來替代梯度。即:

Oracle 實戰 Oracle 實戰

相較於SGD,Momentum就相當於在從山坡上不停的向下走,當沒有阻力的話,它的動量會越來越大,但是如果遇到了阻力,速度就會變小。也就是說,在訓練的時候,在梯度方向不變的維度上,訓練速度變快,梯度方向有所改變的維度上,更新速度變慢,這樣就可以加快收斂並減小振盪。


Adagrad


相較於SGD,Adagrad相當於對學習率多加了一個約束,即:

Oracle 實戰

Adagrad的優點是,在訓練初期,由於gt較小,所以約束項能夠加速訓練。而在後期,隨著gt的變大,會導致分母不斷變大,最終訓練提前結束。

 

Adam


Adam是一個結合了Momentum與Adagrad的產物,它既考慮到了利用動量項來加速訓練過程,又考慮到對於學習率的約束。利用梯度的一階矩估計和二階矩估計動態調整每個引數的學習率。Adam的優點主要在於經過偏置校正後,每一次迭代學習率都有個確定範圍,使得引數比較平穩。其公式為:

Oracle 實戰

其中:

Oracle 實戰

小結


透過實踐證明,Adam結合了Adagrad善於處理稀疏梯度和Momentum善於處理非平穩目標的優點,相較於其他幾種最佳化器效果更好。同時,我們也注意到很多論文中都會引用SGD,Adagrad作為最佳化函式。但相較於其他方法,在實踐中,SGD需要更多的訓練時間以及可能會被困到鞍點的缺點,都制約了它在很多真實資料上的表現。



5損失函式的選擇



深度學習同樣有許多損失函式可供選擇,如平方差函式(Mean Squared Error),絕對平方差函式(Mean Absolute Error),交叉熵函式(Cross Entropy)等。而在理論與實踐中,我們發現Cross Entropy相比於線上性模型中表現比較好的平方差函式有著比較明顯的優勢。其主要原因是在深度學習透過反向傳遞更新W和b的同時,啟用函式Sigmoid的導數在取大部分值時會落入左、右兩個飽和區間,造成引數的更新非常緩慢。具體的推導公式如下:


一般的MSE被定義為:

Oracle 實戰


其中y是我們期望的輸出,a為神經元的實際輸出a=σ(Wx+b)。由於深度學習反向傳遞的機制,權值W與偏移量b的修正公式被定義為:

Oracle 實戰

因為Sigmoid函式的性質,導致σ′(z)在z取大部分值時會造成飽和現象。


Cross Entropy的公式為:


Oracle 實戰


如果有多個樣本,則整個樣本集的平均交叉熵為:


Oracle 實戰


其中n表示樣本編號,i表示類別編號。 如果用於Logistic分類,則上式可以簡化成:


Oracle 實戰


與平方損失函式相比,交叉熵函式有個非常好的特質:


Oracle 實戰


可以看到,由於沒有了σ′這一項,這樣一來在更新w和b就不會受到飽和性的影響。當誤差大的時候,權重更新就快,當誤差小的時候,權重的更新就慢。



6寬深度模型框架



在實驗初期,我們只將單獨的5層DNN模型與線性模型進行了比對。透過線下/線上AUC對比,我們發現單純的DNN模型對於CTR的提升並不明顯。而且單獨的DNN模型本身也有一些瓶頸,例如,當使用者本身是非活躍使用者時,由於其自身與Item之間的互動比較少,導致得到的特徵向量會非常稀疏,而深度學習模型在處理這種情況時有可能會過度的泛化,導致推薦與該使用者本身相關較少的Item。因此,我們將廣泛線性模型與深度學習模型相結合,同時又包含了一些組合特徵,以便更好的抓住Item-Feature-Label三者之間的共性關係。我們希望在寬深度模型中的寬線性部分可以利用交叉特徵去有效地記憶稀疏特徵之間的相互作用,而在深層神經網路部分透過挖掘特徵之間的相互作用,提升模型之間的泛化能力。下圖就是我們的寬深度學習模型框架:


Oracle 實戰


在離線階段,我們採用基於Theano、Tensorflow的Keras作為模型引擎。在訓練時,我們分別對樣本資料進行清洗和提權。在特徵方面,對於連續特徵,我們用Min-Max方法做歸一化。在交叉特徵方面,我們結合業務需求,提煉出多個在業務場景意義比較重大的交叉特徵。在模型方面我們用Adam做為最佳化器,用Cross Entropy做為損失函式。在訓練期間,與Wide & Deep Learning論文中不同之處在於,我們將組合特徵作為輸入層分別輸入到對應的Deep元件和Wide元件中。然後在Deep部分將全部輸入資料送到3個ReLU層,在最後透過Sigmoid層進行打分。我們的Wide&Deep模型在超過7000萬個訓練資料中進行了訓練,並用超過3000萬的測試資料進行線下模型預估。我們的Batch-Size設為50000,Epoch設為20。



 深度學習線下/線上效果



在實驗階段,分別將深度學習、寬深度學習以及邏輯迴歸做了一系列的對比,將表現比較好的寬深度模型放線上上與原本的Base模型進行AB實驗。從結果上來看,寬深度學習模型線上下/線上都有比較好的效果。具體結論如下:


Oracle 實戰


隨著隱藏層寬度的增加,線下訓練的效果也會隨著逐步的提升。但考慮到線上實時預測的效能問題,我們目前採用256->128->64的框架結構。


Oracle 實戰


下圖是包含了組合特徵的寬深度模型與Base模型的線上實驗效果對比圖:


Oracle 實戰


從線上效果來看,寬深度學習模型一定程度上解決了歷史點選過的團單在遠距離會被召回的問題。同時,寬深度模型也會根據當前的場景推薦一些有新穎性的Item。


Oracle 實戰

 總結



排序是一個非常經典的機器學習問題,實現模型的記憶和泛化功能是推薦系統中的一個挑戰。記憶可以被定義為在推薦中將歷史資料重現,而泛化是基於資料相關性的傳遞性,探索過去從未或很少發生的Item。寬深度模型中的寬線性部分可以利用交叉特徵去有效地記憶稀疏特徵之間的相互作用,而深層神經網路可以透過挖掘特徵之間的相互作用,提升模型之間的泛化能力。線上實驗結果表明,寬深度模型對CTR有比較明顯的提高。同時,我們也在嘗試將模型進行一系列的演化:


1.  將RNN融入到現有框架。現有的Deep & Wide模型只是將DNN與線性模型做融合,並沒有對時間序列上的變化進行建模。樣本出現的時間順序對於推薦排序同樣重要,比如當一個使用者按照時間分別瀏覽了一些異地酒店、景點時,使用者再次再請求該異地城市,就應該推出該景點周圍的美食。

2.  引入強化學習,讓模型可以根據使用者所處的場景,動態地推薦內容。


深度學習和邏輯迴歸的融合使得我們可以兼得二者的優點,也為進一步的點選率預估模型設計和最佳化打下了堅實的基礎。



 參考文獻 



1.  H. Cheng, L. Koc, J. Harmsen etc, Wide & Deep Learning for Recommender Systems, Published by ACM 2016 Article, 

2.  P. Covington, J. Adams, E. Sargin, Deep Neural Networks for YouTube Recommendations, RecSys '16 Proceedings of the 10th ACM Conference on Recommender Systems,

3.  H. Wang, N. Wang, D. Yeung, Collaborative Deep Learning for Recommender Systems.







來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28530558/viewspace-2153099/,如需轉載,請註明出處,否則將追究法律責任。

相關文章