個性化推薦性能提升20%:圖學習在Uber Eats餐飲推薦系統的應用

Uber Eats爲了更好地服務龐大的用戶羣,將圖學習理論應用到了Uber的美食推薦上,並開發了圖像學習技術,基於此給用戶推薦更符合他們需求的餐廳和菜餚。這種技術方法提高了平臺上對食物和餐廳推薦的質量及相關性。本文基於其應用實踐,向我們介紹了其中的算法實現邏輯,及搜索和推薦系統模型。

Uber Eats應用程序爲全球36個國家、500多個城市的32萬多家餐廳合作伙伴提供服務。爲了使用戶使用更加方便順暢並擁有更佳的用戶體驗,我們會向用戶推薦他們可能喜歡的菜餚、餐館和菜系。爲此,我們之前開發了機器學習模型使查詢更智能,並在Uber Eats搜索和推薦系統中進行了多目標優化

已有的研究理論[1]已經證明了圖學習方法在推薦任務中的有效性。我們把這個理論應用到了Uber的美食推薦上,並開發了圖像學習技術,基於此我們會給用戶推薦最有可能吸引他們的食物。這種技術方法提高了我們平臺上對食物和餐廳推薦的質量及與用戶需求的相關性。

圖學習簡介

爲了更好地理解我們是如何讓Uber Eats推薦算法變得更準確的,瞭解圖學習的基本原理很有必要。通過學習節點的表示形式,許多機器學習任務可以在圖形數據結構上執行。我們從圖中學習的表示法可以對圖的結構屬性進行編碼,可以方便地用於上述機器學習任務中。例如,爲了在我們的Uber Eats模型中表示一個食客,在提供訂單建議的時候,我們不僅使用訂單歷史記錄,而且還會將食品與過去的Uber Eats訂單進行相關分析,並參考相似用戶的一些意見見解。

具體來說,爲了獲得具有這些屬性的表示,我們爲圖中的每個節點(在本例中是用戶、餐館和食品)計算一個向量,使節點向量相似性近似於圖中兩個節點之間的連接強度。我們的目標是找到一個從節點映射到其向量表示(一個編碼函數)的節點,使圖中結構相似的節點具有相似的表示。

對於Uber Eats的用戶場景,我們選擇了基於圖神經網絡(GNN)的方法來獲得編碼函數。雖然這種方法最初是在20世紀90年代末和21世紀初提出的[2,3],但最近被研究界廣泛採用,用於各種任務實現[6,7,8],並已被證明對推薦問題[1]特別有效。

GNNs的基本思想是使用神經網絡,通過將相鄰節點的表示以一定深度的遞歸方式聚集,得到節點的表示,如下圖1所示:

圖1:圖神經網絡(圖右)從一個輸入圖(圖左)中獲得節點A的描述

假設我們將遞歸深度限制爲2,以獲得圖1中節點A的表示形式,我們首先從A節點開始執行一個廣度優先搜索,接下來,兩步後我們獲得節點的x屬性,這些屬性通過聚合/池功能被聚合,例如,通過取平均值並通過矩陣乘法與學習權矩陣W投影(圖中爲PROJ W),得到距A一跳距離處節點的鄰域表示。

這些相鄰表示會結合信息節點本身所預測的矩陣乘法學習權重矩陣B( PROJ B在圖1中),這種結合形成一個h表示距離A較遠的節點,這種表示被遞歸地聚合和投影,以獲得節點A的表示,在遞歸的每一步,使用新的矩陣W和B (圖1中第一層爲W1和B1,第二層爲W2和B2)。以這種方式獲得表徵的主要優勢是:它可以捕獲節點的屬性和其鄰域結構信息、聚合節點、節點連接的信息。如圖2所示,如下:

圖2:這些方程表示圖1所示的計算圖

然後,我們使用節點表示來預測兩個節點之間存在連接的概率,並優化損失,使圖中實際連接的兩個節點的概率最大化,使斷開節點的概率最小化。

GNN只需要固定數量的參數,而這些參數不依賴於圖的大小,這使得學習可擴展到大型圖,特別是如果在獲取特定節點的表示時,將相鄰節點採樣爲一定的固定數量。此外,還可以通過新添加節點的基本特徵和連接來對其進行表示。GNNs的這些功能支持Uber Eats上的大規模推薦,即便每天增加新用戶、餐廳和菜餚也可應對自如。

Uber的菜品和餐廳推薦圖學習應用

Uber Eats應用中有幾個推薦頁面,如下圖3所示:



圖3:通過歷史訂單和之前指定的用戶偏好,Uber Eats UI可以爲用戶提供豐富的選擇

