Press "Enter" to skip to content

多目标排序在58同城房源推荐中的实践探索

本站内容均来自兴趣收集,如不慎侵害的您的相关权益,请留言告知,我们将尽快删除.谢谢.

分享嘉宾:刘小飞

 

出品平台: DataFunTalk

 

导读: 58同城&安居客是找房第一大平台,服务百万经纪人和千万级用户。在我们的业务场景下,会关注点击、微聊、电话等多个指标,本文将分享二手房推荐系统的实践经验,并重点介绍多目标排序算法应用。 主要内容包括:① 业务背景&推荐场景;② 向量化召回应用;③ 多目标优化探索;④ 总结和规划。

 

01

 

业务背景&场景介绍

 

1. 二手房业务介绍

 

① 平台情况介绍

 

 

我们的平台包括58跟安居客,从极光公布的数据来看,安居客的平台渗透率排在房产平台第一位,日活量超过了500万。平台涵盖了大部分的房产业务,包括新房,二手房,租房,商铺写字楼,二手房是其中的核心业务。

 

② 用户如何从找房到成交

 

 

用户利用平台的电话、微聊、VR带看、预约看房等功能与经纪人线上沟通,如果用户满意的话再由经纪人带用户线下看房,通过与房东洽谈,最终完成二手房交易,经纪人从中获取佣金。

 

相比传统的推荐系统,58二手房的业务更加复杂,漏斗更长更深,涉及到线上跟线下两部分。

 

2. 二手房推荐场景

 

① 二手房推荐场景

 

 

我们的推荐场景和内容很丰富,包括首页推荐、大类页、推荐频道、零少结果等,房源详情页里也有很多推荐场景比如同价位推荐、看了又看,还有些跨业务线的推荐比如楼盘推荐、装修推荐等。

 

② 推荐架构

 

 

推荐架构主要分为两个部分:数据部分和模型部分。数据部分是利用日志服务器实时采集客户端和服务端的日志,并将采集到的数据通过实时/离线进行特征工程处理,生成用户特征、物品特征、关系特征等信息。模型部分跟业界差不多,主要分为召回层、排序层和重排层。

 

02

 

向量化召回应用

 

1. Embedding召回

 

① Embedding演进

 

 

我们有很多场景需要用到房源的Embedding。上面是embedding模型的演化过程。首先尝试的是Skip-gram模型,把用户浏览的房源序列作为Skip-gram中的词序列,通过模型学习获取到房源的Embedding。

 

但Skip-gram只考虑房源之前的共现性,而且通过用户行为序列构建房源关系其实是一个图结构,所以引入Graph Embedding模型来提高模型的表征能力,这里采用DeepWalk来构建图网络,然后通过随机游走重新生成训练样本,再输入到Skip-gram模型进行训练。

 

Deepwalk可以比较好的学习到房源之间的相似性,但是对于出现次数很少的房源,依然难以有效地学习。所以引入阿里提出的基于Side Information的图嵌入学习方法EGES。通过加入Side Information比如商圈、小区、价格等来丰富对房源的表征。通过Side Information Embedding就可以给新增的房源计算Embedding,从而可以缓解房源冷启动的问题。

 

② Embedding实时召回

 

接下来介绍一下我们线上用Embedding做实时召回的一些方案。

 

方案一:

 

 

根据用户最近浏览房源的Embedding在Faiss库进行召回,此种方式速度比较快,工程比较简单。

 

方案二:

 

 

根据浏览房源在Faiss库里进行分别召回,混排后取topN房源。此种方式召回速度有所下降,但通过并发召回后的召回速度可以接受,而且从实践经验来看,召回效果要优于第一种方式。

 

方案三:

 

 

此种方案类似于基于物品的协同过滤的召回,通过房源的Embedding预先离线计算好每一套房源的相似房源,根据用户的浏览记录召回一部分房源,混排后取topN房源。此种方案的优点是召回速度快,效果较好,但缺点是需要大量空间存储离线数据。

 

2. 向量化召回融合

 

在实际应用中,一般会基于不同的模型生成多套Embedding,并通过以下两种方式进行向量召回融合。

 

 

方案一:

 

针对每一套Embedding都创建一个Faiss应用,线上召回的时候,分别去每个Faiss里召回。这种方式需要维护多个Faiss应用,维护成本很高,而且每一次请求都要召回多次,性能比较低。

 

方案二:

 

每一套Embedding归一化后,乘以相应的权重再直接拼接成一个Embedding向量。这样的话,相当于线上召回的时候,还是只针对一个拼接后总的向量进行操作。从上面的公式可以推导出,跟方案一的效果是一致的,但只需要维护一个Faiss应用即可。

 

03

 

多目标优化探索

 

1. 排序演进

 

平台从开始到现在的模型排序方式的演进如下:

 

 

2. 多目标优化

 

① 为什幺要做多目标优化?

 

 

推荐的最终目的是促成“成交”,但二手房的交易是一个很长很深的漏斗。首先要优化点击率,也就是引导用户去看房源帖子,看完之后通过各种渠道比如电话、微聊、vr带看、预约看房能跟经纪人联系。这时候用户跟经纪人就产生了连接,然后更近一步能产生带看,以及成交。目前由于平台二手房场景的特殊性,线下的数据打通的不多,所以优化的目标主要做到连接这一步。另外单目标优化可能会出现目标衡量不全面的问题,如只优化CTR,则可能会出现低价房源,因为低价房源一般能拿到好的流量。

 

