深度召回在飛豬旅行推薦系統中的探索和實踐

陶然陶然發表於2023-01-29

   導讀:大家好,我是來自飛豬推薦演算法團隊的裡熙,今天給大家分享的是本團隊在飛豬首頁猜你喜歡推薦 Feeds 流的召回階段做的一些最佳化工作。

  今天的分享主要包括三個部分:第一部分是相關的一些背景介紹,第二部分是目前飛豬首猜線上主流的一些召回方法,第三部分是本團隊在飛豬首猜向量召回上做的一些實踐和最佳化點。

   01 背景介紹

  首先看一下應用的場景,飛豬首頁猜你喜歡是多物料混排的 Feeds 流場景,其中多物料包括商品、酒店、POI、影片內容、圖文內容等等。每種物料都是由對應的子場景來負責推薦的,主場景透過非同步呼叫的方式獲取每個子場景的推薦結果,混排之後得到最終的推薦結果。  

  推薦系統一般是由召回、粗排、精排等多個階段組成的。其中召回作為推薦系統的第一個環節,它的主要作用是在海量候選中快速篩選出使用者感興趣的內容,得到相對較小的候選集,從而縮小排序演算法的搜尋範圍。作為整個資訊漏斗的第一個漏斗,召回面臨的挑戰在於:需要在海量候選中快速篩選出使用者感興趣的內容,交給粗排層,在大力出奇跡的同時可以做到快而準。

  目前工業界普遍採用多路召回的方式,各召回策略之間保持一定的獨立性與互斥性,保證在各個鏈路並行召回的同時增加召回結果的多樣性。飛豬首猜使用的正是多路召回的方式,以飛豬首猜商品物料的召回為例,其中包括一些主流的、效果較好的 I2I 召回,一些偏泛化的屬性召回 ,一些富有航旅特色的地理位置召回及旅行狀態的召回,用於兜底的熱門召回,一些偏業務策略的冷啟動和保量機制,以及今天重點介紹的向量召回。  

  向量召回是透過學習 User 和 Item 的低維向量表徵,把召回問題建模成了向量空間的近鄰檢索問題,已經被大量證明可以提升召回結果的多樣性和泛化能力。下面將介紹本團隊在飛豬首猜向量召回的最佳化過程中遇到的一些問題和一些最佳化點。

   02 飛豬首猜向量召回演算法演進

  1. v1版-雙塔模型  

  我們的第一版向量召回模型是經典的雙塔模型,雙塔的設計解耦了 User 和 Item 的底層特徵交叉,可以在離線對所有的 Item 過一遍 Item 塔,得到 Item 的低維表徵。雙塔召回模型雖然犧牲了一定的精度,但速度快,能夠很好地勝任召回側的工作。

  以飛豬首猜的圖文內容的雙塔召回模型為例,在 User 塔中輸入的特徵包括:使用者的基本屬性特徵,使用者的歷史行為序列,以及上下文特徵。在行為序列的處理方式上,我們利用使用者的屬性特徵和上下文特徵拼接之後作為 Query,對使用者的歷史行為序列做了 User Attention,得到使用者的行為表徵向量。將該向量和其他特徵拼接之後一起輸入到 MLP 中,再經過歸一化之後,得到固定維度的 User Embedding。

  在內容塔中,除了內容的屬性特徵,統計效率特徵以外,還引入了內容所掛載的子物料的特徵。旅行內容掛載的子物料包括:商品、酒店和 POI,透過門控機制來控制不同子物料的特徵輸入。最終所有的特徵也是透過拼接之後輸入到 MLP 中,再經過歸一化後得到和 User Embedding 相同維度的內容 Embedding。在最後一層將歸一化之後的 User Embedding 和內容 Embedding 做內積計算,得到向量之間的相似度。

  在訓練模型時,如果採用精排思路,將點選的樣本作為正樣本,曝光未點選的樣本作為負樣本來訓練召回模型的話,訓練出來的模型和向量用於線上檢索時的效率是比較差的。因為召回面臨的是整個候選池的商品,而曝光樣本只是全量候選池中的部分子集。如果只拿曝光樣本來訓練召回模型的話,會面臨離線訓練和線上資料分佈不一致的問題,也就是常說的樣本選擇偏差問題。而召回裡負取樣的目的就是為了儘量符合線上的真實分佈。全域性隨機負取樣是經常用到的一種方法。在本團隊實驗中,取點選樣本作為正樣本,在全量候選池中等機率的抽樣來構造負樣本。  

  V1 版簡單的雙塔模型,在首猜的圖文子場景和影片子場景都進行了上線,可以看到線上兩個子場景的點選率都有比較明顯的提升。除此之外,本團隊還利用雙塔模型所產出的內容 Embedding 和 User Embedding 做了兩個附加的實驗。

  第一個附加實驗是基於雙塔模型所產出的內容 Embedding,基於向量的相似度計算了一路內容召回內容;第二個附加實驗是利用雙塔模型產出的 User Embedding 做了人群的聚類,線上增加了一路基於人群相似度的召回。可以看到這兩路召回也給我們的場景帶來了一定的點選率的提升。

  2. v2版-基於增強向量的雙塔互動模型  

  雙塔模型由於對 User 特徵和 Item 特徵進行了分離,導致雙塔模型難以引入 User 和Item 之間的交叉特徵。另外雙塔模型只有在 User Embedding 和 Item Embedding 在最後計算內積的時候才會發生互動,這種過晚的兩側特徵互動相比從網路底層就進行特徵交叉必然會帶來一定效果損失。  

  美團在這方面提出一種新的模型,透過在 User 塔和 Item 塔中分別引入增強向量來實現雙塔從底層就開始特徵互動,從而進一步提升 Base 雙塔模型的效果。在實現時,User 側的增強向量,實際上代表的是來自 Item 塔中與該 User 有過正向互動的所有 Item 的資訊;Item 側的增強向量,它代表的是來自 User 塔中與該 Item 有過正向互動的所有的 User 的資訊。增強向量實際上是透過擬合對應的 User 或 Item 在另一個塔中的所有的正樣本的輸出,來實現雙塔從底層就開始進行特徵交叉。  

  我們也在 V1 base 雙塔模型的基礎上引入 Item 側的增強向量和 User 側的增強向量。透過離線實驗效果發現引入 Item 側的增強向量,可以提升離線效果,但引入 User 側的增強向量並沒有拿到收益。分析原因可能是 User 側的增強向量,實際上代表的是使用者他所行為過的所有的 Item 的資訊,但在 Base 模型中,User 塔已經有了使用者的歷史行為序列,也就是說在引入 User 側的增強向量,並沒有引入額外增量資訊,反而引入了更多要學習的引數。最終,本團隊將 Item 側引入增強向量的模型在飛豬的圖文子場景進行了上線。可以看到相比第一版 Base 雙塔模型來說,線上的點選率也是有提升的。

  3. v3版-模型無感的無偏召回框架

  前面我們提到為了解決召回的樣本選擇偏差問題,我們是採用了全域性隨機負取樣的方式來構造負樣本,也就是在全量的候選集中等機率的抽樣來構造負樣本,且這些負樣本在訓練時也是被平等對待的。但是假如我們將取樣空間劃分成四個互斥部分,由內而外分別是:點選空間、曝光未點選空間、召回未曝光空間以及未召回空間。很顯然來自不同子空間的負樣本所承擔的重要性是不同的。以 A 空間-曝光未點選的樣本為例,由於這些樣本線上上的時候是經過召回、粗排、精排等階段層層篩選出來的,說明與使用者還是比較相關的,這些樣本相比於 B 空間或者 C 空間的樣本而言,並不是使用者特別不喜歡的。因此,召回模型有必要對這些負樣本進行有差別處理。

  基於上述思考,本團隊提出了模型無感的無偏召回框架,利用了因果推斷中的 IPW(Inverse Propensity Weighting)思想來對召回模型裡面的負樣本進行有差別處理,並利用多工學習方式來實現端到端訓練,該工作是 2022 年發表在 SIGIR 2022 上的一篇短文。  

  整個框架是由兩部分組成:左邊是主任務,它是模型無感的,可以是任意雙塔結構的向量召回模型。右邊是有兩個子任務構成的輔助網路,其中第一個子任務是用於預估全空間到召回空間的機率,它的訓練樣本是以召回未曝光的樣本作為正樣本,未召回的樣本作為負樣本來訓練的;第二個子任務是用於預估召回到曝光空間的機率,它是以曝光未點選的樣本作為正樣本,召回未曝光的樣本作為負樣本來進行訓練的。  

  接下來兩個子任務產出的機率會用於主任務中相應負樣本的去偏。以 B 空間中的負樣本為例, 也就是召回未曝光的樣本,我們會將主任務中召回未曝光的這些樣本的 loss 用子任務一產出的機率進行逆傾向加權,從而得到理論無偏的估計。同理也可以對 A 空間中曝光未點選的樣本,以相同方式來進行處理得到理論無偏估計。最後整個模型是以多工學習的方式實現端到端訓練的,它的 loss 由兩部分組成:一部分是雙塔模型裡面的交叉熵 loss,另一部分是兩個子任務的 loss。  

  由於目前沒有公開的做全空間召回負取樣的資料集,且我們需要用到“是否召回”與“是否曝光”等多個 lable,因此在離線實驗部分,本團隊基於飛豬場景的資料構建了召回資料集。離線實驗部分,對比目前主流的召回方法,可以發現在不同的取樣策略下,該方法都是可以得到離線最優效果。

  本團隊也將離線最好的一版召回模型在飛豬首猜的圖文子場景進行上線,在持續一週的線上實驗中,實驗組的點選率也是持續正向的,對比版本是前面我們提到的美團的 DAT 模型。  

  4. v4版-使用者旅行狀態感知的深度召回

  接下來要介紹的是我們小組 2022 年在 CIKM2022 上發表的,基於行業特色提出的深度召回模型。由於旅行是全鏈路多階段的服務,常常會用到旅行生命週期概念。我們基於人工定義的一些啟發式規則,把使用者的旅行生命週期劃分成四個不同的階段:種草,決策,行前和行中。

  當使用者行為比較發散時,定義使用者處於種草的階段;當使用者行為比較豐富,行為的商品主要集中在某個特定目的地時,認為使用者處於決策狀態;當使用者存在即將出發的行程時,認為使用者處於行前的狀態;當使用者的 LBS 發生位移,並且 LBS 所在地並不是使用者的常去地時,認為使用者處於行中狀態。

  很顯然在不同旅行狀態下,使用者的行為偏好,或者說使用者的需求是不同的。比如說,對於種草階段的使用者,他們往往會對一些全域性熱門的商品比較感興趣,行為也會比較發散。對於行中使用者,他們一般會對當地的一些景點或者美食比較感興趣,行為也比較集中。所以說,使用者的行為和使用者的旅行狀態是相互耦合的。一方面使用者的行為取決於使用者當時所處的狀態,另一方面我們也可以根據使用者的一些歷史行為來對使用者的狀態進行推斷。

  現有的大多數使用者建模的方法往往是從 Item 粒度來建模使用者的行為序列,而忽略了行為序列內部的一些上下文資訊,比如說前面所提到的使用者旅行狀態,也就無法建模出使用者的行為偏好隨著使用者狀態轉移發生的變化,導致召回的結果雖然與使用者存在一定相關性,但是它未必契合當時使用者所處的狀態。這裡我們在建模使用者的行為序列時,嘗試引入使用者的旅行狀態這一先驗知識來進一步提升雙塔模型中的使用者向量學習,並進一步提升召回結果的可解釋性。  

  整個模型的框架圖如下所示。本質上還是召回模型的雙塔結構,左邊是用於學習使用者向量的 User 塔,右邊是用於學習商品向量的 Item 塔。該工作主要的最佳化點是集中在左邊使用者塔的使用者建模上。

  首先引入狀態轉移機率預估模組預測使用者的下一個旅行狀態,然後透過多個不同的專家網路來學習不同狀態下使用者的不同表徵,再利用使用者狀態轉移機率向量,對不同狀態下的使用者表徵進行自適應的聚合,得到狀態增強的使用者表徵向量。最後將使用者向量和商品向量分別進行歸一化,透過內積來計算相似度。接下來,會具體講解每個模組的細節。  

  首先是狀態轉移機率預測模組。

  如前面所說,由於使用者的行為取決於使用者所處的狀態,因此在給使用者推薦商品的時候需要知道使用者的下一個狀態。但由於不同使用者的狀態轉移 pattern 是不同的,所以我們引入了狀態轉移機率預測模組來預測使用者的下一個可能狀態。由於使用者的狀態不僅跟使用者的歷史行為有關,還跟使用者的歷史狀態有關,這裡是將使用者的歷史點選序列和使用者的歷史狀態序列作為該模組的輸入,在對兩個序列處理時,首先根據狀態將使用者的歷史行為序列劃分成一個個子集,透過 Mean Pooling 的方式對子集內部的行為向量進行聚合,然後將聚合之後的行為向量和對應的狀態向量進行拼接得到了狀態增強的行為表徵序列。

  接下來,透過 Self-attention 捕捉不同狀態之間的相互依賴。

  最後,透過 softmax 來預測不同狀態下的機率。該模組它本質上是建模了多分類的問題,對應的類別是我們的四種不同的旅行狀態。  

  第二個模組是狀態差異化的使用者編碼模組。

  透過捕捉狀態內部的行為依賴來學習不同狀態下不同的使用者表徵。首先我們認為不同的使用者屬性,它在不同狀態下所貢獻的重要程度是不同的。利用狀態轉移機率預測模組產出狀態轉移向量,對使用者的屬性特徵進做 Feature Level 的 attention 計算,來建模不同狀態下不同屬性特徵的不同重要性。利用 self-attentation 模組對行為序列部分進行處理,來建模序列內部的依賴關係。接下來會將使用者的屬性特徵和使用者的行為表徵向量拼接作為上面四個專家網路的輸入,每個專家網路分別對應某一種特定的狀態,因此能學習不同狀態下不同的 User Embedding。  

  為了監督專家網路的學習,我們引入了四個輔助 loss。每一個專家網路所產出的 User Embedding 會和 Item 塔所產出 Item Embedding 做內積來計算相似度。最後,基於狀態轉移機率向量對四個不同狀態下的 User Embedding 做自適應聚合,從而得到狀態增強的 User Embedding。

  將 User Embedding 和 Item Embedding 分別做歸一化,透過內積可以計算兩個向量之間的相似度。整個模型的 Loss 由三部分組成:一部分是第一個模組的狀態轉移機率預估模組的多分類 Loss;第二個是雙塔模型的交叉熵 Loss;第三部分是四個專家網路的輔助 Loss。整個模型是用端到端的方式聯合訓練的。  

  由於我們是召回的模型,在樣本部分,取觀測到的點選樣本作為正樣本,負樣本用全域性隨機負取樣的方式得到。離線實驗部分,分別在飛豬內部場景的資料和淘寶公開的推薦資料集都做了對比實驗。

  在飛豬資料集裡,將使用者的旅行生命週期的四個階段當作使用者的四種狀態。在淘寶推薦資料集中,將點選收藏加購購買四種行為當作四種狀態。在兩個資料集上對比了一些基於序列表徵的召回模型,我們提出的方法都取得了最好的效果。另外,我們也做了大量的消融實驗,來驗證每個模組的有效性,具體的實驗細節可以去看論文。最後我們也在飛豬首猜的商品物料上上線了這版商品召回,在持續一週實驗中點選率是穩定正向的。  

  右邊是我們隨機抽樣的兩個使用者的向量召回的結果。上面使用者是 LBS 在杭州,狀態處於行中的使用者,其向量召回結果主要集中在杭州以及杭州周邊城市的一些商品;下面使用者同樣是 LBS 在杭州,但狀態是行前,其向量召回結果在城市粒度上就會比較發散。說明使用者旅行狀態感知的深度召回模型,透過引入使用者狀態這一先驗知識可以很好區分使用者在不同狀態下的不同行為偏好, 同時也說明我們提出的模型具有一定可解釋性。  

來自 “ DataFunTalk ”, 原文作者:樓佳珍;原文連結:http://server.it168.com/a2023/0129/6787/000006787436.shtml,如有侵權,請聯絡管理員刪除。

相關文章