阿里飞猪推荐算法探索实践
分享嘉宾:温鸿 阿里巴巴 高级算法专家
编辑整理:孙彬 太原理工大学
出品平台:DataFunSummit
导读: 本文的主题为阿里飞猪推荐算法探索实践,首先会介绍电商背景下主流推荐技术的发展,例如基于全空间的CVR预估技术的发展历程等 ( ESMM / ESM^2 / HM^3 );接着会重点结合旅行行业的特色,进一步介绍飞猪推荐算法的现状及发展。
01 电商推荐算法简介
首先和大家分享一下电商的推荐算法。
1. 推荐技术框架
电商的推荐技术框架大致可以分为如下四个部分:
① 基础能力:主要包括基础数据、样本、特征和机器学习平台四个方面。
具体涉及到基础数据的处理,样本、特征怎样做,以及后续机器学习平台涉及到的一系列流程,包括样本生成,模型训练,模型校验以及模型上线等。
② 算法模型:主要包括召回,初排,精排和重排。
召回阶段:业界正从协同过滤往基于深度学习的Deep Match方向衍化。
协同过滤简单地说就是一份i2i数据,它是一份全局的相似数据,具体来说,它会根据用户点过的商品去推荐和该商品相关的商品,这样就会丢掉很多个性化的信息。举个例子:用户A和B都点击了同一个商品,那对A和B来说,后面的推荐结果在召回层面是一样的。但A和B为什么会去点这个商品呢?事实上,会有一些context信息的,比如会存在不同的行为序列等。我们是希望考虑用户的行为序列去做相应的召回,所以模型在往基于深度学习的Deep Match方向做衍化。例如,阿里最近的一个工作应该是发表在SIGIR2021上的PDN模型,该模型研究了如何更好的把u2i和i2i数据做一个更好的结合。
精排阶段:正在从以FTRL为代表的线性模型和以GBDT为代表的非线性模型往深度模型的方向发展。
这其中,阿里妈妈提出的DIN模型为深度学习方向的代表性模型。它对我们建模用户行为序列提供了非常好的指导。随后也有很多基于DIN的一些衍化工作,比如针对怎样捕捉用户兴趣的衍化,提出了DIEN模型;针对怎样建模用户更长时间周期的行为,提出了超长行为序列建模的思想。另外,在CVR预估领域,代表性的工作是阿里妈妈提出的ESMM模型,我们也基于此有一些后续的研究成果。
③ 线上服务: 采用的是统一的TPP推荐方案,在TPP方案内部嵌套了相应的基础服务。比如做特征处理的ABFS,做召回的BE,做储存的IGraph等。这些组件集成在TPP方案里,再用这套推荐方案去承接线上各类推荐场景。
④ 业务场景: 比如手淘的猜你喜欢,店铺、商家私域,还有逛逛、订阅、购后场景等
2. 基于全空间的CVR预估—ESMM模型回顾
接下来我们基于全空间的CVR预估,讲讲这个方向最近的一些进展。首先回顾一下阿里妈妈发在SIGIR 2018上的ESMM模型。
① 传统CVR预估面临的三大技术挑战:
Sample Selection Bias(SSB)问题
传统的CVR预估是用点击的样本去train一个模型,点击之后购买,它的label就是1,没有买,label就是0。但事实上,商品在曝光时,推荐系统就要估出它们的CVR分。所以会存在training space和inference space不一致的问题。
Data Sparsity ( DS ) 问题
传统CVR预估的数据量比CTR预估的数据量少几个数量级。所以,CVR预估存在数据稀疏性问题。如果拿数据量很少的数据集去train一个深度模型,相应的Embedding的学习也会不充分,进一步影响CVR模型的预估效果。
购买正样本的缺乏
用户实际产生的购买行为确实是非常少的,导致了绝对正样本的缺乏
② ESMM建模方法
引入CTR/CTCVR任务为辅助任务
我们可以看下下面这个公式:是指从曝光到购买的一个概率,就等于。CTR就是从曝光到点击的概率,CVR就是从点击到购买的概率。
我们怎么去获得CVR的预估值?ESMM的建模思路是,直接在模型中引入了两个基于全空间的辅任务,比如CTR和CTCVR。一条样本曝光之后,我们能够知道他是否会点击,是否会购买的。所以这两个任务的label是提前知道的。我们可以基于这两个引入的辅任务,对CVR做预估。
ESMM模型结构如上图:它有两个塔,分别代表CTR和CVR,同时基于这两个塔定义了两个辅任务。比如CTR,还有CTCVR(它代表CTR和CVR的乘积)。这样,给定一条曝光样本,我们知道它接下来是否会发生点击,是否会发生购买。再通过梯度回传的方式,就可以把CVR也给估出来。
另外,ESMM模型在底层把CTR和CVR的两个task所需要的embedding做了共享,这样我们可以用包括曝光样本在内的所有的训练数据共同去做embedding的更新,缓解了CVR预估面临的data Sparsity问题。
通过优化CTR和CTCVR两个辅任务达到预估CVR的目的
我们引入的两个辅任务CTR和CTCVR都是从曝光开始的。这样预估得到的CVR其实也受益于CTR和CTCVR的两个基于全空间的任务,相当于CVR也是基于全空间去估出来的。这样就消除了Sample Selection Bias问题。
3. 基于全空间的CVR预估—ESM^2模型
① ESMM模型的不足:
建模路径上,只考虑了从曝光到点击再到购买
事实上,用户的购买决策路径非常复杂。比如用户在点击之后,有可能会先加入购物车再通过购物车去产生购买行为。所以需要考虑更复杂的用户购买决策路径。
没有考虑到购买正样本的缺乏对建模的影响
购买正样本的缺乏也会影响预估的精准性。我们提出了可以引入点击之后的post-click行为,去缓解购买正样本缺乏对最终建模的影响。
② ESM^2模型解决的问题
基于这样的考虑,我们提出了ESM^2模型,该工作发表在SIGIR 2020上,它主要解决三个问题:首先解决了SSB问题,其次解决了DS问题,最后缓解了正样本的缺乏。这篇paper最主要的贡献就是引入了合适的post-click行为。当然该模型在建模时,也会面临一些挑战。
③ ESM^2建模面临的四大挑战:
- 如何定义合适的post-click行为
- 如何抽象用户复杂的购买决策过程
- 如何有效地同时组织多种post-click行为
- 如何建模post-click行为与购买之间的依赖关系
④ ESM^2建模思路:
用户对商品的决策过程非常复杂
用户购买决策过程非常复杂,比如点击之后,可能先加购,加购之后可能再点击,再次点击之后可能再购买。
点击到购买之间引入合适的post-click行为
解决正样本缺乏问题,我们的做法是在点击到购买之间引入合适的post-click行为。比如以前的建模方式是直接从点击到购买,现在把过去的建模方式拆分,我们观察到发生点击行为之后,可能会发生相应的一些类似加购、收藏的post-click行为。
通过定义完备划分事件组织多种post-click行为
事实上,post-click行为是非常丰富的,我们该怎样组织它们呢?我们的做法是把post-click行为做一个完备的划分。具体来说,我们把所有的post-click行为分成两个集合,并保证这两个集合互不相交。比如,我们定义加购/收藏行为作为DAction,那么我们对它取反,就代表了其他剩余的post-click行为,叫OAction。这样,DAction和OAction两个节点就可以认为囊括了所有的post-click行为。
全概率公式建模用户行为之间依赖关系
我们就可以基于全概率公式对用户行为之间的依赖关系做建模。
具体而言,我们以前是直接从点击到购买估出CVR的预估值。现在我们把过去的单一路径拆成两条路径,并且这两条路径是互不相交的。比如说用户可以通过点击到DAction,再从DAction到购买;或者用户也可以从点击到OAction,然后再从OAction到购买。这样我们可以基于全概率公式去做相应的建模。
⑤ ESM^2模型
我们具体怎么建模呢?以前的ESMM模型,它直接从点击到购买会有一个CVR预估值,我们把这样一个值进行拆解。首先我们引入一个任务叫从点击到DAction,DAction可以简单理解为加购或者收藏这样的行为是否发生;如果发生了,DAction的label就是1。OAction对应为DAction的取反。所以如果从点击到DAction的概率是y2,则从点击到OAction的概率就是1-y2。同时再引入两个辅任务,比如一个概率叫y3,一个叫y4,它们分别代表DAction到Buy、OAction到Buy这两条路径的概率。我们怎么解决Sample Selection Bias问题?一条样本曝光之后,我们知道它是否有点击,是否有购买的label,同时也知道,是否有DAction的label。这样其实就引入了三个基于全空间的辅任务。第一个任务是从曝光到点击,其实就是CTR(对应y1);第二个任务是从曝光到DAction,DAction其实就可以理解成刚才我们讲到的加购/收藏这样一个行为,它是否发生的概率其实就等于y1乘上y2;第三个任务是从曝光到购买的概率,就等于曝光到点击的概率乘以从点击到购买的概率,即y1×[y2×y3+(1-y2)×y4]。这就是一个全概率的分解;其中,中括号里面的就代表了CVR的预估值。
整个网络结构如上图所示。我们的四个网络分别对应到图上的y1到y4,另外,我们还有三个相应的损失函数。比如说从曝光到DAction的概率就是y1×y2,就是两个网络输出结果的乘积,它的label是用户是否发生DAction这样的行为。同理,购买的概率值就是y1[y2y3+(1−y2)y4],它的label是用户是否发生购买行为。损失函数就是基于预估值和真实label给定义出来的;我们拿到了Loss1到Loss3后,就可以通过梯度回传的方式,对相应的embedding做一些更新,同时也能得到y1到y4的值。得到y1到y4之后,pCTR和pCVR也就得到了。
⑥ ESM^2模型优化思路:
我们可以想想用户在手淘商品详情页上可能发生的行为。我们可以把这些行为分为两类,一类就是以商品粒度作为最小单元。比如说用户点击了某商品,这种行为叫宏观行为。同时还会有微观行为。比如用户可能会点击商品详情页上的一些控件button,比如点击了和卖家聊天这个button、点击了查看评论这个button等, 经过分析,这样的控件点击行为也和我们的购买行为存在一定的强关联性的。基于这样考虑,我们把模型ESM^2进行了升级,提出了HM^3,该工作发表在SIGIR2021上。
4. 基于全空间的CVR预估—HM^3模型
HM^3模型的架构和ESM^2模型架构差不太多,只是在宏观行为之前,又引入了一层微观的行为。并根据引入的微观行为去进一步指导宏观行为的建模,进而间接影响对最终目标购买的建模。
同样的,微观行为和宏观行为各分为两个互不相交的集合,这样从点击到购买,就进一步拆解成了图中的左上部分。
那么,针对这个图,接下来该怎么去建模CVR呢?同样的道理,我们把相应路径上的概率标出来,比如从点击到D_Micro节点的概率是y2,相应的从点击到O_Micro节点的概率就定义成1-y2。另外,我们可以基于y1到y6这6个概率值,定义出四个基于全空间的辅任务。比如,从曝光到点击,从曝光到D_Micro,从曝光到D_Macro, 从曝光到购买。这样,pCVR就等于{y4[y2y3+(1-y2)y5]+y6[y2(1-y3)+(1-y2)(1-y5)]}。
02 飞猪推荐算法探索
接下来对飞猪的推荐算法做一个简要的分享。
1. 旅行推荐的背景
① 旅行状态下用户生命周期
我们把旅行状态下的用户生命周期分为了四个阶段。
激发需求
首先要有一个需求的激发。比如,你身边有朋友向你推荐他去过的某个好玩的地方,那么你也有可能会去,因为你对朋友推荐的那个地方也感兴趣;又或者你在刷抖音、小红书、或一些旅行app时,相关的视频或内容可能也会对你起到种草的作用。总之,可能会存在多种不同的渠道激发出你的旅行需求。
行前
当你有了这样的旅行需求之后,接下来要怎么做?大概率会在像飞猪这样的APP上做相应的攻略,这个阶段叫行前。这个时候你会去找目的地相关的一些酒店,选择相应的出行方式,是坐火车还是坐飞机去?然后你也可能会关注下当地的旅行攻略,比如提前看看当地景点门票啥的。当你综合考虑了各种信息之后,你会做一个你认为的最优的决策,例如,选择什么样的交通方式,入住当地什么类型的酒店,玩哪些好玩的景点等。
行中
当你完成上述的行前准备工作后,接下来乘坐相应的交通工具到达了目的地,这时的状态叫做行中。此时你会更多地关注两方面的内容,一方面就是当地是否还有一些热门的景点是你感兴趣的;另一方面你也可能会关心目的地周边的玩乐等。这时,如果用户打开飞猪app,我们的推荐算法也会结合你此时正处于行中状态去推荐一些当地热门景点门票或周边玩乐等
行后
行中状态结束之后,就是行后了。此时,用户会对这次旅行做出相应的反馈,例如,对此次行程是否满意等;同时,如果后续有新的旅行需求被激发,用户又将开启新一轮的旅行周期。
② 旅行周期中飞猪app的应用
当用户打开飞猪APP时,如果此刻用户的需求特别明确,例如是要订机票、火车票,或酒店等,那么用户会去点击相关的金刚,例如,在金刚内部,通过机票/酒店的搜索等完成用户的需求。另一方面,如果用户需求不太明确时,他会一直下翻,此时最底部的无穷feeds流猜你喜欢模块,会去承接用户此时偏“逛”的需求。
③ 飞猪推荐的特点
低频
第一个特点是低频性。旅行是一个较低频的行业,用户的旅行需求比较低频。低频就会导致用户旅行行为也比较稀疏,甚至会导致冷启动。
时空属性
第二个特点是时空属性,推荐需要考虑时空属性的特点。比如需要考虑当下什么样的玩法是比较热门的,又或者需要考虑时令的特点,比如每年3~4月樱花盛开时,需要重点去捕捉等。
周期性
第三个特点是周期性。比如每逢五一,用户可能会回老家。如果过去几年用户都选择回老家了,那么接下来的五一推荐算法会推测用户大概率也会回老家;过年也是一样的。我们可以根据相应的周期性特点,对推荐算法做相应的定制。
2. 旅行特色算法技术
① 旅行推荐算法架构
整个旅行行业的推荐技术架构和电商推荐是差不多的,都是基础的四个环节,从基础能力的建设,到算法模型的迭代,再到线上的服务,最后到对应的业务场景,只是我们结合飞猪的业务特点,做了相应的定制与升级。比如在底层基础能力建设时,我们更多的需要去考虑基于旅行特色的用户理解;在召回层面,我们需要去考虑时空属性,还有用户旅行阶段和行程状态等;在排序时需要去考虑多端多场景应该怎样做?考虑周期性特点时又该怎样建模?
线上服务模块,除了刚才讲到的ABFS,BE,IGRAPH,RTP等,我们飞猪内部还有一个RTUS,可以简单理解成一个user center服务。
业务场景层面,我们飞猪有多端多场景的特点。例如,我们在淘宝、支付宝、飞猪APP都会有相应的场景,这是多端。还有多场景,我们营销场下可能有成百上千个小的场景,当然也还有一些较大的一些场景,比如猜你喜欢,购后等。
② RTUS
接下来简单讲讲RTUS。我们首先基于用户全链路日志拿到浏览、点击、搜索、加购、收藏、购买等数据,接着会先基于统计规则做简单的数据分析。比如对用户的行为数据做聚合,或对整个行业做个简单分析,观察下它的发展趋势等。
当我们拿到这样的统计数据后,可以进一步对用户的实时行程状态、兴趣,甚至旅行意图做出相应的预测。我个人理解飞猪不一定非要做端到端的推荐,也并不是简单的一个CTR预估模型能搞定的。我们在研究的过程中发现,旅行特色业务的理解,是至关重要的。所以,这里我们会基于RTUS的能力,将一些中间的预估结果,例如,用户对目的地的偏好等,融入到传统CTR预估模型中,会得到更好的效果。这就是RTUS的大致工作内容。
③ 用户行程状态感知召回
接下来讲讲我们基于用户行程状态感知的召回;这个工作目前还没有公开,投递至ICDE2022上,正在审稿中。所以这个工作只能大体上讲一讲。
首先,我们基于用户的行程状态,例如是行前、行中、或行后等,对用户的profile信息做融合;接着,我们基于融合后的用户状态,对用户行为序列做特征提取;再接着,我们把上述两个模块各自的结果concat到一起,再过几层MLP,得到最终用户的表达。另一方面,我们基于target item的一些属性,同样经过几层MLP,得到最终item侧的表达;最后,通过一个内积函数得到最终的召回分数。离线实验部分,我们可以看出它相比电商里的模型而言,取得了较大幅度的提升;这也说明了,电商场景下的模型结构可能并一定适合旅行场景,我们需要结合旅行场景的理解定制相应的特色模型;另外,线上实验也表明,相比不加入这路基于行程状态感知的召回,也获得了不同程度的线上效果的提升。
④ 周期感知序列建模
最后简单讲讲怎样把周期感知用在精排模型里面。这里我们可以把用户的行为序列按照横向和纵向两个方向进行组织。横向部分可以认为是每一年的数据,其中每个slice可以认为是每个月的数据;多个横向就代表着多年的数据,例如第一个行代表20年数据,第二行代表19年数据等;纵向部分,我们要考虑周期性的因素,例如如果需要建模用户每逢春节会有什么样的行为,我们可以把用户多年的春节的数据按照纵向的方式进行组织。总之,我们希望通过横向/纵向数据的组织,去挖掘出用户横向的兴趣衍化和纵向上周期的行为习惯。另外,每一个Slice里的建模方式和传统模型无异。这个模型我们暂时在离线AUC上拿到了一定的正向效果提升,仍在进一步优化中。
03 总结&展望
未来,我们还是会更多的结合旅行场景的特色,例如用户的旅行周期,时空属性,行业特点等,去开展相关的算法研究。
PS:这里打个广告,我们飞猪算法团队专注于搜推广相关领域的研究,也希望一些对旅行行业感兴趣的同学加入我们,和我们一起去打造整个旅行业的新标杆。这里我把相关同学的联系方式写出来,感兴趣的同学可以直接去联系。
04 问答环节
Q:从点击通过加购或者收藏进行购买的样本量大吗?如果量很小的话,能带来足够大的收益吗?
A:我们可以看下手淘上某个场景的数据:
我们点击后直接产生购买的概率大概是2.5%。引入一些合适的post-click行为是为了辅助CVR的建模,所以引入的这些行为,从点击到相应行为发生的概率肯定不能比2.5%更低,例如,从点击到加购,概率是8.3%。这就满足我们刚才讲的条件。同时引入的post-click行为还要与最终的购买强相关。我的理解是,在点击和购买之间引入了一些和购买强相关的、且能直接拿到用户反馈label的post-click行为,然后拿它可以进一步辅助我们做CVR的建模。
Q:ESM^2模型中每增加一类的post-click行为,就需要多增加三个塔吗?
A:不需要。事实上,我们也不能够完全枚举出所有的post-click行为。那这里我们怎么做呢?我们把所有的post-click行为分为两类:一类是我们通过数据分析,把一些覆盖量较大的post-click行为先摘出来。比如点击后的加购/收藏行为等,这类post-click行为也较满足我们的大众认知;另一类就是一些比较长尾的post-click行为了,我们也不需要刻意去处理它们,只需要对前面的DAction取反就能够得到了。所以这里增加post-click行为也不会增加我们训练的复杂度。
Q:从购买历史中再次购买会算有点击吗?CTR到CTR概率需要怎么处理?
A:这就要看你这个行为是怎么发生的了。如果商品从曝光到点击,然后点击后再购买,购买之后再次购买。连续的两次购买在建模时只当做了一条正样本,label为1。如果你在第一次购买完之后,又去逛了相应的场景,又产生从曝光到点击再到购买的行为,这样我们又会额外增加了一条训练数据。它的label即购买的label也为1。
Q:用户生命周期里面在激发需求阶段和行前阶段是怎么定义或者区分的?
A:这是我们人工定义的规则。我们把用户的行为数据拿到并进行分析后,人为的把阶段分为了激发需求、行前、行中、行后阶段。事实上,用户在各个阶段的点击率会有存在一定的差异。
Q:使用一年甚至更长的数据来训练,不就非常的耗时吗?还是说有一些采样的策略?
A:如果我们还是用DIN的思想,把行为序列拉到一年来建模肯定会非常耗时。这块我们目前也正在做相应的研究。比如说针对超长行为训练建模,阿里妈妈团队提供了如何在线上serving的解决方案,具体怎样做,论文里有相关的介绍。这一块我个人意见还是在于它的工程链路会复杂一些。
Q:CTR,CVR,CTCVR样本和label分别是怎么标注的?
A:不管是ESM^2还是HM^3模型,建模时都是基于全空间的。全空间建模需要我们的label也要基于全空间去标注的。那么,针对一条曝光样本,如果有点击行为,那对应的CTR label就是1,没点就是0。CTCVR就是说曝光之后,买了就是1,没有买就是0。这样CTR和CTCVR的label就得到了。我们是没有单独对CVR做label的标注的。因为我们基于全空间建模,CVR是通过多个辅任务给间接估出来的。
Q:周期感知序列建模怎么处理双十一、双十二、国庆节等这些序列点?
A:我们其实可以把不同年份下相应的节日,例如,国庆节等,再结合个人的行为pattern,做一个纵向的建模。然后这一块的工作也是正在开展之中,暂时还没有取得特别大的突破。
Q:请问ESM^2模型具体在我们线上业务中的哪块儿场景中应用?
A:该模型以前是在商品详情页腰部的推荐场景上线的。另外,这个模型的思想我觉得挺好的,我们也把相应的建模思想应用在飞猪旅行场景,也拿到了一些效果。而且,这个思想也不一定局限于CVR预估里。例如,可以结合我们飞猪的特点,将它用在我们的CTR模型里面。比如传统预估CTR时,曝光后,点击的话, label就是1,否则为0。我们也可以结合这个思想,可以把对CTR的预估分为两个阶段去看。第一个阶段就是去预估用户对商品所属目的地是否感兴趣,再预估在相应目的地下,对相应的商品是否感兴趣。这样,我们可以把这个两阶段的建模,统一到ESM^2的建模思想中来。
Q:已经购买的,那么它后面的短期购买意愿可能会降低,那么这种怎么处理?那模型,样本,特征各个角度都有什么思路吗?
A:这一块我们没有做过特别的处理,一般来说都是后验的策略。比如说可能会做一些购买的过滤,甚至购买的降权。在模型层面上没有做过特别的预处理。
Q:用户周期的判断能稍微说细一点吗?尤其是行前的定义。
A:行前这个阶段,用户可能更多的是在找一些东西,这时用户有可能围绕着某个目的地在做相应的攻略。比如,可能在找目的地下的某些酒店,又或者在选择去目的地的交通工具等。如何去区分是否行前,我觉得每个人的想法都会不一样。我们主要还是通过后验的CTR去做划分的。
分享嘉宾: