LTR入门:从 Ranknet 到 LambdaMart 原理与 lgb 实战

本文详细介绍了RankNet、LambdaRank和LambdaMART等排序学习算法,从RankNet的二分类损失函数到LambdaRank针对NDCG优化的梯度,再到LambdaMART结合增强树模型进行优化。同时,讨论了信息检索指标如NDCG和ERR,并阐述了如何在LightGBM中实现自定义损失函数以适应排序任务。文章还涵盖了其他相关概念,如MART、动态margin和pointwise与pairwise损失函数的结合。


前半部分内容主要基于《From RankNet to LambdaRank to LambdaMART》,最近复习 LTR 相关算法,想到之前看过这篇经典 paper,拿出来重新看看,也顺手搞了一个翻译版出来。毕竟这篇文章差不多是 LTR 算法入门必看文章了。
第二部分、第三部分是 rankloss 日常使用的一些经验;以及使用 lightgbm 实战一个简单的排序算法变体的案例,对原理比较了解的同学或者对如何实操更感兴趣的读者,可以直接跳到第二部分。

第一部分 论文翻译

1 Introduction

LambdaMART是LambdaRank的增强树版本,它基于RankNet。事实证明,RankNet,LambdaRank 和 LambdaMART是解决工业上 rank 问题的非常成功的算法:例如,多个LambdaMART的集成版本赢得了最近的 Yahoo! Learning To Rank Challenge[5]。虽然在这里我们将专注于ranking,但通常可以直接修改MART,特别是 LambdaMART,以解决各种监督学习问题(包括最大化 IR 的一些目标,如NDCG,注意 NDCG 并不是一个平滑的函数)。

本文档试图给出这些算法的独立解释。唯一需要的数学背景是基本矢量微积分;并且我们假设读者对LTR的问题有一定的了解。我们希望这个概述是完全独立的,例如,希望训练增强树模型以优化他们想到的一些信息检索目标的读者可以理解如何使用这些方法来实现这一点。网络搜索的排名目标在本文中是主要的示例。

2 RankNet

对于 RankNet [2],底层模型可以是任何模型,模型的输出是模型参数的可微函数(通常我们使用神经网络,但我们也使用boosted trees实现RankNet,我们将在下面描述)。 RankNet 训练的工作原理如下。训练数据按查询分组。在训练期间的给定点,RankNet将输入 n 维特征向量 x 映射到数字 f(x)。对于给定的 query,选择具有不同 label 的一对 URL,Ui和Uj,并且将每个这样的pair(具有特征向量xi和xj)喂给模型,得到每个 doc 的计算得分 si = f(xi) 和 sj = f (xj) 。让 Ui > Uj 表示 Ui 应该排名高于 Uj 的事件(例如,对于此查询,Ui被标记为 ‘excellent’ 而 Uj 被标记为 ‘bad’,该标注和 query 相关)。模型的两个输出通过sigmoid函数被映射为“Ui应该排名高于Uj”的概率,即:

其中参数σ的选择决定了S形函数的形状。 sigmoid模块是神经网络训练中的一种常见组件,已被证明可用于良好的概率估计[1]。 然后,我们应用交叉熵 cost 函数,他会惩罚模型输出概率与期望概率的偏差:令 Pij(hat) 是 Ui 应该排名高于 Uj 的已知概率。 然后 cost 是:

对于给定的查询,如果文档 i 被标记为比文档 j 更好,则将 Sij(可能取值为0,+1,-1)定义为1,如果文档i被标记为与文档j不太相关则为-1,如果他们有相同的标签则定义为 0。 在本文中,我们假设我们有一个确定性已知的目标排序,因此Pij(hat) = 0.5*(1+Sij).(注意,模型可以处理测量概率的更一般情况,例如,可以通过统计Ui和Uj在历史数据中的共现数据来估计Pij(hat))。结合上面两个公式可以得到:

这个 loss 有一个很好的性质是,损失函数是对称的(交换 i 和 j 并且改变 Sij 的符号会使C不变)。
即,Sij=1时,

而Sij=-1时,

请注意,当 si = sj 时,损失依然存在,等于 log2,因此模型包含一个margin(即具有不同标签的文档,但模型分配相同的分数,在排名中仍然相互推离,直到两个标签的文档之间有足够的区分度)。 此外,渐近地看(损失函数的梯度),如果评分函数给出错误的排名,cost会表现出近似线性,如果评分函数可以给出正确的排名,则是 0。 因此:

该梯度可用于更新权重wk(即模型参数),即通过随机梯度下降来降低损失(注意下式可以分解):

其中η是正的学习率(使用验证集选择的参数;通常取值为1e-3到1e-5)。
很明显:

通过梯度下降学习排名的想法是本文中出现的一个关键思想,即使当期望的cost没有良好的梯度时,甚至当模型不具有可微分参数时(例如boosted trees的集合):为了更新模型,我们必须指定相对于模型参数 wk 的 cost 的梯度,并且为了做到这一点,我们需要相对于模型得分 si 的 cost 的梯度。 增强树的梯度下降公式通过直接建模 ∂C/∂si 来绕过计算∂C/∂wk的需要。

2.1 Factoring RankNet: Speeding Up Ranknet Training

上面的公式是可以分解的,注意,这是通向 LambdaRank 的关键步骤:对于给定的一对URL,Ui和Uj:

上式中:

设 I 表示一组索引 (i,j),我们希望 Ui 与 Uj 的排序不同(对于给定的查询)。(集合 I 中只包含label不同的doc的集合,且每个pair仅包含一次,即(Ui,Uj)与(Uj,Ui)等价。为方便起见,我们假设 I 中只包含 (Ui,Uj) 表示 Ui 相关性大于 Uj 的pair,即 I 中的 pair 均满足 Sij=1 )
请注意,由于RankNet从概率中学习并输出概率,因此不需要 URL 的 level 具体是多少; 它只需要集合 I (也就是仅利用了数据里的相对关系),这种方式可以说没有利用完全信息,但是也更加通用,因为实际如果我们使用自动样本, pair 之间实际上可能是互相冲突的:U1 > U2,U2 > U3和 U3 > U1)。

批量化处理所有对wk更新权重的贡献:

我们引入了λi(每个url对应一个λi:注意,带有一个下标的λ是带有两个下标的λ的和)。 为了计算λi(对于url Ui),我们找到所有和 i 组成pair的另外的url,即 ( i, j ) 中的 j 和 ( k, i ) 中的 k 。可以这样计算,令 λi 初值为零。对于前者(即相关性低于 i 的文档),我们将pair对应的 λij 加到 λi 中,对于后者(即相关性高于 i 的文档),我们从 λi 中减少 λki。 例如,如果只有一对 pair ,即 I = { {1,2}},并且λ1=λ12=-λ2。

再举一个例子:
下面我们用一个实际的例子来看:有三个doc,其真实相关性满足U1>U2>U3,那么集合I中就包含{(1,2), (1,3), (2,3)}共三个pair ,则:

显然λ1=λ12+λ13,λ2=λ23−λ12,λ3=−λ13−λ23。
一般来说,我们有:

下面我们描述一下这里面的关键思想:我们可以将 λ 视为力,一个附加到每个 doc 的力,其方向指示我们希望网址移动的方向(以尽可能的满足数据中没队 pair 的约束),其长度表示力的大小。给定 URL 的 λ 是通过该 URL 所属的所有 pair 计算的。当我们第一次实现 RankNet 时,我们使用真正的随机梯度下降:在检查每对URL(具有不同标签)之后更新权重。
然而刚刚我们看到,我们可以为每个 doc 累积 λ ,将所有 pair 提供的两个相关的贡献累加到对应的 doc 上,然后进行更新。这其实是以 mini-batch 的方式来训练,其中首先为给定查询计算所有权重更新,然后应用,但训练加速的本质由对目标函数的分解带来的,而不仅仅是使用mini-batch的这种表现形式。
这导致RankNet训练中的非常显著的加速(因为更新权重代价很大,例如对于神经网络模型,它需要back propogation)。实际上,每个查询的训练时间(关于网址数量)从接近二次降提升到接近线性。它还为LambdaRank奠定了基础,但在我们讨论之前,让我们回顾一下我们希望学习的信息检索的评估标准。

这里我们可以考虑一下,如果我们使用 tensorflow,怎么实现这种加速版本的 ranknet?

3 Information Retrieval Measures