在主頁上,我們根據用戶偏好爲餐廳和菜品生成輪播推薦。在瀏覽餐館的菜單時,我們還會生成餐館內的個性化推薦,以適應用戶的口味。這些建議是由根據歷史訂單和用戶偏好訓練的推薦系統給出的。

Uber Eats推薦系統可以分爲兩大組成部分:候選商品生成和個性化排名。

候選商品生成部分以可伸縮的方式生成相關的候選對象,換句話說,就是生成可推薦的菜餚和餐館。我們需要使這個階段具有高度的可伸縮性,以便能夠對平臺上數量巨大且不斷增長的菜餚和餐館選項進行預過濾。預過濾可以基於地理位置等因素,所以我們不會向超出其送貨範圍的用戶推薦餐廳。候選菜品和餐廳還需要與特定用戶相關,以確保我們不會過濾掉他們想要的菜品。

系統的第二個組成部分是進行個性化的推薦,它是一個成熟的ML模型,基於附加的上下文信息對預過濾的候選菜品和餐廳進行排名,例如,時間、用戶打開應用時的當前位置等。 該模型可以學習捕獲循環訂單模式,包括在一週的特定日期訂購特定類型的食物,也可以在午餐和晚餐訂購不同類型的菜餚。

爲了使用GNN改進Uber Eats的推薦功能,我們創建兩個由兩部分構成的圖: 第一個圖將用戶和菜餚表示爲節點,節點的邊緣表示用戶點某道菜的次數, 第二個圖將用戶和餐館表示爲節點,邊表示用戶從特定餐館訂購的次數。

我們選擇GraphSAGE[4]作爲建模起點,因爲它具有強大的可伸縮性,這是GNN的一種特殊形式,其中聚合函數是經過投影后的最大池或平均池。在這個GNN中,節點信息和鄰居信息的組合是通過拼接得到的。此外,GraphSAGE還採用了一種採樣策略,將採樣節點的數量限制在與我們想要獲得其表示的節點之間的一跳和兩跳距離,使得將學習擴展到具有數十億個節點的圖數據成爲可能,並提供了更好的建議方案。

爲了將GraphSAGE應用於我們的二部圖,我們必須用幾種方式先做一些修改。首先,由於每個節點類型可能具有不同的特性,我們需要向GNN添加一個額外的投影層。這一層根據輸入節點的類型(用戶、餐館或菜餚)將輸入特性投射到相同大小的向量中。例如, 菜餚可以通過嵌入一個詞來表示,嵌入的詞來源於菜餚的描述或與之相關的圖像的特徵, 餐廳可以有與菜單和菜餚相關的基本功能,它們的功能大小不同,但投影層需要將它們投射到相同大小的空間中。

此外,GraphSAGE只考慮圖形與二進制邊緣,但在我們的例子中,需要對邊緣進行加權,以包含關於用戶從一家餐廳或某道菜訂購的次數和用戶對某道菜的評級的信息,因爲這些是非常重要的信號。對於這個問題,我們引入了一些新的概念來增加邊緣的權重。最重要的變化是採用了鉸鏈損失,相對於用戶的排名這種損失比使用二進制邊緣更適合項目。

假設用戶u至少一次點了菜v,它們之間存在加權邊。如果我們想要預測這雙節點的分數,比我們預測相同的節點u和一個隨機選擇的不相關的節點n的分數要高,他們得分之間的差異應該大於利潤率。

這種損失的問題在於,高權重和低權重的邊緣是可以互換處理的,考慮到用戶一次點的菜和用戶十次點的菜的區別,這種做法效果並不好。爲此,我們引入了損失的低排名積極因素概念。

圖4:Uber Eats推薦系統使用最大的利潤率損失和低排名積極因素

上面的圖4顯示了我們的系統如何利用低排名的積極因素來修正我們的損失。給定一條正邊<u, v>,低排名的積極因素是一條邊<u, l>,其中節點u相同,但節點l與v不同,且<u,l>邊的權重比在<u,n>邊的權重小。我們在損失中增加了第二部分,以確保權重高的邊的排名高於權重低的邊的排名,而權重低的邊有一個邊距Δl,我們將邊距設置爲負樣本的邊距Δn。損失的兩個部分都有一個乘數α,一個控制損失的負樣本部分和損失的低排名積極因素部分相對重要性的超參數。

最後,我們還使用了聚合和採樣函數中的權值。

一旦我們使用訓練過的GNN獲得節點的表示,我們就可以使用節點表示之間的距離來近似它們之間的相似性。具體來說,我們將用戶和物品的點積和餘弦相似度添加到我們的菜品和餐廳推薦系統中作爲特徵,並對它們進行離線和在線測試,以確定它們的準確性。

