再谈排序算法的pairwise,pointwise,listwise

article/2025/10/20 19:30:00

  NewBeeNLP·干货  

作者:DOTA

大家好,这里是 NewBeeNLP。

最近因为工作上的一些调整,好久更新文章和个人的一些经验总结了,下午恰好有时间,看了看各渠道的一些问题和讨论,看到一个熟悉的问题,在这里来分享一下。

在排序算法里有三种优化目标:pairwise,pointwise,listwise,每个方法都有其优缺点。

  • pairwise是每次取一对样本,预估这一对样本的先后顺序,不断重复预估一对对样本,从而得到某条query下完整的排序。pair-wise损失在训练模型时,直接用两个物品的顺序关系来训练模型,就是说优化目标是物品A排序要高于物品B,类似这种优化目标。

  • 对于pointwise而言,每次仅仅考虑一个样本,预估的是每一条和query的相关性,基于此进行排序。最简单的损失函数定义是Point-wise,就是输入用户特征和单个物品特征,对这个物品进行打分,物品之间的排序,就是谁应该在谁前面,不用考虑。

  • Listwise同时考虑多个样本,找到最优顺序。List-wise的Loss更关注整个列表中物品顺序关系,会从列表整体中物品顺序的角度考虑,来优化模型。

pairwise 用于推荐系统的排序任务时,效果却差于 pointwise?

ceadac5161d34bea27ada2218f2b351b.png

(1)point wise虽然简单,但是存在不少问题。比如搜索场景,我们确实可以预估每个query到每个document的点击率做为排序依据,但是点击率要考虑rank,例如排的越靠前的document点击率上占据优势,这些point-wise模型很难考虑进去。

(2)pair wise是在搜索排序中提出的,是基于相关性标注的,正负例之间是有明显界限的,基于它产生的排序结果能输出明确的相关性。这种正负例之间的明显界限,是因为我们搜索时是有意识的、有Query的,搜索结果的排序是推荐是被动的。

(3)推荐是发散的、无意识的,是基于场景的主动推荐,在推荐场景中用户的反馈具有随机性,同样相关性高的两个Item A/B曝光给用户,用户点击了Item A,说明用户对A有兴趣,当时这能说明用户对B没有兴趣吗?与此同时精准性并不是推荐的唯一指标,多样性是一个必要的指标。在多样性前提下,曝光给用户的item集合是通过推荐系统层层的召回、排序、重排等过程,选出的最符合用户兴趣的item,此时用户的负反馈就有一定的随机性这也就导致推荐场景不像搜索场景,可以有适合做pairwise的样本。

接下来,聊一聊3种方法各自的优缺点。

(一)pairwise

835e4a782b3daab0e35aaf13ec6185fb.png

Pair-wise的方法是将同一个查询中两个不同的Item作为一个样本,主要思想是把rank问题转换为二值分类问题。对于同一Query的相关文档集中,对任何两个不同label的文档,都可以得到一个训练实例(di,dj),如果di>dj则赋值+1,反之-1,于是我们就得到了二元分类器训练所需的训练样本了。

1f57be54ed76388d2a22fd56e13d53a9.png

常用Pair-wise实现有SVMRank、RankBoost、RankNet等。

优点

  • 输出空间中样本是 pairwise preference;

  • 假设空间中样本是二变量函数;

  • 输入空间中样本是同一 query 对应的两个 doc和对应 query构成的两个特征向量;

  • 损失函数评估 doc pair 的预测 preference 和真实 preference 之间差异;

缺点

  • 只考虑了两篇文档的相对顺序,没有考虑他们出现在搜索结果列表中的位置;即:Pair-wise方法仅考虑了doc-pair的相对位置,损失函数还是没有模型到预测排序中的位置信息;

  • 对于不同的查询相关文档集的数量差异很大,转换为文档对后,有的查询可能只有十几个文档对,而有的查询可能会有数百个对应的文档对,这对学习系统的效果评价带来了偏置;

  • Pair-wise对噪声标注更敏感,即一个错误标注会引起多个doc-pair标注错误;

(二)pointwise

c5fd4842d5354facafb74d6cd2269809.png

Point-wise排序是将训练集中的每个Item看作一个样本获取rank函数,主要解决方法是把分类问题转换为单个item的分类或回归问题。就是输入用户特征和单个Item特征,对这个物品进行打分,物品之间的排序,就是谁应该在谁前面,不用考虑。Point-wise方法很好理解,即使用传统的机器学习方法对给定查询下的文档的相关度进行学习,比如CTR就可以采用PointWise的方法学习,但是有时候排序的先后顺序是很重要的,而Point-wise方法学习到全局的相关性,并不对先后顺序的优劣做惩罚。

