推荐算法在闲鱼小商品池的探索与实践

avatar
@阿里巴巴集团
原文链接: mp.weixin.qq.com

引言

个性化推荐是提升转化率的有效方法,闲鱼的大量导购场景中已经使用了个性化推荐算法,并取得了很好的效果。但是随着导购场景的微型化,精细化,出现越来越多的万级别以下商品量级导购场景,这些场景也需要引入个性化推荐,但闲鱼商品生命周期短、实时性高等的特点,限制了基于I2I的个性化推荐在这种小商品池上的召回效果。本文在介绍闲鱼的个性化推荐流程的基础上,针对闲鱼小商品池特点,在个性化推荐的召回阶段进行了一些实践和探索。

一.闲鱼中个性化推荐流程

商品个性化推荐算法主要包含Match和Rank两个阶段:Match阶段也称为商品召回阶段,在推荐系统中用户对商品的行为称为用户Trigger,通过长期收集用户作用在商品上的行为,建立用户行为和商品的矩阵称为X2I,最后通过用户的Trigger和关系矩阵X2I进行商品召回。Rank阶段利用不同指标的目标函数对商品进行打分,根据推荐系统的规则对商品的多个维度进行综合排序。下面以闲鱼的首页feeds为例,简单介绍闲鱼的个性化推荐流程。

如图1所示步骤1.1,利用用户的信息获取用户Trigger,用户信息包括用户的唯一标识userId,用户的设备信息唯一标识uttid。

如图1所示步骤1.2,返回用户Trigger其中包括用户的点击、购买过的商品、喜欢的类目、用户的标签、常逛的店铺、购物车中的商品、喜欢的品牌等。

如图1所示步骤1.3,进行商品召回,利用Trigger和X2I矩阵进行join完成对商品的召回。

如图1所示步骤1.4,返回召回的商品列表,在商品召回中一般以I2I关系矩阵召回的商品为主,其他X2I关系矩阵召回为辅助。

图1.闲鱼个性化推荐流程

如图1步骤2.1,进行商品过滤,对召回商品进行去重,过滤购买过的商品,剔除过度曝光的商品。

如图1所示步骤2.2,进行商品打分,打分阶段利用itemInfo和不同算法指标对商品多个维度打分。

如图1步骤2.3,进行商品排序,根据规则对商品多个维度的分数进行综合排序。

如图1步骤2.4,进行返回列表截断,截断TopN商品返回给用户。

 闲鱼通过以上Match和Rank两个阶段八个步骤完成商品的推荐,同时从图中可以看出为了支持商品的个性化推荐,需要对X2I、itemInfo、userTrigger数据回流到搜索引擎,这些数据包含天级别回流数据和小时级别回流数据。

二.闲鱼小商品池

2.1闲鱼商品的特点

二手商品是闲鱼的服务基础,闲鱼的商品不同于其他电商平台,闲鱼的商品具有以下几个显著特点:

商品的孤品属性,商品的生命周期短,闲鱼二手站内的商品主要来自个人卖家,来自个人的闲置商品库存数量为1,商品一旦被卖掉就会被下架,形成了商品的孤品属性;

商品的主观价值属性,二手商品的新旧程度、功能损耗、价值描述等,都是卖家根据自己的主观意愿对商品进行鉴定,很难客观和规范的衡量产品的价值。

商品的多样类目属性,二手商品的类目呈现出多样性和丰富性的特点,存在很多无法涵盖枚举的其他类目商品。

2.2.小商品池的特点

闲鱼平台目前留存几亿量的商品,为了帮助用户更好的交易,减少在交易过程中的信息不对称,增加商品的曝光,平台会利用规则对商品进行筛选,形成万级别以下的特定商品池,该类商品池称为闲鱼小商品池,在闲鱼中以频道导购的形式展示给用户。小商品池存在以下几个特点。

实时性:在闲鱼搭建的小商品池中要求商品可以实时的流入到该规则下的商品池,为用户提供最新的优质商品。

周期性:在小商品池中,很多商品拥有周期属性,例如免费送的拍卖场景,拍卖周期为6小时,超过6小时后将被下架。

目前频道导购页面大多还是利用搜索引擎把商品呈现给用户,为了保证商品的曝光,一般利用搜索的时间窗口在商品池中对商品进一步筛选,但是仍存在商品曝光的问题,如果时间窗口过大,那么将会造成商品过度曝光,如果商品窗口过小那么就会造成商品曝光不足,同时还存在一个搜索无法解决的问题,同一时刻每个用户看到的商品都是相同的,无法针对用户进行个性化推荐,为了进一步提升对用户的服务,小商品池亟需引入个性化推荐。

