排名算法简介:对搜索结果进行排序的主要排名算法

news/2024/12/15 8:50:17/

一、介绍

        学习排名 (LTR) 是一类监督式机器学习算法,旨在根据项目与查询的相关性对项目列表进行排序。在分类和回归等问题中的经典机器学习中,目标是根据特征向量预测单个值。LTR 算法对一组特征向量进行操作,并预测项目的最佳顺序。

        LTR 有许多不同的应用。以下是其中的一些:

  • 搜索引擎。用户在浏览器搜索栏中键入查询。搜索引擎应该对网页进行排名,使最相关的结果出现在顶部位置。
  • 推荐系统。电影推荐系统根据输入查询选择应向用户推荐哪部电影。

        让我们正式定义排名问题:

给定一个存储有关查询和文档信息的 n 维特征向量,排名的目标是找到这样一个函数 f,该函数产生一个实数,指示查询与文档的相关性。此外,如果对象 i 的排名高于对象 j (i  j),则 f(i) 应大于 f(j)。

注意。i ▷ j 表示文档 i 的排名高于文档 J。

二、数据

2.1 特征向量

        特征向量由三种类型的特征组成:

  • 仅从文档派生的特征(例如,文档长度、文档中的链接数)。
  • 仅从查询派生的特征(例如,查询长度、查询频率)。
  • 从文档和查询的组合派生的特征(例如,TF-IDF、BM25、BERT、文档中常用单词的数量和查询)

2.2 训练数据

        为了训练模型,我们需要将输入到模型中的训练数据。根据训练数据的收集方式,有两种可能的方法。

  • 离线 LTR。数据由人工手动注释。人工对不同查询和文档的对(查询、文档)的相关性进行评分。这种方法既昂贵又耗时,但提供了高质量的注释。
  • 在线LTR。数据是从用户与查询结果的交互中隐式收集的(例如,排名项目的点击次数、在网页上花费的时间)。在这种情况下,获取训练数据很简单,但用户交互不容易解释。

之后,我们有特征向量和与之对应的标签。这就是我们训练模型所需的一切。下一步是为问题选择最适合的机器学习算法。

三、排名类型

        从高层次来看,大多数 LTR 算法使用随机梯度下降来找到最佳排名。根据算法在每次迭代中选择和比较项目排名的方式,存在三种主要方法:

  • 逐点排名。
  • 成对排名。
  • 按列表排名。

        所有这些方法都将排名任务转换为分类或回归问题。在以下部分中,我们将看到它们如何在引擎盖下运行。

3.1 逐点排名

        在逐点方法中,为每个特征向量单独预测分数。最终,对预测的分数进行排序。使用哪种类型的模型(决策树、神经网络等)进行预测并不重要。

这种类型的排序将排名问题转换为回归任务,其中回归模型试图预测与所选损失函数(例如,MSE)的正确相关性。

另一种有效的方法是将真实值排名转换为独热表示,并将此数据提供给模型。在这种情况下,可以使用回归或分类模型(具有交叉熵损失)。

逐点模型体系结构。作为输入,模型接受查询和特征向量。

尽管该方法非常简单,但它存在下面列出的一些问题。

阶级失衡

使用逐点方法时的一个常见问题是类不平衡。如果在现实生活中进行随机查询,那么很可能集合中所有文档中只有一小部分与之相关。因此,在训练数据中,查询的相对和非相关文档之间存在高度不平衡。

虽然可以克服这个问题,但还有一个更严重的问题需要考虑。

糟糕的优化指标

逐点排名的优化目标存在一个主要的基本问题:

逐点排名独立优化文档分数,不考虑不同文档之间的相对分数。因此,它不会直接优化排名质量。

考虑下面的一个示例,其中逐点算法对两组文档进行了预测。我们假设 MSE 损失在训练期间得到优化。

集合包含 5 个文档,其中 1 个文档相关,其他 4 个不相关。对于相关文档,预测相关性为 0.7,而对于其他文档,预测相关性为 0.5。

        集合包含 5 个文档,其中 1 个文档相关,其他 4 个不相关。对于相关文档,预测相关性为 0.1,而对于其他文档为 0.2。