② 多目标优化的方法

 

常用的多目标优化的方法如下:

 

 

③ 多目标优化—多模型融合

 

 

首先尝试的是多模型融合的方法。考虑到业务情况和线上性能,构造了两个模型:CTR预估模型和连接转化率预估模型。因Wide&Deep兼具了记忆和泛化功能,故以其为底层模型。然后再用一个线性模型将CTR预估模型和连接转化率预估模型进行融合。

 

④ 多目标优化—ESMM

 

在多模型融合中,连接预估模型存在样本选择偏差和数据稀疏的问题。

 

 

具体来讲,用户在平台上的行为顺序是用户先看到曝光的房源,再去点击房源,然后才会产生连接。在训练连接转化模型时,我们用click部分做为负样本,用conversion部分做为正样本,而用户在使用平台时,先看到的是 impression部分,所以会导致训练空间和预测空间不一致,进而导致预测结果出现偏差,推荐效果会受到影响。

 

为了解决样本选择偏差和数据稀疏的问题,我们使用阿里提出的ESMM模型去进行优化。其公式如下:

 

 

ESMM 通过引入两个辅助任务pCTR和pCTCVR来隐式训练pCVR,这两个任务都是从整个样本空间选择样本,通过这种方式来消除样本选择偏差问题。另外pCTR和pCVR底层共享Embedding,这种机制能够使得 pCVR 子任务也能够从曝光未点击的样本中学习,由于 CTR 任务的训练样本量要远超过CVR任务的训练样本量,从而能够缓解训练数据稀疏性问题。

 

在实际应用中样本构造和特征工程的方案如下:

 

 

模型调优参数设置如下,对比多个优化器后最终选择Adam优化器,为了防止模型过拟合加入了Dropout和L2正则化,加入Batch Normalization以加快模型收敛速度,尝试不同的学习率和Batch Size以提高模型训练的稳定性和尽快收敛。

 

 

模型是对6000万样本数据进行训练,每天进行更新。

 

 

经过多目标优化后,CTR和CVR均有明显提升。

 

 

因为正负样本失衡,所以采用Focal Loss来缓解数据不均衡问题。Focal Loss是对交叉熵的优化,引入平衡权重Alpha,如果该类样本占比越少,在Loss函数中的权重就越大,用来平衡正负样本比例不均的问题。Gamma是难易因子,给困难、错分的样本更大的权重,使模型更偏向于学习困难错分的样本。

 

3. 二手房排序——MMOE

 

 

ESMM采用硬共享底层Embedding的方式进行训练,这样会出现个问题,如果两个任务相关性不大的话,会造成相互影响。 MOE是对其的一种改进,底层是共享几个Expert网络,加入了Gate门控机制,通过Gate来确定每个塔依赖Expert网络的权重,这样所有的任务会软共享底层的网络,对任务的相关性就没那幺敏感。 MMOE有多个Gate,每一个任务对应一个Gate,这样会更灵活。 不过在我们的场景下,目前还没有产生正向效果,离线测试的AUC和线上效果都弱于ESMM,可能是点击率和连接转化是有依赖关系,先有点击再有连接,但MMOE是对二者进行独立拟合,未能学习到其依赖关系。

 

 

目前的改进方向是参考了腾讯提出的改进方案,将MMOE划分为两个任务,一个任务与FM学习CTR,另外一个任务与FM学习CVR,最后将CTR和CVR联合学习训练,得到CTCVR。这种方式是同时考虑到MMOE和ESMM两者的特点。

 

04

 

总结和规划

 

 

主要围绕三块来开展:数据是重中之重,随着公司产业化的推进,打通更多线上线下数据,从更多的角度去刻画用户兴趣。第二从实践经验来看的话,一路好的召回对线上的效果贡献会特别大,所以也会在召回上进行一个持续的探索。针对排序,之后可以拿到更多线下的行为数据,这样就可以去优化更下游的指标,比如说带看、成交等。

 

05

 

留言和提问

 

Q:请问EGES的更新频率如何?图如何存储的?

 

A:数据量较大,所以三天训练一次。图是直接加在到内存里,通过Spark随机游走重新生成序列样本,生成完之后放到HDFS上供模型训练。

 

Q:在Faiss中Embedding的量级是多大?当需要索引时应当采用哪种方式?

 

A:Faiss中Embedding量级根房源量一致,现在二手房房源大概是2000万的量级,索引使用的是IndexIVFFLat。

 

Q:这里是分布式训练吗?线上推理时排序集合是多大?特征的量级是多大?

 

A:目前还没有用分布式训练,用的是单个的GPU。线上推理的速度大概是5毫秒,特征的量级是400~500左右。

 

Q:线上推理使用了那些优化手段来降低耗时?

 

A:ESMM的long-short不共享底层的方式,性能提升效果比较明显。另外用的是wpai(58人工智能平台)在线推理服务,平台本身也在不断优化。

 

Be First to Comment

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注