作者 | 阿狗
整理 | NewBeeNLP
https://zhuanlan.zhihu.com/p/699188815
五花八门的说法越来越多,但是粗排的意义本质还是由于在工业界中业务链路性能、算力的约束下,漏斗链路设计中的一环,其使命就是在既定资源、性能约束下从全量候选集合中选出一个“优质候选集合”
典型的漏斗链路包含:召回、粗排、精排, 有的也可以粗排和召回合并为一级漏斗,也有的在精排之前甚至有3级漏斗,这都是不同方案设计的问题,但是都不影响粗排的定位。
大概在2019年以前,很多人把粗排当成小精排定位,用精排的指标衡量粗排, pv/click的auc之类,但是两个模块两个模型学习同一个目标,两者之间的gap一定会带来效果的折损,和通道的不畅通, 所以这时候大家提出来了一致性的评估指标,也是从2020延续到现在的主流评估思想。
粗排目前主流的评估思路是用和精排的一致性相关指标来评估:因为粗排从功能定位上就是一个帮精排减轻负担的一个模块, 两个模块在业务目标上是一致,只不过一个选top几百,一个选top几个,但是在精度要求和候选分布集合上不一致。
目前粗排常用的指标:自定义的auc、ndcg、hitrate等各种变种;
精排topK目标auc(K一般比较小,代表能展示的候选):定义精排topK为正,其余为负。以此计算auc,和业务的目标会比较接近
recall 或者hitrate@N:比如粗排截断500个候选,那么在这500候选上看 topN个粗排分后选,能命中精排topK的概率
和精排排序一致性的auc:用和精排的排序一致的总pair对数量作为分子,所有的pair对作为分母,可以衡量和精排一致性,但是由于粗排更重要保证要把精排的top候选选出来的能力, 所以该指标和业务效果相关性不大。
各种变种的NDCG:考虑了位次重要度的指标 ndcg= DCG/ IDCG;DCG叫 折损累计增益(Discounted Cumulative Gain) 思想是命中的item越排名靠前增益越高, IDCG是完美的排序下的dcg 。DCG的计算一般用。sum【每一个item的价值分/log(n+1)】, n是列表排序位次,也就意味着排序越靠前的item对dcg贡献的越大。
我们团队目前使用的除了第一种auc之外,比较有效的是 也是折损累计增义的思想:我们定义DCG@N为粗排截断N后的排序期望收益(可以就按可曝光的候选算期望价值分),而IDCG就是当下该请求的最佳排序期望收益。IDCG我们就直接用线上真实排序的期望收益(rps或者rpm),那么想评估粗排的能力,我设置一个比线上粗排截断更小的一个数进行截断,看效果损失 , 粗排分截断300后的模拟期望收益 / 线上真实期望收益, 表示我粗排如果截断300给排序带来的效果,其损失越小越好。
以上的各种指标,其实都在一定程度上衡量粗排和精排的一致性,这里其实就可以理解为粗排没有合适的groudtruth, 但是我就用精排的打分作为我的groudtruth。
每次我看到这个问题就很郁闷,因为我觉得这个问题本身不太严谨,太宽泛了:一致性高低具体怎么定义?具体用什么候选集集合来评估?都没有明确的说明和定义。
就算确定了指标,这个问题就好比有人问精排的auc 是否越高越好,那肯定也不是,除了auc,还有gauc,还有oe,还有分布等都会影响效果。就算一个精排模型在曝光集合上auc满分,你也没办法保证没有曝光的那部分候选是否是潜在的更好的候选,所以遇到具体问题就需要更多的指标来去分析和论证。只是一般情况下用auc指导优化还是可以的。同样一般情况下粗排用我们自己定义的适合自己的一致性指标也是足够指导优化的。
粗排的评估,有一个比较值得关注的工作是:2022年阿里搜索提出来了一篇文章介绍了他们的评估,他们把整个粗排的评估分为了:呈上启下,一则衡量召回-粗排的损失, 一则衡量粗排-精排的损失, 前者侧重能更好的应对ssb问题,后者侧重在排序效果上和精排趋于一致。
一般情况下,通过提升一致性,大概率都可以使得整个链路更为通畅,尤其是在广告业务下(有bid因素影响,这种链路竞价通畅就更为重要)。但只关注一致性,会损失一些优化的视角, 参考阿里的那篇文章提出来的全域评估。
极端情况下会遇到离线评估一致性增长,但献上效果不跌反降, 分析你会发现在新分支上 精排的效果变差、或者精排、粗排的一致性变差,出现和离线不一致的情况。这种情况一般有两个原因:
一种情况:看精排的排序分是否变高了,如果变高了,说明在线上粗排从精排一致性的能力还是ok的,选出了精排认为更好的候选,只是因为精排对这部分候选上的打分精度下降,导致虚高。
这种情况这个系统也未必就是坏的,只是说在老的系统下,这样的迭代方法无法推全,不具备可行性,那就需要针对问题做针对性的小改进调整
另外一种情况:精排的排序分可能没变甚至变低了, 这时候说明粗排遇到了较为严重的SSB问题,选出来的整体候选集合质量变差了,以及精排仍然也会遇到打分精度跟不上oe变差的问题。
这种情况肯定是比较糟糕的,说明粗排性能下降了,要去优化。
怎么构造样本,这里需要考虑SSB问题, 样本从曝光空间、排序空间、召回空间,前者是后者的子集,如果只用曝光空间的样本,则会导致训练空间和推理空间不一致,造成粗排效果不佳。
所以一般都是要都有有所涉及。一般用精排topK 作为证样本, 然后在精排候选、召回候选进行负采样作为副样本。这时候样本权重也会有一些优化技巧, top候选增大权重往往能提高效果。
还有引入多目标建模, 无论是多塔分数做bagging,或者单独用主塔分数,都可能获得更好的效果。
最好就是用全连接结构,单塔模型。很多人说不看好粗排用单塔模型那是不对的:因为精排是持续朝着复杂化,精细化去发展的,如果粗排始终停留在双塔, 脱节会越来越大,损失也会越来越大。
有人也会提:算力的提升那么快,以后也许有足够的算力和性能用复杂模型打全库,粗排保持双塔就够了。那我只能说这个就是看后续发展的趋势, 是算力的发展超过数据、模型的发展,还是模型的发展超过算力的发展。至少现在看,精排模型的复杂度提升空间还大得很, 而且各大公司也勇于尝试更大餐数量,更复杂的模型,对算力的需求是持续增加的, 也就要求粗排也要能跟着水涨船高, 否则无法发挥尖端模型的效果优势, 可能一个及其高精尖的精排模型受限于算力(打分候选量), 干不过一个适中复杂度的精排模型。
全连接粗排模型下:考验一些工程化能力, 参考cold粗排, 可以做特征筛选、可以做量化、蒸馏、网络减脂等工作。
剩下的就是双塔粗排,和召回模型结构差不多,这里不多说了。
Loss的选择, 这里尝试过很多,感觉区别不大。
想和你一起学习进步!『NewBeeNLP』目前已经建立了多个不同方向交流群(机器学习 / 深度学习 / 自然语言处理 / 搜索推荐 / 图网络 / 面试交流 / 等),名额有限,赶紧添加下方微信加入一起讨论交流吧!(注意一定o要备注信息才能通过)
美团技术团队:美团搜索粗排优化的探索与实践: https://zhuanlan.zhihu.com/p/553953132
[2]深度统一粗排在淘宝主搜索的优化实践: https://zhuanlan.zhihu.com/p/630985673