LambdaRank就是在RankNet中定义了一个λ 作为梯度,然后从新反推出新的损失函数。
RankNet的损失函数中设计到两个神经网络的输出si,sj ,所以梯度如下:
∂Wk∂Cij=∂si∂Cij∂Wk∂si+∂sj∂Cij∂Wk∂sj 一次请求召回的待排序文档集D的损失C=∑i,j∈D∂Wk∂Cij
对梯度展开
∂si∂Cij=∂si∂21(1−Sij)σ(si−sj)+log(1+e−σ(si−sj))=21(1−Sij)−1+e−σ(si−sj)1=−∂sj∂Cij ∂Wk∂Cij=(21(1−Sij)−1+e−σ(si−sj)1)(∂Wk∂si−∂Wk∂sj)=λij(∂Wk∂si−∂Wk∂sj)λij=21(1−Sij)−1+e−σ(si−sj)1 对于文档pair,由于di▹dj因此:Sij=1所以λij=−1+e−σ(si−sj)1 因此对每个文档di,有λi=∑j(i,j)∈Dλij−∑j(j,i)∈Dλij,即每一个文档下一次调序的方向和强度取决于所有同一query的其他不同label的文档。
此外,还引入评价指标Z(如NDCG、ERR等),把交换两个文档的位置引起的评价指标的变化∣ΔZi,j∣作为其中一个因子。
通过梯度反推出LambdaRank的损失函数:Cij=log(1+e−σ(si−sj))∣ΔZi,j∣ 。
LambdaRank相比RankNet的优势在于分解因式后训练速度变快,同时考虑了评价指标,直接对问题求解,效果更明显。
Ranklib开源工具包定义的数据格式如下:
label qid:$id $feaid:$feavalue $feaid:$feavalue … #description
每行代表一个样本,相同查询请求的样本的qid相同,label表示该样本和该查询请求的相关程度,description描述该样本属于哪个待排序文档,用于区分不同的文档。
参考佳文
Learning To Rank之LambdaMART的前世今生
http://datayuan.baijia.baidu.com/article/486753 达观数据帮你揭开搜索引擎排序的神秘面纱