京东电商推荐系统实践( 二 )


▌思考

京东电商推荐系统实践

文章插图
 
排序可以算是推荐系统中比较重要的一个环节,但是只有排序肯定是不够的,事实上,有一些问题是目前的排序框架无法解决的:
  • 排序得到的结果非常相似,影响体验 。
  • 有多个优化目标,需要一个平衡(点击率、订单金额、用户交互时长等) 。
  • 计算能力有限,如果有无限的计算力,可以直接对全部候选集进行排序 。
1. 多样性
京东电商推荐系统实践

文章插图
 
使用模型输出的结果一般都会非常相似,如果直接给用户看体验会很差,因此在模型之后我们需要加入多样性的逻辑 。
比较通用的解决办法是多样性的 ranking,这是一个贪心算法,从第一个商品开始选,当选第二个商品的时候,会重新计算下候选集中每个商品的 score,然后选择一个 score 最高的 。我们的方法是看 novelty score 候选商品的产品词分布和之前 N 个商品的产品词分布的 KL 距离 。这样做的思路,就是选一个和已有商品最不像的商品,来更好的保证商品推荐结果的多样性 。
由于纯基于算法的多样性可能会出现 badcase,因此还需要一个规则来进行兜底,确保在极端情况下结果也能接受 。
最后,我们思考一个问题,有没有更好的方法实现多样性的逻辑呢?当然有,比如是否可以考虑使用 list wise ranking 。这里只是为大家分享一个比较容易的,并且效果比较好的方法 。
2. 多目标
京东电商推荐系统实践

文章插图
 
我们的优化目标有很多,比如点击、转化、时长等,问题会变得比较复杂,单一的模型训练很难覆盖到所有指标 。另外,经常我们需要在各个指标之间进行权衡,因此可调试性也非常重要 。
一种很有用的方式是多模型 ranking,然后用某种方式把所有模型的结果 combine 。
这也体现了一个思想,在算法的实际应用中,其实需要在算法的先进性和系统可维护性、可调试性之间做一个平衡 。往往 paper 里很有创意的算法落地的时候是有些困难的 。
3. 多轮排序
京东电商推荐系统实践

文章插图
 
下面我们讨论一下多轮排序的问题 。多轮排序是 learning to rank 实践中很重要的一个思想 。使用多轮排序主要是因为计算资源的限制,无法使用复杂的模型进行大规模的候选集排序 。右图描述了一个多轮排序的框架 。这像是一个漏斗模型,从上往下模型的复杂度是递增的,同时候选集是逐渐减少的,就是越到后面用越复杂的模型来保证效果更好,越到前面可能只需要简单的模型来保证能拿到一些商品就可以了 。
这样会存在一个问题,由于训练样本可能有偏,导致只有被用户看到的样本才有 label,但是一般不会有太大的影响 。
▌基于索引的首轮排序
1. 索引召回
京东电商推荐系统实践

文章插图
 
下面我们重点介绍一下第一轮排序 。倒排索引很常见,是信息检索里常用的工具 。它通过把 doc 的内容索引到 doc id 的方式,快速通过内容来查找 doc 。我们很多召回都是通过索引实现的 。这里我列举了一些基于索引的召回方式,如 item cf 的 key、产品词、热门类目、促销产品词等 。
京东电商推荐系统实践

文章插图
 
虽然索引能够很大程度上的缩小候选集的范围,但是经常情况下,第一轮排序的 doc 数量仍然可能会很大 。为了保证性能,截断逻辑是必不可少的 。通过情况下可以通过 quality score 截断,保留质量好的 doc 。经过线性的 LR 或者 GBDT 模型就可以有结果了 。另外截断之后需要有些多样性的逻辑,因为只有在召回的时候保持多样性,最终结果才会有多样性 。
京东电商推荐系统实践

文章插图
 
基于 quality score 截断是一种 naive 的算法,这里我们讨论另一种业界也较常用的算法,wand 。wand 其实是 weak and,它的重点是 wand 操作符 。wand 操作符是一个布尔操作符,当 Xi wi 比 θ 大时,它的值是1,否则是0 。之所以叫做 weak-and,是因为当 w 都取1,θ 取 K 时,wand 操作符就变成了 and,当 w 取1,θ 取1时,wand 操作符就变成了 or 。可以看出 wand 是介于 and 和 or 之间的操作 。对 Xi wi 求和的操作其实和我们线性模型很相似 。通过 wand 操作符,我们可以定义一些上界,因为是倒排索引,可以给每个索引链赋予一个估计值,这样就可以拿到权重上界 UBt,这样通过和 wand 操作符对比,就可以快速的判断 UBt 是否满足条件,如果满足条件就可以快速的把一些 doc 扔掉,这样就可以快速的使用线性模型对全户做 ranking 。可以看到,基于线性模型的分数做截断,比完全基于 quality score 截断的策略要稍微好一点 。


推荐阅读