转自:http://blog.csdn.net/u014374284/article/details/49385065, 感谢分享!

LamdaMart 介绍见博客http://blog.csdn.net/huagong_adu/article/details/40710305,感谢分享!

在使用搜索引擎的过程中,对于某一Query(或关键字),搜索引擎会找出许多与Query相关的URL,然后根据每个URL的特征向量对该URL与主题的相关性进行打分并决定最终URL的排序,其流程如下:

排序的好坏完全取决于模型的输出,而模型又由其参数决定,因而问题转换成了如何利用带label的训练数据去获得最优的模型参数w。Ranknet提供了一种基于Pairwise的训练方法,它最早由微软研究院的Chris Burges等人在2005年ICML上的一篇论文Learning to Rank Using Gradient Descent中提出,并被应用在微软的搜索引擎Bing当中。

相关性概率

Cost function是RankNet算法的核心,在介绍Cost function前,我们先定义两个概率:预测相关性概率、真实相关性概率。

  • 预测相关性概率
    对于任意一个URL对(Ui

    ,Uj

    ),模型输出的score分别为si

    和sj

    ,那么根据模型的预测,Ui

    比Uj

    与Query更相关的概率为:

    Pij=P(Ui>Uj)=11+e−σ(si−sj)

    由于RankNet使用的模型一般为神经网络,根据经验sigmoid函数能提供一个比较好的概率评估。参数σ

    决定sigmoid函数的形状,对最终结果影响不大。

  • 真实相关性概率
    对于训练数据中的Ui

    和Uj

    ,它们都包含有一个与Query相关性的真实label,比如Ui

    与Query的相关性label为good,Uj

    与Query的相关性label为bad,那么显然Ui

    比Uj

    更相关。我们定义p¯ij

    为Ui

    比Uj

    更相关的真实概率,有

    p¯ij=12(1+Sij)

    如果Ui

    比Uj

    更相关,那么Sij=1

    ;如果Ui

    不如Uj

    相关,那么Sij=−1

    ;如果Ui

    、Uj

    与Query的相关程度相同,那么Sij=0

代价函数

对于一个排序,RankNet从各个URL的相对关系来评价排序结果的好坏,排序的效果越好,那么有错误相对关系的pair就越少。所谓错误的相对关系即如果根据模型输出Ui

排在Uj

前面,但真实label为Ui

的相关性小于Uj

,那么就记一个错误pair,RankNet就是以错误的pair最少为优化目标。对于每一个pair,我们使用交叉熵来度量其预测代价,即:

Cij=−P¯¯¯ijlogPij−(1−P¯¯¯ij)log(1−Pij)

化简

Cij=−12(1+Sij)log11+e−σ(si−sj)−12(1−Sij)loge−σ(si−sj)1+e−σ(si−sj)=−12(1+Sij)log11+e−σ(si−sj)−12(1−Sij)[−σ(si−sj)+log11+e−σ(si−sj)]=12(1−Sij)σ(si−sj)+log(1+e−σ(si−sj))

下图展示了Cij

随P¯¯¯ij

、Pij

的变化情况:

图中t表示si−sj

,可以看到当Sij=1

时,模型预测的si

比sj

越大,其代价越小;Sij=−1

时,si

比sj

越小,代价越小;Sij=0

时,代价的最小值在si

与sj

相等处取得。该代价函数有以下特点:

  • 当两个相关性不同的文档算出来的模型分数相同时,损失函数的值大于0,仍会对这对pair做惩罚,使他们的排序位置区分开
  • 损失函数是一个类线性函数,可以有效减少异常样本数据对模型的影响,因此具有鲁棒性

总代价

C=∑(i,j)∈ICij

I表示所有URL pari的集合,且每个pair仅包含一次。

梯度下降迭代

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

了,即

wk→wk−η∂C∂wk

η

为步长,代价C

沿负梯度方向变化:

ΔC=∑k∂C∂wkΔwk=∑k∂C∂wk(η∂C∂wk)=−η∑k(∂C∂wk)2<0

这表明沿负梯度方向更新参数确实可以降低总代价。我们对∂C∂wk

继续分解