给定两个排名结果,我们可以看到,从算法的角度来看,第二个排名更好,因为相应的MSE值较低。但是,选择第二个排名意味着首先将向用户显示所有不相关的结果。顺便说一下,在第一个示例中,首先显示了相关结果,从用户体验来看要好得多。通常,用户不会过多关注之后的建议。

        这个例子表明,在现实生活中,我们首先更关心的是显示相关结果以及项目的相对顺序。通过独立处理文件,逐点不保证这些方面。较低的损失并不等同于更好的排名。

3.2 成对排名

        成对模型在每次迭代时都使用一对文档。根据输入格式,有两种类型的成对模型。

3.2.1 配对输入模型

        模型的输入是两个特征向量。模型输出是第一个文档排名高于第二个文档的概率。在训练期间,针对不同的特征向量对计算这些概率。模型的权重通过基于地面实况等级的梯度下降进行调整。

配对输入模型体系结构。作为输入,模型接受一个查询和两个串联的特征向量。

此方法在推理过程中有两个主要缺点:

  • 为了在推理过程中对给定查询的 n 个文档进行排名,模型需要处理其中的每一对文档,以获得所有成对概率。对的总数是二次的(正好等于 n * (n — 1) / 2),效率非常低。
  • 即使拥有所有文档的成对概率,最终如何对它们进行排名也不明显,尤其是在像恶性循环这样的矛盾情况下,当存在三元组文档(x,y,z)时,模型以以下方式进行排名:x ▷ y,y ▷ z 和 z ▷ x

恶性循环问题

由于这些缺点,配对输入模型在实践中很少使用,单输入模型优于它们。

3.2.2 单输入型号

        该模型接受单个特征向量作为输入。在训练期间,一对中的每个文档都独立地馈送到模型中以接收自己的分数。然后比较两个分数,并根据地面真实等级通过梯度下降调整模型。

单输入模型架构。作为输入,该模型采用查询和表示文档的单个特征向量。排名预测是在模型独立地将分数分配给两个特征向量后计算的。

在推理过程中,每个文档通过传递给模型来获得一个分数。然后对分数进行排序以获得最终排名。

对于那些熟悉Siamese网络(FaceNet,SBERT,e.t.c)的人来说,单输入模型可以被认为是Siamese网络。

3.2.3 成对损失函数

        在每次训练迭代期间,模型都会预测一对文档的分数。因此,损失函数应该是成对的,并考虑两个文档的分数。

        一般来说,成对损失将两个分数 s[i] — s[j] 之间的差乘以常数σ作为其参数 z。根据算法的不同,损失函数可以具有以下形式之一:

        

成对排序的不同损失函数

有时分数差 z 可以乘以一个常数。

RankNet是最流行的成对排名算法之一。我们将在下一节中查看其实现的详细信息。

3.2.4 排名网

        在获得文档 i 和 j 的分数后,RankNet 使用 softmax 函数对其进行规范化。通过这样做,RankNet 获得了文档 i 排名高于文档 j 的概率 P[i][j] = P(i ▷ j)。 相反,我们可以计算概率 P̃[j][i] = P(j ▷ i) = 1 — P(i ▷ j)。为简单起见,我们假设在现实中 i 的排名更高 j,因此 P̃[i][j] = 1 且 P̃[j][i] = 0。对于模型权重的更新,RankNet使用交叉熵损失,其简化方式如下:

        排名净亏损函数

        模型的权重由梯度下降调整。下次模型获得同一对文档 i 和 j 时,文档 i 可能会获得比以前更高的分数,并且文档 j 可能会被推下。

RankNet 分解

为简单起见,我们不打算深入研究数学,但在原始论文中提出了一个有趣的研究结果,作者找到了一种简化训练过程的方法。这是通过引入变量 S[i][j] 来完成的,该变量采用三个可能的值之一:

经过一些数学技巧,交叉熵损失的导数分解为:

公式中的 lambda 值是一个常量,可以相对快速地为所有文档对计算。通过取正值或负值,这些 lambda 充当推动文档向上或向下的力。

我们可以总结单个文档 i 的所有成对 lambda。此总和得出应用于排名中文档 i 的总力。

汇总 lambda 以查找应用于文档的总力

使用 lambda 直接导致更快的训练时间和更好的结果解释。

尽管成对算法的性能优于逐点方法,但它们有两个缺点。

不可解释的概率

模型的输出概率只是表明模型对某个对象 i 的排名高于对象 j 的置信度。然而,这些概率不是真实的,有时可以通过模型粗略地近似,所以总是使用它们进行解释不是一个好主意,尤其是在我们之前看到的恶性循环混淆的情况下。

最小化反转不是最佳的

这个问题比前一个问题要严重得多。大多数成对算法,特别是RankNet的根本问题是它们最大限度地减少了秩倒置的数量。虽然优化反转数量似乎很自然,但实际上这并不是大多数最终用户想要的。请考虑以下示例,其中包含两个排名。在您看来,哪个排名更好?

两个相关文件位于列表的开头和末尾。

两个相关文档位于列表中间的左侧。

虽然第二个排名的反转较少,这是算法的优先级,但普通用户仍然更喜欢第一个排名,因为顶部至少有一个相关结果。这意味着用户不必滚动浏览大量文档即可找到第一个相关结果。同样,最好使用nDCGERR等面向用户的指标,它们更强调顶级结果而不是反转次数。

因此,我们可以看到并非所有文档对都同样重要。算法需要调整,使其更加重视在顶部而不是底部获得正确的排名。

该论文的研究人员提出了一个说明良好的示例,说明使用RankNet优化排名如何导致非最佳结果:

我们可以看到,第 1 位的文档被推到了第 4 位,第 15 位文档被推到了第 10 位,因此反转总数减少了 2。然而,从用户体验来看,新的排名变得更糟。核心问题在于,RankNet为位置较差的文档分配了更大的梯度。但是,为了优化面向用户的指标,这应该相反:位置较好的文档应该比位置较差的文档进一步推高。这样,像nDCG这样的面向用户的指标将会更高。

3.3 按列表排名

        列表算法明确优化排名指标。要优化具有梯度下降的某个指标,需要为该指标计算导数。不幸的是,大多数排名指标(如nDCG精度)都是非连续且不可微分的,因此发明了其他先进技术。

        与逐点或成对排名不同,列表方法一次将整个文档列表作为输入。有时这会导致大计算,但也提供了更多的鲁棒性,因为算法在每次迭代时都会提供更多信息。

列表模型体系结构。作为输入,该模型采用所有文档的查询和特征向量。

3.3.1 LambdaRank

根据实现的不同,可以将 LambdaRank 视为成对或列表方法。

当关注 nDCG 时,似乎最好为位置交换导致更高 nDCG 的文档对分配较大的梯度。这个核心思想在于LambdaRank

算法名称中的“lambda”暗示LambdaRank也使用RankNet中描述的lambda进行优化。

研究人员产生了惊人的结果,并证明如果将RankNet中的损失值乘以|nDCG|,那么该算法倾向于直接优化nDCG!也就是说,LambdaRank算法与RankNet非常相似,除了这次lambda乘以nDCG变化:

nDCG优化公式

这项研究的不可思议之处在于,这个技巧不仅适用于nDCG,也适用于其他信息检索指标!同样,如果 lambda 乘以精度变化,则精度将得到优化。

最近,理论上证明 LambdaRank 优化了某些信息检索指标的下限。

3.3.2 其他方法

        我们不会详细讨论其他列表方法的工作原理,但仍然提供其实现两个光荣算法背后的主要思想。

        LambdaMart 是列表方法的著名实现,该方法使用梯度提升树和源自 LambdaRank 的损失函数。在实践中,它的性能优于LambdaRank。

      SoftRank解决了nDCG的衍生存在问题。它创建了一个称为“SoftNDCG”的新指标,该指标平滑地表示和近似 nDCG,从而可以找到相应的导数并通过梯度下降更新模型的权重。事实上,这种方法同样可以应用于其他指标。

