1. 程式人生 > >工程實踐也能拿KDD最佳論文?解讀Embeddings at Airbnb

工程實踐也能拿KDD最佳論文?解讀Embeddings at Airbnb

640?wx_fmt=jpeg


作者 | Mihajlo Grbovic,Airbnb 資深機器學習科學家

譯者 | Lang Yang,Airbnb 工程經理


【導讀】本文最早於 2018 年 5 月 13 日發表,主要介紹了機器學習的嵌入技術在 Airbnb 愛彼迎房源搜尋排序和實時個性化推薦中的實踐。Airbnb 愛彼迎的兩位機器學習科學家憑藉這項技術的實踐獲得了 2018 年 KDD ADS track 的最佳論文,本文即是對這篇論文的精華概括。


Airbnb 平臺包含數百萬種不同的房源,使用者可以通過瀏覽搜尋結果頁面來尋找想要的房源,我們通過複雜的機器學習模型使用上百種訊號對搜尋結果中的房源進行排序。 當用戶檢視一個房源時,他們有兩種方式繼續搜尋:返回搜尋結果頁,或者檢視房源詳情頁的「相似房源」(會推薦和當前房源相似的房源)。我們 99% 的房源預訂來自於搜尋排序和相似房源推薦。


在這篇博文中,我們將會介紹 Airbnb 開發和部署的房源嵌入(Listing Embedding)技術,以及如何用此來改進相似房源推薦和搜尋排序中的實時個性化。 這種嵌入是從搜尋會話(Session)中學到的 Airbnb 房源的一種矢量表示,並可用此來衡量房源之間的相似性。 房源嵌入能有效地編碼很多房源特徵,比如位置、價格、型別、建築風格和房屋風格等等,並且只需要用 32 個浮點數。我們相信通過嵌入的方法來做個性化和推薦對所有的雙邊市場平臺都非常有效。

嵌入的背景


將詞語表示為高維稀疏向量 (high-dimensional, sparse vectors) 是用於語言建模的經典方法。不過,在許多自然語言處理 (NLP) 應用中,這一方法已經被基於神經網路的詞嵌入並將詞語用低維度 (low-dimentional) 來表示的新模型取代。新模型假設經常一起出現的詞也具有更多的統計依賴性,會直接考慮詞序及其共現 (co-occurrence) 來訓練網路。 隨著更容易擴充套件的單詞表達連續詞袋模型 (bag-of-words) 和 Skip-gram 模型的發展,在經過大文字資料訓練之後,嵌入模型已被證明可以在多種語言處理任務中展現最佳效能。


最近,嵌入的概念已經從詞的表示擴充套件到 NLP 領域之外的其他應用程式。來自網路搜尋、電子商務和雙邊市場領域的研究人員已經意識到,就像可以通過將句子中的一系列單詞視為上下文來訓練單詞嵌入一樣,我們也可以通過處理使用者的行為序列來訓練嵌入使用者操作,比如學習使用者點選和購買的商品或瀏覽和點選的廣告。 這樣的嵌入已經被用於 web 上的各種推薦系統中。


房源嵌入


我們的資料集由 N 個使用者的點選會話 (Session) 組成,其中每個會話640?wx_fmt=png定義為一個由使用者點選的 n 個房源 id 組成的的不間斷序列;同時,只要使用者連續兩次點選之間的時間間隔超過30分鐘,我們就會認為是一個新的會話。 基於該資料集,我們的目標是學習一個 32 維的實值表示方式

640?wx_fmt=png來包含平臺上所有的房源,並使相似房源在嵌入空間中處於臨近的位置。


列表嵌入的維度被設定為640?wx_fmt=png,這樣的設定可以平衡離線效能(在下一節中討論)和線上搜尋伺服器記憶體中儲存向量所需的空間,能夠更好地進行實時相似度的計算。