信息检索研究人员使用排名质量度量,如Mean Reciprocal Rank(MRR),Mean Average Precision (MAP), Expected Reciprocal Rank (ERR), and Normalized Discounted Cumulative Gain (NDCG)。 NDCG [9]和ERR [6]的优势在于它们处理标注具有多个相关性级别的情况(而MRR和MAP是针对二分类相关性标注设计的),并且该度量包括对用户显示的结果的位置依赖性(排名结果更靠前的具有更大的重要性),这特别适合网络中的搜索场景。
然而,所有这些度量都具有不适合作为模型损失函数的特点,因为它们是不光滑的或者是不连续的,因此梯度下降难以直接在这几个目标函数上生效。 例如,NDCG定义如下。 给定搜索结果集(对于给定查询)的DCG(折扣累积增益,Discounted Cumulative Gain)是:

其中,T是截断数目(例如,如果我们只关心返回结果的第一页,我们可能需要T = 10),li 是第 i 个列出的URL的标签。 我们通常使用五个相关级别:0,1,2,3,4。 NDCG是DCG的 normalized 版本:

其中分母是该查询可达到的最大DCG@T,因此NDCG @ T 的取值范围在0到1之间。

ERR最近被引入并且受到级联模型的启发,其中假定用户读取返回的URL列表,直到找到他们喜欢的URL。 ERR定义为:

其中,n是指对于这个 query 进行评估的前多少篇文档,l 是文档label,即相关度等级,令 lm 表示最大相关度等级,则:

Ri模拟用户在相关的排名位置处找到文档的概率。
可以把上式中的 Rr 放入连乘符号内部,则得到:

这个连乘式子表示的是:“用户停在第r篇文档的概率”。很类似于几何分布:“前k-1枪未命中,第k枪命中了”。放在 rank 的场景下指的就是“前 r-1 个文档未满足用户需求,直到第 r 个文档才满足”。
ERR中的 1/r 是位置权重,因此可以将其抽象为 φ® ,只要该函数满足 r=0 时,φ®=1,且是单调递减函数即可。比如,DCG中使用的就是:

直观地想,我们可能会期望计算损失ΔERR(交换两个文档的排名而使所有其他文档位置保持不变而导致的ERR的变化)。对于给定查询的文档数量,计算ΔERR将是文档数量立方的复杂度,因为排名位于被交换的两个 doc 之间的 doc被认为是对 ΔERR 有贡献的,而 ranknet 必须为每对文件计算这个贡献。 然而,该计算具有二次成本(其中二次成本来自需要为具有不同标签的每对文档计算ΔERR),因为它可以如下排序。 设Δ表示ΔERR。 设Ti表示1-Ri,创建一个数组A,其第i个分量是仅计算到i级的ERR。 (计算A具有线性复杂性)。

注意,与NDCG不同,保持所有其他URL固定,通过交换Ui和Uj引起的ERR的变化,取决于具有 Ui 和 Uj 之间 URL 的标签。 因此,好奇的读者可能想知道ERR是否一致:如果Ui dUj和两个排名位置交换,ERR是否必然会减少? 很容易看出,当 Ri > Rj 时,下面的计算说明上述Δ是非负的。

4 LambdaRank

虽然通过简单地使用上述度量作为验证集的标准,可以使RankNet与上述度量相匹配,但我们可以做得更好。 RankNet正在针对错误的pair的数量进行优化( 当时,是这个目标的平滑的凸近似的版本,因为实际上我们可以认为 ranknet 是一个针对 pair 的二分类模型),如果这是期望的损失,则没有问题,但它与其他一些信息检索的评估度量方式不匹配。
下图是描述该问题的示意图。 直接写下所需渐变的想法(如图中的箭头所示),而不是从cost函数中得出它们是LambdaRank [4]的基本思想之一:它允许我们绕过大多数类型引入的困难 IR 目标。 请注意,这并不意味着 LambdaRank 中的梯度不是 cost 的梯度。 在本节中,假设我们正在设计一个模型来学习NDCG。

使用 01 标记为给定查询排序的一组URL打标记,表明 url 是否满足用户需求。 也就是说,浅灰色条表示与查询无关的网址,而深蓝色条表示与查询相关的网址。
左:错误的 pair 总数是十三。
右:通过将顶部网址向

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值