Applying Deep Learning To Airbnb Search
Introduction
首先,作者介紹了airbnb的業務流程:從客人在airbnb上搜尋合适的房子,系統給出具有一定順序的清單房間。
同時介紹了airbnb的技術變遷,從最早的人力手動打分,後面又使用gbdt模型有了很大的提高,再是順應時代變遷在神經網絡有持續性的探索,最後收獲了滿意的結果。
搜尋排序模型的主要生态是預測主人接受客人的機率以及客人對旅途體驗的打分。作者主要關注于根據客人的預定機率對房子清單進行排序的問題。
文章總體對模型架構的變遷有一個總結,同時結合特征工程,系統工程,超參數調優來進一步說明。
Model Evolution
Simple NN
第一個上線的架構是一個單隐藏層,有32個relu的激活單元,所有用到的特征和評估目标都是與GBDT一樣的,使用者預定了就是1,沒有預定就是0,目标函數是最小化L2 regression loss。
Lambdarank NN
lambdarank NN的主要提升在于兩點:
- 将booked listing與not-booked listing成對作為訓練例子,訓練的時候最小化租與不租的得分之差的交叉熵
- 通過計算pairwise loss的權重,使得在清單排序在前的結果優先進行優化
Decision Tree/FM NN
在研究NN模型的同時,Airbnb還探索了GBDT和FM模型。三者線下表現差不多,但是得到的排序結果卻很不相同。是以,Airbnb嘗試了将三種模型進行模型結構的融合,也算是常用的做法:
- 将GBDT的每一顆樹的預測結果在葉節點中的index,作為categorical feature,輸入到NN中;(這個方法和facebook提出的gbdt+lr類似)
- 将FM的預測點選機率結果,直接作為特征放到NN中。
Deep NN
原來的模型過于複雜,以及有很多問題的出現,後來作者隻是簡單的将訓練資料變大了十倍,然後将模型調整為了有2層隐藏層的DNN。輸入層是195個特征,第一個隐藏層是127個全連接配接的relu單元,第二個隐藏層是83個全連接配接的relu單元。
Failed Models
Listing ID
雖然将id進行embedding在很多應用上都獲得了成功,但是作者嘗試各種變化,但是都導緻了過拟合。
作者給出的解釋是:listing id太稀疏了,即時是最熱門的listing一年也就隻能預定365次。而embedding需要一定數量的樣本來給出相對合理的取值。
Multi-task learning
為了解決listing id過于稀疏帶來的過拟合的問題,作者嘗試用Multi-task learning同時對long view和probability of booking進行模組化。期待相對不那麼稀疏的view能夠給booking proba的學習到來一定的額外資訊,以解決過拟合的問題。
因為long view 的标簽數量遠大于booking的标簽數量,是以booking給了較大的權重,而long view用log(view_duration)進行scale。線上實驗發現,booking并沒有提升,但是long views的比例卻大大的提升了。
作者觀察了一些long view比例比較高的listing,發現一些可能的原因導緻上述結果。比如說高端但是價格太高昂的的listing,listing的描述太長的,比較獨特,有趣的listing等等。
對于工程來說,真正了解業務才能實作好的模型。
Feature Engineering
Feature normalization
對于神經網絡來說,對于數值比較敏感,較大的梯度更新可能會使梯度消失,是以歸一化勢在必行。主要包括兩種轉換:
- 對于特征分布類似于正态分布的,我們可以用 f e a t u r e _ v a l − μ σ \frac{feature\_val -\mu}{\sigma} σfeature_val−μ來進行轉換
- 如果特征分布更加接近幂律分布,那麼我們可以通過 l o g 1 + f e a t u r e _ v a l 1 + m e d i a n log\frac{1+feature\_val}{1+median} log1+median1+feature_val
Feature distribution
-
spotting bugs
平滑的分布有利于發現在普通分布中的錯誤
- Facilitating generalization
這些曲線解釋了DNN泛化能力強的原因,lower layer的平滑輸出保證upper layer可以對沒有見過的特征取值做出正确響應。同樣的道理,input layer的輸入應該也是平滑的才好。
雖然有些特征經過合适的歸一化可以獲得一個順滑的分布,但是有一些特征比如經緯度,就需要取log将經緯度轉換為基于距離的屬性而不是具體地理位置的屬性
- Checking feature completeness 作者根據(a)圖看出分布不是那麼的順滑,通過調查發現業務特征不夠完善,再補充上缺失的特征之後,分布相對平滑如(b)所示。
High cardinality categorical features
使用者對于城市區域的偏好是一個重要的位置信号。原來GBDT需要做很多特征工程,NN處理起來非常簡單。 使用hash函數對query進行編碼得到類别型特征,然後Embedding并訓練,最終得到針對目前city query的偏好的地點的編碼。
Hyper parameter
####Drop out
首先嘗試了dropout,但是對于airbnb的這個業務來說沒有絲毫提升,作者給出的解釋是dropout類似于一種資料增強技術,對于資料有缺失的随機模拟場景有效,但是對他們來說随機性隻會分散模型的注意力。
Initialization
最初weights,bias全部被初始化為0,NN效果非常差。最後選擇Xavier對weights進行初始化,針對Embedding使用{-1, 1}範圍内的均勻分布進行初始化。
####Learning rate
利用adam很難對airbnb的應用有很大的提高,是以作者使用一個不同的LazyAdamOptimizer,對于大embedding的訓練速度會快一些
Batch SIze
Batch size對模型訓練速度影響很大,但是對模型性能影響不好說。最終選用的是200.
Feature Importance
Score Decomposition
對于神經網絡來說,想要了解每一個單獨特征的重要性總會帶來一些影響,因為我們無法去分離輸入結點的影響,因為激活函數是非線性的。
Ablation Test
基礎的想法是每次删去一個特征然後觀察模型表現的差别。但是可能會因為特征集的備援使得模型能夠彌補單個特征的缺失,進而使得無法說明該特征是否對模型有作用,
Permutation set
随機修改某些特征的在測試集中的取值,檢視模型性能的改變。同樣假設特征之間互相獨立,這是不可能的。 但是,随機修改一個特征沒有引起模型性能變化,也許能說明模型不需要這個特征。
TopBot Analysis
通過觀察在清單中排名較高的與排名較低的特征分布情況:
如上圖所示,我們可以觀察到模型對于價格比較敏感。