目前有幾種不同的嵌入訓練方法,在這裡,我們將專注於一種稱為負抽樣 (Negative Sampling) 的技術。 首先,它將嵌入初始化為隨機向量,然後通過滑動視窗的方式讀取所有的搜尋會話,並通過隨機梯度下降(stochastic gradient descent)來更新它們。 在每一步中,我們都會將中央房源的向量更新並將其推向正向相關房源的向量(使用者在點選中心房源前後點選的其他房源,滑動視窗長度為640?wx_fmt=png),並通過隨機抽樣房源的方式將它從負向相關房源推開(因為這些房源很大機率與中央房源沒有關係)。


640?wx_fmt=jpeg


為簡潔起見,我們將跳過具體訓練過程的細節,並著重解釋為了更好地適用我們的場景而做的一些修改:


  • 使用最終預訂的房源作為全域性上下文 (Global Context) :我們使用以使用者預訂了房源(上圖中紫色標記)為告終的使用者會話來做這個優化,在這個優化的每個步驟中我們不僅預測相鄰的點選房源,還會預測最終預訂的房源。 當視窗滑動時,一些房源會進入和離開視窗,而預訂的房源始終作為全域性上下文(圖中虛線)保留在其中,並用於更新中央房源向量。


  • 適配聚集搜尋的情況:線上旅行預訂網站的使用者通常僅在他們的旅行目的地內進行搜尋。 因此,對於給定的中心房源,正相關的房源主要包括來自相同目的地的房源,而負相關房源主要包括來自不同目的地的房源,因為它們是從整個房源列表中隨機抽樣的。 我們發現,這種不平衡會導致在一個目的地內相似性不是最優的。 為了解決這個問題,我們添加了一組從中央房源的目的地中抽樣選擇的隨機負例樣本集640?wx_fmt=png


考慮到上述所有因素,最終的優化目標可以表述為

640?wx_fmt=jpeg


在這裡


  • 640?wx_fmt=png是正在更新的中心房源的向量 640?wx_fmt=png

  • 640?wx_fmt=png是一對正對640?wx_fmt=png,表示(中心房源,相關房源)元組,其向量在優化中會被互相推近

  • 640?wx_fmt=png是一對負對640?wx_fmt=png,表示(中心房源,隨機房源)元組,其向量在優化中會被互相推離


  • 640?wx_fmt=png是最終被預訂的房源,被視為全域性上下文並被推向中心房源向量 


  • 640?wx_fmt=png是一對目的地維度的負例對640?wx_fmt=png,代表(中央房源,來自同一目的地的隨機列表)元組,其向量被推離彼此


使用上面所描述的優化程式,我們通過使用超過 8 億次的搜尋點選會話,訓練了 Airbnb 上 450 萬個有效列表的房源嵌入,從而獲得了高質量的房源展示。


冷啟動嵌入:每天在 Airbnb 上都有新的房源提供。這些房源在新建時還不在我們的訓練資料集中,所以沒有嵌入資訊。 要為新房源建立嵌入,我們會找到 3 個地理位置最接近、房源類別和價格區間相同的已存在的房源,並計算這些房源嵌入的向量平均值來作為新房源的嵌入值。


嵌入學習到的是什麼?


我們用多種方式來評估嵌入捕獲到的房源的特徵。首先,為了評估地理位置相似性是否被包含,我們對用於學習的嵌入進行了 k 均值聚類 (k-means clustering)。下面的圖顯示了美國加州產生的 100 個聚類,確認了來自近似位置的房源聚集在一起。 接下來,我們評估了不同型別(整套房源,獨立房間,共享房間)和價格範圍的房源之間的平均餘弦相似性 (cosine similarity) ,並確認相同型別和價格範圍的房源之間的餘弦相似性遠高於不同型別和不同價格的房源之間的相似性。 因此我們可以得出結論,這兩個房源特徵也被很好的包括在訓練好的嵌入中了。


640?wx_fmt=jpeg


