Article

先找到,再排好:我两周学会的“检索系统评估”

从召回与排序出发,梳理 Recall@K、Hit@K、MRR 和条件 MRR,并记录候选池、错误分析与分布漂移带来的思考。

文章目录

在线上购物商城搜索商品,,线上商城会从几亿件商品里筛选出几千件(召回),并且把它认为你最可能购买的排到最前面(排序),这篇文章就是介绍召回与排序

两阶段:召回和排序

召回与排序的含义:

​ 顾名思义,召回看的是正确答案有没有被筛选进入候选池;而排序则是在候选池中以一定的标准对候选进行排序.

为什么要拆开:

​ 召回是从大池中筛选出符合条件的候选,而排序则是在召回的基础上进行进一步的排名.召回了正确答案,但是并不意味着排序也会让正确答案进入前列.排序能力极强,但是却无法召回正确答案,这样永远也无法得到正确答案.因此,这两个步骤需要拆开.但拆开并不意味着两者是独立的.(MRR,条件MRR,召回率)当选择扩大候选池,增加召回量时,此时排序受到的噪音会更多,影响排序.当同一候选池采用不同的排序方法时,得到的结果也可能不同.

例子:

​ 比如在工作招聘中,一般公司会根据简历建立一个候选池,然后再用面试等方式对候选者进行排序,最终筛选出受聘者.

怎么打分:Recall@K、Hit@K、MRR:

含义:

Recall@K:

​ recall,召回,Recall@K就是在前k个候选中找到了多少正确答案,这些正确答案数量占总正确答案数量的多少.

​ 例如,这道题有三个正确答案,召回了10个候选,其中有两个正确答案,召回率就是 Recall@10=23\text{Recall@10} = \frac{2}{3}.

Hit@K:

​ hit,击打,Hit@K,即命中率.是否命中了正确答案.如在10个候选中存在正确答案,那么Hit@K = 1.当然,如果像kaggle casmi2026赛题这样一个查询谱对应一个正确答案,那么这时Recall@K与Hit@K相同.

MRR:

​ RR:用排名的倒数来作为分数,即 RR=1排名RR = \frac{1}{\text{排名}}.例如排名第一即是1,排名第4就是 14=0.25\frac{1}{4} = 0.25.

​ MRR:mean平均,就是多个题目的平均RR分数. 例如,四次搜索,答案分别排第 1、第 2、没找到、第 4,MRR 是:

MRR=1+0.5+0+0.254=0.4375\text{MRR} = \frac{1 + 0.5 + 0 + 0.25}{4} = 0.4375

注意:加入一个候选进入了候选池,但是我想计算的是MRR@30,而这个候选在30名外,那么就算0分,分母也要算上它,如果不算,分数会偏高

条件MRR:分数低,到底是哪一段的锅?

条件MRR:

定义:

​ 在30道题目中,有15道题目的正确答案都被召回,进入候选池.那么条件MRR就等于这15道题RR的总和除以15

与MRR的关系:

​ MRR等于所有RR的总和除以总数量.但是由于有效得分都是在存在召回正确答案的题目中的,所以以上一题为例,这15道题RR的总和也是MRR计算时的分子.条件MRR再乘以总的召回率(正确答案进入候选池的题目比例),分数的乘法相约,那么就发现得到了MRR:

MRR=∑RR30,条件MRR=∑RR15,召回率=1530\text{MRR} = \frac{\sum RR}{30},\qquad \text{条件MRR} = \frac{\sum RR}{15},\qquad \text{召回率} = \frac{15}{30} 召回率×条件MRR=1530×∑RR15=∑RR30=MRR\text{召回率} \times \text{条件MRR} = \frac{15}{30} \times \frac{\sum RR}{15} = \frac{\sum RR}{30} = \text{MRR}

因此:

MRR=召回率×条件MRR\text{MRR} = \text{召回率} \times \text{条件MRR}

公式的作用:

​ 有了这个公式,我们就能更加直观的看出召回与排序的关系.假如一个推荐系统的召回率高达90%,但是最终效果还是不好,根据公式,说明这是条件MRR过低,也就是排序能力存在问题.

候选越多,不一定越好:

为什么:

​ 根据上面的数学公式,要想要积增加,就要使因数增加,于是,我们便很容易想到增加候选池的大小,增加召回率.但是这里两个因数并不是独立,候选的增加,意味着会面临更多的杂音,这会增加排序的难度,原本正确答案的排名很高,但在大量的杂音下,反而可能位次下降.比如说:简历多收十倍,面试官的时间不变,每份简历能分到的注意力就少了,真正优秀的人反而可能被埋没

启示:

​ 因此,我们需要找到召回与排序之间的一个平衡.我们可以这样做来找到这样的平衡:把候选数量当成一个可以调的参数,拿几个不同的大小分别试(比如 3000 和 10000),每次同时看召回率和 MRR,选 MRR 最高的那个。

看总分会骗人:要逐条拆开看:

为什么:

​ 例如kaggle casmi26赛题,当更新方法在数据集上得到的MRR提升了,并不意味着新方法比旧方法更好.更科学的,我们应该具体地去看看到底是哪部分在变好,哪部分在变差,什么在不变.如果成功的部分集中在一个分子,那么很可能只是方法适用于这个分子,具有偶然性.我们更期待的是看到不同分子地稳步提升带来的得分提升.针对失败,我们可以以失败原因分类,然后从大到小地解决问题.例如一次考试虽然总分提升了,但是细究得分情况,发现选择题其实相比以前反而差了些,但是在平时失分的大题中,这次运气好,考得更简单,得分更高,但是这显然并不意味着我能力上升.

阈值和分布:参数在一批数据上最好,换一批不一定

阈值:

​ 在kaggle casmi赛题中,class1是参考库里有这个分子的谱,而class2则是参考库里没有这个分子的谱,最多只知道候选结构.于是相应的,class1可以采用直接的以图搜图比较相似度的方法.class2则需要其他更加复杂的方法.但是,在隐藏测试集中,我们并不知道这个要判断的分子是class1还是class2,因此,我们就需要一个阈值来判断.假如参考谱与查询谱算出来的相似度高于阈值,我们就认为这是class1,假如小于,我们就进入class2的解决办法.

分布:

​ 以化学为例,我们想预测这个分子的结构,隐藏测试集的分子结构全都是在某种实验仪器下的特定某种分子,但是我们的数据集里面可能是来自各种实验条件的不同分子,因此,我们在数据集上得到的有效办法,可能在隐藏测试集上没那么奏效,这就是分布漂移.

阈值与分布的联系:

​ 因此因为分布漂移,我们在选取阈值的时候,更应该考虑与隐藏测试集条件相近的情况来选取阈值,而不是选择一个整体的阈值.

总结:

​ 检索排序系统的步骤分为召回与排序,召回与排序会相互影响,并不独立.分析错误时不能只看总体分数,要看具体情况的变化.