之前的博客:http://www.cnblogs.com/bentuwuying/p/6681943.html中简单介绍了Learning to Rank的基本原理,也讲到了Learning to Rank的几类常用的方法:pointwise,pairwise,listwise。前面已经介绍了pairwise方法中的 RankSVM,IR SVM,和GBRank。这篇博客主要是介绍另外三种相互之间有联系的pairwise的方法:RankNet,LambdaRank,和LambdaMart。

1. RankNet

RankNet是2005年微软提出的一种pairwise的Learning to Rank算法,它从概率的角度来解决排序问题。RankNet的核心是提出了一种概率损失函数来学习Ranking Function,并应用Ranking Function对文档进行排序。这里的Ranking Function可以是任意对参数可微的模型,也就是说,该概率损失函数并不依赖于特定的机器学习模型,在论文中,RankNet是基于神经网络实现的。除此之外,GDBT等模型也可以应用于该框架。

1.1 相关性概率

我们先定义两个概率:预测相关性概率、真实相关性概率。

(1)预测相关性概率

对于任意一个doc对(Ui,Uj),模型输出的score分别为si和sj,那么根据模型的预测,Ui比Uj与Query更相关的概率为:

由于RankNet使用的模型一般为神经网络,根据经验sigmoid函数能提供一个比较好的概率评估。参数σ决定sigmoid函数的形状,对最终结果影响不大。

RankNet证明了如果知道一个待排序文档的排列中相邻两个文档之间的排序概率,则通过推导可以算出每两个文档之间的排序概率。因此对于一个待排序文档序列,只需计算相邻文档之间的排序概率,不需要计算所有pair,减少计算量。

(2)真实相关性概率

对于训练数据中的Ui和Uj,它们都包含有一个与Query相关性的真实label,比如Ui与Query的相关性label为good,Uj与Query的相关性label为bad,那么显然Ui比Uj更相关。我们定义Ui比Uj更相关的真实概率为:

如果Ui比Uj更相关,那么Sij=1;如果Ui不如Uj相关,那么Sij=−1;如果Ui、Uj与Query的相关程度相同,那么Sij=0。通常,两个doc的relative relevance judgment可由人工标注或者从搜索日志中获取得到(见http://www.cnblogs.com/bentuwuying/p/6681943.html)。

1.2 损失函数

对于一个排序,RankNet从各个doc的相对关系来评价排序结果的好坏,排序的效果越好,那么有错误相对关系的pair就越少。所谓错误的相对关系即如果根据模型输出Ui排在Uj前面,但真实label为Ui的相关性小于Uj,那么就记一个错误pair,RankNet本质上就是以错误的pair最少为优化目标。而在抽象成cost function时,RankNet实际上是引入了概率的思想:不是直接判断Ui排在Uj前面,而是说Ui以一定的概率P排在Uj前面,即是以预测概率与真实概率的差距最小作为优化目标。最后,RankNet使用Cross Entropy作为cost function,来衡量的拟合程度:

化简后,有:

当Sij=1,有:

当Sij=-1,有:

下面展示了当Sij分别取1,0,-1的时候cost function以si-sj为变量的示意图:

可以看到当Sij=1时,模型预测的si比sj越大,其代价越小;Sij=−1时,si比sj越小,代价越小;Sij=0时,代价的最小值在si与sj相等处取得。

该损失函数有以下几个特点:

1) 当两个相关性不同的文档算出来的模型分数相同时,损失函数的值大于0,仍会对这对pair做惩罚,使他们的排序位置区分开。

2) 损失函数是一个类线性函数,可以有效减少异常样本数据对模型的影响,因此具有鲁棒性。

总代价为:

其中,I表示所有在同一query下,且具有不同relevance judgment的doc pair,每个pair有且仅有一次。

1.3 合并概率

上述的模型Pij需要保持一致性,即如果Ui的相关性高于Uj,Uj的相关性高于Uk,则Ui的相关性也一定要高于Uk。否则,如果不能保持一致性,那么上面的理论就不好使了。

