Learning To Rank之LambdaMART前世今生
1. 前言
我们知道排序在非常多应用场景中属于一个非常核心的模块。最直接的应用就是搜索引擎。当用户提交一个query。搜索引擎会召回非常多文档,然后依据文档与query以及用户的相关程度对文档进行排序,这些文档怎样排序直接决定了搜索引擎的用户体验。其它重要的应用场景还有在线广告、协同过滤、多媒体检索等的排序。
LambdaMART是Learning To Rank的当中一个算法,适用于很多排序场景。
它是微软Chris Burges大神的成果,近期几年很火,屡次现身于各种机器学习大赛中,Yahoo! Learning to Rank Challenge比赛中夺冠队伍用的就是这个模型[1],据说Bing和Facebook使用的也是这个模型。
本文先简介LambdaMART模型的组成部分,然后介绍与该模型相关的其它几个模型:RankNet、LambdaRank。接着重点介绍LambdaMART的原理,然后介绍LambdaMART的开源实现软件包Ranklib。最后以搜索下拉提示的个性化推荐场景说明LambdaMART的应用。
2. 符号说明
在展开介绍之前先说明本文用到的符号所代表的含义:
符号 |
说明 |
q |
用户提交的查询请求 |
d |
须要排序的文档 |
D |
一次请求召回的待排序文档集 |
s |
模型计算得到的文档得分 |
(i, j) |
文档 和 |
P |
全部的文档pair集合 |
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaHVhZ29uZ19hZHU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt=""> |
排在 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaHVhZ29uZ19hZHU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt=""> |
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaHVhZ29uZ19hZHU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt=""> |
文档pair下标集合,对每一个 。有 |
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaHVhZ29uZ19hZHU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">排在 |
|
排在 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaHVhZ29uZ19hZHU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt=""> |
|
与 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaHVhZ29uZ19hZHU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt=""> watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaHVhZ29uZ19hZHU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt=""> }:0表示 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaHVhZ29uZ19hZHU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt=""> 的相关性一样。谁排在前面没关系;1表示 |
3. LambdaMART说文解字
LambdaMART模型从名字上能够拆分成Lambda和MART两部分,表示底层训练模型用的是MART(Multiple Additive Regression Tree)。假设MART看起来比較陌生,那换成GBDT(GradientBoosting Decision Tree)预计大家都非常熟悉了。没错,MART就是GBDT。Lambda是MART求解过程使用的梯度,其物理含义是一个待排序的文档下一次迭代应该排序的方向(向上或者向下)和强度。
将MART和Lambda组合起来就是我们要介绍的LambdaMART。
4. 奇妙的Lambda
为什么LambdaMART能够非常好的应用于排序场景?这主要受益于Lambda梯度的使用。前面介绍了Lambda的意义在于量化了一个待排序的文档在下一次迭代时应该调整的方向和强度。
但Lambda最初并非诞生于LambdaMART。而是在LambdaRank模型中被提出。而LambdaRank模型又是在RankNet模型的基础上改进而来。如此可见RankNet、LambdaRank、LambdaMART三个的关系非常不一般,是一个神奇的基友群。以下我们逐个分析三个基友之间的关系[2]。
5. RankNet
RankNet[3]是一个pairwise模型,它把排序问题转换成比較一个(i, j) pair的排序概率问题,即比較
排在 前的概率。
它首先计算每一个文档的得分。然后依据得分计算文档pair的排序概率:
能够看到这事实上就是逻辑回归的sigmoid函数[4],因为
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaHVhZ29uZ19hZHU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
影响的是sigmoid函数的形状,对终于结果影响不大,因此默认使用 =1进行简化。RankNet证明了假设知道一个待排序文档的排列中相邻两个文档之间的排序概率,则通过推导能够算出每两个文档之间的排序概率。
因此对于一个待排序文档序列,仅仅需计算相邻文档之间的排序概率,不须要计算全部pair。降低计算量。
然后用交叉熵[5]作为损失函数来衡量
对 的拟合程度:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaHVhZ29uZ19hZHU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
该损失函数有下面几个特点:
1) 当两个相关性不同的文档算出来的模型分数同样时,损失函数的值大于0,仍会对这对pair做惩处。使他们的排序位置区分开
2) 损失函数是一个类线性函数,能够有效降低异常样本数据对模型的影响,因此具有鲁棒性
Ranknet终于目标是训练出一个算分函数s=f(x:w),使得全部pair的排序概率预计的损失最小:
RankNet採用神经网络模型优化损失函数,採用梯度下降法[6]求解:
排序问题的评价指标一般有NDCG[7]、ERR[8]、MAP[9]、MRR[10]等,这些指标的特点是不平滑、不连续,无法求梯度。因此无法直接用梯度下降法求解。
RankNet的创新点在于没有直接对这些指标进行优化,而是间接把优化目标转换为能够求梯度的基于概率的交叉熵损失函数进行求解。因此不论什么用梯度下降法优化目标函数的模型都能够採用该方法。RankNet採用的是神经网络模型,其它类似boosting
tree等模型也能够使用该方法求解。
6. LambdaRank
图1 pairwise error
如图 1所看到的,每一个线条表示文档,蓝色表示相关文档,灰色表示不相关文档,RankNet以pairwise error的方式计算cost。左图的cost为13,右图通过把第一个相关文档下调3个位置,第二个文档上条5个位置,将cost降为11。可是像NDCG或者ERR等评价指标仅仅关注top k个结果的排序,在优化过程中下调前面相关文档的位置不是我们想要得到的结果。
图
1右图左边黑色的箭头表示RankNet下一轮的调序方向和强度,但我们真正须要的是右边红色箭头代表的方向和强度。即更关注靠前位置的相关文档的排序位置的提升。LambdaRank[11]正是基于这个思想演化而来。当中Lambda指的就是红色箭头,代表下一次迭代优化的方向和强度,也就是梯度。
受LambdaNet的启示。LambdaRank对
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaHVhZ29uZ19hZHU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
做因式分解,例如以下:
当中
代入上式得
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaHVhZ29uZ19hZHU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
当中令
对于
的文档pair。因为
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaHVhZ29uZ19hZHU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt=""> 。因此
,所以有
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaHVhZ29uZ19hZHU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
因此。对每一个文档
。其Lambda为
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaHVhZ29uZ19hZHU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt=""> ,即每个文档下一次调序的方向和强度取决于全部同一query的其它不同label的文档。
同一时候LambdaRank还在Lambda中引入评价指标Z (如NDCG、ERR等)。把交换两个文档的位置引起的评价指标的变化
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaHVhZ29uZ19hZHU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
作为当中一个因子,实验表明对模型效果有显著的提升:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaHVhZ29uZ19hZHU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
能够看出。LambdaRank不是通过显示定义损失函数再求梯度的方式对排序问题进行求解,而是分析排序问题须要的梯度的物理意义。直接定义梯度。能够反向推导出LambdaRank的损失函数为:
LambdaRank相比RankNet的优势在于分解因式后训练速度变快,同一时候考虑了评价指标,直接对问题求解。效果更明显。
7. LambdaMART
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,因此对正负样本比例失衡不敏感
8. Ranklib开源工具包
Ranklib[15]是一个开源的Learning ToRank工具包,里面实现了非常多Learning To Rank算法模型,当中包含LambdaMART。其源代码的算法实现流程大致例如以下:
该工具包定义的数据格式例如以下:
label qid:$id $feaid:$feavalue $feaid:$feavalue … #description
每行代表一个样本。同样查询请求的样本的qid同样。label表示该样本和该查询请求的相关程度,description描写叙述该样本属于哪个待排序文档,用于区分不同的文档。
该工具包是用Java实现的,在空间使用上感觉有些低效,但总体设计还是挺好的,Ranker的接口设计的非常好。值得学习借鉴。
另外还有非常多其它的LambdaMART的开源实现,有兴趣的能够參考[16][17][18]
9. LambdaMART应用
最后我们以一个实际场景来介绍LambdaMART的应用。如今非常多搜索引擎都有一个下拉提示的功能。学术上叫QAC(Query Auto-Completion,query自己主动补全),主要作用是在用户在搜索引擎输入框输入query的过程中输出一系列跟用户输入query前缀相匹配的query,供用户选择。降低用户的输入。让用户更加便捷的搜索。
Milad Shokouhi[19]发现有一些query的热度有明显的用户群倾向。比如,当不同用户输入i时。年轻的女性用户倾向于搜instagram,而男性用户则倾向于搜imdb,所以能够对query的下拉提示做个性化排序。
Milad Shokouhi使用LambdaMART模型作为个性化排序模型,使用了用户的长期历史、短期历史、性别、年龄、所处地域、提示query的原始排序位置等特征,终于效果提升了9%,效果很明显。
Milad Shokouhi的工作说明LambdaMART能够应用于个性化排序,且效果很不错。
10. 总结
本文在一些相关书籍、paper和开源码的基础上,简单梳理了LambdaMART的来龙去脉。简单总结:Lambda在RankNet出炉,在LambdaRank升华,在LambdaMART发扬光大。青出于蓝而胜于蓝。模型的数学推导和实际效果都很美丽。仅仅要涉及到排序的场景都能够适用。是排序场景的“万金油”。
參考文献:
[1] Learning to Rank Using an Ensemble ofLambda-Gradient Models
[2] From RankNet to LambdaRank to LambdaMART: AnOverview
[3] Learning to Rank using Gradient Descent
[4] Wikipedia-Sigmoid Function
[6] Wikipedia-Gradient Descent
[7] Wikipedia-NDCG
[8] Expected Reciprocal Rank for Graded Relevance
[9] Wikipedia-MAP
[10] Wikipedia-MRR
[11] Learning to Rank with Nonsmooth CostFunctions
[12] Adapting boosting for information retrievalmeasures
[13] Greedy function approximation: A gradientboosting machine
[14] The Elements of Statistical Learning
[15] RankLib
[16] jforests
[17] xgboost
[18] gbm
[19] Learning to Personalize QueryAuto-Completion
转载请注明出处,本文转自:http://blog.csdn.net/huagong_adu/article/details/40710305
本博客搬迁至:http://ralphadu.com/
版权声明:本文博主原创文章,博客,未经同意不得转载。
Learning To Rank之LambdaMART前世今生的更多相关文章
- 转 Learning To Rank之LambdaMART的前世今生
http://blog.csdn.net/huagong_adu/article/details/40710305
- [笔记]Learning to Rank算法介绍:RankNet,LambdaRank,LambdaMart
之前的博客:http://www.cnblogs.com/bentuwuying/p/6681943.html中简单介绍了Learning to Rank的基本原理,也讲到了Learning to R ...
- Learning to Rank算法介绍:RankNet,LambdaRank,LambdaMart
之前的博客:http://www.cnblogs.com/bentuwuying/p/6681943.html中简单介绍了Learning to Rank的基本原理,也讲到了Learning to R ...
- [Machine Learning] Learning to rank算法简介
声明:以下内容根据潘的博客和crackcell's dustbin进行整理,尊重原著,向两位作者致谢! 1 现有的排序模型 排序(Ranking)一直是信息检索的核心研究问题,有大量的成熟的方法,主要 ...
- Learning to Rank 简介
转自:http://www.cnblogs.com/kemaswill/archive/2013/06/01/3109497.html,感谢分享! 本文将对L2R做一个比较深入的介绍,主要参考了刘铁岩 ...
- Learning to Rank简介
Learning to Rank是采用机器学习算法,通过训练模型来解决排序问题,在Information Retrieval,Natural Language Processing,Data Mini ...
- 芝麻HTTP: Learning to Rank概述
Learning to Rank,即排序学习,简称为 L2R,它是构建排序模型的机器学习方法,在信息检索.自然语言处理.数据挖掘等场景中具有重要的作用.其达到的效果是:给定一组文档,对任意查询请求给出 ...
- Learning to rank的讲解,单文档方法(Pointwise),文档对方法(Pairwise),文档列表方法(Listwise)
学习排序(Learning to Rank) LTR(Learning torank)学习排序是一种监督学习(SupervisedLearning)的排序方法.LTR已经被广泛应用到文本挖掘的很多领域 ...
- 读paper笔记[Learning to rank]
读paper笔记[Learning to rank] by Jiawang 选读paper: [1] Ranking by calibrated AdaBoost, R. Busa-Fekete, B ...
随机推荐
- 一个解析RTSP 的URL函数
写了一个解析URL的函数,可以提取URL中的IP 和 port. 如:url = "rtsp://192.168.1.43:2554/realmp3.mp3"; url = &qu ...
- bestcoder.hdu.edu.cn
http://bestcoder.hdu.edu.cn/ Problem A 题目链接: http://bestcoder.hdu.edu.cn/contests/contest_showproble ...
- Visual Studio 控件命名规范(很详细)
VS 控件命名规范 Type Prefix Example Array arr arrShoppingList Boolean bln blnIsPostBack Byte byt bytPixelV ...
- 键盘游戏之canvas--用OO方式写
虽然写的不是很好,但 解释权以及版权仍然归13东倍所有! <!DOCTYPE HTML> <html> <head> <title>canvas-00 ...
- android binder机制之——(创建binder服务)
Binder机制编程 前面的几篇文章具体介绍了android中binder机制的方方面面,相信你对binder机制已经有了较深刻的理解.俗话说得好"学以致用",以下我们就通过在 ...
- java.lang.ClassCastException: sun.proxy.$Proxy11 cannot be cast to分析
报这个错,只有一个原因,就是你转化的类型不对. 如果你的类是一个单实体类,也就是没有继承或是接口别的类. public class HjmServiceImpl {} 那么这样写就可以: HjmSer ...
- C++异常中的堆栈跟踪
C++语言的运行时环境是基于栈的环境,堆栈跟踪(trace stack)就是程序运行时能够跟踪并打印所调用的函数.变量及返回地址等,C++异常中的堆栈跟踪就是当程序抛出异常时,能够把导致抛出异常的语句 ...
- linux教程之一
相信不少想学习linux的新手们正愁不知道看什么linux学习教程好,下面小编给大家收集和整理了几点比较重要的教程,供大家学习,如需想学习更多的话,可到wdlinux学堂寻找更多教程. 1. 忘记my ...
- 调整Tomcat的并发线程到5000+
调整Tomcat的并发线程数到5000+ 1. 调整server.xml的配置 先调整maxThreads的数值,在未调整任何参数之前,默认的并发线程可以达到40. 调整此项后可以达到1800左右. ...
- 通过加载Kernel32来动态判断 当前操作系统32bit还是64bit
工作原理:通过加载Kernel32来获取IsWow64Process 函数然后通过函数的地址操作,执行函数的操作. 在程序中只要我们获取了一个函数的地址,就可以找到正确的方法执行这个函数. 但是这种方 ...