明显这种方式无论是训练还是在线推理,都非常简单直接效率高,但是它的缺点是没有考虑物品直接的关联,而这在排序中其实是有用的。

b9753f646d52e51626df1e65677ef5d9.png

常用Point-wise实现基于回归的算法、基于分类的算法、基于有序回归的算法等。

优点

  • 使用传统的机器学习方法对给定查询下的文档的相关度进行学习;

  • 输入空间中样本是单个document和对应query构成的特征向量;

  • 输出空间中样本是单个documen和对应query的相关度;

  • 假设空间中样本是打分函数,损失函数评估单个 doc 的预测得分和真实得分之间差异。

缺点

  • Point-wise类方法并没有考虑同一个query对应的documents间的内部依赖性,完全从单文档的分类角度计算,没有考虑文档之间的相对顺序;

  • 和Pair-wise类似,损失函数也没有模型到预测排序中的Position位置信息;

(三)listwise

6dde11df06f254a7b326247ec1773ea0.png

List-wise排序是将整个item序列看作一个样本,通过直接优化信息检索的评价方法和定义损失函数两种方法来实现。它是直接基于评价指标的算法非直接基于评价指标的算法。在推荐中,List-wise损失函数因为训练数据的制作难,训练速度慢,在线推理速度慢等多种原因,尽管用的还比较少,但是因为更注重排序结果整体的最优性,所以也是目前很多推荐系统正在做的事情。

和其他X-wise方法比较,List-wise方法往往更加直接,它专注于自己的目标和任务,直接对文档排序结果进行优化,因此往往效果也是最好的。Listwise常用方法有AdaRank、SoftRank、LambdaMART、LambdaRank等。

优点

  • 输入空间中样本是同一query对应的所有documents构成的多个特征向量;

  • 输出空间中样本是这些documents和对应query的相关度排序列表或者排列;

  • 假设空间中样本是多变量函数,对于documents得到其排列,实践中,通常是一个打分函数,根据打分函数对所有documents的打分进行排序得到documents相关度的排列;

  • listwise 类相较 pointwise、pairwise 对 ranking 的 model 更自然,解决了 ranking 应该基于 query 和 position 问题。

缺点

  • 一些ranking算法需要基于排列来计算 loss,从而使得训练复杂度较高,如 ListNet和 BoltzRank。

  • 位置信息并没有在loss中得到充分利用,可以考虑在ListNet和ListMLE loss中引入位置折扣因子。

(四)应用实践

2087dec7436332bc84b26c8e13cddaf3.png

这里,介绍一下用 XGBoost 如何实践上面的几种方法,本章节已有实践经验的可自行忽略。

首先要明确的是训练数据,训练数据必须包含一列query id,该id下指明哪些样本要放到一起进行排序.同时特别需要注意的是,在训练集和测试集进行拆分时,需要按query id进行分割,如果直接随机拆分,同一个query id下的数据就会被分开,这样会导致模型出问题。我们可以用如下代码进行拆分:

from sklearn.model_selection import GroupShuffleSplit
gss = GroupShuffleSplit(test_size=.40, n_splits=1, random_state = 7).split(df, groups=df['query_id'])
X_train_inds, X_test_inds = next(gss)train_data= df.iloc[X_train_inds]
X_train = train_data.loc[:, ~train_data.columns.isin(['id','rank'])]
y_train = train_data.loc[:, train_data.columns.isin(['rank'])]# 模型需要输入按query_id排序后的样本
# 并且需要给定每个query_id下样本的数量
groups = train_data.groupby('id').size().to_frame('size')['size'].to_numpy()test_data= df.iloc[X_test_inds]#We need to keep the id for later predictions
X_test = test_data.loc[:, ~test_data.columns.isin(['rank'])]
y_test = test_data.loc[:, test_data.columns.isin(['rank'])]

我们的数据格式应该如下所示,如果数据长这样,那么我们上述代码中的groups就是[3, 4]:

be2b3e81159b1144081840b4a3a0b46b.jpeg

然后我们就可以建模了,可以用XGBRanker训练排序模型,在这个场景下,我们无法自定义objective,,也无法自定义mertic了。

import xgboost as xgbmodel = xgb.XGBRanker(  tree_method='gpu_hist',booster='gbtree',objective='rank:pairwise',random_state=42, learning_rate=0.1,colsample_bytree=0.9, eta=0.05, max_depth=6, n_estimators=110, subsample=0.75 )model.fit(X_train, y_train, group=groups, verbose=True)