我们使用Ui vs Uj的真实概率 和 Uj vs Uk 的真实概率,计算Ui vs Uk的真实概率:

,则有下图所示:

1.4 Gradient Descent

我们获得了一个可微的代价函数,下面我们就可以用随机梯度下降法来迭代更新模型参数wk了,即

η为步长,代价C沿负梯度方向变化。

这表明沿负梯度方向更新参数确实可以降低总代价。

而使用了随机梯度下降法时,有:

其中,

1.5 加速RankNet训练过程

上面的是对于每一对pair都会进行一次权重的更新,其实是可以对同一个query下的所有文档pair全部带入神经网络进行前向预测,然后计算总差分并进行误差后向反馈,这样将大大减少误差反向传播的次数。

即,我们可以转而利用批处理的梯度下降法:

其中,

我们令:

有:

下面我们来看看这个λi是什么。前面讲过集合I中只包含label不同的doc的集合,且每个pair仅包含一次,即(Ui,Uj)与(Uj,Ui)等价。为方便起见,我们假设I中只包含(Ui,Uj)表示Ui相关性大于Uj的pair,即I中的pair均满足Sij=1,那么

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

显然λ1=λ12+λ13,λ2=λ23−λ12,λ3=−λ13−λ23,因此我所理解的λi应为

λi决定着第i个doc在迭代中的移动方向和幅度,真实的排在Ui前面的doc越少,排在Ui后面的doc越多,那么文档Ui向前移动的幅度就越大(实际λi负的越多越向前移动)。这表明每个f下次调序的方向和强度取决于同一Query下可以与其组成relative relevance judgment的“pair对”的其他不同label的文档。

同时,这样的改造相当于是mini-batch learning。可以加速RankNet的学习过程。

原先使用神经网络模型,通过Stochastic gradient descent计算的时候,是对每一个pair对都会进行一次权重的更新。而通过因式分解重新改造后,现在的mini-batch learning的方式,是对每一个doc进行一次权重的更新。时间消耗从O(n2)降到了O(n),其中n为每个query下doc的数目的总和。这对训练过程的影响是很大的,因为使用的是神经网络模型,每次权重的更新迭代都需要先进行前向预测,再进行误差的后向反馈。

2. Information Retrieval的评价指标

Information Retrieval的评价指标包括:MRR,MAP,ERR,NDCG等。之前的博客中有详细介绍过NDCG和MAP:http://www.cnblogs.com/bentuwuying/p/6681943.html,这里就不再重复介绍了。NDCG和ERR指标的优势在于,它们对doc的相关性划分多个(>2)等级,而MRR和MAP只会对doc的相关性划分2个等级(相关和不相关)。并且,这些指标都包含了doc位置信息(给予靠前位置的doc以较高的权重),这很适合于web search。然而,这些指标的缺点是不平滑、不连续,无法求梯度,如果将这些指标直接作为模型评分的函数的话,是无法直接用梯度下降法进行求解的。

这里简单介绍下ERR(Expected Reciprocal Rank)。ERR是受到cascade model的启发,即一个用户从上到下依次浏览doc,直至他找到一个满意的结果,ERR可以定义为:

其中,表示第i位的doc的相关性概率:

其中,lm表示相关性评分最高的一档。

3. LambdaRank

上面我们介绍了以错误pair最少为优化目标的RankNet算法,然而许多时候仅以错误pair数来评价排序的好坏是不够的,像NDCG或者ERR等评价指标就只关注top k个结果的排序,当我们采用RankNet算法时,往往无法以这些指标为优化目标进行迭代,所以RankNet的优化目标和IR评价指标之间还是存在gap的。以下图为例:

如上图所示,每个线条表示文档,蓝色表示相关文档,灰色表示不相关文档,RankNet以pairwise error的方式计算cost,左图的cost为13,右图通过把第一个相关文档下调3个位置,第二个文档上条5个位置,将cost降为11,但是像NDCG或者ERR等评价指标只关注top k个结果的排序,在优化过程中下调前面相关文档的位置不是我们想要得到的结果。图 1右图左边黑色的箭头表示RankNet下一轮的调序方向和强度,但我们真正需要的是右边红色箭头代表的方向和强度,即更关注靠前位置的相关文档的排序位置的提升。LambdaRank正是基于这个思想演化而来,其中Lambda指的就是红色箭头,代表下一次迭代优化的方向和强度,也就是梯度。

