1. 程式人生 > >機器學習在高德搜尋建議中的應用優化實踐

機器學習在高德搜尋建議中的應用優化實踐

本文將主要介紹機器學習在高德搜尋建議的具體應用,尤其是在模型優化方面進行的一些嘗試,這些探索和實踐都已歷經驗證,取得了不錯的效果,並且為後來幾年個性化、深度學習、向量索引的應用奠定了基礎。

對搜尋排序模組做重構

搜尋建議(suggest服務)是指:使用者在輸入框輸入query的過程中,為使用者自動補全query或POI(Point of Interest,興趣點,地理資訊系統中可以是商鋪、小區、公交站等地理位置標註資訊),羅列出補全後的所有候選項,並進行智慧排序。

我們希望通過suggest服務:智慧提示,降低使用者的輸入成本。它的特點是:響應快、不承擔複雜query的檢索,可以把它理解為一個簡化版的LBS領域資訊檢索服務。

和通用IR系統一樣,suggest也分為doc(LBS中的doc即為POI)的召回和排序兩個階段。其中,排序階段主要使用query和doc的文字相關性,以及doc本身的特徵(weight、click),進行加權算分排序。

但隨著業務的不斷髮展、特徵規模越來越大,人工調參逐漸困難,基於規則的排序方式已經很難得到滿意的效果。這種情況下,為了解決業務問題,將不得不打上各種補丁,導致程式碼難以維護。

因此,我們決定對排序模組進行重構,Learning to Rank無疑是一個好的選擇。

面臨的挑戰:樣本構造、模型調優

Learning to Rank(LTR)是用機器學習的方法來解決檢索系統中的排序問題。業界比較常用的模型是gbrank,loss方案用的最多的是pair wise,這裡也保持一致。一般應用LTR解決實際問題,最重要的問題之一就是如何獲得樣本。

首先,高德地圖每天的訪問量巨大,這背後隱藏的候選POI更是一個天文數字,想要使用人工標註的方法去獲得樣本明顯不現實。

其次,如果想要使用一些樣本自動構造的方法,比如基於使用者對POI的點選情況構建樣本pair ,也會遇到如下的問題:

•容易出現點選過擬合,以前點選什麼,以後都給什麼結果。
•有時,使用者點選行為也無法衡量真實滿意度。
•suggest前端只展示排序top10結果,更多的結果沒有機會展現給使用者,自然沒有點選。
•部分使用者習慣自己輸入完整query進行搜尋,而不使用搜索建議的補全結果,統計不到這部分使用者的需求。

對於這幾個問題總結起來就是:無點選資料時,建模很迷茫。但就算有某個POI的點選,卻也無法代表使用者實際是滿意的。

最後,在模型學習中,也面臨了特徵稀疏性的挑戰。統計學習的目標是全域性誤差的一個最小化。稀疏特徵由於影響的樣本較少,在全域性上影響不大,常常被模型忽略。但是實際中一些中長尾case的解決卻往往要依靠這些特徵。因此,如何在模型學習過程中進行調優是很重要。

系統建模過程詳解

上一節,我們描述了建模的兩個難題,一個是樣本如何構造,另一個是模型學習如何調優。 先看下怎麼解決樣本構造難題,我們解決方案是:

•考量使用者在出行場景的行為session,不光看在suggest的某次點選行為,更重要的是,考察使用者在出行場景下的行為序列。比如suggest給出搜尋建議後,繼續搜尋的是什麼詞,出行的地點是去哪裡,等等。

•不是統計某個query下的點選, 而是把session看作一個整體,使用者在session最後的點選行為,會泛化到session中的所有query上。

詳細方案
第一步,融合服務端多張日誌表,包括搜尋建議、搜尋、導航等。接著,進行session的切分和清洗。最後,通過把輸入session中,末尾query的點選計算到session中所有query上,以此滿足實現使用者輸入session最短的優化目標。

如下圖所示:

最終,抽取線上點選日誌超過百萬條的隨機query,每條query召回前N條候選POI。利用上述樣本構造方案,最終生成千萬級別的有效樣本作為gbrank的訓練樣本。

特徵方面,主要考慮了4種建模需求,每種需求都有對應的特徵設計方案:

•有多個召回鏈路,包括:不同城市、拼音召回。因此,需要一種特徵設計,解決不同召回鏈路間的可比性。
•隨著使用者的不斷輸入,目標POI不是靜態的,而是動態變化的。需要一種特徵能夠表示不同query下的動態需求。
•低頻長尾query,無點選等後驗特徵,需要補充先驗特徵。
•LBS服務,有很強的區域個性化需求。不同區域使用者的需求有很大不同。為實現區域個性化,做到千域千面,首先利用geohash演算法對地理空間進行分片,每個分片都得到一串唯一的識別符號。從而可以在這個識別符號(分片)上分別統計特徵。

詳細的特徵設計,如下表所示:

完成特徵設計後,為了更好發揮特徵的作用,進行必要的特徵工程,包括尺度縮放、特徵平滑、去position bias、歸一化等。這裡不做過多解釋。

初版模型,下掉所有規則,在測試集上MRR 有5個點左右的提升,但模型學習也存在一些問題,gbrank特徵學習的非常不均勻。樹節點分裂時只選擇了少數特徵,其他特徵沒有發揮作用。

以上就是前面提到的,建模的第二個難題:模型學習的調優問題。具體來說就是如何解決gbrank特徵選擇不均勻的問題。接下來,我們詳細解釋下。

先看下,模型的特徵重要度。如下圖所示:

經過分析,造成特徵學習不均衡的原因主要有:

•交叉特徵query-click的缺失程度較高,60%的樣本該特徵值為0。該特徵的樹節點分裂收益較小,特徵無法被選擇。然而,事實上,在點選充分的情況下,query-click的點選比city-click更接近使用者的真實意圖。
•對於文字相似特徵,雖然不會缺失,但是它的正逆序比較低,因此節點分裂收益也比city-click低,同樣無法被選擇。

綜上,由於各種原因,導致樹模型學習過程中,特徵選擇時,不停選擇同一個特徵(city-click)作為樹節點,使得其他特徵未起到應有的作用。解決這個問題,方案有兩種:

•方法一:對稀疏特徵的樣本、低頻query的樣本進行過取樣,從而增大分裂收益。優點是實現簡單,但缺點也很明顯:改變了樣本的真實分佈,並且過取樣對所有特徵生效,無法靈活的實現調整目標。我們選擇了方法二來解決。
•方法二: 調loss function。按兩個樣本的特徵差值,修改負梯度(殘差),從而修改該特徵的下一輪分裂收益。例如,對於query-click特徵非缺失的樣本,學習錯誤時會產生loss,調loss就是給這個loss增加懲罰項loss_diff。隨著loss的增加,下一棵樹的分裂收益隨之增加,這時query-click特徵被選作分裂節點的概率就增加了。

具體的計算公式如下式:

以上公式是交叉熵損失函式的負梯度,loss_diff 相當於對sigmod函式的一個平移。

差值越大,loss_diff越大,懲罰力度越大,相應的下一輪迭代該特徵的分裂收益也就越大。

調loss後,重新訓練模型,測試集MRR在初版模型的基礎又提升了2個點。同時歷史排序case的解決比例從40%提升到70%,效果明顯。

寫在最後
Learning to Rank技術在高德搜尋建議應用後,使系統擺脫了策略耦合、依靠補丁的規則排序方式,取得了明顯的效果收益。gbrank模型上線後,效果基本覆蓋了各頻次query的排序需求。

目前,我們已經完成了人群個性化、個體個性化的建模上線,並且正在積極推進深度學習、向量索引、使用者行為序列預測在高德搜尋建議上的應用。

作者:高德技術小哥

原文連結

本文為雲棲社群原創內容,未經