三.小商品池个性推荐面临的问题

上文中分别介绍了闲鱼小商品池的特点以及闲鱼中个性化推荐流程,本章将从工程的角度,把闲鱼的个性推荐流程应用到闲鱼小商品池中,然后进行实验,最后对结果进行分析。

3.1小商品个性推荐的工程实现

上文中介绍了闲鱼个性推荐的流程,下面把闲鱼个性推荐的流程应用到闲鱼小商品池中。具体的系统架构如图2所示,主要分为四个层次,从下到上分别是数据提供层,数据支持层,应用支撑层和应用层。

图2个性推荐系统架构图

数据提供层,该层主要包含两个模块分别是:实时数据和离线数据,目前离线数据是T+1产生,实时数据小时级别产生。

数据支撑层,主要是对数据提供层数据的整合,形成商品数据表、X2I算法数据表和用户信息表,为了快速查询采用KV数据格式存储。

应用支撑层,封装了对数据的查询能力同时提供了算法实时计算的能力。

应用层,提供了用户、商品等信息查询功能和个性推荐中的Match、Rank功能。

利用以上的系统架构以和算法流程,个性推荐在闲鱼小商品池中进行了初步实践。

3.2个性推荐实验及结果分析

首先对商品的召回率进行验证,在实验过程中分别对2万级别、5万级别、10万级别、50万级别和100万级别的商品池进行了召回实验。同时在每个商品池维度又分别进行了不同召回数量的试验。

               

图3 召回实验结果图

从图3实验数据可以看出横坐标为商品池大小,纵坐标为召回符合规则的个数,对于20万小商品池,当总召回数量为1000时,有效召回数量(即小商品池中的商品数量)为3,在生产个性推荐工程中,无法满足有效召回个数,不能在生产中使用。进一步分析发现,无法使用主站流程对小商品池进行个性推荐的主要原因有如下几个:

在商品Match阶段依赖X2I对商品进行召回。X2I的数据是针对闲鱼全站的商品关系矩阵,召回商品后利用小商品池进行过滤,保留下来的商品会很少,商品池的数量级别过小,极端情况下甚至推荐不出商品。

实时产生的X2I数据无法快速回流,实时的X2I为了提高准确性一般都采用小时级别的回流,对于闲鱼周期性场景显然不适合,免费送拍卖的周期是6小时,如果依旧按照小时级别的回流,很多商品缺少曝光的机会。

总结来说,闲鱼主站推荐流程之所以不适应小商品池,主要体现在商品召回阶段。为了解决商品召回不足的问题,提出三种解法,提前过滤方法、向量搜索解决方法和商品引擎搜索方法。

四.推荐在小商品池的解决方案

在上文中利用全站X2I数据对小商品池的商品进行推荐过程中,发现在Match阶段,当小商品池过小时会造成商品召回不足的问题,为了提升小商品池推荐过程中有效召回数量,提出了如下三种解决方案。

4.1 提前过滤法

提前过滤方法,具体方案如图4所示,数据回流到搜索引擎前,小商品池对数据进行过滤,产生小商品池的回流数据,在商品进行召回阶段,利用小商品池的X2I进行商品召回,以此提升商品的召回率。

图4提前过滤法方案

该方案的优势:

复用全站的X2I数据,解决小商品池的冷启动导致X2I数据不准确的问题。

需要解决的问题:

针对每个商品池都建立对应的X2I,随着小商品池的增多,那么将维护多份X2I数据。

小商品池中小时级别回流的X2I数据,可能无法满足小商品池的时效性。

4.2 商品向量化法

在Match阶段利用向量相似性进行商品召回,商品向量化是利用向量搜索的能力,把商品的特性和规则通过函数映射成商品向量,同时把用户的Trigger和规则映射成用户向量,文本转换向量常用词袋模型和机器学习方法,词袋模型在文本长度较短时可以很好的把文本用词向量标识,但是文本长度过长时受限于词袋大小,如果词袋过小效果将会很差,机器学习的方法是利用Word2Vector把文本训练成向量,根据经验值向量维度一般为200维时效果较好。然后利用向量搜索引擎,根据用户向量搜索出相似商品向量,以此作为召回的商品。如图5所示商品的向量分两部分,前20位代表该商品的规则,后200位代表商品的基本特征信息。

图5向量搜索法方案

向量搜索的优势:

利用向量相似性搜索一定会推荐出商品,不需要兜底表的存在。

商品分钟级别进入向量搜索引擎,解决小商品池的时效性。

需要解决的问题:

映射函数需要保证商品关联的准确性。

