一、飞猪旅行用户理解服务架构
1、旅行行为特点与用户行为模式
旅行行业结构具有低频性、时空属性和周期性三大特点。
① 低频性是指大多数用户每年出去旅行的次数是非常少的;
② 时空属性是指一般用户在不同的时间会选择去不同的地点,比如三月份大多数人会喜欢去武汉看樱花,元旦或者春节很多用户会选择去三亚过冬;
③ 周期性是指用户在周末时喜欢周边游,小长假时会喜欢远途游。
与传统的商品推荐不一样,旅行场景下用户行为包括:
① 行前规划,比如在出行前一周去做相应的一些规划。
② 行程安排,是多元的,包含交通、酒店,以及吃喝玩乐等度假商品。
③ 行中履约,指到达目的地后的酒店履约、门票核销等。
④ 最后是行后反馈,当用户从旅游地回来以后会对旅游地有一些想法,比如喜欢的话下次还会去。
基于这些旅行行业的用户特点,用户在飞猪 APP 从进入到离开的在线行为模式无非是三种链路:一种是用户意图比较明确,一般会去搜索,再去找他想要的东西;第二种是用户通过 APP 上一些导航的小工具栏点击请求;第三种是闲逛的用户,会在首页猜你喜欢去找自己感兴趣的东西,跳到详情页然后进行点击,滚动,或者进行收藏、加购和购买的等行为。
2、RTUS 演变背景
早期基于用户行为模式,我们抽取了一套统一的实时特征服务中心,简称 RTFS。
最底层通过多端(飞猪端、淘宝端、包括早期的支付宝端的飞猪场景)、多场景(机票、酒店、度假等)的一些底层日志(搜索日志、点击日志、购物车加购、收藏日志和下单日志)收集起来,定义了统一的一套用户行为 Schema。
用户行为 Schema 主要包括这样几个字段:行为用户的 user_id,行为类型 bhv_type,行为时间 bhv_time,行为对应的 id,行为对象的类型 biz_type,以及行为对象的一些额外信息 extra_info,比如用户在某个时间点搜索了某个内容,包括了一些额外信息,比如 city 信息,类目信息,或时间信息等等。
这是我们早期统一的一套用户的实时行为特征服务中心,基于用户实时的统一特征服务中心,下游业务会做一些用户理解。
传统的方法是基于用户实时的行为,根据统一的 Schema 信息,各个场景会去查 RTFS,每个场景去做用户的理解和建模。传统方案的弊端是每个场景都要重复去基于底层数据去计算用户的偏好或兴趣,比较浪费资源,每个场景都会花二三十毫秒去计算用户的兴趣点,整体存在一些问题。
后面我们基于 RTFS 统一去做用户理解中心,简称 RTUS,把所有场景做的工作进行统一收尾。根据底层的 RTFS 数据,我们可以去做用户的兴趣理解,包括出行意图预测等,同时提供显式和隐式的表达场景,最终把用户多方面、多维度的兴趣理解或者是意图预测存到实时 IGRAPH 数据库里面。下游各个场景如果需要用户各个维度理解的时候,直接去调用接口去查询。一方面实现了数据复用,模型复用,同时节省了性能开销。
3、RTUS 如何实现多链路融合
整体来说,飞猪底层用户行为数据分为多个链路收集。包括 mtop 服务端的日志、ut 客户端日志 ut/walle 专链数据。不同的链路数据存在不同特点,像服务端的日志,因为服务端直接上报,时延为 2-3 秒,但可能存在数据丢失或重复数据;ut 客户端的数据,因为是客户端用户真实行为直接上报的数据,上报时延会比较长,但准确性比较高;还有专链数据,上报更快,但整体各个场景覆盖面不会特别全。
RTUS 对各个链路的数据做了异步融合。把每个链路收集的数据,统一规范成 Schema,有了统一的数据链路后,后链路就可以拿到既准确又高时效的用户行为数据。
4、RTUS 如何实现数据和模型复用
以目的地的偏好预测为例介绍如何实现数据和模型的复用。
进行用户的目的地偏好分或者是目的地偏好向量预测,一部分是通过离线的 ODPS 数据,全量回流至 IGraph 的全量数据,另外一部分数据是用户实时的目的地行为数据,通过 Blink 或者是 Porsche,以增量方式汇总到离线数据中去作为整体的输入。
传统的方式如蓝色部分所示,每个场景发生了请求时,都会触发各个业务场景的同步计算。新的 RTUS 当用户有任何一次行为触发时,一方面数据融合与传统方式相同,但是有任何用户请求触发时,我们会直接去查用户行为数据,异步去调用打分模型去预估用户的人工偏好。整体打完分以后,会把打完的分实时更新到数据库里面。有业务场景来的时候,直接去查打好分的表就好了,实现了统一的用户目的地偏好预测,各方场景都统一去使用,实现了模型的复用。
5、RTUS 整体架构
RTUS 用户理解服务架构整体如上图所示。
最底层是实时的公共层,包括了用户的浏览、点击、加购、收藏、购买、关注、领券和核销等最底层的日志。
经过特征处理层,会把最底层的行为日志进行规范化、标准化、聚合化,同时会关联用户行为对象的属性,包括商品详情,交通行程,酒店的一些属性信息。通过实时特征层处理,会得到用户 LBS 状态特征、用户的行为序列特征、用户的行为统计特征、商品认知标签特征、商品属性特征、页面模块统计特征。
再往上——用户表达层,是基于结构化特征加工层去做一些算法模型。包括:用户的长短期偏好预测;用户的实时意图,包括 POI 意图,价格意图预测等;用户的需求理解,是否有复购需求,或者是否搭配需求;用户的行程表征;人群的兴趣表征等,是我们算法核心的实时计算。
最上面一层,是算法层的输出。包括显式和隐式向量的一些表达,这些表达都会存在实时引擎的数据库里面。
上游业务场景使用的时候可以根据自己的需求,直接查询到用户的意图向量、兴趣向量或行程向量。下面会重点介绍蓝色用户表达层,即飞猪旅行用户理解算法的一些相关实践工作,这块工作沉积了三篇顶会文章。
二、飞猪旅行用户理解算法实践
1、冷启动用户兴趣表征
(1)问题背景
冷启动用户兴趣表征,是发表在 AAAI 2022 年会议上的一篇文章。
前文中介绍了旅行场景其实是非常低频的需求,大多数用户一年出去一两次,每次出去买的东西一般是比较聚焦的,一般包括交通或酒店或度假商品,导致整体用户行为比较稀疏。因此在该场景下,用户冷启动是非常严峻的问题。
统计数据发现过去三年,只有一个商品行为的用户有 35%。也就是说过去三年有 35% 的用户都是基本上没有行为或者只有一个商品行为,过去 30 天的统计数据发现 58% 的用户只有 1-5 个商品行为。如何对无行为或行为商品少的用户进行推荐是我们面临一个挑战。
但旅行场景下时空兴趣非常明显,比如一般用户,在不同的时间点,不同的地点有一些热门玩法。例如每年元旦或者春节时,很多人会去三亚,每年三月份很多人会去武汉看樱花,北京的用户每年九月到十二月会去看枫叶。即不同的时间点,全国各地会有不同的一些热门地点,用户时空兴趣,随着时间和位置发生变化。
第二个特点是用户具有一些群体兴趣。比如一般亲子用户更倾向于去一些娱乐场所,旅行倾向于自由行,而对老年人用户则更倾向于去跟团,情侣用户也是倾向于自由行,还倾向于去一些浪漫一点的景点,即不同的群体兴趣偏好不同。
第三个特点是用户具有一些周期性的行为偏好。有些用户短期一年内没有行为,但历史过去几年有一些周期性的行为。比如有些亲子用户,每年暑假会带小孩去迪士尼乐园,还有些用户每年都会去三亚过冬。
另一方面的场景特点体现在用户的行为特点里。比如用户会随着旅行规划的决策状态,行为也会有比较大的差异。根据定义,将用户的行为状态划分为多种:从静默期,到浏览期,到种草,有了明确目的地或者兴趣后,会进入决策期,最后会聚焦到商品去进行购买。即用户的行为随着用户的决策状态发生不同的变化,是一个从发散到收敛的过程。
另外用户的行为也会随着 LBS 状态发生变化。位置状态分为三个:行前、行中和行后。行前更聚焦多个景点;行中会聚焦目的地用户所在的 LBS 周围的景点;行后如果是远途旅游的话,短期内不会再去这个地点。
基于这些特点,我们提出了多方面兴趣表征的推荐网络。该网络主要包括:用户当前的兴趣表征输入模块,多方面兴趣抽取模块和用户旅行的状态模块。
最终基于旅行的状态,从多方面兴趣模块中抽取出来和其旅行状态对应的兴趣。同样基于用户当前 Session 内的行为兴趣,也会从多方面兴趣模块交叉学习,抽取出用户历史兴趣相关的一些兴趣作为融合。最终将用户的单方面兴趣、多方面兴趣以及状态角色兴趣,作为融合作为最后的冷启动用户的表征输出。
(2)SMINet Model
目前定义了五个多方面兴趣抽取器,其输入是多方面兴趣的商品集合。这五个多方面兴趣商品集合包括:时空行为的商品集合,群体商品集合,用户周期性商品集合,用户长期行为的商品集合,以及用户短期行为的商品集合。
基于全量用户的全量历史行为,不同的 query 可以检索出 Top-k 的 Item 作为集合的表征。如时空行为的兴趣抽取,首先输入时空的商品集合,query 是时间和空间,比如武汉、三月,从全量用户行为商品里面抽取出销量最高的一些商品作为武汉、三月时空兴趣的集合。得到商品集合后,经过 Embedding 层得到编码向量,再经过 Multi-Head Attention 最终得到时空的兴趣表征。
其他的兴趣表征过程和时空兴趣表征类似,都是通过 query 抽取 Top 销量的商品集合,再经过编码层、聚合层等到兴趣表征。
除此以外,还要结合用户当前 Session 的行为。这里借鉴了传统经验 GRU 网络并做了一些改进,因为我们认为用户当前行为序列中的最近一次行为的商品,最能表现用户当前的兴趣,即用户对某个商品的兴趣随时间衰减。
基于上述思路,在 GRU 网络中引入 Time Aware 模块, 主要加强用户最近一次行为商品的兴趣重要度。一般传统 GRU 会输出 h1-ht 多个状态的隐向量,这里每个隐向量的重要度 β 是不一样的。β 为行为商品的重要度随时间距离单向衰减。最终当前 Session 的表征包括:GRU 网络最后状态的输出,每个状态的输出均值,引入时间衰减的表征的最终融合。
最后,通过 Co-Attention 网络和用户多方面的兴趣做交叉学习。最终得到当前兴趣和多方面兴趣交叉后的兴趣表征。
用户的旅行状态会从多方面的兴趣里抽取出旅行状态对应的兴趣。基于旅行的状态从多方面兴趣里抽取出对应的一些兴趣网络。蓝色部分为 Travel State Aware 的门控网络,通过门控网络从多方面兴趣抽取状态表征,根据每个兴趣的重要度做加权融合得到最终的兴趣表征。
最终把当前 Session 表征以及状态选择的表征做融合,作为用户最终的输出。这是整体的网络结构,损失函数是交叉熵损失函数。
在线 Serving 时,是把多方面的兴趣存在 kv 的数据库中,key 为之前所描述的 query,如时空、群体等,Value 为向量表征。
(3)实验结果
在飞猪和公开数据集上的实验测试表明,与经典统计模型,序列模型,图模型和交叉网络的方法进行比较,整体在 Recall 和 MRR 指标上都远高于之前模型。
消融实验表明,移除用户的短期兴趣,效果下降最多;此外加入时空兴趣可以带来比较好的结果;另外拉长用户的长期的行为数据,也会带来收益。当前 Session 和旅行状态的兴趣表征的融合也带来了效果提升。
上图为 travel state-aware 层的重要度,颜色越深表示越重要。横坐标是不同的五种兴趣,纵坐标是用户行为多少。行为较少的用户时空兴趣的重要度越强,用户短期的兴趣行为整体都比较重要。
线上在全量用户和冷启动用户上都进行了实验来看效果,冷启动用户的效果提升更加明显。
2、用户出行意图预测
(1)问题背景
用户的出行意图预测工作已被 CIKM2022 年会议收录。背景是以营销业务场景为载体,进行用户出行意图预测。为了让有旅行意图的用户,从手淘或者支付宝导航栏的入口跳转到飞猪,会做一些营销文案。会根据用户的不同意图,去做一些营销文案来引导用户跳转。另外会发 push 信息,告诉用户周边好玩的景点,或者回家应该买哪个车次等。
目前根据用户行为距离远近和频次两个维度将具体的旅行场景意图分为八种。通过整体数据分析,60% 的用户是在本地,40% 的用户分布在其他的一些意图上。不同的颜色代表不同的节假日或者日常,在不同的时间用户的出行意图不一样。
基于上述背景可以拿到用户历史在不同的节假日的一些出行数据。分析发现这些数据也有时空的周期性,比如每年元旦都是出去玩,每年的春节都会回老家等,包括在小粒度上,比如每周或者每个月的一些周期数据。此外,还有前后周期的关联性,比如中秋回老家,那国庆就不回老家了。
(2)DCIEN Model
基于这些特点,提出了双通道周期演变的意图预测网络。一方面结合了用户的在线行为序列,另一方面结合了用户的离线行为意图序列。
整体网络的输入包括:用户的 Profile 信息,上下文产品信息(时间、位置等),离线数据(过去三年的结构化为节假日和星期的两个矩阵数据),在线的用户行为序列和未来的意图。
离线数据中,有两个用户线下位移意图,分别是节假日和周一到周天的位移意图。通过设计多种大小的卷积核(2x2、1x7 等),得到节假日和近期的模板 pattern,再通过模板 pattern 挖掘用户的周期表征。
将用户的周期表征引入到用户的在线行为序列中,提出 periodic-aware 兴趣演变模式。通过两层 GRU 网络,把周期性的兴趣演变计算出来。第一层通过序列输入得到隐状态,接下来在隐状态上拼接提取出的离线位移表征得到周期性的 Pattern 表征,作为第二层 GRU 的输入最终得到用户周期演变的兴趣表征。通过 Target Intent 的输入和 Attention 机制可以得到兴趣里哪个跟 Target Intent 最重要,做加权 Pooling 最终得到整体的兴趣输出。
(3)实验结果
和传统经典方法比如 DSIN、DMSN 相比,我们提出的 DCIEN 方法效果更优。
分析原因认为,该方法主要考虑了 Session 内兴趣行为的抽取。DMSN 也是我们团队早期提出的方法,主要是采用 Deep Model 挖掘时空的意图,通过 CNN 和 RNN 进行抽取,因为重点考虑了用户的周期pattern,所以效果比传统电商的 DIN 和 DSIN 要好。DCIEN 方法效果最优的原因一是采用了离线数据去抽取历史 pattern,二是将离线 pattern 融合到在线行为序列建模中。
消融实验可见 DCIEN 的效果是 0.719,去掉离线的序列效果下降至 0.69;去掉在线的序列效果下降更加明显至 0.66;去掉在线离线的交叉计算,效果下降至 0.713;去掉时空 pattern,用 MLP 网络代替,效果下降至 0.711。消融实验表明 DCIEN 中的各个网络模块都对最终效果有正向作用。
线上实验表明模型在营销场景和猜你喜欢上,都对 CTR 有正向影响。
举例来说,一个用户定位在杭州,一般会推附近的三公里内的,也有远处周边的一些景点。加入意图预测模块,如果是外地远途来杭州的人,会更聚焦推荐杭州所在景点附近的一些景点;如果是杭州本地人,会推荐一些周边的景点。结合意图预测,推荐会更加精准和聚焦。
3、用户出行目的地预测
(1)问题背景
用户目的地预测也是意图预测的一种,为直接判断用户去哪个城市,工作发表在 SIGIR2022 的会议上。
该业务的大背景和上面两项工作的背景相似,一是用户旅行需求比较低频,二是早期的一些目的地预测的文章没有考虑到线下的一些位移数据,传统的电商推荐一般只考虑用户在线行为序列。然而旅行是一个线上行为到线下旅行的过程,除了线上行为以为,线下去过哪些城市也是非常重要的。
基于场景的特点,通过数据分析发现用户去不同的城市也呈现周期性。比如周末去的地方和短假或长假去的地方不太一样。如上图的左图横坐标是不同时间的假期,纵坐标是用户出行的次数,一般长假出去次数比较少,周末出行的次数较多。右图的横坐标是距离的范围,纵坐标是出行次数占比概率,可以看出远途旅行相较于距离较短的目的地占比较低。
(2)OOPIN Model
基于上述特点,提出离线和在线融合的目的地预测的网络。整体网络的输入包括离线和在线两大块。
离线的同样把用户线下去过的城市结构化成矩阵 pattern,再融合在线行为序列,对离线和在线的行为做融合,最终得到当前的兴趣演变过程。
离线模块是将用户历史去过哪些城市结构化成矩阵后,通过不同的卷积核可以得到时间空间的一些周期性的 pattern 来在离线兴趣演变中使用。
将这些 pattern 融合输入到离线行为的第二层 GRU 中,相当于把离线行为的城市经过一层 GRU 拼接后可以得到离线演变的周期兴趣。
用户线下去城市之前,在线也会有一些行为序列。通过 Distance Aware Attention 网络得到在线可能去的城市。
计算逻辑为计算在线行为可能城市两两之间的距离,提取出主要的城市。比如,用户要去云南旅行,可能去的城市包括昆明、丽江和大理多个城市等。这些城市之间有共同的特征,就算偶尔穿插了三亚或北京,但通过 Attention 网络还是会聚焦到云南省,把其余的干扰因素丢弃,通过去除噪音得到在线行为序列中的更大范围的核心目的地。用户最终去云南的话,云南可以通过 Target Aware Attention,找出跟离线最接近的城市的表征。通过信息增益网络做减法,可以得到用户还想去三亚的信息。即将用户在线行为过的城市信息里,减去他已经去过的城市信息,增益的信息作为一个新的序列输出,作为用户未来目的地意图的预测。
(3)实验结果
与传统方法对比,OOPIN 效果是最优的。
消融实验表明,去掉在线行为后效果下跌最多至 0.1135。去掉信息增益后,效果也下跌到 0.1527,因为去掉信息增益网络后,没法学习额外的一些增益信息。去掉离线行为模块后,效果也有明显下降。
十天的在线实验也表明,增加目的地预估加权融合商品的 CTR 预估作为最终的排序得分后,商品的 CTR 效果有提升。
三、问答环节
Q1:多方面兴趣抽取的输入是基于 query,可以理解是对输入商品集合做一个 Embedding 吗?
A1:这是全量用户历史的所有行为。比如提取时空兴趣的话会去看三月、武汉所有销量 Top 的商品集合作为表征得到隐向量作为武汉三月份的兴趣表证。
因为这个是基于全量用户历史行为,如果直接去查询,成本很高,所以我们会离线去做一次,来存在 kv 库,线上服务是直接从数据库中去查询。
Q2:为什么用召回指标评价?
A2:用离线 AUC 也可以,召回指标也可以用,都是去衡量算法准确不准确。
Q3:意图和目的地识别模块中离线特征是如何更新的?
A3:拿目的地来说,离线特征是用户过去三年去过哪些城市,虽然时间是三年,但用户每年去过城市不多,平均不到 10 个,特别稀疏。每周会进行增量训练,举个例子不同的节假日比如今年的中秋,今年中秋到明年中秋期间这些特征基本上是不会变的,相当于有些特征是每月变一次,有些特征每年变一次,星期类的周期 T+1 更新计算就好了。根据特征的跨度不一样,更新的周期不一样。
Q4:时间衰减是怎么确定的?
A:一般 RNN 网络没有考虑用户行为序列时间的衰减程度,我们引入 β 值,相当于时间的重要度系数,让最近的行为重要度最高。经过 log 变化做一些平滑,重点是强调越新的商品,重要度越大,权重越大来融合加权。
Q5:多个链路埋点数据,重复数据怎么处理?怎么保证数据准确性?
A5:重点主要是解决新增的问题,重复的我们是有唯一的标识 key,也就是每一条记录,如果三个链路里面都有,唯一的标识 key 一样的话,就直接覆盖掉了。
Q6:武汉三月是怎么确定出来的?是手动找每个维度去做交叉?
A6:是的,时空的话一般是城市,其实全国就两三百个城市,12 个月,300x12 key 离线会去 group by 城市和月份做聚合。