∂C∂wk=∑(i,j)∈I(∂Cij∂si∂si∂wk+∂Cij∂sj∂sj∂wk)

其中

∂Cij∂si=σ(12(1−Sij)−11+eσ(si−sj))=−∂Cij∂sj

我们令λij=∂Cij∂si=σ(12(1−Sij)−11+eσ(si−sj))

,有

∂C∂wk=∑(i,j)∈Iσ(12(1−Sij)−11+eσ(si−sj))(∂si∂wk−∂sj∂wk)=∑(i,j)∈Iλij(∂si∂wk−∂sj∂wk)=∑iλi∂si∂wk

下面我们来看看这个λi

是什么。前面讲过集合I中只包含label不同的URL的集合,且每个pair仅包含一次,即(Ui

,Uj

)与(Uj

,Ui

)等价。为方便起见,我们假设I中只包含(Ui

,Uj

)表示Ui

相关性大于Uj

的pair,即I中的pair均满足Sij=1

,那么

λi=∑j:(i,j)∈Iλij−∑j:(j,i)∈Iλij

这个写法是Burges的paper上的写法,我对此好久都没有理清,下面我们用一个实际的例子来看:有三个URL,其真实相关性满足U1>U2>U3,那么集合I中就包含

{(1,2), (1,3), (2,3)}共三个pair

∂C∂wk=(λ12∂s1∂wk−λ12∂s2∂wk)+(λ13∂s1∂wk−λ13∂s3∂wk)+(λ23∂s2∂wk−λ23∂s3∂wk)

显然λ1=λ12+λ13,λ2=λ23−λ12,λ3=−λ13−λ23

,因此我所理解的λi

应为

λi=∑j:(i,j)∈Iλij−∑k:(k,i)∈Iλki

λi

决定着第i个URL在迭代中的移动方向和幅度,真实的排在Ui

前面的URL越少,排在Ui

后面的URL越多,那么文档Ui

向前移动的幅度就越大(实际λi

负的越多越向前移动)。这表明每个URL下次调序的方向和强度取决于所有同一Query的其他不同label的文档。

LambdaRank

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

图中每个线条表示一个URL,蓝色表示与Query相关的URL,灰色表示不相关的URL。下面我们用Error pair和NDCG分别来评估左右两个排序的好坏:

  • Error pair指标

    对于排序1,排序错误的pair共13对,故cost=13

    ,分别为:
    (2,15)、(3,15)、(4,15)、(5,15)、(6,15)、(7,15)、(8,15)、
    (9,15)、(10,15)、(11,15)、(12,15)、(13,15)、(14,15)

    对于排序2,排序错误的pair共11对,故cost=11

    ,分别为:
    (1,4)、(2,4)、(3,4)
    (1,10)、(2,10)、(3,10)、(5,10)、(6,10)、(7,10)、(8,10)、(9,10)

    所以,从Error pair角度考虑,排序2要优于排序1

  • NDCG指标

    排序1与排序2具有相同的maxDCG@16

    ,

    maxDCG@16=21−1log(1+1)+21−1log(1+2)=1.63

    对排序1,有

    DCG@16=21−1log(1+1)+21−1log(1+15)=1.25
    NDCG@16=DCG@16maxDCG@16=1.251.63=0.767

    对排序2,有

    DCG@16=21−1log(1+4)+21−1log(1+10)=0.72
    NDCG@16=DCG@16maxDCG@16=0.721.63=0.442

    所以,从NDCG指标来看,排序1要优于排序2。

那么我们是否能以RankNet的思路来优化像NDCG、ERR等不连续、不平滑的指标呢?答案是肯定,我们只需稍微改动一下RankNet的λij

的定义即可

λij=−σ1+eσ(si−sj)|ΔZij|

式中ΔZij

表示,将Ui

和Uj

交换位置后,待优化指标的变化,如ΔNDCG

就表是将Ui

和Uj

进行交换,交换后排序的NDCG

与交换前排序的NDCG

的差值,我们把改进后的算法称之为LambdaRank。

排序2中以箭头展示了RankNet和LambdaRank的下一轮迭代的调序方向和强度(箭头长度),黑色箭头表示RankNet算法下U4和U10