训练完后我们就可以进行预估,因为预估方法并不会输入groups,所以我们需要做一些特殊处理:

def predict(model, df):return model.predict(df.loc[:, ~df.columns.isin(['id'])])predictions = (data.groupby('id').apply(lambda x: predict(model, x)))

这里选择了"rank:pairwise"作为loss,看官方文档还有其他rank loss可供尝试:

589e84a4abcb4b70d7a0ee8a21eb7c94.jpeg

pairwise 方法相比pointwise有优势,可以学习到一些顺序。但是pairwise也有缺点:

1.只能给出排序,并不能给出有多好,好多少。比如在搜索场景下,可能一条与query相关的doc都没,pointwise可以通过卡阈值得到这个信息,但是rank方式就不能区分。

2.当一个query下有很多doc,会产生大量的pairs。

3.对噪声的label 非常敏感。

参考资料

70c55562015157a72512edc29bdf0557.png

  • https://zhuanlan.zhihu.com/p/613354685

一起交流

想和你一起学习进步!『NewBeeNLP』目前已经建立了多个不同方向交流群(机器学习 / 深度学习 / 自然语言处理 / 搜索推荐 / 图网络 / 面试交流 / 等),名额有限,赶紧添加下方微信加入一起讨论交流吧!(注意一定o要备注信息才能通过)

format,png

6120304ac4e01652050b4181d1da5e7e.gif


http://chatgpt.dhexx.cn/article/3fwVja7L.shtml

相关文章

【推荐】pairwise、pointwise 、 listwise算法是什么?怎么理解?主要区别是什么?