爲了評估這種嵌入對於我們的推薦任務有多大用處,我們對模型進行了爲期四個月的歷史數據訓練,到一個特定的分割日期才結束。然後,我們測試了推薦菜餚和餐廳的模型性能,測試數據使用的是來自拆分日期後10天的訂單數據。具體來說,我們計算了用戶與城市中所有菜式和餐館嵌入的餘弦相似度,並計算了用戶點的菜式和餐館的等級。在實驗中,我們觀察到,與現有的生產模型相比,在平均倒數排名精確度NDCG等指標上,該系統性能提高了約20%。

通過圖學習的訓練,提高了嵌入式系統的性能,我們也就放心將它們加入到Uber Eats推薦系統的個性化排名模型中了。當我們使用圖學習嵌入相似性特徵訓練個性化排名模型時,我們發現與現有的產品化基線模型相比,AUC提高了12%,這也就改進了系統對用戶的推薦體驗。

此外,通過分析該特徵對預測結果的影響,我們發現圖數據學習相似特徵是推薦模型中最具影響力的特徵。在我們的系統中,與任何現有的特性相比,嵌入圖學習可以捕獲更多的信息,如下圖5所示:

圖5:我們的新版圖學習功能被證明是所有其他實現功能中最有價值的,它決定了我們的Uber Eats和餐廳推薦系統的質量和相關性

根據離線的測試結果,我們覺得在在線實驗中推出新模型應該也會有很好的效果。我們在舊金山進行了A/B測試,發現與之前的產品模型相比,使用圖形學習功能後,用戶的參與度和點擊率有了很大的提高,這表明我們的模型預測並推薦的菜餚對Uber Eats的用戶很有吸引力。

數據和訓練管道

在我們明確了圖數據學習對推薦系統的積極影響後,我們就建立了一個可擴展的數據管道,既可以訓練模型,又可以在實時生產環境中進行預測。

我們爲每個城市訓練獨立的模型,因爲它們的圖形只是鬆散地連接在一起。

爲了實現這一目標,我們使用了過去幾個月的匿名、聚合的訂單數據,並設計了一個四步數據管道來將數據轉換成networkx圖形格式,這是訓練我們的模型所必需的。該管道還提取了原始訂單數據中沒有直接提供的聚合特性,比如用戶訂購菜餚的總次數,這決定了圖的邊緣權重。

此外,管道還能夠爲較早的時間幀創建圖形,這些圖形可用於離線分析。整個管道如圖6所示:

圖6:我們構建了一個數據管道(最上面一行)和訓練管道(最底下一行),它可以幫助我們使用GNN embeddings訓練Uber Eats推薦系統,以改進系統的菜品和餐廳推薦方案。

在管道的第一步中,多個作業從Apache Hive表中提取數據,分別將其作爲包含節點和邊緣信息的Parquet 文件導入HDFS。每個節點和邊緣都具有由時間戳進行版本控制的屬性,這是構建回溯圖所必需的。

在第二步中,我們保留每個節點和給定日期的edge的最新屬性,並使用Cypher格式將它們存儲在HDFS中。在訓練生產模型時,指定的日期是當前的日期,即便如果爲了獲得回溯的圖形而指定了過去的日期,流程也是相同的。

第三步是在Apache Spark執行引擎中使用Cypher查詢語言生成按城市分區的多個圖。

最後,在第四步中,我們將城市圖轉換爲networkx圖格式,該格式在模型訓練和嵌入生成過程中使用,作爲TensorFlow過程實現,並在GPU上運行。

生成的嵌入項存儲在一個查找表中,當應用程序打開併發出請求建議時,排名模型可以從中檢索它們。

可視化學習嵌入

用示例可以很好地展示我們的圖形學習算法所學習到的內容,下面示例展示了我們系統中用戶的描述是如何隨時間變化的。

假設我們在Uber Eats上有一個新用戶,他點了一份雞肉Tandoori和一份蔬菜Biryani(兩者都是印度菜),此時我們就可以獲得該用戶的一種描述。

同一位用戶後來還點了其他幾道菜,包括:半份Pizza、Cobb Salad、半打Dozen Donuts、麻婆豆腐(一道中國菜)、雞肉Tikka Masala和Garlic Naan(三道印度菜)。除了可以獲得這些訂單之外,我們還可以得到關於該用戶的一個描述,並計算這兩個描述與來自不同烹飪類型的最受歡迎的菜餚之間的距離,然後使用視差中引入的顯式軸技術顯示在下面的圖7中

