Fork me on GitHub

推荐系统全链路(2)召回粗排精排 - 级联漏斗上篇

转自:知乎-水哥
链接:https://zhuanlan.zhihu.com/p/396951216
说明:本文仅用于知识交流,如有侵权,联系删除

写在前面

1、把点击多的item曝光提升是推荐模型的基本能力,也是基本要求。后验不好的曝光提高也可能是好模型,后验好的曝光不提高,可以开除推荐模型了

2、在起量阶段,各路item需要争宠,谁能最快博取精排的欢心,谁就有可能在冷启动阶段占据压倒性优势

3、广告主很像dota教练,他们深信一个原则:阵容(素材)没问题,下把干(投放)回来

4、粗排没别的任务,就是向上管理

上一讲我们提到,整个链路是一个大漏斗,前面召回入口最多,最后精排仅仅输出一点点,在这一讲中我们会对漏斗的连接部分做更多的分析。包括上一讲中很多同学都想问的粗排,召回的学习目标,评价标准分别是什么,也会在这一讲和下一讲中详细讲解。

首先我们要分析漏斗的各个环节,学习的目标是什么。虽然整个链路正着往后推理,但是改进的时候往往是倒着往前的,原因我们在上一讲提到过。假如想加某种特征,那么先是精排验证有效,然后粗排。召回可以不按照这个规则走,因为召回很多时候是觉得上面的队列里缺少哪一方面的东西,才多一路的。

各个环节的学习目标及问题

精排的学习目标:后验

以点击率(CTR)预估为例,精排学习的目标的范围一般是所有存在曝光的样本。有曝光但没有点击的是负样本,有曝光也有点击的就是正样本。在其他目标中可以以此类推:比如转化率(CVR)预估,点击了没转化的是负样本,点击了,也转化了就是正样本。

精排的评估方式:AUC/GAUC

说白了,精排还是一个排序模型,排序模型输出的结果,线下都可以由AUC来进行评估。在[1]这篇论文中,阿里的工程师们提出了另一个评价指标:Group AUC(GAUC),如下:

图片

在这个指标中, 代表的是曝光数或者点击数。这个指标是对用户的行为做了加权,比较偏向高活跃的用户。

线上指标则根据业务各有不同,比如在短视频平台上,推荐看的就是观看时长,而广告看的则是eCPM(出价乘以CTR乘以CVR)。在电商平台上看的是GMV(Gross Merchandise Volume,商品交易总额)。线上提升是由线下的一个一个模型提升带来的。比如在广告场景下,既要提升CTR,也要提升CVR,也要改善出价机制。推荐场景下,既要提升对于观看时长的预估,也要提升用户正负反馈(比如点赞关注这些)的预估。

关于AUC和GAUC的文章参考有:

精排的样本组成

在精排中,每次行为都是一条样本,最后实际上是一个分类任务,分为“点击”或者“不点击”的二分类。在一个点击率预估模型中,正样本是非常稀疏的。对于模型来说,当他遇到正样本的时候,它必须把这个结果反映到当前的用户和item上。也就是说,相比于没有点击的样本,这个item会得到模型的认可。那么在接下来的预估中,这个item自然会被更加青睐,排序更加靠前。这样就使得item的曝光能力提升。这样我们就归纳出了推荐系统的一个基本性质:正反馈的能力 。指的是对于一开始后验较好的item,他们的排序更靠前,曝光会进一步提升 。如果去掉一开始这三个字,这句话就是一句废话。但是所谓“一开始”就表明该item不一定是一个真正好的素材,而这会引发下面的问题。

(这里留一个思考题,这个正反馈会无限地持续下去吗?答案我们在未来专门讲item的生命周期中来揭晓)

精排的问题1:ground truth不够置信

我们想评价一个item的质量是否好,其实是需要一定量的曝光量才能说明。但是系统整体的曝光机会往往是有限的。给你的曝光多了必然意味着对他的曝光机会少了。因此有很多item在没有得到充分曝光的情况下就被判了死刑。有的item可能不错,但是在一开始因为有点随机性,或者精排没预估的比较准,导致最初的量没起来。当最初的量没起来的时候,别的起来了的item迅速博取了精排的欢心,这个不幸运的item就只能被打入冷宫了。如下图:

图片

这个问题不仅我们知道,广告主们也知道。他们不仅知道,他们还会不服。他们当然会优化素材,但同时也会进行大量的“重开”,即同样的素材内容,换一个id再来一遍(当id变成新的,系统就会把它当做新的重新开始,这涉及到后面要讲的冷启动问题)。这就是所谓的“阵容没问题,下把干回来”。当大量的广告主这样做了之后,平台资源就会被极大的浪费,因此平台也会做各种方法来阻止这件事情。所以我们也能看到,平台和金主爸爸有时候也存在一种博弈。

