本文系外賣美食知識圖譜系列的第三篇文章,從技術層面咱們會介紹外賣套餐搭配的技術方案,包括離線、實時的套餐搭配的迭代,套餐質量評估方案,同時會介紹套餐搭配的業務應用。
讓用戶更方便快捷地選購到滿意的外賣商品,是美團外賣一直在努力的方向。本文主要介紹了針對美食類商家的套餐搭配技術以及應用實踐。在外賣點餐的選擇過程當中,用戶通常會考慮單品偏好、組合搭配等因素,挑選商家和商品的過程耗時較長。咱們經過套餐搭配技術,基於商家的候選商品,自動搭配優質套餐,輕鬆解決用戶「選擇困難症」,可以提高用戶的決策效率。前端
目前,美團外賣App的套餐搭配應用有不少,有「今日套餐推薦」、「滿減神器」、「套餐搭配推薦」等。因爲目前外賣商家自行搭配套餐的能力較弱並且意願不強,致使外賣套餐底層供給對業務場景和商家的覆蓋率偏低,不能知足套餐相關推薦排序應用的需求。所以,外賣套餐搭配的業務目標是對於美食類商家搭配出候選的套餐組合,給套餐相關應用方提供更豐富的套餐供給。算法
對於套餐相關應用方,咱們進行了業務分析:「今日推薦」、「滿減神器」等業務的搭配條件相對較弱且能夠離線獲取搭配條件,歸類爲推薦型相關業務,此類業務須要保證商家的套餐覆蓋率提高,從而保證商家的推薦露出。詳情頁、滿減加購等業務的搭配條件較強,並且偏實時。例如,詳情頁是用戶指定一個菜品後進行搭配,滿減加購場景是用戶選擇一個菜品和特定的價格區間做爲條件。這些屬於搭配型業務,此類業務須要保證套餐對實時場景的覆蓋,從而保證套餐搭配Tab的露出。套餐搭配算法的目標有:①提高套餐組合的覆蓋度,從而給下游的套餐相關應用提供場景覆蓋率高、多樣性充足的套餐組合。②保證搭配套餐的質量。後端
商品搭配在電商場景下也存在較多的應用,例如淘寶的購物車搭配、服裝搭配,化妝品搭配。購物車搭配是基於用戶購物車、已購買商品的打包推薦,例如,用戶在加購牙刷後,能夠給出牙膏的推薦。這類方法主要基於商品的購買行爲進行相關性的推薦,目標不是造成一個完成的搭配組合。可是,外賣美食商品搭配則須要考慮整個組合的合理性,而不單純基於商品是否相關。好比:大量訂單中有「小炒肉+番茄雞蛋湯+米飯」、「魚香肉絲+番茄雞蛋湯+米飯」等組合方式,可是「番茄雞蛋湯+米飯」並不構成一個好的套餐搭配。安全
服裝搭配和化妝品搭配爲面向組合的搭配推薦,對此類搭配問題的解決方案大致分紅兩類,一類是:搭配模式用於模型挑選商品過程的剪枝,搭配模式能夠是人工或者模型的方式先驗給出,參考文獻中的論文四、5採用此思路,該方法的特色是搭配效果靠剪枝策略+質量評估模型共同保證。另外一類是經過端到端的網絡參數學習搭配模式思路,論文6和咱們的離線套餐搭配採用此思路,該方案的特色是搭配效果更依賴於端到端模型保證,但同時搭配模型更復雜。網絡
相比電商場景的商品搭配,美食搭配面臨獨特的業務挑戰:架構
爲此,咱們的解決方案是:框架
整體,咱們在非標品的商品表示、商家表示、套餐搭配模型、套餐搭配質量評估上都進行了相關的探索和迭代,造成了以下圖2所示的套餐搭配框架。運維
咱們面臨的一個問題是外賣商品爲非標品,菜品數據質量較差、屬性缺失。爲此,咱們基於商家菜單、菜譜、商品描述等多種信息源,經過信息抽取、關係識別、知識融合等多種方法,構建了以美食爲核心的知識圖譜,對菜品創建了品類、口味、作法、功效等多個維度的表示。ide
商家的歷史高銷量套餐通常可認爲是優質的套餐,可是,中低銷量商家的高銷量套餐數量較少,難以支持套餐的個性化推薦等應用。依賴美食圖譜對菜品的語義表達,咱們首先嚐試了基於知識圖譜的直接概括演繹進行套餐搭配的方案。例如,經過高頻訂單能夠概括得出,{熱菜}+{米飯}+{湯}是一個常見的套餐搭配方式,進而對於商家演繹出「番茄炒雞蛋+番茄雞蛋湯+米飯」的套餐搭配。函數
圖譜概括演繹的過程是高頻聚合和基於搭配模板的泛化過程,咱們經過訂單聚合、同品牌、同標籤、同菜品模板泛化,來產生高質量的套餐搭配,同時套餐的商家覆蓋率有了顯著的提高。可是搭配模板的問題在於較難對搭配質量和泛化程度取得折中。約束性較強的搭配模板能夠確保搭配質量,但泛化能力不足,套餐覆蓋度較低。若是用單一或少許標籤描述搭配項,會致使模式過分泛化,準確率不能保證。爲此,咱們引入了基於模型的套餐搭配方法。
用戶搭配套餐也是一個信息編碼到信息輸出的過程:用戶瀏覽商家菜單便是編碼過程,獲得該商家和商品信息的一個總體概況,再基於這個概況去進行套餐的搭配。貼合該過程的一個思路是採用Encoder-Decoder框架進行套餐搭配模型的建設,Encoder類比用戶瀏覽菜單的過程,學習菜單的語義信息,Decoder負責搭配出套餐。Encoder-Decoder是一種深度學習網絡框架,已經被普遍應用於文本摘要、機器翻譯、對話生成等應用中,其建模的方式是經過編碼(特徵提取)和解碼(目標擬合),學習從Encoder輸入數據到Decoder輸出數據的映射。常見的編碼方式有CNN、RNN、Transformer等結構,解碼方式也相似。
套餐生成問題是要從一個商家的全部候選商品集合中提取出多個商品子集,造成方便用戶篩選、可直接下單的套餐。套餐生成的數據源主要是該商家的候選商品信息(如商品的名稱、標籤、價格、銷量等),再結合用餐價格區間、用餐人數等約束條件,以及用戶偏好等信息。最初咱們採用了LSTM做爲Encoder和Decoder的神經網絡進行套餐搭配。咱們基於圖譜語義抽取商品語義表示,並輸入Encoder的RNN模型。Encoder編碼過程相似於用戶翻閱商家候選商品的過程,Encoder端輸入菜品名稱、菜品標籤、菜品的業務屬性(價格、銷量等),經過LSTM對非標品菜品進行特徵抽取。以下圖4所示,每一個商品的名稱通過Embedding層、CNN+Pooling層提取特徵,並同菜品標籤、類別的Embedding以及價格和銷量等連續特徵進行拼接,最終做爲Encoder RNN中每步的輸入。
Decoder在解碼過程當中通常依賴一個固定的字典或詞典做爲候選集,每一步輸出候選集中的字、詞被選中的機率分佈。對於套餐搭配網絡來講,Decoder解碼的候選集來源於Encoder輸入端商家內的商品列表,而非固定維度的外部菜品詞表,Pointer Network是建模這一問題的有效架構。Pointer Network是基於Seq2seq的擴展,主要解決的是候選集不固定的問題,這一模型架構已被成功應用於抽取式文本摘要,以及旅行商問題、凸包問題等組合優化問題的解決方案中。
套餐搭配解碼的具體過程爲,Decoder每一步預估目標菜品來自菜品列表的機率分佈。在第n(n>=1)步時,這個機率分佈向量表達了在已經選擇了n-1個商品的狀況下,某個商品或者終止位被選中的機率。若終止位對應的機率較大,則模型傾向之前n-1個已選商品造成一個完整的套餐搭配。解碼過程當中,咱們結合BeamSearch算法產生TopN個結果,保證搭配的多樣性。
套餐搭配模型的學習目標
爲了解決菜品搭配模式因商家而異的問題,模型經過擬合該商家的歷史訂單來學習商家的搭配特性。一種較爲主流的訓練形式是基於商家真實訂單,採用Teacher Forcing的形式進行訓練,使得模型預測的菜品逐位匹配上真實訂單內的菜品。Teacher Forcing式的訓練方法使得預測菜品的機率傾向於0-1分佈,可是現實的菜品搭配一般是個性化、多樣性的,例如在Decoder已經輸出「宮保雞丁」菜品的基礎上,下一步選擇的主食爲「米飯」或者「炒飯」皆可。
爲此,咱們對商家歷史成單的套餐搭配模式進行統計,計算出商品選擇的機率分佈,Decoder以此商品選擇的機率分佈做爲訓練目標,同預估的分佈計算MSE Loss,並最小化該值指導模型的訓練。Teacher Forcing的另外一個問題是較難引入搭配質量、套餐的點擊購買行爲等外部知識來指導模型訓練,爲此咱們嘗試了採用強化學習的思路進行改進。在解碼過程的時刻T,咱們經過蒙特卡洛算法採樣(Monte Carlo Sampling)出完整的套餐候選,並計算套餐候選的搭配質量分做爲Reward,結合MSE Loss和搭配質量分進行模型訓練。
套餐搭配的約束
套餐搭配過程會面臨多種業務約束,例如,對於「滿減神器」來講,搭配的套餐須要知足給定的滿減價格檔位。「智能助手」的套餐搭配過程須要考慮用戶選定的篩選條件,例如條件可能爲「主食爲米飯」且「價格爲30元如下」。咱們經過剪枝策略保證搭配過程知足約束,以「滿減神器」的價格區間約束爲例,Decoder端在單步產生候選菜品時,會基於剩餘的價格過濾掉超出剩餘價格範圍的菜品。以下圖6所示,對於商家的A、B、C、D、E菜品,Decoder會利用剩餘價格的區間「15元之內」對後一輪菜品A、B、C、D、E進行剪枝,並刪除超過價格區間的C、D兩個菜品。
基於Attention網絡的套餐搭配模型
基於LSTM網絡的商家內菜品特徵提取面臨的問題有:第一,商家菜單的菜品自己無序,而RNN網絡依賴序列進行建模。第二,菜品之間可能存在長距離的語義依賴,例如,菜單內是否有「米飯」、「饅頭」等菜品會影響對於「宮保雞丁」菜品的搭配。
爲了更好的對無序菜單和菜品之間依賴信息進行表徵,咱們嘗試了基於Attention結構的Encoder-Decoder模型。Encoder部分採用層次化Attention結構提取菜品的語義信息,包含底層單菜品級的Attention和菜品之間的Attention兩部分。對於單菜品級的Attention,咱們在字維度採用Multi-Head Attention結構獲得菜品名稱的語義向量,菜品標籤一樣採用Multi-Head Attention 獲得菜品標籤語義向量,對於菜品的交易屬性,咱們採用多層全鏈接網絡提取交易特徵的語義向量。
最後,菜品名稱語義向量、菜品標籤語義向量、交易特徵語義向量拼接後通過全鏈接層+層歸一化獲得菜品語義向量。對於菜品之間的Attention層,咱們對該店的菜品語義向量列表採用多層Multi-Head Attention獲得該店的菜單級別語義向量。模型Decoder部分一樣採用Multi-Head Attention進行解碼,輸入信息包括用戶偏好信息、歷史時刻的解碼輸入、價格約束等上下文信息,模型在每步輸出商家菜單中的菜品被選擇的機率分佈。Decoder過程當中咱們對用戶偏好信息同商家菜單級別的語義向量進行Multi-Head Attention,在套餐搭配過程當中考慮用戶的用餐偏好。
咱們認爲商家高質量的搭配能夠從訂單的銷量體現,一種評估方法便是評估模型輸出的套餐對商家真實高銷量套餐的覆蓋。經過離線和在線評估,咱們發現該模型能夠擬合出商家高銷量套餐。在人工評估部分,咱們把算法搭配的套餐和真實成單訂單進行混合並讓人工進行區分,發現人工沒法分辨模型搭配的訂單和真實成單訂單的差別。同時,該模型具有良好的泛化能力,顯著提高了套餐對商家和特定業務場景的覆蓋度。
咱們對模型輸出的菜品表徵向量進行了分析,以瞭解模型的套餐搭配模式。利用TSNE對向量進行降維和聚類,經過聚類圖觀察發現「主食」、「主菜」、「小食」類的菜品各自彙集在一塊兒,能夠看出模型識別了菜品的「主食」、「菜品」、"小食"等品類語義屬性,並參考此語義進行套餐搭配。
主食類:"餛飩"的TOP N類似菜品 | 菜品類:"紅燒肉"的TOP N類似菜品 |
---|---|
雞湯大餛飩 0.981 | 黃瓜拌牛肉 0.975 |
豌雜酸辣粉 0.979 | 鮮菇牛肉 0.977 |
豬肉餛飩 0.975 | 毛家紅燒肉 0.980 |
清湯牛肉麪 0.975 | 白菜肥腸 0.973 |
皮肚肥腸面 0.974 | 拌小腸 0.976 |
海鮮炒烏冬面 0.974 | 豬頭肉 0.981 |
大蔥肉鍋貼 0.973 | 紅燒小土豆 0.975 |
豌雜米粉 0.971 | 拌牛肉 0.980 |
利用離線搭配產生套餐候選的方案能夠知足推薦型業務的需求,但對於一些搭配型的業務場景仍然覆蓋不足,例如,目前離線套餐對菜品的覆蓋度較低,即對於菜品詳情頁等應用只保證部分PV的搭配模塊露出。
一種解決方案是經過離線搭配提高套餐對美食商品的覆蓋,但該方案的存儲成本較高,爲此咱們採用實時套餐搭配方案。實時生成方案的難點在於既要保證套餐質量,又要知足各類搭配條件,最重要的還要保證明時性。最初咱們把離線搭配模型應用於線上實時搭配,發如今性能方面存在瓶頸。所以,咱們對離線模型進行了精簡,精簡的思路是將選菜的過程精簡爲選擇菜品類目的過程,將菜品維度的搭配關係精簡爲菜品類目的搭配關係,實現整個解空間的縮小。以下圖8所示,具體流程以下:
高銷量的訂單中也存在搭配質量稍低的套餐,加上模型泛化的精度問題,搭配模型很容易生成質量較差的搭配組合。以下圖9右側,模型生成的後兩個套餐搭配相對不是特別合理。爲進一步保證用戶體驗,咱們創建了套餐搭配質量模型,對套餐的質量進行統一評估。套餐質量分類模型將套餐搭配質量轉化爲一個分類問題。由於套餐組合是有多個菜品組成的,因此咱們基於菜品名稱、標籤等信息構造菜品的表示,而後經過Global-Attention來實現菜品間重要程度的考量,同時添加總商品個數、總份數等全局特徵來表示總體搭配的信息,模型結構具體見下圖9所示:
咱們對套餐的搭配質量進行了細粒度的分檔:極差、差、中、好 ,且四種類別存在有序關係(極差<差<中<好),對應模型有四個輸出值,每個表示該位爲1的機率,例如「極差」表示爲「1,0,0,0」, 「差」表示爲「1,1,0,0」,「中」表示爲「1,1,1,0」,「好」表示爲「1,1,1,1」。模型的損失採用Pair Hinge Loss函數,避免前面節點爲0後面節點爲1的狀況,保證模型的準確度。套餐的搭配質量分值爲四個輸出節點的求和平均值,使得預測值更加可信。模型結構同通常的分類模型大致一致,目標函數以下:
套餐質量模型的建設過程當中,負例樣本主要來自用戶反饋的Bad Case,和經過人工構造不合理搭配模式版篩出的套餐。這種方式存在的問題是:Bad Case和人工構造的搭配負樣本有偏、多樣性較差,且負樣本同正樣本的配比不容易調節。
爲此,咱們引入一個預訓練任務學習歷史訂單的搭配模式,爲套餐搭配質量模型引入更多的搭配先驗知識。預訓練過程以下圖11所示,咱們隨機Mask已成單搭配組合中的一個菜品,而後訓練Transformer模型還原被Mask掉的菜品。在這個過程當中,考慮一些次優套餐的合理性(例如:"宮保雞丁+米飯+可樂",Mask掉"宮爆雞丁",生成器生成出來的是「魚香肉絲」,「魚香肉絲+米飯+可樂」就可理解爲一個次優套餐),咱們在最後的損失函數添加預測菜品與目標菜品類別類似性的判別器來解決這類狀況。預訓練獲得的參數最終用來初始化套餐搭配質量分檔模型,並基於少許的人工標註語料進行模型的調優。
目前,外賣已打造了多款以套餐爲核心供給的產品,「今日套餐推薦」幫助用戶解決不知道吃什麼、選購慢的問題,店鋪頁內的「滿減神器」、「單品搭配推薦」解決用戶湊單難、搭配難的問題。爲了解決了各業務場景下套餐搭配難題,套餐搭配算法針對覆蓋度、搭配質量、搭配多樣性進行了持續優化,爲業務提供了重要的技術和數據支撐。離線套餐搭配用於」滿減神器「、」今日套餐推薦「等業務,顯著提升了套餐商家的覆蓋率,實時套餐搭配用於「菜品詳情頁套餐搭配」等業務,並取得較好的業務收益。
後續工做,一方面咱們會繼續優化菜品知識圖譜的構建,完善對非標品菜品的刻畫,經過引入圖像等多模態數據進一步提高數據準確度和覆蓋度,經過構建場景知識圖譜更好地刻畫用戶需求和供給。另外一方面咱們會探索場景化的套餐搭配:目前咱們在場景化套餐搭配方面的工做較少,並且用戶在不一樣場景下會有不一樣的套餐需求,例如天氣寒冷偏心吃火鍋類套餐、臘八節吃粥類套餐,在異地但願吃當地特點類套餐。接下來,咱們會在場景化套餐搭配方面進行探索,針對節氣、節日、人羣等場景搭配套餐,更好的知足用戶個性化、場景化的用餐需求。
瑞玉、文斌、楊林、懋地,均來自美團外賣技術團隊。
閱讀美團技術團隊更多技術文章合集
前端 | 算法 | 後端 | 數據 | 安全 | 運維 | iOS | Android | 測試
| 在公衆號菜單欄對話框回覆【2020年貨】、【2019年貨】、【2018年貨】、【2017年貨】等關鍵詞,可查看美團技術團隊歷年技術文章合集。
| 本文系美團技術團隊出品,著做權歸屬美團。歡迎出於分享和交流等非商業目的轉載或使用本文內容,敬請註明「內容轉載自美團技術團隊」。本文未經許可,不得進行商業性轉載或者使用。任何商用行爲,請發送郵件至tech@meituan.com申請受權。