四、结论

        我们已经介绍了排名 - 机器学习中的一项重要任务,用于按相关顺序对一组对象进行排序。逐点和成对方法不经常使用,而按列表方法最可靠。显然,我们只讨论了排名算法的一小部分,但这些信息对于理解更复杂的技术(如ListNet或ListMLE)至关重要。可以在此处找到列表算法的广泛列表。

        值得注意的是,LambdaRank是目前最先进的排名算法之一,它为优化特定指标提供了很大的灵活性。

        如果您想找到有关排名指标的更多信息,我强烈建议您阅读我关于此主题的另一篇文章。

排名评估指标综合指南

探索丰富的指标选择,并找到最适合您问题的指标

towardsdatascience.com

五、资源

  • 从RankNet到LambdaRank再到LambdaMART:概述
  • 学习使用梯度下降进行排名
  • 信息检索 |学习排名 |哈里·奥斯特赫伊斯
  • 学习排名 |维基百科
  • 软排名:优化非平滑排名指标

 有图片均由作者提供 维亚切斯拉夫·叶菲莫夫

·

http://www.ppmy.cn/news/1041808.html

相关文章

【Mysql】MVCC版本机制的多并发

🌇个人主页:平凡的小苏 📚学习格言:命运给你一个低的起点,是想看你精彩的翻盘,而不是让你自甘堕落,脚下的路虽然难走,但我还能走,比起向阳而生,我更想尝试逆风…

【Git】Git中的钩子

Git Book——Git的自定义钩子 Git中的钩子分为两大类: 1、客户端钩子:由诸如提交和合并这样的操作所调用 2、服务端钩子:由诸如接收被推送的提交这样的联网操作 客户端钩子: 提交工作流钩子 pre-commit:在提交信息前…

C++ 关键字override,final的作用

文章目录 一、为什么要引入这两个关键字?1.虚函数复写2. 类继承 二、override三、final C11引入这两个关键字 一、为什么要引入这两个关键字? 1.虚函数复写 不能阻止某个虚函数进一步重写 本意写一个新函数,错误重写基类虚函数(子类中 virtual 关键字可省略) 本…

通过 HttpClient 发送请求

文章目录 1. 引入 maven 依赖2. 发送 GET 方式的请求3. 发送 POST 方式的请求 1. 引入 maven 依赖 <dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId> </dependency>2. 发送 GET 方式的请求…

【Git】Git中用到的一些命令

Git文件有四种状态&#xff1a; 未跟踪未修改&#xff08;已跟踪&#xff09;已修改&#xff08;已跟踪&#xff09;已暂存&#xff08;已跟踪&#xff09; 通常我们将项目clone下来就会处于已跟踪状态 1、git diff命令 git diff&#xff1a;查看没有暂存的文件更新哪些部分…

高并发内存池(centralcache)[2]

Central cache threadcache是每个线程独享&#xff0c;而centralcache是多线程共享&#xff0c;需要加锁&#xff08;桶锁&#xff09;一个桶一个锁 解决外碎片问题&#xff1a;内碎片&#xff1a;申请大小超过实际大小&#xff1b;外碎片&#xff1a;空间碎片不连续&#x…

ntp网络时间服务器(网络时钟源)助力电子签名认证系统

ntp网络时间服务器&#xff08;网络时钟源&#xff09;助力电子签名认证系统 ntp网络时间服务器&#xff08;网络时钟源&#xff09;助力电子签名认证系统 医院信息系统中大量的文书需要医务人员签名提交&#xff0c;同时签名者需要为签署的文书承担相应的法律责任。如何判断签…

latex行内符号的编写

$ $ 【latex】输入公式与编号_latex公式后面加编号_hitrjj的博客-CSDN博客