映射函数能够区分开不同的规则下的商品。

映射函数能够保证用户特征映射的准确性。

用户和商品能够映射到同一个维度。

4.3 商品搜索引擎法

在Match阶段利用商品搜索引擎对商品进行召回,如图6所示在商品进入搜索引擎时,对商品结构进行理解,在商品引擎中加入Tag和规则,然后根据用户的Trigger和规则作为搜索条件,利用搜索引擎完成商品的召回。搜索引擎的天然实时性解决了小商品池推荐强实时性的问题。

图6搜索引擎召回方案

商品搜索引擎优势:

引擎的天然时效性解决了小商品池的实时性问题。

用户Trigger实时回流,推荐的商品对用户动作的响应会更实时。

需要解决的问题:

商品的理解,商品进入引擎时需要对商品进行打标,对商品的理解决定了商品打标的准确性和丰富性。

商品Tag和用户Trigger的对应关系,利用用户Trigger作为关键字作为商品召回时,如果商品的Tag和用户的Trigger是一一对应关系那么召回的商品自然很符合用户的意愿。

用户的Trigger时效性,利用用户Trigger进行作为关键字搜索,那么Trigger的回流是推荐准确性的前提条件。

商品召回时根据不同的Trigger对商品进行打散。

4.4 方案实施

为了解决小商品池在Match阶段召回数量不足的问题,提出了提前过滤法、商品向量法和商品引擎法三种解决方案,并对每种方案的优点和需要解决的问题进行了总结。提前过滤法随着商品池的增多X2I维护成本也线性增加,闲鱼中的小商品池场景的个数是万级别的,在实际应用中不利用维护。商品向量法对映射函数在一定程度上解决了小商品池的推荐,但是对映射向量要求较高,很难用向量描述商品特性,并把用户和商品映射为同样的维度进行搜索。所以本文中采用了利用搜索引擎进行商品召回。上文中分析了利用搜索引擎进行商品召回面临的问题,针对这些问题设计了如下解决方案,如图7所示:

图7商品引擎搭建方案

首先在商品发布时,先对商品进行结构化处理,把作为商品基本信息存入到DB的商品宽表中。同时商品的基本信息会同步到实时算法计算中,算法会根据商品进行商品质量的评分,商品的标签预测等算法行为;为了进一步理解商品,需要对卖家进行用户评分,这些信息在产出后实时同步到商品的宽表中。同时商品经过选品引擎,把商品的规则信息也同步到宽表中。最后把商品宽表通过全量和增量两种方式同步到搜索引擎,搜索引擎构建索引提供服务。

由于搜索引擎召回商品时是按照页数和每页个数进行召回数据,所以为了实现用户的个性化进行了如下的处理。第一步对用户的请求进行改写,扩大召回数量为请求数量的10倍,目的在于防止用户在第一页多次刷新可能会出现相同的商品。

图8.商品召回的个性化方案

第二步根据用户的Trigger进行商品召回,在召回过程中进行基于商品类目的打散,保证每个类目的商品数量不多于3个。

第三步对召回的商品进行过滤,对用户浏览过的商品进行过滤,用户浏览过的商品采用的是长度为200的FIFO的队列,保证用户在20页的浏览范围内部不重复。

第四步在进行排序截断过后,需要把返回给用户的商品数据写入用户已浏览的队列中。

4.5上线效果

用户的Trigger作为搜索条件利用搜索引擎召回商品,然后对商品进行过滤、打分、排序和截断实现对用户的个性化推荐,满足了小商品池中商品实时性、周期性的要求。我们进行了分桶对比实验,

 

图9成交数据

结果表明利用个性推荐后,单个用户的成交笔数提升0.14%,点击数提升了14.1%,点击人数提升了18.2%。

五.总结

本文首先介绍了闲鱼商品推荐的流程,然后介绍了闲鱼商品和闲鱼中小商品池的特点,通过实验发现闲鱼个性推荐流程应用到闲鱼小商品池中,在Match阶段存在召回数量不足的问题,针对面临的问题提出了提前过滤法、商品向量搜索法、商品引擎搜索法三种解决方案。最后通过理论和可行性分析,采用商品引擎搜索法解决个性推荐中商品召回不足问题,并对该方案进行了工程实现。结果表明该方法在用户点击率和成交转化上都有明显提升。

最后,闲鱼技术团队广招各类方向的达人,无论你是精通移动端,前端,后台,还是机器学习,音视频,自动化测试等,都欢迎投递简历加入我们,一同用技术改善生活!

简历投递:guicai.gxy@alibaba-inc.com

识别二维码,前瞻技术尽在掌握