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

導讀:高德的願景是:鏈接真實世界,讓出行更美好。爲了實現願景,咱們要處理好LBS大數據和用戶之間的智能連接。信息檢索是其中的關鍵技術,而搜索建議又是檢索服務不可或缺的組成部分。前端

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

對搜索排序模塊作重構

搜索建議(suggest服務)是指:用戶在輸入框輸入query的過程當中,爲用戶自動補全query或POI(Point of Interest,興趣點,地理信息系統中能夠是商鋪、小區、公交站等地理位置標註信息),羅列出補全後的全部候選項,並進行智能排序。session


咱們但願經過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的排序需求。

目前,咱們已經完成了人羣個性化、個體個性化的建模上線,而且正在積極推動深度學習、向量索引、用戶行爲序列預測在高德搜索建議上的應用。


本文做者:高德技術小哥

原文連接

本文爲雲棲社區原創內容,未經容許不得轉載。

相關文章
相關標籤/搜索