LambdaRank是一个经验算法,它不是通过显示定义损失函数再求梯度的方式对排序问题进行求解,而是分析排序问题需要的梯度的物理意义,直接定义梯度,即Lambda梯度。

LambdaRank在RankNet的加速算法形式(,Sij=1)的基础上引入评价指标Z (如NDCG、ERR等),把交换两个文档的位置引起的评价指标的变化作为其中一个因子,实验表明对模型效果有显著的提升:

损失函数的梯度代表了文档下一次迭代优化的方向和强度,由于引入了IR评价指标,Lambda梯度更关注位置靠前的优质文档的排序位置的提升。有效的避免了下调位置靠前优质文档的位置这种情况的发生。LambdaRank相比RankNet的优势在于分解因式后训练速度变快,同时考虑了评价指标,直接对问题求解,效果更明显。

3. LambdaMart

1)Mart定义了一个框架,缺少一个梯度。

2)LambdaRank重新定义了梯度,赋予了梯度新的物理意义。

因此,所有可以使用梯度下降法求解的模型都可以使用这个梯度,MART就是其中一种,将梯度Lambda和MART结合就是大名鼎鼎的LambdaMART[12]。

MART[13][14]的原理是直接在函数空间对函数进行求解,模型结果由许多棵树组成,每棵树的拟合目标是损失函数的梯度,在LambdaMART中就是Lambda。LambdaMART的具体算法过程如下:

可以看出LambdaMART的框架其实就是MART,主要的创新在于中间计算的梯度使用的是Lambda,是pairwise的。MART需要设置的参数包括:树的数量M、叶子节点数L和学习率v,这3个参数可以通过验证集调节获取最优参数。

MART支持“热启动”,即可以在已经训练好的模型基础上继续训练,在刚开始的时候通过初始化加载进来即可。下面简单介绍LambdaMART每一步的工作:

1)  每棵树的训练会先遍历所有的训练数据(label不同的文档pair),计算每个pair互换位置导致的指标变化以及Lambda,即 ,然后计算每个文档的Lambda: ,再计算每个 的导数wi,用于后面的Newton step求解叶子节点的数值。

2)  创建回归树拟合第一步生成的,划分树节点的标准是Mean Square Error,生成一颗叶子节点数为L的回归树。

3)  对第二步生成的回归树,计算每个叶子节点的数值,采用Newton step求解,即对落入该叶子节点的文档集,用公式 计算该叶子节点的输出值。

4)  更新模型,将当前学习到的回归树加入到已有的模型中,用学习率v(也叫shrinkage系数)做regularization。

LambdaMART具有很多优势:

1)  适用于排序场景:不是传统的通过分类或者回归的方法求解排序问题,而是直接求解

2)  损失函数可导:通过损失函数的转换,将类似于NDCG这种无法求导的IR评价指标转换成可以求导的函数,并且富有了梯度的实际物理意义,数学解释非常漂亮

3)  增量学习:由于每次训练可以在已有的模型上继续训练,因此适合于增量学习

4)  组合特征:因为采用树模型,因此可以学到不同特征组合情况

5)  特征选择:因为是基于MART模型,因此也具有MART的优势,可以学到每个特征的重要性,可以做特征选择

6)  适用于正负样本比例失衡的数据:因为模型的训练对象具有不同label的文档pair,而不是预测每个文档的label,因此对正负样本比例失衡不敏感