雖然有一些房源特徵我們可以從房源元資料中提取(例如價格),所以不需要被學習,但是其他型別的房源特徵(例如建築風格,樣式和感覺)很難提取為房源特徵的形式。 為了評估這些特性並能夠在嵌入空間中進行快速簡便的探索,我們內部開發了一個相似性探索工具 (Similarity Exploration Tool),並提供了一個視訊進行演示。


視訊連結:https://www.youtube.com/watch?v=1kJSAG91TrI&feature=youtu.be


該視訊提供了許多嵌入示例,能夠找到相同獨特建築風格的相似房源,包括船屋、樹屋、城堡等。


線下評估


在對使用了嵌入的推薦系統進行線上搜尋測試之前,我們進行了多次離線測試。同時我們還使用這些測試比較了多種不同引數訓練出來的不同嵌入,以快速做優化,決定嵌入維度、演算法修改的不同思路、訓練資料的構造、超引數的選擇等。


評估嵌入的一種方法是測試它們通過使用者最近的點選來推薦的房源,有多大可能最終會產生預訂。


更具體地說,假設我們獲得了最近點選的房源和需要排序的房源候選列表,其中包括使用者最終預訂的房源;通過計算點選房源和候選房源在嵌入空間的餘弦相似度,我們可以對候選房源進行排序,並觀察最終被預訂的房源在排序中的位置。


我們在下圖中顯示了一個此類評估的結果,搜尋中的房源根據嵌入空間的相似性進行了重新排序,並且最終被預訂房源的排序是按照每次預定前的點選的平均值來計算,追溯到預定前的 17 次點選。


640?wx_fmt=jpeg


我們比較了幾個嵌入版本:


  1. d32 regular,沒有對原始嵌入演算法進行任何修改


  2. d32 booking global,被預訂房源作為全域性上下文


  3. d32 booking global + market negatives,被預訂房源作為全域性上下文,且加入了中央房源的目的地中抽樣選擇的隨機負例樣本作為負值(見上述目標優化公式)


從圖中我們可以看出,第三個選項中的被預訂房源一直都有較為靠前的排序,所以我們可以得出結論,這個選擇要比其它兩個更優。


基於嵌入的相似房源推薦


每個 Airbnb 房源詳情頁面都包含一個「相似房源」的輪播,推薦與當前房源相似並且可以在相同時間段內預訂的房源。


640?wx_fmt=jpeg


在我們測試嵌入前,我們主要通過呼叫主搜尋排序模型來搜尋相同位置、價格區間和型別的房源以得出相似房源。


在有了嵌入之後,我們對此進行了 A/B 測試,將現有的相似房源演算法與基於嵌入的解決方案進行了比較。在基於嵌入的解決方案中,相似房源是通過在房源嵌入空間中找到 k 個最近鄰居 (k-nearest neighbors) 來生成的。 更確切地說,給定學習好了的房源嵌入,通過計算其向量640?wx_fmt=png與來自相同目的地的所有房源的向量640?wx_fmt=jpeg之間的餘弦相似性,可以找到指定房源640?wx_fmt=png的所有可預訂的相似房源(如果使用者設定了入住和退房日期,房源需要在該時間段內可預訂)。最終得到的640?wx_fmt=png個最高相似性的房源組成了相似房源列表。


A/B 測試顯示,基於嵌入的解決方案使「相似房源」點選率增加了21%,最終通過「相似房源」產生的預訂增加了 4.9%。


基於嵌入的實時個性化搜尋


到目前為止,我們已經看到嵌入可以有效地用於計算房源之間的相似性。 我們的下一個想法是在搜尋排序中利用此功能進行一個會話內的實時個性化,目的是向用戶更多展示他們喜歡的房源,更少展示他們不喜歡的房源。


