趋近智
排序学习(LTR)需要的损失函数是为了对项目进行排序而设计的,而不是为了预测确切的值或类别标签。像均方误差这样的标准回归损失或像对数损失这样的分类损失不适合,因为它们独立地(逐点)评估预测,并且不考虑项目的相对顺序,而这正是排序的主要目的。
梯度提升框架通过引入旨在优化排序指标的损失函数来适应排序。这些损失函数通常分为两大类:成对和列表。
成对方法将排序问题转变为文档对的分类问题。对于给定的查询,目标是正确预测任何两个相关性级别不同的文档的相对顺序。
考虑一个查询 以及两个文档 和 ,它们具有相关的相关性标签 和 。假设值越高表示相关性越大。如果 ,模型理想情况下应预测文档 的得分高于 ,即 。
主要思想是定义一个作用于文档对 的损失函数,其中 。一个常见的选择是逻辑损失函数,类似于二元分类中使用的函数:
这里, 是提升模型对文档 预测的得分, 是一个缩放因子(通常设为1)。这种损失函数会惩罚那些不那么相关的文档 () 得分高于或等于更相关的文档 () 的文档对。最小化此损失鼓励模型在每个文档对中为更相关的文档分配更高的分数。
LambdaRank与成对梯度
尽管最小化成对逻辑损失看起来直观,但它并不直接优化我们最终关注的排序指标,例如归一化折现累积增益(NDCG)或平均精度(MAP)。LambdaRank带来了一项重要改进。LambdaRank没有使用成对损失的标准梯度,而是根据交换文档 和 的排名位置后,目标排序指标会发生的变化来定义替代梯度(“lambda值”)。
梯度(lambda值)对于文档 相对于文档 (其中 )的公式通常为:
这里, 表示当文档 和 在排名列表中交换位置时,所选排序指标(例如NDCG)的绝对变化。项 是该文档对的逻辑损失梯度。文档 的总lambda梯度是所有相关文档对的这些成对梯度的总和:
这些lambda梯度随后用于梯度提升过程中。每棵新树都经过训练以预测这些梯度,有效地促使模型向着能提高目标排序指标的配置前进。
XGBoost和LightGBM中像 rank:pairwise 这样的实现通常采用这种受LambdaRank启发的方法。它们使用成对比较,但根据梯度对排序指标的影响进行加权。
优点:
缺点:
列表方法试图直接优化针对给定查询的整个文档列表定义的损失函数。目标是学习一个得分函数 ,使得通过对得分 排序而产生的文档排列与由真实相关性标签 定义的理想排列紧密匹配。
存在几种列表方法,它们在定义损失或近似优化列表指标的方式上有所不同。
排序指标的直接优化
一些方法试图创建NDCG或MAP等列表指标的可微近似并直接优化它们。然而,这些指标由于依赖于排序,通常是不可微且不连续的,这使得直接优化变得困难。
基于概率的方法(例如ListNet,ListMLE)
这些方法根据预测得分定义文档列表所有可能排列的概率分布,并旨在最小化该分布与由真实相关性标签定义的分布之间的差异(例如KL散度)。例如,ListNet使用Plackett-Luce模型来定义排列概率。
LambdaMART:通过成对梯度进行列表优化
在流行的梯度提升库中,最常见的列表方法或许是 LambdaMART。LambdaMART将梯度提升框架(MART - 多元加性回归树)与来自LambdaRank的lambda梯度结合起来。
尽管使用的梯度()来源于成对比较及其对列表指标的影响(如LambdaRank部分所述),但正在优化的目标实际上是列表性的(例如NDCG或MAP)。提升算法迭代地将树拟合到这些lambda梯度,逐步改进列表排序指标。
XGBoost和LightGBM中像 rank:ndcg 和 rank:map 这样的实现通常基于LambdaMART。您指定要优化的列表指标,算法在训练期间使用相应的lambda梯度。
优点:
缺点:
rank:pairwise):通常是一个强大的基线。它通常更快,并且能提供出色的结果,特别是当在top-k排名中的确切位置不如相关与不相关项目的相对顺序重要时。rank:ndcg,rank:map):当特定的列表指标(如NDCG或MAP)是主要评估标准时,这种方法更受青睐,尤其是在排序列表顶部的表现非常重要时。它将目标指标直接纳入梯度计算,可能为该特定指标带来更好的优化。在实践中,建议尝试这两种损失函数。选择通常取决于特定的数据集特性、评估指标和计算限制。梯度提升库提供这些损失函数作为内置选项,主要要求您正确格式化数据(包括查询/组标识符)并选择所需的损失函数字符串。然而,理解这些损失函数内部如何工作,能让您在排序任务中进行更明智的模型构建和调整。
这部分内容有帮助吗?
© 2026 ApX Machine Learning用心打造