搜索是大衆點評App上用戶進行信息查找的最大入口,是鏈接用戶和信息的重要紐帶。而用戶搜索的方式和場景很是多樣,而且因爲對接業務種類多,流量差別大,爲大衆點評搜索(下文簡稱點評搜索)帶來了巨大的挑戰,具體體如今以下幾個方面:html
上述的各項特性,疊加上時間、空間、場景等維度,使得點評搜索面臨比通用搜索引擎更加獨特的挑戰。而解決這些挑戰的方法,就須要升級NLP(Natural Language Processing,天然語言處理)技術,進行深度查詢理解以及深度評價分析,並依賴知識圖譜技術和深度學習技術對搜索架構進行總體升級。在美團NLP中心以及大衆點評搜索智能中心兩個團隊的緊密合做之下,通過短短半年時間,點評搜索核心KPI在高位基礎上仍然大幅提高,是過去一年半漲幅的六倍之多,提早半年完成整年目標。算法
美團NLP中心正在構建全世界最大的餐飲娛樂知識圖譜——美團大腦(相關信息請參見《美團大腦:知識圖譜的建模方法及其應用》)。它充分挖掘關聯各個場景數據,用NLP技術讓機器「閱讀」用戶公開評論,理解用戶在菜品、價格、服務、環境等方面的喜愛,構建人、店、商品、場景之間的知識關聯,從而造成一個「知識大腦」[1]。經過將知識圖譜信息加入到搜索各個流程中,咱們對點評搜索的總體架構進行了升級重塑,圖1爲點評搜索基於知識圖譜搭建的5層搜索架構。本篇文章是「美團大腦」系列文章第二篇(系列首篇文章請參見《美團餐飲娛樂知識圖譜——美團大腦揭祕》),主要介紹點評搜索5層架構中核心排序層的演變過程,文章主要分爲以下3個部分:服務器
搜索排序問題在機器學習領域有一個單獨的分支,Learning to Rank(L2R)。主要分類以下:網絡
在排序模型方面,點評搜索也經歷了業界比較廣泛的迭代過程:從早期的線性模型LR,到引入自動二階交叉特徵的FM和FFM,到非線性樹模型GBDT和GBDT+LR,到最近全面遷移至大規模深度學習排序模型。下面先簡單介紹下傳統機器學習模型(LR、FM、GBDT)的應用和優缺點,而後詳細介紹深度模型的探索實踐過程。架構
隨着業務的發展,在傳統模型上取得指標收益變得愈發困難。同時業務的複雜性要求咱們引入海量用戶歷史數據,超大規模知識圖譜特徵等多維度信息源,以實現精準個性化的排序。所以咱們從2018年下半年開始,全力推動L2核心排序層的主模型遷移至深度學習排序模型。深度模型優點體如今以下幾個方面:框架
下圖是咱們基於Google提出的Wide&Deep模型搭建的網絡結構[2]。其中Wide部分輸入的是LR、GBDT階段經常使用的一些細粒度統計特徵。經過較長週期統計的高頻行爲特徵,可以提供很好的記憶能力。Deep部分經過深層的神經網絡學習Low-Order、高緯度稀疏的Categorical型特徵,擬合樣本中的長尾部分,發現新的特徵組合,提升模型的泛化能力。同時對於文本、頭圖等傳統機器學習模型難以刻畫的特徵,咱們能夠經過End-to-End的方式,利用相應的子網絡模型進行預處理表示,而後進行融合學習。機器學習
深度學習的橫空出世,將算法工程師從不少人工挖掘和組合特徵的事情中解放出來。甚至有一種論調,專作特徵工程的算法工程師可能面臨着失業的風險。可是深度學習的自動特徵學習目前主要集中體如今CV領域,CV領域的特徵數據是圖片的像素點——稠密的低階特徵,深度學習經過卷積層這個強力工具,能夠自動對低階特徵進行組合和變換,相比以前人工定義的圖像特徵從效果上來講確實更加顯著。在NLP領域由於Transformer的出現,在自動特徵挖掘上也有了長足的進步,BERT利用Transformer在多個NLP Task中取得了State-of-The-Art的效果。分佈式
可是對於CTR預估和排序學習的領域,目前深度學習還沒有在自動特徵挖掘上對人工特徵工程造成碾壓之勢,所以人工特徵工程依然很重要。固然,深度學習在特徵工程上與傳統模型的特徵工程也存在着一些區別,咱們的工做主要集中在以下幾個方面。ide
特徵離散化:工業界通常不多直接使用連續值做爲特徵,而是將特徵離散化後再輸入到模型中。一方面由於離散化特徵對於異常值具備更好的魯棒性,其次能夠爲特徵引入非線性的能力。而且,離散化能夠更好的進行Embedding,咱們主要使用以下兩種離散化方法:函數
特徵組合:基於業務場景對基礎特徵進行組合,造成更豐富的行爲表徵,爲模型提供先驗信息,可加速模型的收斂速度。典型示例以下:
深度學習最大的魅力在於其強大的特徵表徵能力,在點評搜索場景下,咱們有海量的用戶行爲數據,有豐富的商戶UGC信息以及美團大腦提供的多維度細粒度標籤數據。咱們利用深度學習將這些信息Embedding到多個向量空間中,經過Embedding去表徵用戶的個性化偏好和商戶的精準畫像。同時向量化的Embedding也便於深度模型進一步的泛化、組合以及進行類似度的計算。
用戶行爲序列(搜索詞序列、點擊商戶序列、篩選行爲序列)包含了用戶豐富的偏好信息。例如用戶篩選了「距離優先」時,咱們可以知道當前用戶頗有多是一個即時消費的場景,而且對距離較爲敏感。行爲序列特徵通常有以下圖所示的三種接入方式:
同時,爲了突顯用戶長期偏好和短時間偏好對於排序的不一樣影響,咱們按照時間維度對行爲序列進行了劃分:Session、半小時、一天、一週等粒度,也在線上取得了收益。
一種更常見的刻畫用戶偏好的方式,是直接將用戶ID通過Embedding後做爲特徵接入到模型中,可是最後上線的效果卻不盡如人意。經過分析用戶的行爲數據,咱們發現至關一部分用戶ID的行爲數據較爲稀疏,致使用戶ID的Embedding沒有充分收斂,未能充分刻畫用戶的偏好信息。
Airbnb發表在KDD 2018上的文章爲這種問題提供了一種解決思路[9]——利用用戶基礎畫像和行爲數據對用戶ID進行聚類。Airbnb的主要場景是爲旅遊用戶提供民宿短租服務,通常用戶一年旅遊的次數在1-2次之間,所以Airbnb的用戶行爲數據相比點評搜索會更爲稀疏一些。
如上圖所示,將用戶畫像特徵和行爲特徵進行離散分桶,拼接特徵名和所屬桶號,獲得的聚類ID爲:US_lt1_pn3_pg3_r3_5s4_c2_b1_bd2_bt2_nu3。
咱們也採起了相似Airbnb的方案,稀疏性的問題獲得了很好的解決,而且這樣作還得到了一些額外的收益。點評搜索做爲一個本地化的生活信息服務平臺,大部分用戶的行爲都集中本身的常駐地,致使用戶到達一個新地方時,排序個性化明顯不足。經過這種聚類的方式,將異地有相同行爲的用戶彙集在一塊兒,也能解決一部分跨站的個性化問題。
商戶Embedding除了能夠直接將商戶ID加入模型中以外,美團大腦也利用深度學習技術對UGC進行大量挖掘,對商家的口味、特點等細粒度情感進行充分刻畫,例以下圖所示的「好停車」、「菜品精緻」、「願意再次光顧」等標籤。
這些信息與單純的商戶星級、點評數相比,刻畫的角度更多,粒度也更細。咱們將這些標籤也進行Embedding並輸入到模型中:
在咱們的深度學習排序模型中,除了Embedding特徵,也存在大量Query、Shop和用戶維度的強記憶特徵,可以很快收斂。而Embedding特徵是更爲稀疏的弱特徵,收斂速度較慢,爲了加速Embedding特徵的收斂,咱們嘗試了以下幾種方案:
預訓練:利用多類模型對稀疏Embedding特徵進行預訓練,而後進入模型進行微調:
圖片在搜索結果頁中佔據了很大的展現面積,圖片質量的好壞會直接影響用戶的體驗和點擊,而點評商戶首圖來自於商戶和用戶上傳的圖片,質量良莠不齊。所以,圖片特徵也是排序模型中較爲重要的一類。目前點評搜索主要用瞭如下幾類圖片特徵:
一般模型的預測目標與業務指標總會存在一些Gap。若是模型的預測目標越貼近業務目標,越能保證模型優化的同時業務指標也可以有相應的提高;反之則會出現模型離線指標提高,但線上關鍵業務指標提高不明顯,甚至出現負向的問題。工業屆大部分深度學習排序採用Pointwise的Log Loss做爲損失函數,與搜索業務指標有較大的Gap。體如今以下兩個方面:
基於上述理由,咱們對於深度學習模型的損失函數進行了優化。
爲了讓排序模型的優化目標儘可能貼近搜索業務指標,須要按照Query計算損失,且不一樣位置的樣本具備不一樣的權重。搜索系統經常使用的指標NDCG(Normalized Discounted Cumulative Gain)相較於Log Loss顯然更貼近搜索業務的要求,NDCG計算公式以下:
累加部分爲DCG(Discounted Cumulative Gain)表示按照位置折損的收益,對於Query下的結果列表l,函數G表示對應Doc的相關度分值,一般取指數函數,即G(lj)=2lj-1(lj表示的是相關度水平,如{0,1,2});函數 η 即位置折損,通常採用 η(j)=1/log(j+1),Doc與Query的相關度越高且位置越靠前則DCG值會越大。另外,一般咱們僅關注排序列表頁前k位的效果,Zk 表示 DCG@k 的可能最大值,以此進行歸一化處理後獲得的就是NDCG@k。
問題在於NDCG是一個到處非平滑的函數,直接以它爲目標函數進行優化是不可行的。LambdaRank提供了一種思路:繞過目標函數自己,直接構造一個特殊的梯度,按照梯度的方向修正模型參數,最終能達到擬合NDCG的方法[6]。所以,若是咱們能將該梯度經過深度網絡進行反向傳播,則能訓練一個優化NDCG的深度網絡,該梯度咱們稱之爲Lambda梯度,經過該梯度構造出的深度學習網絡稱之爲LambdaDNN。
要了解Lambda梯度須要引入LambdaRank。LambdaRank模型是經過Pairwise來構造的,一般將同Query下有點擊樣本和無點擊樣本構形成一個樣本Pair。模型的基本假設以下式所示,令Pij爲同一個Query下Doci相比Docj更相關的機率,其中si和sj分別爲Doci和Docj的模型得分:
使用交叉熵爲損失函數,令Sij表示樣本Pair的真實標記,當Doci比Docj更相關時(即Doci有被用戶點擊,而Docj沒有被點擊),有Sij=1,不然爲-1;則損失函數能夠表示爲:
在構造樣本Pair時,咱們能夠始終令i爲更相關的文檔,此時始終有Sij≡1,代入上式並進行求導,則損失函數的梯度爲:
到目前爲止,損失函數的計算過程當中並未考慮樣本所在的位置信息。所以進一步對梯度進行改造,考慮Doci和Docj交換位置時的NDCG值變化,下式即爲前述的Lambda梯度。能夠證實,經過此種方式構造出來的梯度通過迭代更新,最終能夠達到優化NDCG的目的。
Lambda梯度的物理意義以下圖所示。其中藍色表示更相關(用戶點擊過)的文檔,則Lambda梯度更傾向於位置靠上的Doc獲得的提高更大(如紅色箭頭所示)。有了Lambda梯度的計算方法,訓練中咱們利用深度網絡預測同Query下的Doc得分,根據用戶實際點擊Doc的狀況計算Lambda梯度並反向傳播回深度網絡,則能夠獲得一個直接預測NDCG的深度網絡。
咱們利用TensorFlow分佈式框架訓練LambdaDNN模型。如前文所述,Lambda梯度須要對同Query下的樣本進行計算,可是正常狀況下全部的樣本是隨機Shuffle到各個Worker的。所以咱們須要對樣本進行預處理:
因爲每次請求Query召回的Doc數不同,對於可變Size的Query樣本在拉取數據進行訓練時須要注意,TF會自動補齊Mini-Batch內每一個樣本大小一致,致使輸入數據中存在大量無心義的默認值樣本。這裏咱們提供兩點處理方式:
爲了提高訓練效率,咱們與基礎研發平臺數據平臺中心緊密協同,一塊兒探索並驗證了多項優化操做:
總體下來,對於30億左右的樣本量、上億級別的特徵維度,一輪迭代大概在半小時內完成。適當的增長並行計算的資源,能夠達到分鐘級的訓練任務。
NDCG的計算公式中,折損的權重是隨着位置呈指數變化的。然而實際曝光點擊率隨位置變化的曲線與NDCG的理論折損值存在着較大的差別。
對於移動端的場景來講,用戶在下拉滑動列表進行瀏覽時,視覺的焦點會隨着滑屏、翻頁而發生變更。例如用戶翻到第二頁時,每每會從新聚焦,所以,會發現第二頁頭部的曝光點擊率其實是高於第一頁尾部位置的。咱們嘗試了兩種方案去微調NDCG中的指數位置折損:
通過上述對NDCG計算改造訓練出的LambdaDNN模型,相較Base樹模型和Pointwise DNN模型,在業務指標上有了很是顯著的提高。
Lambda梯度除了與DNN網絡相結合外,事實上能夠與絕大部分常見的網絡結構相結合。爲了進一步學習到更多交叉特徵,咱們在LambdaDNN的基礎上分別嘗試了LambdaDeepFM和LambdaDCN網絡;其中DCN網絡是一種加入Cross的並行網絡結構,交叉的網絡每一層的輸出特徵與第一層的原始輸入特徵進行顯性的兩兩交叉,至關於每一層學習特徵交叉的映射去擬合層之間的殘差。
離線的對比實驗代表,Lambda梯度與DCN網絡結合以後充分發揮了DCN網絡的特色,簡潔的多項式交叉設計有效地提高模型的訓練效果。NDCG指標對比效果以下圖所示:
深度學習排序模型雖然給業務指標帶來了大幅度的提高,但因爲深度學習模型的「黑盒屬性」致使了巨大的解釋性成本,也給搜索業務帶來了一些問題:
這些問題都會潛在帶來一些用戶沒法理解的排序結果。咱們須要對深度排序模型清晰地診斷並解釋。
關於機器學習模型的可解釋性研究,業界已經有了一些探索。Lime(Local Interpretable Model-Agnostic Explanations)是其中的一種,以下圖所示:經過對單個樣本的特徵生成擾動產生近鄰樣本,觀察模型的預測行爲。根據這些擾動的數據點距離原始數據的距離分配權重,基於它們學習獲得一個可解釋的模型和預測結果[5]。舉個例子,若是須要解釋一個情感分類模型是如何預測「我討厭這部電影」爲負面情感的,咱們經過丟掉部分詞或者亂序構造一些樣本預測情感,最終會發現,決定「我討厭這部電影」爲負面情感的是由於「討厭」這個詞。
基於Lime解釋器的思想,咱們開發了一套深度模型解釋器工具——雅典娜系統。目前雅典娜系統支持兩種工做模式,Pairwise和Listwise模式:
2018年下半年,點評搜索完成了從樹模型到大規模深度學習排序模型的全面升級。團隊在深度學習特徵工程、模型結構、優化目標以及工程實踐上都進行了一些探索,在覈心指標上取得了較爲顯著的收益。固然,將來依然有很多能夠探索的點。
在特徵層面,大量知識圖譜提供的標籤信息還沒有充分挖掘。從使用方式上看,簡單以文本標籤的形式接入,損失了知識圖譜的結構信息,所以,Graph Embedding也是將來須要嘗試的方向。同時團隊也會利用BERT在Query和商戶文本的深層語義表達上作一些工做。
模型結構層面,目前線上依然以全鏈接的DNN網絡結構爲主,但DNN網絡結構在低秩數據的學習上不如DeepFM和DCN。目前LambdaDeepFM和LambdaDCN在離線上已經取得了收益,將來會在網絡結構上作進一步優化。
在模型優化目標上,Lambda Loss計算損失的時候,只會考慮Query內部有點擊和無點擊的樣本對,大量無點擊的Query被丟棄,同時,同一個用戶短期內在不一樣Query下的行爲也包含着一些信息能夠利用。所以,目前團隊正在探索綜合考慮Log Loss和Lambda Loss的模型,經過Multi-Task和按照不一樣維度Shuffle樣本讓模型充分學習,目前咱們已經在線下取得了一些收益。
最後,近期Google開源的TF Ranking提出的Groupwise模型也對咱們有一些啓發。目前絕大部分的Listwise方法只是體如今模型訓練階段,在打分預測階段依然是Pointwise的,即只會考慮當前商戶相關的特徵,而不會考慮列表上下文的結果,將來咱們也會在這個方向上進行一些探索。