為實現這一目標,我們為每個使用者實時收集和維護(基於 Kafka)兩組短期歷史事件:


  1. 640?wx_fmt=png:使用者在過去 2 周內點選的房源 ID


  2. 640?wx_fmt=png:使用者在過去 2 周內跳過的房源 ID(我們將跳過的房源定義為排序較靠前的房源,但使用者跳過了此房源並點選了排序較靠後的房源)


接下來,在使用者進行搜尋時,我們為搜尋返回的每個候選房源做 2 個相似性計算:


  • 640?wx_fmt=png:候選房源與使用者點選過的房源的嵌入空間的相似性(來自 )


640?wx_fmt=jpeg


具體來說,我們計算來自640?wx_fmt=png的目的地級質心之間的相似性並選擇最大相似度。 例如,如果640?wx_fmt=png包含來自紐約和洛杉磯的房源,那麼這兩個目的地中每個目的地的房源嵌入將被平均以形成目的地級別的質心。


  • 640?wx_fmt=png:候選房源和使用者跳過的房源嵌入空間的相似性(來自640?wx_fmt=png

640?wx_fmt=jpeg


上面這兩個相似性衡量的結果,會作為之後通過搜尋排序機器學習模型對候選房源進行排序時考慮的附加訊號。


我們首先會記錄這兩個嵌入相似性特徵以及其他搜尋排序特徵,來為模型訓練建立一個新的標記資料集,然後繼續訓練一個新的搜尋排序模型,之後我們可以通過 A/B 測試來和當前線上的排序模型進行對比。


為了評估新模型是否如預期地學會了使用嵌入相似性特徵,我們在下面繪製了它們的部分依賴圖。這些圖顯示瞭如果我們固定住其他所有的特徵值,只考慮我們正在測試的某個特徵值,候選房源的排序分數會發生什麼變化。


640?wx_fmt=jpeg


從左邊的圖中可以看出,較大的640?wx_fmt=png值(使用者最近點選的房源的相似房源)會導致更高的模型得分。


在右邊的圖中可以看出,較大的640?wx_fmt=png值(使用者最近跳過的房源的相似房源,即不喜歡的房源)會導致較低的模型得分。


所以部分依賴圖的觀察結果證實,特徵行為符合我們之前預期的模型將學習的內容。除此之外,當新的嵌入特徵在搜尋排序模型特徵中重要性排序很靠前的時候,我們的離線測試結果顯示各項效能指標都有所改進。這些資料讓我們做出了進行線上實驗的決定,之後該實驗取得了成功,我們在 2017 年夏季上線了將嵌入特徵用於實時個性化生成推薦的功能。


文字經授權轉載:

https://zhuanlan.zhihu.com/p/43295545


本文僅代表作者獨立觀點,轉載請聯絡原作者。


-【完】-

精彩推薦

BDTC 2018


2018 中國大資料技術大會將於 12 月 6 - 8 日在新雲南皇冠假日酒店舉行。匯聚超百位國內外實力講師從學界翹楚到行業一線大拿:

管曉巨集:中國科學院院士;

張巨集江:原始碼資本投資合夥人;

張曉東:美國俄亥俄州立大學 Robert M. Critchfield 講席教授;

陳性元:北京資訊科學技術研究院副院長;

周靖人:阿里巴巴集團副總裁;

李浩源:Alluxio 公司創始人&CEO

......

全方位立體解讀大資料時代的技術程序,為眾技術愛好者奉上一場優質乾貨盛宴。


640?wx_fmt=jpeg


推薦閱讀

勝過iPhone XS?Google Pixel的“夜視功能”是怎樣煉成的

近期最受大家關注的機器學習專案Top10!

乾貨(附原始碼) | 爬取一萬條b站評論,分析9.7分的新番憑啥這麼火?

程式設計師如何 Get 分散式鎖的正確姿勢?

讓你崩潰無語的程式命名有哪些?

2年2億美金,澳本聰耗得起BCH內戰又怎樣?

剛寫完排序演算法,就被開除了…