写在前面:写博客当成了学习笔记,容易找到去完善,不用于商业用途。通过各种途径网罗到知识汇总与此,如有侵权,请联系我,我下掉该内容~~ 排序学习的模型通常分为单点法(Pointwise Approach&#…

软件测试用例设计之Pairwise算法

Pairwise算法简介 Pairwise是L. L. Thurstone(29 May1887 – 30 September 1955)在1927年首先提出来的。他是美国的一位心理统计学家。Pairwise也正是基于数学统计和对传统的正交分析法进行优化后得到的产物。 测试过程中,对于多参数参数多值的情况进行测试用例组…

磁盘配额中quotacheck不能创建aquota.user和aquota.group文件的问题

在centos6.5学习中有关磁盘配额的内容中,发现quotacheck -augv 命令无法创建aquota.group 和aquota.user文件, 操作系统挂载在/home下,经排查发现是SELinux的问题,使用setenforce 0命令将其关闭后,重新执行quotacheck…

Linux从入门到精通(八)——Linux磁盘管理

文章篇幅较长,建议先收藏,防止迷路 文章跳转Linux从入门到精通(八)——Linux磁盘管理goLinux从入门到精通(九)——Linux编程goLinux从入门到精通(十)——进程管理goLinux从入门到精…

Linux:Quota 的基本命令​​​​​​​

在开始进行 quota 的实作之前,我们得来了解一下 quota 要使用的指令啰! 基本上分为两种,一种是查询功能(quota, quotacheck, quotastats, warnquota, repquota),另一种则是编辑 quota 的内容( …

01_Linux系统管理_基础知识_高级文件系统管理_磁盘配额(quota)

环境 虚拟机:VMware-10.0.7 build-2844087Linux系统:CentOS 6.8远程工具:Xshell 6 (Build 0197) 01_Linux系统管理_基础知识_高级文件系统管理_磁盘配额 一、什么是磁盘配额(quota) 磁盘配额概念 对用户和用户组使用磁…

linux 系统配额管理功能,磁盘配额管理_Linux教程_Linux公社-Linux系统门户网站

在多用户系统中,如果没有对用户使用的磁盘空间做出限制,用户无限制地存放数据和文件,可能会导致系统磁盘空间告警。如果存放的是无用数据,就会导致磁盘空间白白浪费。磁盘配额可以限制用户或组在磁盘上存放文件的空间,…

Linux复习笔记

Linux复习笔记 常识说明 目录结构 Linux以树型结构管理文件,其最上层文件夹为 / ,也就是根目录。 如图所示,图中展示了一部分文件夹的结构: 所有的文件夹都属于根目录的子文件夹。 安装好系统后,根目录会挂载到一…

linux对目录空间使用限制,Linux quotacheck命令使用详解:检查磁盘的使用空间和限制...

quotacheck命令通过扫描指定的文件系统,获取磁盘的使用情况,创建、检查和修复磁盘配额(quota)文件。执行quotacheck指令,扫描挂入系统的分区,并在各分区的文件系统根目录下产生quota.user和quota.group文件,设置用户和…

Linux常用命令——quotacheck命令

在线Linux命令查询工具(http://www.lzltool.com/LinuxCommand) quotacheck 检查磁盘的使用空间与限制 补充说明 quotacheck命令通过扫描指定的文件系统,获取磁盘的使用情况,创建、检查和修复磁盘配额(quota)文件。执行quotach…

Linux quotacheck失败

我找了多少个帖子才发现解决这个问题的啊...最终还是靠FQ找的这位大佬的文章 http://www.2daygeek.com/quotacheck-error/# 当我在执行quotacheck -avug的时候出现如下的错误: quotacheck: 无法从 /dev/sdb1 上的文件名猜测其格式,请在命令行中指定一个…

Linux系统输入quotacheck -ugcv /dev/sdb1报错

quotacheck -ugcv /dev/sdb1 报错处理 报错大多因为selinux没有关闭 [rootlocalhost fanhuilin]# quotacheck -ugcv /dev/sdb1 quotacheck: Your kernel probably supports journaled quota but you are not using it. Consider switching to journaled quota to avoid runni…

【Shell 命令集合 磁盘管理 】Linux 检查和创建磁盘配额数据库 quotacheck命令使用教程

目录标题 描述语法格式参数说明错误情况 注意事项底层实现示例示例一示例二示例三示例四示例五示例六示例七 用c语言实现结语 Shell 命令专栏:Linux Shell 命令全解析 描述 quotacheck命令是Linux系统中的一个磁盘配额管理工具,用于检查和创建磁盘配额数…

linux quotacheck命令参数及用法详解---Linux系统管理

功能说明:检查磁盘的使用空间与限制。 语  法:quotacheck [-adgRuv][文件系统...] 补充说明:执行quotacheck指令,扫描挂入系统的分区,并在各分区的文件系统根目录下产生quota.user和quota.group文件,设…

第一性原理 《禅与计算机程序设计艺术》 / 陈光剑

第一性原理 《禅与计算机程序设计艺术》 / 陈光剑 任何事物背后必有道理。 什麼是第一性原理 第一性原理(First Principle Thinking),指的是回歸事物最基本的條件,將其拆分成各要素進行解構分析,從而找到實現目標最優路徑的方法。 該原理源於古希臘哲學家亞里士多德提出的一…

“风味人间”与计算机程序设计艺术《禅与计算机程序设计艺术》 / 陈光剑

来自“风味人间”的类比 所谓美食,不过是一次又一次的相逢。我们带您穿越山海之间,偶尔的落地生根,成就万千肴变,随即化作滚滚红尘,穿越香料歧路,几度江湖夜雨后,点亮万家灯火。 《风味人间》 浮华随风去,一菜一江湖。无论置身繁华闹市,还是身居乡野陋巷,世上的滋味,…

《禅与计算机程序设计艺术》/ By 禅与计算机程序设计艺术GPT-4

以《禅与计算机程序设计艺术》为文章标题,写一篇关于软件架构设计哲学思想的文章,不少于10000字。不要列目录,直接写具体的内容。 《禅与计算机程序设计艺术》/ By 禅与计算机程序设计艺术&GPT-4 文章目录 《禅与计算机程序设计艺术》/ By 禅与计算机程序设计艺术&G…

编程语言进化史《禅与计算机程序设计艺术》 / 陈光剑

编程语言概述 计算机编程语言是程序设计的最重要的工具,它是指计算机能够接受和处理的、具有一定语法规则的语言。 编程语言处在不断的发展和变化中,从最初的机器语言发展到如今的2500种以上的高级语言,每种语言都有其特定的用途和不同的发展轨迹。编程语言并不像人类自然语…

《计算机程序设计艺术》系列书

《计算机程序设计艺术》重译自Donald E. Knuth(汉名高德纳)的三卷著作:"The Art of Computer Programming: 1. Fundamental Algorithms; 2. Seminumerical Algorithms; 3. Sorting and Searching";三卷中文名为《基本算法》、《半数值算法》及…

“风味人间”与计算机程序设计艺术《禅与计算机程序设计艺术》

来自“风味人间”的类比 所谓美食,不过是一次又一次的相逢。我们带您穿越山海之间,偶尔的落地生根,成就万千肴变,随即化作滚滚红尘,穿越香料歧路,几度江湖夜雨后,点亮万家灯火。 《风味人间》 浮华随风去,一菜一江湖。无论置身繁华闹市,还是身居乡野陋巷,世上的滋味,…