以前的博客: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。html
RankNet是2005年微软提出的一种pairwise的Learning to Rank算法,它从几率的角度来解决排序问题。RankNet的核心是提出了一种几率损失函数来学习Ranking Function,并应用Ranking Function对文档进行排序。这里的Ranking Function能够是任意对参数可微的模型,也就是说,该几率损失函数并不依赖于特定的机器学习模型,在论文中,RankNet是基于神经网络实现的。除此以外,GDBT等模型也能够应用于该框架。web
咱们先定义两个几率:预测相关性几率、真实相关性几率。算法
对于任意一个doc对(Ui,Uj),模型输出的score分别为si和sj,那么根据模型的预测,Ui比Uj与Query更相关的几率为:网络
因为RankNet使用的模型通常为神经网络,根据经验sigmoid函数能提供一个比较好的几率评估。参数σ决定sigmoid函数的形状,对最终结果影响不大。框架
RankNet证实了若是知道一个待排序文档的排列中相邻两个文档之间的排序几率,则经过推导能够算出每两个文档之间的排序几率。所以对于一个待排序文档序列,只需计算相邻文档之间的排序几率,不须要计算全部pair,减小计算量。机器学习
对于训练数据中的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)。学习
对于一个排序,RankNet从各个doc的相对关系来评价排序结果的好坏,排序的效果越好,那么有错误相对关系的pair就越少。所谓错误的相对关系即若是根据模型输出Ui排在Uj前面,但真实label为Ui的相关性小于Uj,那么就记一个错误pair,RankNet本质上就是以错误的pair最少为优化目标。而在抽象成cost function时,RankNet其实是引入了几率的思想:不是直接判断Ui排在Uj前面,而是说Ui以必定的几率P排在Uj前面,便是以预测几率与真实几率的差距最小做为优化目标。最后,RankNet使用Cross Entropy做为cost function,来衡量对
的拟合程度:优化
化简后,有:atom
当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有且仅有一次。
上述的模型Pij须要保持一致性,即若是Ui的相关性高于Uj,Uj的相关性高于Uk,则Ui的相关性也必定要高于Uk。不然,若是不能保持一致性,那么上面的理论就很差使了。
咱们使用Ui vs Uj的真实几率 和 Uj vs Uk 的真实几率,计算Ui vs Uk的真实几率:
若,则有下图所示:
咱们得到了一个可微的代价函数,下面咱们就能够用随机梯度降低法来迭代更新模型参数wk了,即
η为步长,代价C沿负梯度方向变化。
这代表沿负梯度方向更新参数确实能够下降总代价。
而使用了随机梯度降低法时,有:
其中,
上面的是对于每一对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的方式,是对同一个query下的全部doc进行一次权重的更新。时间消耗从O(n2)降到了O(n)。这对训练过程的影响是很大的,由于使用的是神经网络模型,每次权重的更新迭代都须要先进行前向预测,再进行偏差的后向反馈。
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表示相关性评分最高的一档。
上面咱们介绍了以错误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的优点在于分解因式后训练速度变快,同时考虑了评价指标,直接对问题求解,效果更明显。
1)Mart定义了一个框架,缺乏一个梯度。
2)LambdaRank从新定义了梯度,赋予了梯度新的物理意义。
所以,全部可使用梯度降低法求解的模型均可以使用这个梯度,MART就是其中一种,将梯度Lambda和MART结合就是大名鼎鼎的LambdaMART。
MART的原理是直接在函数空间对函数进行求解,模型结果由许多棵树组成,每棵树的拟合目标是损失函数的梯度,在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,所以对正负样本比例失衡不敏感