导读: 58同城作为分类信息网站,服务覆盖多个领域,如房屋租售、招聘求职、二手买卖等等,不同的业务有不同的特点,这使得多业务融合推荐成为一大挑战。如何准确挖掘用户的需求?如何平衡各业务之间的流量分配?如何增加多样性提升用户体验?这些问题将在本次分享中解答。
58的推荐系统架构主要分成三部分:
在推荐系统中需要持续优化的环节有召回、排序和重排。召回方面,58团队采用用户兴趣召回和向量化召回相结合的方式,其中向量化召回是通过word2vec、深度兴趣模型等多种方式构建帖子的向量化表征;排序方面全量采用深度学习模型,同时也在探索多目标一体化深度学习模型。
58同城首页信息流位于app的下方,其中包含多个业务门类,如招聘、租房、二手车、二手房等,在58内部把这些信息统称为帖子。一个帖子代表某个用户发布的信息,比如一个二手车帖子,包含某个用户发布的二手车车型、车系、公里数、价格等等信息。
特点与挑战:
本文主要优化的是58同城的首页信息流,这个业务场景的特点有:
58app首页推荐业务 ( 多品类推荐 ) 主要面临的挑战在于:
这个优化主要针对第一个挑战:强兴趣下的多业务融合。
常见的推荐系统,如新闻推荐、视频推荐、商品推荐等都是要先建立用户和商品之间的联系,然后通过适当的算法进行匹配。在58同城中,用户既有买家也有卖家,所以不仅要构建用户和商品的联系,还要构建买家和卖家之间的联系。这就需要分别为用户和商品打标签,这也是兴趣策略的重点。
以图中租房用户为例,先分别提取租客寻找房子的标签和房东在帖子中提供的标签,然后在两者之间建立联系形成匹配。
然而,如果直接利用原始的标签进行推荐,那么效果肯定是不理想的。为了改善推荐效果,还要通过一定的策略挖掘出用户当前最迫切的需求。
在对原始策略进行优化时需要考虑以下几个方向:
那么具体如何操作呢?下面结合优化的方向,介绍打标签的具体步骤:
第一步:数据抽取
通过埋点数据获取用户的行为,典型的方法有两种:
第二步:数据清洗
对重复或错误的埋点、缺失或错误的字段进行修正。
第三步:兴趣分类
太久远的标签可能不符合当前用户的需求,比如以下几种经典情况:
考虑到以上情况,58把用户兴趣分成历史兴趣和实时兴趣两大类。
第四步:兴趣计算
通过两个独立的流程分别处理历史兴趣和实时兴趣,这里还要考虑两种兴趣的存储系统是否分开,信息结构是否保持一致。
第五步:兴趣衰减
58采用的这个衰减公式简单直观,经过相同的时间衰减的程度是一致的。具体的参数可以通过abtest来检验,上面的表格是对比不做时间衰减情况下的检验结果,其中参数选择7天的效果最好。
经过时间衰减后,用户近期兴趣的权重会上升,而太久远的兴趣的权重会下降,这样可以解决以下几个问题:
与此同时,还要考虑不同业务之间的差异,并根据差异设置不同的系数。比如二手房的成交周期很长,租房的成交周期就比较短,那么这两者的衰减速度就可以设置不同的值。
第六步:兴趣合并
这里分为时间和品类两个维度
这些兴趣汇总以后最终形成一个用户所有时间段内所有业务的基础数据
第七步:兴趣合并
有的标签之间可能会有冲突,比如在正常情况下,真正有购车需求的人不会同时关注经济实惠的平价车和昂贵奢侈的豪华车。然而在实际的数据中,会发现一个用户同时存在40万以上和5万以下这种冲突的标签,如果同时采用这些有冲突的标签计算推荐结果,那么会造成很糟糕的用户体验。
58用户在二手车价格标签上的分布,可以看到也就是说大多数用户只会关注1-2组价格区间,如果同一用户关注的价格区间超过几个,那么这种用户可能就是车商。
通过聚合策略可以避免同一类目的兴趣过于分散,这样更容易贴近用户的需求。58采用了优势组直选和长尾组淘汰两种方式:
第八步:兴趣去噪
这一步的目的是除去相关性低的兴趣,主要有以下几类:
根据我们的数据调研,权重比较小的兴趣占比不会高于15%,淘汰这些兴趣会有一定的效果改善,比如上图中把位于6%和4%这样的兴趣删除以后效果会得到改善。
第九步:兴趣扩展
从表格中可以看出不同类型的兴趣效果不同,扩展出来的兴趣的效果远低于原始兴趣,而泛扩展的效果会更差。所以在展示的时候,需要对它们进行分层并设定优先级,原始兴趣的优先级比较高,相关扩展和泛扩展的优先级比较低。
另外,兴趣扩展的方法可以分为品类内部标签的纵向扩展和跨品类的迁移扩展。
经过这些扩展,每个用户的标签可能就会扩展成几十个或者上百个。
第十步:兴趣排序
最后一步是把兴趣按照顺序排序,因为在召回、过滤、排序重排、分配流量上都会根据这些排序类分配优先级。
这个优化主要针对第二个挑战:多业务之间的流量均衡
实际业务需求:
由于58首页信息流是多品类混合推荐的场景,推荐的结果既要满足用户个性化需求,又要满足在整体上各业务的占比与58实际业务流量比例相符合,比如在58平台上,整租房的用户要多于合租房的用户,那么就要求推荐的帖子中整租房的比例要高于合租房的比例。
原始策略:
以上两种策略均与千人千面的目标是不一致。为了解决这个问题,58调整了方案,使其既能满足个性化需求,又能保证流量分配对各业务线相对合理。
按兴趣权重分配流量:
第一步:计算用户的兴趣权重,下图为某用户在招聘、租房、黄页上的比例,分别是60%、20%和20%
第二步:经过召回、过滤、排序等环节后得到帖子的候选集,候选集中有照片、租房、黄页帖子,组成比例分别为65%、25%、10%。
注:这个比例可能跟用户兴趣比例偏差不大甚至一致,但也有可能差异很大。
第三步:优先以兴趣权重分配帖子,当帖子数量不足时再由其他品类补充。用户对黄页的兴趣占比是20%,但候选集中黄页占比只有10%,也就是说即便推出候选集中所有的黄页贴子,也不能满足黄页帖子的占比要求,这种情况就用其他品类的帖子进行补足。
这样的策略既满足了个性化需求又满足了流量分配需求,点击效果提升了1.1%,推荐业务帖的流量分配比例与58平台整体流量占比基本一致。
品类之间打散:
通过以上的步骤得到最终进行展示的帖子后,有可能还会出现一种情况——连续多个帖子都属于同一个业务,甚至出现雷同帖子。为了避免这个情况,58对最终进行展示的帖子进行业务打散,比如从排序靠后的其他品类的帖子中抽出一部分插到前面 ( 见上图 ),打散后不仅避免上述问题,还使每个业务有更公平的展示机会,且在视觉上增加了多样性。这个打散策略使点击率提升0.4%左右。
突出实时兴趣:
第一推荐位根据用户的最新实时行为直选,比如上图中用户最新的实时行为是招聘,捕捉到这个信息后在短时间内集中推荐招聘帖。该策略强调了实时兴趣,点击效果提升0.7%。
综合前面介绍的两大块内容:业务分配策略和兴趣策略,点击效果比基准效果提升1.1%。
这个优化主要针对第三个挑战:推荐结果的多样性。
算法模型挖掘出来的特征会促使推荐结果越来越聚焦,这就导致用户使用越频繁,多样性就越差。如果想试探新的用户兴趣或者试探新的内容,往往又会牺牲CTR。通过协同过滤、向量化召回等多路召回的办法可以增加多样性,但在用户兴趣不变的情况下召回集合基本不变,此时需要考虑在召回集合内部的排序上进行动态调整。
降权排序:
在排序的时候把曝光次数较多的帖子进行降权和后移,比如上图中帖子2和帖子5曝光次数过多,在后续展示的时候就适当调低其排序位置。经过降权排序后,点击效果比未动态化基准累计提升4.1%。
引入时间衰减:
在降权排序的时引入时间衰减——近期曝光的帖子更快后移,远期曝光的帖子回归到正常序列,这样在点击效果和多样性之间就取得一定平衡。引入时间衰减后,点击效果比未动态化基准累计提升6.5%。
引入服务端的曝光日志:
引入服务端的曝光日志作为补充,这样可以进一步提升多样性,帖子序列的变化也会进一步加快。考虑到曝光真实性的问题,58只选取服务端头部的帖子补充补充道集合中。引入服务端的曝光日志后点击效果比未动态化基准累计提升7.0%。
经过上述三步操作,点击率比基准提高7%,且在多样性上也有明显的改善,取得双赢的结果。
回顾下实践过程中的一些教训与思考:
这讨论显性负反馈。当用户反馈对帖子不感兴趣的理由后,相当于提供了一个显性的负反馈。典型的方案有这几个:
多样性的目标是减少马太效应,有以下集中方法:
作者介绍:
王炜,58同城 TEG 推荐技术部架构师。目前负责 APP 首页业务信息流推荐,致力于通过融合多业务、多策略推荐系统的迭代升级,支持流量分发,优化连接效率,提升用户体验。
本文来自 DataFunTalk
领取专属 10元无门槛券
私享最新 技术干货