RankLib源码分析(三)----LambdaRank

参考文档:
From RankNet to LambdaRank to LambdaMART: An Overview(公式主要引用这个)
Learning to Rank with Nonsmooth Cost Functions。(无公式引用,但是还是推荐看看)

w32:隐藏层到输出层的w参数
w12:输入层到输出层的w参数

1.lambdaRank和RankNet的关系
lambdaRank是在RankNet的思路上发展出来的。
RankNet是以 crossEntropy为损失函数的,确保corssEntropy最小,梯度下降;
lambdaRank是以NDCG为标准的,确保NDCG最大,梯度上升;(这里论文没有定义函数的形式,而是直接定义了导数的形式)

2.
pairMap[i][] : 输入中指定query的Doci与其他文,这里既包含评分大于Doci的,也包括评分小于Doci的。
这点与rankNet不同。RankNet只包含评分小于Doci的。
targetValue[i][]: 对应query的Doci与其他文档的关系,1为i大于其他文档;0为i小于其他文档。

3.
computePairWeight
对于输入的pair,互换其排序的位置,计算delta|NDCG|,以及为计算 Lambda做准备:σ*|∆NDCG |


4.batchBackPropagate 
a.更新W32,于rankNet不同
以下是RankNet的:
以下是LambdaRank的值
注意,公式6里面与公式3不一样的原因在于公式6的输入时si > sj的,而公式3无指定si和sj之间的大小关系。因为源码中pairMap[i][] 即用到了比i大的,也用到了比i小的,因此采用公式(6)
源码实现中对 Lambda的计算分为两部分,
一个是σ*|∆NDCG |,在第3节已经计算出来了(LambdaRank类的computePairWeight方法)。
一个是
,这部分在Neuron.java的computeDelta里计算的。

w32 = w32-δwk
这里请注意一下,我引用的δwk是梯度下降的公式,但是为求最大值(NDCG),应该采用正值,而非负值,因此在求w32的时候,采用了w32-δwk。(减去负数,等于加上正数)
源码在实现的时候δwk,是算正值的,w32是加δwk的。

b.更新w21的话,基本上个RankNet采用的公式一致。


总结: 其init,learning,eval的流程跟RankNet一致,都是用二层神经网络的方式,唯一不同的在于训练的过程。









你可能感兴趣的:(learning,to,rank)