飛豬旅行場景下的實時用戶理解服務
一、飛豬旅行用戶理解服務架構
1、旅行行為特點與用戶行為模式
旅行行業(yè)結構具有低頻性、時空屬性和周期性三大特點。
① 低頻性是指大多數用戶每年出去旅行的次數是非常少的;
② 時空屬性是指一般用戶在不同的時間會選擇去不同的地點,比如三月份大多數人會喜歡去武漢看櫻花,元旦或者春節(jié)很多用戶會選擇去三亞過冬;
③ 周期性是指用戶在周末時喜歡周邊游,小長假時會喜歡遠途游。
與傳統(tǒng)的商品推薦不一樣,旅行場景下用戶行為包括:
① 行前規(guī)劃,比如在出行前一周去做相應的一些規(guī)劃。
② 行程安排,是多元的,包含交通、酒店,以及吃喝玩樂等度假商品。
③ 行中履約,指到達目的地后的酒店履約、門票核銷等。
④ 最后是行后反饋,當用戶從旅游地回來以后會對旅游地有一些想法,比如喜歡的話下次還會去。
基于這些旅行行業(yè)的用戶特點,用戶在飛豬 APP 從進入到離開的在線行為模式無非是三種鏈路:一種是用戶意圖比較明確,一般會去搜索,再去找他想要的東西;第二種是用戶通過 APP 上一些導航的小工具欄點擊請求;第三種是閑逛的用戶,會在首頁猜你喜歡去找自己感興趣的東西,跳到詳情頁然后進行點擊,滾動,或者進行收藏、加購和購買的等行為。
2、RTUS 演變背景
早期基于用戶行為模式,我們抽取了一套統(tǒng)一的實時特征服務中心,簡稱 RTFS。
最底層通過多端(飛豬端、淘寶端、包括早期的支付寶端的飛豬場景)、多場景(機票、酒店、度假等)的一些底層日志(搜索日志、點擊日志、購物車加購、收藏日志和下單日志)收集起來,定義了統(tǒng)一的一套用戶行為 Schema。
用戶行為 Schema 主要包括這樣幾個字段:行為用戶的 user_id,行為類型 bhv_type,行為時間 bhv_time,行為對應的 id,行為對象的類型 biz_type,以及行為對象的一些額外信息 extra_info,比如用戶在某個時間點搜索了某個內容,包括了一些額外信息,比如 city 信息,類目信息,或時間信息等等。
這是我們早期統(tǒng)一的一套用戶的實時行為特征服務中心,基于用戶實時的統(tǒng)一特征服務中心,下游業(yè)務會做一些用戶理解。
傳統(tǒng)的方法是基于用戶實時的行為,根據統(tǒng)一的 Schema 信息,各個場景會去查 RTFS,每個場景去做用戶的理解和建模。傳統(tǒng)方案的弊端是每個場景都要重復去基于底層數據去計算用戶的偏好或興趣,比較浪費資源,每個場景都會花二三十毫秒去計算用戶的興趣點,整體存在一些問題。
后面我們基于 RTFS 統(tǒng)一去做用戶理解中心,簡稱 RTUS,把所有場景做的工作進行統(tǒng)一收尾。根據底層的 RTFS 數據,我們可以去做用戶的興趣理解,包括出行意圖預測等,同時提供顯式和隱式的表達場景,最終把用戶多方面、多維度的興趣理解或者是意圖預測存到實時 IGRAPH 數據庫里面。下游各個場景如果需要用戶各個維度理解的時候,直接去調用接口去查詢。一方面實現了數據復用,模型復用,同時節(jié)省了性能開銷。
3、RTUS 如何實現多鏈路融合
整體來說,飛豬底層用戶行為數據分為多個鏈路收集。包括 mtop 服務端的日志、ut 客戶端日志 ut/walle 專鏈數據。不同的鏈路數據存在不同特點,像服務端的日志,因為服務端直接上報,時延為 2-3 秒,但可能存在數據丟失或重復數據;ut 客戶端的數據,因為是客戶端用戶真實行為直接上報的數據,上報時延會比較長,但準確性比較高;還有專鏈數據,上報更快,但整體各個場景覆蓋面不會特別全。
RTUS 對各個鏈路的數據做了異步融合。把每個鏈路收集的數據,統(tǒng)一規(guī)范成 Schema,有了統(tǒng)一的數據鏈路后,后鏈路就可以拿到既準確又高時效的用戶行為數據。
4、RTUS 如何實現數據和模型復用
以目的地的偏好預測為例介紹如何實現數據和模型的復用。
進行用戶的目的地偏好分或者是目的地偏好向量預測,一部分是通過離線的 ODPS 數據,全量回流至 IGraph 的全量數據,另外一部分數據是用戶實時的目的地行為數據,通過 Blink 或者是 Porsche,以增量方式匯總到離線數據中去作為整體的輸入。
傳統(tǒng)的方式如藍色部分所示,每個場景發(fā)生了請求時,都會觸發(fā)各個業(yè)務場景的同步計算。新的 RTUS 當用戶有任何一次行為觸發(fā)時,一方面數據融合與傳統(tǒng)方式相同,但是有任何用戶請求觸發(fā)時,我們會直接去查用戶行為數據,異步去調用打分模型去預估用戶的人工偏好。整體打完分以后,會把打完的分實時更新到數據庫里面。有業(yè)務場景來的時候,直接去查打好分的表就好了,實現了統(tǒng)一的用戶目的地偏好預測,各方場景都統(tǒng)一去使用,實現了模型的復用。
5、RTUS 整體架構
RTUS 用戶理解服務架構整體如上圖所示。
最底層是實時的公共層,包括了用戶的瀏覽、點擊、加購、收藏、購買、關注、領券和核銷等最底層的日志。
經過?特征處理層,會把最底層的行為日志進行規(guī)范化、標準化、聚合化,同時會關聯用戶行為對象的屬性,包括商品詳情,交通行程,酒店的一些屬性信息。通過實時特征層處理,會得到用戶 LBS 狀態(tài)特征、用戶的行為序列特征、用戶的行為統(tǒng)計特征、商品認知標簽特征、商品屬性特征、頁面模塊統(tǒng)計特征。
再往上——用戶表達層,是基于結構化特征加工層去做一些算法模型。包括:用戶的長短期偏好預測;用戶的實時意圖,包括 POI 意圖,價格意圖預測等;用戶的需求理解,是否有復購需求,或者是否搭配需求;用戶的行程表征;人群的興趣表征等,是我們算法核心的實時計算。
最上面一層,是算法層的輸出。包括顯式和隱式向量的一些表達,這些表達都會存在實時引擎的數據庫里面。
上游業(yè)務場景使用的時候可以根據自己的需求,直接查詢到用?戶的意圖向量、興趣向量或行程向量。下面會重點介紹藍色用戶表達層,即飛豬旅行用戶理解算法的一些相關實踐工作,這塊工作沉積了三篇頂會文章。
二、飛豬旅行用戶理解算法實踐
1、冷啟動用戶興趣表征
(1)問題背景
冷啟動用戶興趣表征,是發(fā)表在 AAAI 2022 年會議上的一篇文章。
前文中介紹了旅行場景其實是非常低頻的需求,大多數用戶一年出去一兩次,每次出去買的東西一般是比較聚焦的,一般包括交通或酒店或度假商品,導致整體用戶行為比較稀疏。因此在該場景下,用戶冷啟動是非常嚴峻的問題。
統(tǒng)計數據發(fā)現過去三年,只有一個商品行為的用戶有 35%。也就是說過去三年有 35% 的用戶都是基本上沒有行為或者只有一個商品行為,過去 30 天的統(tǒng)計數據發(fā)現 58% 的用戶只有 1-5 個商品行為。如何對無行為或行為商品少的用戶進行推薦是我們面臨一個挑戰(zhàn)。
?但旅行場景下時空興趣非常明顯,比如一般用戶,在不同的時間點,不同的地點有一些熱門玩法。例如每年元旦或者春節(jié)時,很多人會去三亞,每年三月份很多人會去武漢看櫻花,北京的用戶每年九月到十二月會去看楓葉。即不同的時間點,全國各地會有不同的一些熱門地點,用戶時空興趣,隨著時間和位置發(fā)生變化。
第二個特點是用戶具有一些群體興趣。比如一般親子用戶更傾向于去一些娛樂場所,旅行傾向于自由行,而對老年人用戶則更傾向于去跟團,情侶用戶也是傾向于自由行,還傾向于去一些浪漫一點的景點,即不同的群體興趣偏好不同。
第三個特點是用戶具有一些周期性的行為偏好。有些用戶短期一年內沒有?行為,但歷史過去幾年有一些周期性的行為。比如有些親子用戶,每年暑假會帶小孩去迪士尼樂園,還有些用戶每年都會去三亞過冬。
另一方面的場景特點體現在用戶的行為特點里。比如用戶會隨著旅行規(guī)劃的決策狀態(tài),行為也會有比較大的差異。根據定義,將用戶的行為狀態(tài)劃分為多種:從靜默期,到瀏覽期,到種草,有了明確目的地或者興趣后,會進入決策期,最后會聚焦到商品去進行購買。即用戶的行為隨著用戶的決策狀態(tài)發(fā)生不同的變化,是一個從發(fā)散到收斂的過程。
?另外用戶的行為也會隨著 LBS 狀態(tài)發(fā)生變化。位置狀態(tài)分為三個:行前、行中和行后。行前更聚焦多個景點;行中會聚焦目的地用戶所在的 LBS 周圍的景點;行后如果是遠途旅游的話,短期內不會再去這個地點。
基于這些特點,我們提出了多方面興趣表征的推薦網絡。該網絡主要包括:用戶當前的興趣表征輸入模塊,多方面興趣抽取模塊和用戶旅行的狀態(tài)模塊。
最終基于旅行的狀態(tài),從多方面興趣模塊中抽取出來和其?旅行狀態(tài)對應的興趣。同樣基于用戶當前 Session 內的行為興趣,也會從多方面興趣模塊交叉學習,抽取出用戶歷史興趣相關的一些興趣作為融合。最終將用戶的單方面興趣、多方面興趣以及狀態(tài)角色興趣,作為融合作為最后的冷啟動用戶的表征輸出。
(2)SMINet Model
目前定義了五個多方面興趣抽取器,其輸入是多方面興趣的商品集合。這五個多方面興趣商品集合包括:時空行為的商品集合,群體商品集合,用戶周期性商品集合,用戶長期行為的商品集合,以及用戶短期行為的商品集合。
基于全量用戶的全量歷史行為,不同的 query 可以檢索出 Top-k 的 Item 作為集合的表征。如時空行為的興趣抽取,首先輸入時空的商品集合,query 是時間和空間,比如武漢、三月,從全量用戶行為商品里面抽取出銷量最高的一些商品作為武漢、三月時空興趣的集合。得到商品集合后,經過 Embedding 層得到編碼向量,再經過 Multi-Head Attention 最終得到時空的興趣表征。
其他的興趣表征過程和時空興趣表征類似,都是通過 query 抽取 Top 銷量的商品集合,再經過編碼層、聚合層等到興趣表征。
?除此以外,還要結合用戶當前 Session 的行為。這里借鑒了傳統(tǒng)經驗 GRU 網絡并做了一些改進,因為我們認為用戶當前行為序列中的最近一次行為的商品,最能表現用戶當前的興趣,即用戶對某個商品的興趣隨時間衰減。
基于上述思路,在 GRU 網絡中引入 Time Aware 模塊, 主要加強用戶最近一次行為商品的興趣重要度。一般傳統(tǒng) GRU 會輸出 h1-ht 多個狀態(tài)的隱向量,這里每個隱向量的重要度 β 是不一樣的。β 為行為商品的重要度隨時間距離單向衰減。最終當前 Session 的表征包括:GRU 網絡最后狀態(tài)的輸出,每個狀態(tài)的輸出均值,引入時間衰減的表征的最終融合。?
最后,通過 Co-Attention 網絡和用戶多方面的興趣做交叉學習。最終得到當前興趣和多方面興趣交叉后的興趣表征。
用戶的旅行狀態(tài)會從多方面的興趣里抽取出旅行狀態(tài)對應的興趣。基于旅行的狀態(tài)從多方面興趣里抽取出對應的一些興趣網絡。藍色部分為 Travel State Aware 的門控網絡,通過門控網絡從多方面興趣抽取狀態(tài)表征,根據每個興趣的重要度做加權融合得到最終的興趣表征。
最終把當前 Session 表征以及狀態(tài)選擇的表征做融合,作為用戶最終的輸出。這是整體的網絡結構,損失函數是交叉熵損失函數。
在線 Serving 時,是把多方面的興趣存在 kv 的數據庫中,key 為之前所描述的 query,如時空、群體等,Value 為向量表征。
(3)實驗結果
在飛豬和公開數據集上的實驗測試表明,與經典統(tǒng)計模型,序列模型,圖模型和交叉網絡的方法進行比較,整體在 Recall 和 MRR 指標上都遠高于之前模型。
消融實驗表明,移除用戶的短期興趣,效果下降最多;此外加入時空興趣可以帶來比較好的結果;另外拉長用戶的長期的行為數據,也會帶來收益。當前 Session 和旅行狀態(tài)的興趣表征的融合也帶來了效果提升。
上圖為 travel state-aware 層的重要度,顏色越深表示越重要。橫坐標是不同的五種興趣,縱坐標是用戶行為多少。行為較少的用戶時空興趣的重要度越強,用戶短期的興趣行為整體都比較重要。
線上在全量用戶和冷啟動用戶上都進行了實驗來看效果,冷啟動用戶的效果提升更加明顯。
2、用戶出行意圖預測
(1)問題背景
用戶的出行意圖預測工作已被 CIKM2022 年會議收錄。背景是以營銷業(yè)務場景為載體,進行用戶出行意圖預測。為了讓有旅行意圖的用戶,從手淘或者支付寶導航欄的入口跳轉到飛豬,會做一些營銷文案。會根據用戶的不同意圖,去做一些營銷文案來引導用戶跳轉。另外會發(fā) push 信息,告訴用戶周邊好玩的景點,或者回家應該買哪個車次等。
目前根據用戶行為距離遠近和頻次兩個維度將具體的旅行場景意圖分為八種。通過整體數據分析,60% 的用戶是在本地,40% 的用戶分布在其他的一些意圖上。不同的顏色代表不同的節(jié)假日或者日常,在不同的時間用戶的出行意圖不一樣。
基于上述背景可以拿到用戶歷史在不同的節(jié)假日的一些出行數據。分析發(fā)現這些數據也有時空的周期性,比如每年元旦都是出去玩,每年的春節(jié)都會回老家等,包括在小粒度上,比如每周或者每個月的一些周期數據。此外,還有前后周期的關聯性,比如中秋回老家,那國慶就不回老家了。
(2)DCIEN Model
?基于這些特點,提出了雙通道周期演變的意圖預測網絡。一方面結合了用戶的在線行為序列,另一方面結合了用戶的離線行為意圖序列。
整體網絡的輸入包括:用戶的 Profile 信息,上下文產品信息(時間、位置等),離線數據(過去三年的結構化為節(jié)假日和星期的兩個矩陣數據),在線的用戶行為序列和未來的意圖。?
離線數據中,有兩個用戶線下位移意圖,分別是節(jié)假日和周一到周天的位移意圖。通過設計多種大小的卷積核(2x2、1x7 等),得到節(jié)假日和近期的模板 pattern,再通過模板 pattern 挖掘用戶的周期表征。
將用戶的周期表征引入到用戶的在線行為序列中,提出 periodic-aware 興趣演變模式。通過兩層 GRU 網絡,把周期性的興趣演變計算出來。第一層通過序列輸入得到隱狀態(tài),接下來在隱狀態(tài)上拼接提取出的離線位移表征得到周期性的 Pattern 表征,作為第二層 GRU 的輸入最終得到用戶周期演變的興趣表征。通過 Target Intent 的輸入和 Attention 機制可以得到興趣里哪個跟 Target Intent 最重要,做加權 Pooling 最終得到整體的興趣輸出。
(3)實驗結果
和傳統(tǒng)經典方法比如 DSIN、DMSN 相比,我們提出的 DCIEN 方法效果更優(yōu)。
分析原因認為,該方法主要考慮了 Session 內興趣行為的抽取。DMSN 也是我們團隊早期提出的方法,主要是采用 Deep Model 挖掘時空的意圖,通過 CNN 和 RNN 進行抽取,因為重點考慮了用戶的周期pattern,所以效果比傳統(tǒng)電商的 DIN 和 DSIN 要好。DCIEN 方法效果最優(yōu)的原因一是采用了離線數據去抽取歷史 pattern,二是將離線 pattern 融合到在線行為序列建模中。
消融實驗可見 DCIEN 的效果是 0.719,去掉離線的序列效果下降至 0.69;去掉在線的序列效果下降更加明顯至 0.66;去掉在線離線的交叉計算,效果下降至 0.713;去掉時空 pattern,用 MLP 網絡代替,效果下降至 0.711。消融實驗表明 DCIEN 中的各個網絡模塊都對最終效果有正向作用。
線上實驗表明模型在營銷場景和猜你喜歡上,都對 CTR 有正向影響。
舉例來說,一個用戶定位在杭州,一般會推附近的三公里內的,也有遠處周邊的一些景點。加入意圖預測模塊,如果是外地遠途來杭州的人,會更聚焦推薦杭州所在景點附近的一些景點;如果是杭州本地人,會推薦一些周邊的景點。結合意圖預測,推薦會更加精準和聚焦。
3、用戶出行目的地預測
(1)問題背景
用戶目的地預測也是意圖預測的一種,為直接判斷用戶去哪個城市,工作發(fā)表在 SIGIR2022 的會議上。
該業(yè)務的大背景和上面兩項工作的背景相似,一是用戶旅行需求比較低頻,二是早期的一些目的地預測的文章沒有考慮到線下的一些位移數據,傳統(tǒng)的電商推薦一般只考慮用戶在線行為序列。然而旅行是一個線上行為到線下旅行的過程,除了線上行為以為,線下去過哪些城市也是非常重要的。
基于場景的特點,通過數據分析發(fā)現用戶去不同的城市也呈現周期性。比如周末去的地方和短假或長假去的地方不太一樣。如上圖的左圖橫坐標是不同時間的假期,縱坐標是用戶出行的次數,一般長假出去次數比較少,周末出行的次數較多。右圖的橫坐標是距離的范圍,縱坐標是出行次數占比概率,可以看出遠途旅行相較于距離較短的目的地占比較低。
(2)OOPIN Model
?基于上述特點,提出離線和在線融合的目的地預測的網絡。整體網絡的輸入包括離線和在線兩大塊。
離線的同樣把用戶線下去過的城市結構化成矩陣 pattern,再融合在線行為序列,對離線和在線的行為做融合,最終得到當前的興趣演變過程。?
離線模塊是將用戶歷史去過哪些城市結構化成矩陣后,通過不同的卷積核可以得到時間空間的一些周期性的 pattern 來在離線興趣演變中使用。
將這些 pattern 融合輸入到離線行為的第二層 GRU 中,相當于把離線行為的城市經過一層 GRU 拼接后可以得到離線演變的周期興趣。
用戶線下去城市之前,在線也會有一些行為序列。通過 Distance Aware Attention 網絡得到在線可能去的城市。
計算邏輯為計算在線行為可能城市兩兩之間的距離,提取出主要的城市。比如,用戶要去云南旅行,可能去的城市包括昆明、麗江和大理多個城市等。這些城市之間有共同的特征,就算偶爾穿插了三亞或北京,但通過 Attention 網絡還是會聚焦到云南省,把其余的干擾因素丟棄,通過去除噪音得到在線行為序列中的更大范圍的核心目的地。用戶最終去云南的話,云南可以通過 Target Aware Attention,找出跟離線最接近的城市的表征。通過信息增益網絡做減法,可以得到用戶還想去三亞的信息。即將用戶在線行為過的城市信息里,減去他已經去過的城市信息,增益的信息作為一個新的序列輸出,作為用戶未來目的地意圖的預測。
(3)實驗結果
與傳統(tǒng)方法對比,OOPIN 效果是最優(yōu)的。
消融實驗表明,去掉在線行為后效果下跌最多至 0.1135。去掉信息增益后,效果也下跌到 0.1527,因為去掉信息增益網絡后,沒法學習額外的一些增益信息。去掉離線行為模塊后,效果也有明顯下降。
十天的在線實驗也表明,增加目的地預估加權融合商品的 CTR 預估作為最終的排序得分后,商品的 CTR 效果有提升。
三、問答環(huán)節(jié)
Q1:多方面興趣抽取的輸入是基于 query,可以理解是對輸入商品集合做一個 Embedding 嗎?
A1:這是全量用戶歷史的所有行為。比如提取時空興趣的話會去看三月、武漢所有銷量 Top 的商品集合作為表征得到隱向量作為武漢三月份的興趣表證。
因為這個是基于全量用戶歷史行為,如果直接去查詢,成本很高,所以我們會離線去做一次,來存在 kv 庫,線上服務是直接從數據庫中去查詢。
Q2:為什么用召回指標評價?
A2:用離線 AUC 也可以,召回指標也可以用,都是去衡量算法準確不準確。
Q3:意圖和目的地識別模塊中離線特征是如何更新的?
A3:拿目的地來說,離線特征是用戶過去三年去過哪些城市,雖然時間是三年,但用戶每年去過城市不多,平均不到 10 個,特別稀疏。每周會進行增量訓練,舉個例子不同的節(jié)假日比如今年的中秋,今年中秋到明年中秋期間這些特征基本上是不會變的,相當于有些特征是每月變一次,有些特征每年變一次,星期類的周期 T+1 更新計算就好了。根據特征的跨度不一樣,更新的周期不一樣。
Q4:時間衰減是怎么確定的?
A:一般 RNN 網絡沒有考慮用戶行為序列時間的衰減程度,我們引入 β 值,相當于時間的重要度系數,讓最近的行為重要度最高。經過 log 變化做一些平滑,重點是強調越新的商品,重要度越大,權重越大來融合加權。
Q5:多個鏈路埋點數據,重復數據怎么處理?怎么保證數據準確性?
A5:重點主要是解決新增的問題,重復的我們是有唯一的標識 key,也就是每一條記錄,如果三個鏈路里面都有,唯一的標識 key 一樣的話,就直接覆蓋掉了。
Q6:武漢三月是怎么確定出來的?是手動找每個維度去做交叉?
A6:是的,時空的話一般是城市,其實全國就兩三百個城市,12 個月,300x12 key 離線會去 group by 城市和月份做聚合。