該文章是KDD 2019上發表的Airbnb的搜尋引擎主要算法的文章,主要介紹了Airbnb算法的演進歷程。還是Airbnb一貫的樸實無華的風格:不在乎有多少創新,更多是工業界結合業務上的算法工程,該文章很難的是文章中不僅介紹了Airbnb的算法,以及使用該算法的出發點和考慮,同時還記錄了中間的各種坑,甚至一些失敗的實驗,真的是經驗的無私分享,寫作手法更像各大廠內網的技術總結分享文章。對於廣大研發有較強的借鑑作用。
再具體到技術細節,Airbnb的場景是低頻,且作為平台需要同時考慮需求側(用戶/網民)同時還要考慮供給側(Airbnb中是民宿),另外民宿預訂有很強的地理位置屬性,所以文中的算法對於低頻場景,LBS場景的搜索推薦都有較強的借鑑意義。低頻場景例如飛豬,攜程,馬蜂窩的酒店,旅遊預訂;LBS屬性例如Google Map,百度地圖,高德地圖等場景。
Abstract
搜尋引擎一直都是airbnb成功的重要的因素,之前的實現主要是使用樹模型來實現核心的算法,但是出現了瓶頸,所以後來airbnb就使用深度學習來優化其搜尋引擎。
本文不會針對深度學習的算法進行創新,更多的是在使用深度學習的構建核心引擎中的一些細節的探討。bon voyage
Introduction
搜索場景是airbnb的重要的場景,最開始系統使用的是人工的打分函數。之後使用gbdt進行特徵的組合,這是一個比較大的進步,並且經過了比較多的疊代。現在開始轉移到深度學習。
圖:搜索session示例
典型的搜尋引擎,在用戶看了一系列的listing(相當於其它文章中的item)之後,完成了booked的工作。
系統運行中間的日誌都被記錄下來,之後使用離線的方式訓練新的模型模型,儘量的將booked的listing的排序排到最靠前。之後在線上使用ab test的方式進行驗證。
本文敘述的方式是從feature engineering和system engineering的方式進行的介紹。最後再對內容進行回顧。
Model Evolution
模型的疊代也是一步接一步的。深度學習是頂峰的表現,是最終逐步疊代後的結果,過程中也走了很多彎路。
圖:展示了在各個模型疊代上離線ndcg的提升幅度:
圖:展示了各個模型在線轉化的相對提升幅度:
Dustinsea: 可以看到,在全面DeepNN前,就已經拿到了比較多的受益,DeepNN讓效果更上一層樓
第一階段:simple NN
論文12提到don』t be a hero,但是我們一開始就從複雜的nn模型出發,到最後只是得到了複雜結構,還有花時間的循環。
在nn上也也花了比較多的時間,gbdt模型輸出作為nn模型的輸入。該過程最重要的貢獻,就是把特徵的pipeline給建立起來。
第二階段:lambdarank nn
使用lambda rank,直接對離線的ndcg進行優化。
第三階段:gbdt/fm nn
gbdt作為另外一條線,在進行優化中間發現一個有意思的現象:從指標上gbdt的效果和nn的效果比較類似,但是他們排序出來的結果是不一樣的。受這一現象的啟發,將gbdt/fm和nn的架構進行了融合,FM的最終輸出直接作為nn的特徵,同時樹模型的節點index作為nn的特徵輸入(和2014年facebook發表論文中gbdt+lr的思路異曲同工)。模型結構圖如下:
圖:NN和GBDT模型融合方法示例
第四階段:DEEP NN
模型
最終使用具有兩個隱藏層的nn。配置如下:
特徵
大部分的特徵都直接進行輸入,沒有進行太多的feature enginering,少部分的特徵作為其他模型的輸出,會進行特殊的處理。
price特徵:使用模型進行處理。
similarity features:使用功現的embedding進行處理。
使用17億樣本進行訓練,以ndcg作為評估指標的情況下,能夠達到收斂的效果。
在評估過程中一個非常困難的點就是我們如何評判模型的結果和人的認知評判的結果的效果的對比。在圖像中人是可以作為一個評判標準的絕對增值進行評價的,但是在我們的數據裡邊卻看不出來絕對的增值,因為這些絕對的因素都是隱藏的比較深的。這和video或者audio領域不一樣。
失敗的模型
一般大家在敘事的時候都是在講成功的案例,但這其實只是整個過程的很少的一部分,下面就向大家介紹一下失敗的嘗試,因為失敗的嘗試比較多,所以這個地方挑了兩個模型。
第一種失敗嘗試:直接使用listing ids embedding
在nlp中或者電商視頻推薦中,對於item的embedding使用是比較成熟的,並且證明效果比較好。但在airbnb的環境中,因為數據量比較稀少,就算最火的民宿一年也只能有365個預定,更多的民宿數據都是非常少的,所以很難學出穩定的embedding,基本上都是Over fitting,所以listing ids使用會失敗。
Dustinsea:所以Airbnb進行embedding的時候,更多是對人群/POI群進行embedding,而非用戶/單個POI進行embedding.
圖:增加listing id embedding後,over fitting問題明顯嚴重
第二種:multi-task learning
多任務是現在很多推薦搜索場景中常用的技術,多任務是現在比較fancy的技術,聽起來也是make sense的。Airbnb也進行了嘗試。
進一步講,在文中嘗試的方向:是認為瀏覽時間比較長的listing應該會和booked行為有比較強的相關性。所以進行了多任務的學習,在學習的過程當中有兩個子任務,一個是booked的子任務,另外一個是預估用戶瀏覽時長的子任務。
多任務模型在低層共用embedding,在上層分成兩個任務,並且在loss function中將booked的樣本進行加權。線上使用的時候只使用booked子任務進行預估。
但最終線上的結果是用戶的瀏覽是瀏覽市場的確變長,但是預定基本上沒有什麼變化,經過分析可能的原因如下
第一是推薦出來的內容描述會比較長,或者描述中帶有一些比較獨特的東西,或者甚至是比較搞笑,這樣用戶瀏覽的時間就變成了,但是並不會影響到對應的預定。
第2個可能的原因,是模型傾向於推薦價格比較高的listing,這樣用戶會進行瀏覽,但是最後也沒有預定。所以多任務是一個比較有挑戰的方向,需要繼續進行研究。
Dustinsea: multi-task learning是大趨勢,從理論上也是符合邏輯的,但真正應用的時候,需要的投入也比較多,包括對於問題的細緻分析,所以可以作為系統成熟階段需要突破的手段,但在系統的拓荒階段,不一定是很好的選擇。
圖:下單率分布
特徵工程
傳統的feature engineering需要很多的時間以及經驗,並且中間有很多的tricks才能提升目前的效果,但是這些經驗和方法不一定還適用於最新的變化的數據(因為用戶的行為是動態變化的,之前人工feature engineering的人工經驗知識可能已經遷移)
nn的一個優勢就是它能對特徵進行自由的組合,不過我們還是需要一部分的特徵工程,只是我們的特種工程不再聚焦在我們選擇以及如何進行特徵變化,更多的是對數據進行統一的預處理,這樣nn能夠更正確的對特徵進行轉換和組合。
feature nomalization
gbdt值和特徵的相對順序有關,但是nn會和特徵的值有關,所以進行特徵的規範化。
圖:特徵歸一化方法
第1種相對進行z score的處理
第2種,如果分布符合指數分布,則進行log的處理
feature distribution
從特徵的角度保證特徵是平滑的,是比較重要的。因為如果一般特徵不平衡,都是存在問題。檢查特徵是否平滑,有以下好處:
檢查數據種是否有bugs
檢查如何進行特徵變換,例如文中將lng/lat轉變為用戶和listing的distance
圖:經緯度特徵分布
超參數
dropout: 一般dropout在nn中都是防止過你和的標配,但在該場景中效果不佳,文中給出的解釋是dropout比較像數據增強,相當於引入噪音。文中後續引入了人工構造的噪音, 線下ndcg有1%提升,但線上無變化
initialization:使用xavier initialization方法,比參數默認置0好
Optimizer:文中最後使用的是LazyAdamOptimizer,因為實驗中使用Adam發現效果很難再優化
文中最後還是推薦dnn是一個方向,因為能夠讓大家很大程度上擺脫特徵工程,而站到更高的角度上去考慮優化目標的問題。但是整個過程也是比較耗時的,作者認為他們DNN的工作也才剛剛開始。
圖:發展歷程
文章來源: https://twgreatdaily.com/zh-tw/TmMx7m4BMH2_cNUgBTwX.html