推薦系統:從千人千面到千域千面
談到推薦系統,很多人的印象中是 “個人性推薦” 和“千人千面”。關於 “千域千面” 應該很少人提及,主要能用到的場景不多,先前有想過在酒店場景上應用,但是由於各種原因最終沒有嘗試。以下是高德地圖在 “千域千面” 的一些經驗,記錄下來供後續學習。
目錄
-
Learning to Rank(LTR)在高德的嘗試
-
應用場景
-
詳細方案
-
具體效果
-
相關文章
Learning to Rank(LTR)在高德的嘗試
應用場景
搜索建議(suggest 服務),用戶在輸入框輸入 query 的過程中,爲用戶自動補全 query 或 POI,羅列出補全後的所有候選項,並進行智能排序。
Learning to Rank(LTR)是用機器學習的方法來解決檢索系統中的排序問題。業界比較常用的模型是 GBrank,Loss 方案用的最多的是 Pair Wise,這裏也保持一致。一般應用 LTR 解決實際問題,最重要的問題之一就是如何獲得樣本。
-
高德地圖每天的訪問量巨大,這背後隱藏的候選 POI 更是一個天文數字,想要使用人工標註的方法去獲得樣本明顯不現實。
-
如果想要使用一些樣本自動構造的方法,比如基於用戶對 POI 的點擊情況構建樣本 pair <click, no-click>,也會遇到如下的問題:
-
容易出現點擊過擬合,以前點擊什麼,以後都給什麼結果。
-
有時,用戶點擊行爲也無法衡量真實滿意度。
-
Suggest 前端只展示排序 Top 10 結果,更多的結果沒有機會展現給用戶,自然沒有點擊。
部分用戶習慣自己輸入完整 Query 進行搜索,而不使用搜索建議的補全結果,統計不到這部分用戶的需求。對於這幾個問題總結起來就是:無點擊數據時,建模很迷茫。但就算有某個 POI 的點擊,卻也無法代表用戶實際是滿意的。最後,在模型學習中,也面臨了特徵稀疏性的挑戰。統計學習的目標是全局誤差的一個最小化。稀疏特徵由於影響的樣本較少,在全局上影響不大,常常被模型忽略。但是實際中一些中長尾 case 的解決卻往往要依靠這些特徵。因此,如何在模型學習過程中進行調優是很重要。
詳細方案
第一步,融合服務端多張日誌表,包括搜索建議、搜索、導航等。接着,進行 session 的切分和清洗。最後,通過把輸入 session 中,末尾 query 的點擊計算到 session 中所有 query 上,以此滿足實現用戶輸入 session 最短的優化目標。
最終,抽取線上點擊日誌超過百萬條的隨機 query,每條 query 召回前 N 條候選 POI。利用上述樣本構造方案,最終生成千萬級別的有效樣本作爲 GBrank 的訓練樣本。
-
特徵方面,主要考慮了 4 種建模需求,每種需求都有對應的特徵設計方案:
-
有多個召回鏈路,包括:不同城市、拼音召回。因此,需要一種特徵設計,解決不同召回鏈路間的可比性。
-
隨着用戶的不斷輸入,目標 POI 不是靜態的,而是動態變化的。需要一種特徵能夠表示不同 query 下的動態需求。
-
低頻長尾 query,無點擊等後驗特徵,需要補充先驗特徵。
-
LBS 服務,有很強的區域個性化需求。不同區域用戶的需求有很大不同。爲實現區域個性化,做到千域千面,首先利用 geohash 算法對地理空間進行分片,每個分片都得到一串唯一的標識符。從而可以在這個標識符(分片)上分別統計特徵。
詳細的特徵設計,如下表所示:
初版模型,下掉所有規則,在測試集上 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 特徵被選作分裂節點的概率就增加了。具體的計算公式如下式:
$$-\text{gradient}=y_{ij}-\frac{1}{1+\exp(-(h(x_i)-h(x_j))+\text{loss}_{diff})}$$
以上公式是交叉熵損失函數的負梯度,$loss_{diff}$ 相當於對 sigmod 函數的一個平移。
差值越大,$loss_{diff}$ 越大,懲罰力度越大,相應的下一輪迭代該特徵的分裂收益也就越大。調 loss 後,重新訓練模型,測試集 MRR 在初版模型的基礎又提升了 2 個點。同時歷史排序 case 的解決比例從 40% 提升到 70%,效果明顯。
具體效果
Learning to Rank 技術在高德搜索建議應用後,使系統擺脫了策略耦合、依靠補丁的規則排序方式,取得了明顯的效果收益。gbrank 模型上線後,效果基本覆蓋了各頻次 query 的排序需求。目前,已經完成了人羣個性化、個體個性化的建模上線,並且正在積極推進深度學習、向量索引、用戶行爲序列預測在高德搜索建議上的應用。
參考鏈接:
- 機器學習在高德搜索建議中的應用優化實踐(https://developer.aliyun.com/article/708264)
作者:錢魏 Way
來源:www.biaodianfu.com/amap-suggestion-optimization-practice.html
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/yBaDaKx54qK4okju9cu9uw