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

news2025/1/19 8:13:19

一、介绍

        学习排名 (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.coloradmin.cn/o/896020.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【FAQ】视频集中存储EasyCVR安防监控平台接入AI分析时的通道显示问题排查

安防视频监控平台视频集中存储EasyCVR可拓展性强、视频能力灵活、部署轻快,可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等,以及支持厂家私有协议与SDK接入,包括海康Ehome、海大宇等设备的SDK等。 安防监控视频云存储平台EasyCVR既具…

为什么贴片电阻的阻值不规律?为了在某精度下做到阻值的全覆盖(对,但不全对),E系列电阻的算法(E12系列值不对的猜想)

1、先放上E系列的电阻表格 E12精度10%,E24精度5%,E96精度1%; 2、以精度作为条件的演算 通常我们选择电阻,要确定电阻的精度,如果以精度作为条件。 以10%精度来说:(数值少,好算&am…

STM32 CubeMX (第二步Freertos任务通信:队列、信号量、互斥量,事件组,任务通知)

STM32 CubeMX STM32 CubeMX ____Freertos任务通信:队列、信号量、互斥量,事件组,任务通知 STM32 CubeMX一、STM32 CubeMX设置时钟配置HAL时基选择TIM1(不要选择滴答定时器;滴答定时器留给OS系统做时基)使用…

超分辨率地震速度模型

文献分享 1. Multitask Learning for Super-Resolution 原题目:Multitask Learning for Super-Resolution of Seismic Velocity Model 全波形反演(FWI)是估算地下速度模型的强大工具。与传统反演策略相比,FWI充分利用了地震波的…

计算机丢失msvcp110.dll是什么意思?如何修复?

在日常使用电脑的时候,有时候会遇到一些使用问题。 比如,有一次遇到了这样一个问题。 那就是,因为“msvcp110.dll”这个文件丢失,有些软件安装不了。 计算机丢失msvcp110.dll是什么意思?该如何修复呢? ​…

05-微信小程序常用组件-表单组件

05-微信小程序常用组件-表单组件 文章目录 表单组件button 按钮案例代码 form 表单案例代码 image 图片支持长按识别的码案例代码 微信小程序包含了六大组件: 视图容器、 基础内容、 导航、 表单、 互动和 导航。这些组件可以通过WXML和WXSS进行布局和样式设…

LC-二叉树最大深度

LC-二叉树最大深度 链接:https://leetcode.cn/problems/maximum-depth-of-binary-tree/description/ 描述: 给定一个二叉树 root ,返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 例1: …

一力破万法,Fiddler跟Charles抓包图文详解教程

一、Fiddler 1.1 Fiddler抓取HTTPS设置 1.1.1 配置证书 Tools菜单 —> Options —> HTTPS —> 勾选Decrypt HTTPS traffic选项。 说明: 勾选Decrypt HTTPS traffic选项:Decrypt HTTPS traffic:意思是解密HTTPS流量(…

[VS/C++]如何更好的配置DLL项目中的成品输出

注意,解决方案与项目不放在同一个文件夹中,即不选中图中选项 直入主题 首先右键项目选择属性,或者选中项目然后AltEnter 选择配置属性下的常规 分别在四种配置中编辑输出目录如下 注意,四种配置要分别配置,一个个来…

leetcode做题笔记86分隔链表

给你一个链表的头节点 head 和一个特定值 x ,请你对链表进行分隔,使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。 你应当 保留 两个分区中每个节点的初始相对位置。 示例 1: 输入:head [1,4,3,2,5,2], x 3 输出&am…

用pytorch实现google net

GoogleNet(也称为Inception v1)是由Google在2014年提出的一个深度卷积神经网络架构。它在ImageNet Large Scale Visual Recognition Challenge (ILSVRC) 2014比赛中取得了优秀的成绩,并引起了广泛的关注。 GoogleNet的设计目标是构建一个更…

【学会动态规划】最长湍流子数组(23)

目录 动态规划怎么学? 1. 题目解析 2. 算法原理 1. 状态表示 2. 状态转移方程 3. 初始化 4. 填表顺序 5. 返回值 3. 代码编写 写在最后: 动态规划怎么学? 学习一个算法没有捷径,更何况是学习动态规划, 跟我…

LeetCode49.字母异味词分组

我一开始的思路就是用1个hashmap<Integer,List<String>>,Integer存的的是字符串所有字母ASCLL值的和&#xff0c;List里面放异位字符串&#xff0c;但是不是异位的字符串的ascll值也可能相同比如acd和abe&#xff0c;所以这个hashmap只能降低一点时间复杂度我还是要…

整理mongodb文档:索引

个人博客 整理mongodb文档:索引 个人博客&#xff0c;求关注&#xff0c;有问题的地方欢迎指出&#xff0c;觉得讲解的繁琐的也请指出 文章概叙 本文主要还是在shell下的操作。让大家了解下mongodb中index的用途&#xff0c;基本的索引的新增、查看、删除等&#xff0c;最后…

使用Dockker创建vwas容器时报错的解决方法

执行命令 docker run -it -d -p 13443:3443 --cap-add LINUX_IMMUTABLE secfa/docker-awvs没有详细看报错之前找了各种各样的解决办法&#xff0c;都无法解决。因此以后在看报错提示的时候耐心一点看关键词Error 后来才发现启动vwas时docker报了这个错&#xff1a; OSError: …

记忆正则表达式的基本元件

正则常见的三种功能&#xff0c;它们分别是&#xff1a;校验数据的有效性、查找符合要求的文本以及对文本进行切割和替换等操作。 正则表达式&#xff0c;简单地说就是描述字符串的规则。在正则中&#xff0c;普通字符表示的还是原来的意思&#xff0c;比如字符 a&#xff0c;…

【编织时空三:探究顺序表与链表的数据之旅】

本章重点 链表OJ题 1. 删除链表中等于给定值 val 的所有结点。 OJ链接 思路一&#xff1a;删除头结点时另做考虑&#xff08;由于头结点没有前一个结点&#xff09; struct ListNode* removeElements(struct ListNode* head, int val) {assert(head);struct ListNode* cur h…

利用Opencv实现人像迁移

前言&#xff1a; Hello大家好&#xff0c;我是Dream。 今天来学习一下如何使用Opencv实现人像迁移&#xff0c;欢迎大家一起参与探讨交流~ 本文目录&#xff1a; 一、实验要求二、实验环境三、实验原理及操作1.照片准备2.图像增强3.实现美颜功能4.背景虚化5.图像二值化处理6.人…

操作系统-笔记-第二章-进程调度

目录 二、第二章——【进程调度】 1、调度的概念 &#xff08;1&#xff09;五状态和七状态&#xff08;就绪挂起、阻塞挂起&#xff09; &#xff08;2&#xff09;三层调度 &#xff08;高级、中级、低级&#xff09; &#xff08;3&#xff09;总结 2、调度的切换 &a…

Vue--》打造个性化医疗服务的医院预约系统(六)

今天开始使用 vue3 + ts 搭建一个医院预约系统的前台页面,因为文章会将项目的每一个地方代码的书写都会讲解到,所以本项目会分成好几篇文章进行讲解,我会在最后一篇文章中会将项目代码开源到我的GithHub上,大家可以自行去进行下载运行,希望本文章对有帮助的朋友们能多多关…