欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

推荐系统:粗排和细排

最编程 2024-07-07 12:20:45
...

1/什么是粗排

<1>粗排是不是必须的?

极端一点说,不同的业务、不同的发展阶段,甚至可以说召回、排序都可能不是必须的。
所以,粗排当然也不是在所有业务、所有阶段都是必须的。

分发物料少的业务,可以不用召回,直接进行精排模型打分就可以了;
推荐系统刚刚搭建,甚至连内容标签都没有的阶段,多维度的特征无法建立的时候,也许只有协同过滤召回的效果也是能接受的。
同样,粗排是在发展到一定的阶段之后,有很多路不同维度召回(多路召回),而且精排模型又已经达到一个很复杂很精细程度的时候,是夹在召回和精排中间的“折中”的产物。

想一下,如果召回一共有10000个item, 粗排之后输出1000个,精排之后输出10个。
如果算力允许,直接拿召回的10000个item去精排,是不是也可以?甚至更好?
从10000个item种直接找10个精排模型认为最好的,比从粗排的1000个item中找10个精排模型认为最好的,哪种效果会更好。
我认为前者更好。如果默认精排模型已经是足够精细综合的模型,那么它从更多的候选中选出按道理说更可能包含“更优”的item.

<2>粗排的目的是什么?

粗排是为精排做准备的。
如果直接把多路召回的item扔进精排模型(比如是10000个item),那么可能会对精排的算力有一定的要求。
粗排是用来帮精排模型找到那些它本来就要打高分的item,只不过范围更广一些。
按照上面的例子,如果没有粗排,精排模型自己找出来的某top10的item。
而粗排的任务就是要找到包含这10个item的一个更小的候选集,既保证了效果,又减少线上预测的负担。

总的来说:粗排是先从大的集合中找到一个复合要求的小的集合,然后把这个小的集合输入到精排模型中再进行更加细致的排序。在不影响推荐效果的情况下,减小精排模型的计算压力。

<3>粗排模型和召回模型有什么不同?

我问你一个问题:同样是DSSM模型,它作为召回和作为粗排模型,做法一样吗?

目的不一样,样本构造不一样。作为召回,它要不遗漏,它可以从全库item中负采样。作为粗排,它要准确,要接近精排,它的可以用线上的曝光的负样本,或者从全体召回候选中负采样。

我再问你一个问题:如果一个粗排的效率足够高,它可以把全库当成候选集,这个时候还需要其他多路的召回吗?按照上面的例子,全库有10万个item,我对这10万个样本用粗排模型预测一遍,取top1000,这样会比先召回10000再粗排,效果更好吗?

不一定。至少在体验上不一定。其实召回有一个隐藏的任务:弥补排序的“贪婪”,限制排序模型对眼前的欲望,留点机会后面有潜力的item.不能只给排序模型它喜欢的item.

有一个简单的场景能很好地理解上面的观点:一个人看了非常多并且只看了“美女”标签的内容,按道理精排模型肯定把所有“美女”的item前面。那是不是我们全部推荐“美女”的item效果就最好呢?不一定。召回要有多样性,有些类别虽然打分不一定最高,但是也要给机会。然后你就惊喜地发现,喜欢看美女的用户,往往也关系国家大事 。

<4>为什么要把排序分为粗排和精排序

可以把粗排看成是召回和精排之间的一个折中的产物。
随着现在user和item的爆炸式的增长,特别是像抖音,youtube这样的大体量的app,用户请求非常大。
在排序的阶段,不允许模型和特征太多复杂。
所以为了解决这个问题,在召回和排序之间添加了一个‘预截断’的过程,也就是粗排,然后后面的就理所当然的变成了精排。这样可以缓解精排模型的计算压力。

<5>召回和粗排的区别

(1)建模目标不同

   召回是漏斗的最上游,可以说是决定了推荐系统的上限
   召回的目标是召回用户可能感兴趣的 item,会考虑多方面的因素

   粗排是对召回的结果进行排序,选取topk个item送入精排模型进行更加细致的选择,
   常用的有两种建模方式:
    1. 独立建模,如在在广告推荐中,粗排也是优化ecpm,在推荐中也是优化Finish、Staytime等
    2. 对齐精排,用 leaning to rank 等方法去学习精排的序

(2)正负样本的选择不同

    如果说召回决定了推荐系统的上限的话,那么可以说样本的构造(正负样本分布)决定了模型的上限

   先看召回阶段:
   正样本一般选择用户有正反馈的样本,如ctr中用户点击了的作为正样本,like中用户点了喜欢的作为正样本
   但是负样本该怎么选呢?
   最简单的方法就是把推荐给用户后,用户没有进行正反馈的样本作为负样本。
   但是这样会带来一个问题,那就是召回模型在training和serving面临的样本分布是不一样的,违反了机器学习的基本原则。

   具体的来说就是,真正被推荐给用户的item只占所有item非常小的一部分,召回模型在serving时会面临很多它以前从来没有见过的样本,召回模型在这些样本上会很难区分

   怎么解决这个问题呢?
   通常的方法就是从召回的池子中进行随机采样


  再来看粗排:
  粗排的基本目标一般是对其精排,所以可以把精排的topk个样本作为正样本,然后从精排中其它样本中随机采样,作为负样本
  粗排对其精排本身没有太大问题,但是这里也有一个ee(exploit-explore)问题,如果粗排完全对其精排的话,可能会导致模型探索不足,为了缓解这个问题,我们可以适当补充一些进入召回但是没有进精排的样本作为负样本

2/什么是精排

精排就是对粗排的结果再进行一轮的排序,
最后选择topk个item进行推荐

推荐阅读