圖7:我們比較了一個假想的用戶在點餐之前和之後的表現,並將他們與來自不同菜系的流行菜餚進行了比較。四個座標突出了屬於四個不同菜系子集的菜餚。x軸表示在點其他菜之前,某道菜與用戶描述的相似程度,而y軸表示在點其他菜之後,某道菜與用戶描述的相似程度。

在圖7的左下角部分,出現了清晰的模式。 第一個模式在右下角的綠色方框中高亮顯示:

由於最初的訂單都是印度菜,所以在追加訂單之前最接近用戶描述的菜品幾乎都是印度菜(綠點), 但也有一些中國菜在x軸上排名靠前,表明了這些烹飪類型之間的二級相關性(點了很多印度菜的用戶也點了中國菜)。中國菜在y軸上的排名也相當靠前,這表明點麻婆豆腐對模型產生了影響,使其推薦了更多的中國菜。

在圖7的右上角部分,橙色框中突出顯示了第二個模式:用戶選擇了美國、意大利、泰國和韓國菜,顯示了在用戶訂購了其他菜式之後,系統是如何更準確描述用戶的。這不僅是由於點了Pizza、Doughnuts和Cobb Salad,也是由於對中國菜建議的增加帶來的二階效應,因爲點中國菜的用戶也更有可能點泰國菜和韓國菜。

最後,在圖像的左上部分, 第三個模式在藍色框中突出顯示:與這兩種用戶描述最接近的前三名之外的所有菜系,在它們後續訂單中,它們的相似度都大幅增加,這表明該模型意識到,這個特定的用戶可能希望獲得新的烹飪建議。

未來的發展方向

如前所述,圖形學習不僅是一個引人注目的研究方向,而且已經成爲大規模部署推薦系統的一個不錯的選擇。

雖然圖數據學習已經在推薦質量和相關性方面帶來了顯著的改進,但是我們仍然需要做更多的工作來增強我們部署的系統。特別是,我們正在探索合並我們的菜餚和餐廳推薦任務的方法,這兩個任務目前是分開的,因爲之前我們認爲它們可以相互促進。隨着時間的推移,我們計劃從兩個二部圖轉移到一個包含所有實體節點的圖。這將需要對丟失和聚合函數進行額外的優化才能正常工作,但是我們相信它將爲利用公共信息的兩個任務提供更多有價值的信息。

我們想要解決的另一個缺陷是,即使在數據稀缺的情況下,也要向用戶推薦合適的商品,比如在Uber Eats平臺剛剛推出的城市。我們正在通過使用元圖學習[5]進行這方面的研究,並取得了令人興奮的結果。

假如你對Uber如何利用人工智能進行個性化推薦點餐建議感興趣,通過Uber Eats的食物挖掘系列文章,可以更加深入的瞭解我們的Uber Eats推薦系統:

致謝

非常感謝Jimin Jia、Alex Danilychev、Long Tao、Santosh Golecha、Nathan Barrebbi、Xiaoting Yin、Jan Pedersen、Ramit Hora對系統研究的貢獻。

參考文獻

  1. Rex Ying, Ruining He, Kaifeng Chen, Pong Eksombatchai, William L. Hamilton and Jure Leskovec: Graph Convolutional Neural Networks for Web-Scale Recommender Systems. KDD 2018.
  2. Alessandro Sperduti and Antonina Starita: Supervised neural networks for the classification of structures. IEEE Transactions on Neural Networks, 1997.
  3. Marco Gori, Gabriele Monfardini and Franco Scarselli: A new model for learning in graph domains. IJCNN 2005.
  4. William L. Hamilton, Rex Ying and Jure Leskovec: Inductive Representation Learning on Large Graphs. NIPS 2017.
  5. Joey Bose, Ankit Jain, Piero Molino and William L. Hamilton: Meta-Graph: Few shot Link Prediction via Meta-Learning. Graph Representation Learning Workshop @ NeurIPS 2019.
  6. Thomas N. Kipf and Max Welling: Semi Supervised Classification With Graph Convolutional Networks. ICLR 2017.
  7. Bing Yu, Haoteng Yin and Zhanxing Zhu: Spatio-Temporal Graph Convolutional Networks: A Deep Learning Framework for Traffic Forecasting. IJCAI 2018.
  8. X. Geng, Y. Li, L. Wang, L. Zhang, Q. Yang, J. Ye, and Y. Liu, Spatiotemporal multi-graph convolution network for ride-hailing demand forecasting. AAAI 2019.

原文鏈接:

Food Discovery with Uber Eats: Using Graph Learning to Power Recommendations

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章