的调序方向和强度,红色箭头表示以NDCG为优化目标的LambdaRank算法下的调序方向和强度。

以上就是我对RankNet和LambdaRank的理解,如有不对之处还请指正。

参考:
From RankNet to LambdaRank to LambdaMART: An Overview
http://blog.csdn.net/huagong_adu/article/details/40710305
http://www.cnblogs.com/kemaswill/p/kemaswill.html

http://www.cnblogs.com/LeftNotEasy/archive/2011/03/07/random-forest-and-gbdt.html

Pairwise ranking methods: RankNet与LambdaRank的更多相关文章

  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算法介绍:RankNet,LambdaRank,LambdaMart

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

  3. 机器学习排序算法:RankNet to LambdaRank to LambdaMART

    使用机器学习排序算法LambdaMART有一段时间了,但一直没有真正弄清楚算法中的所有细节. 学习过程中细读了两篇不错的博文,推荐给大家: 梯度提升树(GBDT)原理小结 徐博From RankNet ...

  4. Learning to Rank:Point-wise、Pair-wise 和 List-wise区别

    机器学习的 ranking 技术——learning2rank,包括 pointwise.pairwise.listwise 三大类型. [Ref-1]给出的: <Point wise rank ...

  5. Learning to Rank之RankNet算法简介

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

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

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

  7. Preference Learning——Object Ranking

    Basics About Orders Object Ranking应用: 量化的受訪者的感觉或印象(quantification of respondents' sensations or impr ...

  8. 【机器学习Machine Learning】资料大全

    昨天总结了深度学习的资料,今天把机器学习的资料也总结一下(友情提示:有些网站需要"科学上网"^_^) 推荐几本好书: 1.Pattern Recognition and Machi ...

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

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

随机推荐

  1. 【转】org.apache.jasper.JasperException: The absolute uri: http://java.sun.com/jsp/jstl/core cannot be res

    如图所示: 看网上的解决方案,有的说是jstl的版本问题,1.0版本引入使用的时候加的uri不带有jsp路径的,1.2的带有/jsp路径,还有的说是依赖冲突的问题,最后尝试了都不行,只有一招能够行的通 ...

  2. abp + angular 项目 图标字体注意事项

    用的字体建议下载到本地,否则部署环境没有网络的话,则图片字体会不正常显示.

  3. 能量项链 (区间DP)

    能量项链 (区间DP) 问题引入 能量项链 洛谷 P1063 思路 诸如此类不能线性规划的问题要用到区间DP,区间DP一般就是三层循环,第一层表示区间长度(本题即\(n\)),第二层枚举起点并根据第一 ...

  4. HDU - 3033 滚动数组有坑

    每层至少一个,滚动时要判上一层非法与否,所以每次都要memset #include<bits/stdc++.h> #define rep(i,j,k) for(int i=j;i<= ...

  5. ali代码风格

    如下: <?xml version="1.0" encoding="UTF-8" standalone="no"?><pr ...

  6. 实现类似tail -f file功能

    python版本py3 tail -f file是打印最后10行,然后跟踪文件追加的内容打印出来. python3 以为本方式打开的话,不能回退(f.seek(-1,1)),所有以'rb'方式打开文件 ...

  7. 面向切面编程 (AOP )

    什么是面向切面编程? 面向切面编程就是(AOP --- aspect-oriented programming), 在百科上说: 面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一 ...

  8. 生产者与消费者模式-阻塞 wait,notify

    设计思路:生产者push ,消费者 拿,篮子装,syncstack先进后出,while 判断 index=0 wait,      当 Producer生产了 并push到篮子里  notify(唤醒 ...

  9. Long 和 Integer

    Integer 32位 其范围为 -2^31 到 2^31-1 之间,所以最大值是 2^31-1 Long 64位

  10. 读《NoSQL精粹》前三章有感

    现在NoSQL很流行,所以买了一本这方面的书,这本书虽然很薄 156页,但是感觉的确是大师的经验之谈,对于自己经验还是很少.无法能完全能心领神会,大师所说的,就像一个人说药苦,你没吃过.再听别人描述也 ...