[笔记]Learning to Rank算法介绍:RankNet,LambdaRank,LambdaMart的更多相关文章

  1. Learning to Rank算法介绍:RankNet,LambdaRank,LambdaMart

    之前的博客:http://www.cnblogs.com/bentuwuying/p/6681943.html中简单介绍了Learning to Rank的基本原理,也讲到了Learning to R ...

  2. Learning to Rank算法介绍:GBRank

    之前的博客:http://www.cnblogs.com/bentuwuying/p/6681943.html中简单介绍了Learning to Rank的基本原理,也讲到了Learning to R ...

  3. Learning to Rank算法介绍:RankSVM 和 IR SVM

    之前的博客:http://www.cnblogs.com/bentuwuying/p/6681943.html中简单介绍了Learning to Rank的基本原理,也讲到了Learning to R ...

  4. 读paper笔记[Learning to rank]

    读paper笔记[Learning to rank] by Jiawang 选读paper: [1] Ranking by calibrated AdaBoost, R. Busa-Fekete, B ...

  5. 排序学习(learning to rank)中的ranknet pytorch简单实现

    一.理论部分 理论部分网上有许多,自己也简单的整理了一份,这几天会贴在这里,先把代码贴出,后续会优化一些写法,这里将训练数据写成dataset,dataloader样式. 排序学习所需的训练样本格式如 ...

  6. [Machine Learning] Learning to rank算法简介

    声明:以下内容根据潘的博客和crackcell's dustbin进行整理,尊重原著,向两位作者致谢! 1 现有的排序模型 排序(Ranking)一直是信息检索的核心研究问题,有大量的成熟的方法,主要 ...

  7. Learning to Rank之RankNet算法简介

    排序一直是信息检索的核心问题之一, Learning to Rank(简称LTR)用机器学习的思想来解决排序问题(关于Learning to Rank的简介请见我的博文Learning to Rank ...

  8. Learning to rank基本算法

    搜索排序相关的方法,包括 Learning to rank 基本方法 Learning to rank 指标介绍 LambdaMART 模型原理 FTRL 模型原理 Learning to rank ...

  9. Learning To Rank之LambdaMART前世今生

    1.       前言 我们知道排序在非常多应用场景中属于一个非常核心的模块.最直接的应用就是搜索引擎.当用户提交一个query.搜索引擎会召回非常多文档,然后依据文档与query以及用户的相关程度对 ...

随机推荐

  1. redis的数据类型 (一) 字符串

    redis中存储方式是以键值对存储的,所以叫做字典试.redis(Remote dictionary server)远程字典服务器 每个redis数据类型,都会有增加.删除,查看的功能,用实例来学习命 ...

  2. linux 压缩zip包

    压缩: zip -r  名称.zip 被压缩文件 解压: unzip 名称.zip

  3. Jemter+Badboy实战经验一(Badboy录制及基础功能)

    1. 使用工具: Apache Jemeter:http://jmeter.apache.org/download_jmeter.cgi (免费官网下载地址) BadBoy:   http://www ...

  4. 【js】性能问题

    执行环境和作用域 一.全局变量和局部变量 每个执行环境都有与之关联的变量对象(变量和函数存储在这里),全局执行环境是最外围的执行环境,根据ECMA实现所在的宿主不同,表示的执行环境的对象也不同.在we ...

  5. PHP数据访问增删查(20161028)

    注:预定义数组   $_POST[ ]; <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" &qu ...

  6. python中try except处理程序异常的三种常用方法

    如果你在写python程序时遇到异常后想进行如下处理的话,一般用try来处理异常,假设有下面的一段程序: try: 语句1 语句2 . . 语句N except .........: do somet ...

  7. Octave Tutorial(《Machine Learning》)之第一课《数据表示和存储》

    Octave Tutorial 第一课 Computation&Operation 数据表示和存储 1.简单的四则运算,布尔运算,赋值运算(a && b,a || b,xor( ...

  8. spring项目中dubbo相关的配置文件出现红叉的问题

    近来在eclipse中导入了一个web项目,但是发现项目上有红色的叉号. 原来是spring中关于dubbo的配置文件报错了. Multiple annotations found at this l ...

  9. web从入门开始(1)------简介

    服务端与客户端 HTML简介

  10. C++移位运算符详解

    移位运算符包括左移"<<"和右移">>" 左移运算符<<: 1.无符号 语法格式:需要移位的数字<<移位的次数n ...