GBRank:一种基于回归的排序方法

本文详细讲解了Learning to Rank算法中的GBRank,一种基于GBDT的pairwise方法,阐述了其原理、如何通过回归解决排序问题,以及训练过程中的样本选择和目标函数调整。重点在于理解GBRank如何通过梯度提升树优化文档排序的效率。

1. Learning to Rank算法

下图为机器学习排序的原理图,机器学习排序系统由4个步骤组成——人工标注训练数据文档特征抽取学习分类函数在实际搜索系统中采用机器学习模型

在这里插入图片描述

2. Learning to Rank的三种类型

Learning to Rank主要包含pointwise方法、pairwise方法和listwise方法三种类型。

  • pointwise方法:对于某一个query,它将每个doc分别判断与这个query的相关程度,由此将docs排序问题转化为了分类(比如相关、不相关)或回归问题(相关程度越大,回归函数的值越大)。
  • pairwise方法:pairwise方法并不关心某一个doc与query相关程度的具体数值,而是将排序问题转化为任意两个不同的docs di和dj谁与当前的query更相关的相对顺序的排序问题。一般分为di比dj更相关、更不相关和相关程度相等三个类别,分别记为{+1, -1, 0},由此便又转化为了分类问题。
  • listwise方法:将一个query对应的所有相关文档看做一个整体,作为单个训练样本。

3. GBRank

(1)定义

GBRank是一种pairwise的学习排序算法,它是基于回归来解决pair对的先后排序问题。在GBRank中使用的回归算法是GBT(Gradient Boosting Tree)

(2)算法原理

一般来说在搜索引擎里面,与用户搜索query相关度越高的网页越应该排在前面。现在query-doc的特征使用向量xxx或者yyy表示,假设现在有一个文档对<xi,yi><x_i, y_i><xi,yi>,当xix_ixi排在yiy_iyi前面时,我们使用xi>yix_i > y_ixi>yi来表示。

在实际用的时候可以将 xix_ixi 当作doc_x的特征,yiy_iyi 当作doc_y的特征。这样的话h(xi)h(x_i)h(xi) 可以理解为doc_x 的分数,h(yi)h(y_i)h(yi) 可以理解为doc_y 的分数。

我们含顺序的pair对用如下集合表示(也就是真的xix_ixi排在真的yiy_iyi前面):
在这里插入图片描述
现假设学习的排序函数为h(x)h(x)h(x),我们希望当h(xi)>h(yi)h(x_i) > h(y_i)h(xi)>h(yi)时,满足xi>yix_i > y_ixi>yi的样本的数量越多越好。

现将h(x)h(x)h(x)的风险函数用如下的式子表示:
在这里插入图片描述
R(h)R(h)R(h)可以知道每个pair对<xi,yi><x_i, y_i><xi,yi>的cost为:
在这里插入图片描述

可以发现当:

  • h(xi)≥h(yi)h(x_i) \ge h(y_i)h(xi)h(yi),cost为0,也就是并不会对最终的风险函数的值产生影响
  • h(xi)<h(yi)h(x_i) < h(y_i)h(xi)<h(yi),cost为其差值的平方

上述风险函数直接优化比较困难,这里一个巧妙的解决方案是使用回归的方法,也就是让xix_ixi去拟合yiy_iyi的预测值,让yiy_iyi去拟合xix_ixi的目标值。

为了避免优化函数h(x)h(x)h(x)是一个常量函数,风险函数一般会增加一个平滑项τ\tauτ(0<τ≤10< \tau \leq 10<τ1):
在这里插入图片描述
因为当h(x)h(x)h(x)为常量函数时,先前的 R(h)=0R(h)=0R(h)=0 就没有再优化的空间了,加入平滑项就变相地转为:如果希望xi>yix_i > y_ixi>yi,就得有h(xi)>h(yi)+τh(x_i) > h(y_i) + \tauh(xi)>h(yi)+τ,也就更为严格了,多了一个gap。

对于R(h)R(h)R(h)计算h(xi)h(x_i)h(xi)h(yi)h(y_i)h(yi)的负梯度为:
在这里插入图片描述
可以发现当pair对符合<xi,yi><x_i, y_i><xi,yi>顺序时,上述的梯度均为0,对于这一类case就没有必要去优化了,但是对于另一类,如果h(x)h(x)h(x)不满足pair<xi,yi><x_i, y_i><xi,yi> 他们对应的梯度为:

到了这里我们就知道所谓的训练样本就是对于 xi>yix_i > y_ixi>yi 但是 h(yi)>h(xi)h(y_i) > h(x_i)h(yi)>h(xi) 的那些样本,并且使用的是回归的方法,GBRank为其巧妙地找到了 xix_ixi的 目标为 h(yi)+τh(y_i) + \tauh(yi)+τ 以及 yiy_iyi 的目标为 h(xi)−τh(x_i) - \tauh(xi)τ, 也就是在每次迭代的时候将会构建以下的训练集:
在这里插入图片描述

这里可以这样理解:

h(t)(xi)+τh_{(t)}(x_i) + \tauh(t)(xi)+τ 向着 h(t−1)(yi)h_{(t-1)}(y_i)h(t1)(yi) 逼近,让 h(t)(yi)+τh_{(t)}(y_i) + \tauh(t)(yi)+τ 向着 ht−1(xi)h_{t-1}(x_i)ht1(xi) 逼近。

这是因为在有效的训练集中,即 xi>yix_i > y_ixi>yi 但是 h(yi)>h(xi)h(y_i) > h(x_i)h(yi)>h(xi) ,我们的目标是更新函数 h(x)h(x)h(x) 使得经 h(xi)h(x_i)h(xi) 算出来的xix_ixi 的分数更高,经h(yi)h(y_i)h(yi) 算出来的yiy_iyi 的分数更低。所以 h(t)(xi)+τh_{(t)}(x_i) + \tauh(t)(xi)+τ 的目标就是更大一些的 h(t−1)(yi)h_{(t-1)}(y_i)h(t1)(yi)h(t)(yi)+τh_{(t)}(y_i) + \tauh(t)(yi)+τ 的目标就是更小一些的 ht−1(xi)h_{t-1}(x_i)ht1(xi)

(3)算法步骤

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

comli_cn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值