原文towardsdatascience.com/ranking-basics-pointwise-pairwise-listwise-cd5318f86e1b?sourcecollection_archive---------3-----------------------#2024-12-14因为邻近的对象很重要https://medium.com/kunals726?sourcepost_page---byline--cd5318f86e1b--------------------------------https://towardsdatascience.com/?sourcepost_page---byline--cd5318f86e1b-------------------------------- Kunal Santosh Sawant·发布于 Towards Data Science ·6 分钟阅读·2024 年 12 月 14 日–https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/54cb29c9cdd0f38ae586510bb08af75b.png图片来自 unsplash.com首先让我们讨论排名的作用。排名在电子商务和搜索应用中非常重要——基本上是任何需要根据查询来组织文档的场景。这与经典的分类或回归问题有些不同。例如在泰坦尼克号数据集中你预测乘客是否幸存在房价预测中你估计房子的价格。但在排名中情况不同。你不是在预测单一的值或类别而是在尝试根据相关性对文档进行排序。举个例子你在像亚马逊这样的电子商务网站上搜索“纱丽”。你不想要一个随机的纱丽列表你希望最相关的产品出现在顶部对吧这就是学习排序LTR的作用——它根据文档或产品与查询的匹配程度来对它们进行排名。现在我们已经了解了排名的作用让我们深入探讨不同的排名方法和技术。学习排序LTR有三种主要方法点对Pointwise成对Pairwise列表Listwise为了更容易理解让我们先定义一些符号用于解释这些方法。我们将处理一组查询q1, q2, …, qn每个查询都有对应的一组文档d1, d2, d3, …, dm。例如查询q1与文档d1,d2,d3相关联。查询q2与文档d4,d5相关联。既然我们已经了解了排名的定位让我们深入分析每种方法及其如何解决排名问题。点对Pointwise在点对点方法中我们将排名问题视为一个简单的分类任务。对于每个查询-文档对我们分配一个目标标签表示文档与查询的相关性。例如标签1表示文档相关。标签0表示文档不相关。以我们之前的例子为例数据看起来是这样的q1,d1→标签: 1q1,d2→标签: 0q1,d3→标签: 1q2,d4→标签: 0q2,d5→标签: 1我们使用这些标注数据训练模型利用查询和文档中的特征来预测标签。训练完成后模型会预测每个文档与给定查询的相关性作为一个概率值范围从 0 到 1。这个概率值可以解释为相关性分数。例如训练后模型可能会生成以下分数q1,d1→分数: 0.6q1,d2→分数: 0.1q1,d3→分数: 0.4使用这些分数我们将文档按相关性降序重新排序d1,d3,d2。然后将这个新的排序呈现给用户确保最相关的文档出现在最前面。成对比点对点方法的主要缺点是它忽略了用户与文档互动时的上下文。当用户点击或认为某个文档相关时往往有多个因素在起作用——其中一个最重要的因素就是邻近项。例如如果用户点击了某个文档这并不一定意味着该文档非常相关。可能只是因为展示的其他文档质量较差。类似地如果你为相同的查询展示了一组不同的文档用户的互动可能会完全不同。想象一下对于查询q1我们展示了d4。如果d4比d1更相关用户可能会点击d4而不是d1。在点对点方法中这种文档之间的比较完全被忽视。为了捕捉这种相对相关性我们转向了成对比方法。在成对比方法中我们不是单独看查询-文档对而是聚焦于同一查询下的文档对并尝试预测哪个文档更相关。这有助于结合文档之间的比较上下文。我们现在会类似地生成数据但我们使用它的方式会稍微复杂一些。接下来我们将分解它。想象一下成对比方法的训练数据结构如下q1,(d1,d2)→标签: 1表示d1比d2更相关q1,(d2,d3)→标签: 0表示d2比d3不太相关q1,(d1,d3)→标签: 1表示d1比d3更相关q2,(d4,d5)→标签: 0表示d4比d5不太相关在这里我们根据用户的互动分配标签。例如d1和d3都被点击表示它们相关因此我们保持它们的顺序便于在此解释。模型训练过程尽管训练数据是成对的但模型并不会直接处理这些对。相反我们将其类似于分类问题处理每个查询-文档对都会单独传递给模型。例如s1 f(q1,d1)s2 f(q1,d2)s3 f(q1,d3)模型为文档生成评分s1,s2,s3。这些评分用于比较文档对的相关性。惩罚模型如果模型预测的评分违反了真实的相关性顺序那么它会受到惩罚。例如如果s1s2但训练数据表明d1d2则模型会受到惩罚因为它未能将d1排在d2之前。如果s2s3并且训练数据表明d2d3那么模型做对了因此不需要惩罚。这种成对比较帮助模型学习文档的相对顺序而不是像点对点方法那样仅预测独立的相关性评分。挑战实现成对模型的主要挑战之一是计算复杂度——因为我们需要比较所有可能的文档对这一过程的规模是 O(n²)。此外成对方法并不考虑文档的全局排序它们仅在比较过程中关注个别对这可能导致整体排序的不一致。Listwise在 Listwise 排序中目标是基于文档与查询的相关性来优化整个文档列表。与其单独处理每个文档不如专注于它们在列表中出现的顺序。以下是 ListNet 和 LambdaRank 中工作原理的分解NDCG归一化折扣累积增益我将在另一篇博客中深入探讨 NDCG但现在可以把它看作一种衡量项目排序与其相关性匹配程度的方式。它奖励相关项目出现在列表顶部并对评分进行归一化以便更容易进行比较。在 Listwise 排序中如果你有一个文档列表d1, d2, d3模型会考虑这些文档的所有可能排列(d1, d2, d3)(d1, d3, d2)(d2, d1, d3)(d2, d3, d1)(d3, d1, d2)(d3, d2, d1)训练过程评分预测模型为列表中的每个文档预测一个评分文档将根据这些评分进行排序。例如s1 f(q1,d1), s2 f(q1,d2)理想排序理想排序是通过根据文档的真实相关性对其进行排序来计算的。例如d1可能是最相关的其次是d2然后是d3。NDCG 计算NDCG 是针对每个文档列表的排列进行计算的。它检查预测排序与理想排序的接近程度同时考虑到文档的相关性和位置。惩罚错误排序如果预测排序与理想排序不同NDCG 分数将下降。例如如果理想排序是***(d1, d3, d2)而模型排序为(d2, d1, d3)***那么 NDCG 分数会较低因为最相关的文档d1)没有排在最前面。梯度计算模型根据如果调整文档顺序NDCG 分数会发生的变化来计算梯度。这些梯度指引模型如何改进预测。这个过程帮助模型学习如何优化整个排序列表提高呈现给用户的文档的相关性。总结在学习排序Learning to Rank中并没有一种通用的解决方案。基于点的模型非常容易设置和更新但它们并不总是考虑到文档之间的相互关系。也就是说如果你需要一个简单且快速的方法它们是一个很好的选择。另一方面**成对排序pairwise和列表排序listwise方法更为强大因为它们考虑了文档之间的相互比较。但是这种力量带来了更多的复杂性而且列表排序由于训练的高复杂度可能会成为一个真正的挑战。就我个人而言我认为***成对排序pairwise***方法是一个很好的平衡点。它在复杂性和性能之间达到了良好的平衡使其在许多情况下都很理想。最终你选择的方法确实取决于你的具体情况。你的数据集有多大且多复杂了解每种方法的优缺点将帮助你选择最适合你需求的方法。今天的内容就到这里敬请期待下一部分在那之前祝你排序愉快参考文献从 RankNet 到 LambdaRank 再到 LambdaMART概述学习排序从成对排序方法到列表排序方法学习排序简介