精排的问题2:自嗨

从上面的叙述中,可以看出精排学习的目标往往有一个共同的特点,就是正负样本都来自于已经曝光的样本 ,而曝光与否是谁决定的呢?是精排自己决定的。这就造成了“自己学自己”的问题,学习的目标本来就是自己产生的,在自己原本的大方向上有可能一条路走到黑 。设想有AB两个item,实际上B是一个更优秀的素材,因为系统随机性或者精排的缺陷,A获得了更多的曝光量,而B只获得了很少的曝光量。而B恰好在这几个曝光量中都没获得什么正向反馈。那接下来B就惨了,根据我们上面说的正反馈特性,A的曝光会越来越高,正向的点击数据越来越多,而B可能就暴毙了。这个情况如果不断恶化,推荐系统可能会陷入局部最优中出不来,也就是我们说的“自嗨”:它认为A好,所以给了A更好的条件,而A自然获得了更好的反馈,又再一次验证了系统的“正确性”。最终在A比B好的错误路线上越走越远。

那么有什么办法可以防止这个情况?一般来说有两种方法。第一种是策略的干涉。有的策略会强制一定的探索量,比如上面的B曝光不能低于100,这样会缓解一些学习错误的问题。可能还是有个别item的序会不符合,但是整体上发生错误的概率会变低。另一种做法是开辟“随机流量”,即有一定比例的请求不通过任何模型预估,直接随机展示看看点击率。随机流量的结果一方面可以认为是完全真实的训练样本,另一方面也可以对照当前模型的效果。


讲完了精排部分,我们再来讲讲粗排部分

粗排的学习目标:精排

naive的方案中,粗排也可以直接学习后验数据。但这不是一个好主意,你又决定不了输出,学精排(领导)的做事方法,你优化的目标精排(领导)不认,还没干好自己的本职工作(向上管理)。毕竟后验是精排控制的,粗排只能优化级联的下一端。

粗排的学习目标应该是精排的输出 。说白了,粗排只是一个精排的影子,就像上一讲提到的,要不是精排吃不下,也不会需要粗排。因此粗排就是跟精排保持步调一致。如果粗排排序高的,精排排序也高,那么粗排就很好的完成了“帮助精排缓冲 ”的目的。反之,如果你排序低的,精排反而排的高了,那你不就是跟领导对着干嘛。

粗排的样本组成+学习方法:Learning to Rank

对于粗排,我们需要两个,或者一组样本。假如精排的队列有100个排好序的样本,我们可以在前10里面取出一个A,作为好样本。再从后10个取出一个B当做坏样本。粗排的目标,就是要让自己也认为A好于B。越是这样,它就和精排越像,就越能帮精排分担压力。

此时不是一个分类任务了,而是learning to rank的一种方法,pairwise的学习。目标是让上面的A和B之间差距尽可能大(还可以更彻底的拿出更多样本,比如精排输出每10个里面取一个,得到一个长度为10的list,按照list-wise的方式去学习。list-wise比较复杂,后面再讲)。这里先提一下pairwise如何实现。我们把两个样本记为 和 ,做差之后带入一个binary cross entropy的loss:

图片其中 代表sigmoid。假如第一个样本更好, ,只有前半部分被激活。此时loss最小就要求 比 大的越多越好。反之亦然。

注意在这样的设计下,我们就把没有曝光的样本纳入训练范围了 。粗排入口比精排大,训练样本也比它多,这就很合理。

最后用一张图来总结下:

图片粗排的评估标准:精排

既然粗排学习的目标是精排的输出,那么粗排的评估自然也就是学精排学得像不像。在线下可以有两种指标来评估。一种是NDCG,它是一种评价两个排序相似度的指标,就是把精排输出的样本让粗排过一遍,看看粗排输出的排序结果和精排有多像。

NDCG的具体计算方式:NDCG介绍与实现和推荐系统中的应用

第二种评估方式是召回率,或者重叠度(也可以用IOU啥的)。即精排输出的前 ,有多少在粗排输出的前K里面。这个也是用来评价两个模型输出像不像。

相比之下,NDCG是一种更细致的指标。我们可以认为NDCG不仅仅刻画了topK的召回,也刻画了top K-1,K-2……等等情况。

讲完粗排之后发现要讲的东西太多了,写不下了,我们留(鸽)到下一讲吧

参考文献

[1]. Optimized Cost per Click in Taobao Display Advertising


本文地址:https://www.6aiq.com/article/1634686246960
本文版权归作者和AIQ共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出