参考论文:
GREEDY FUNCTION APPROXIMATION: A GRADIENT BOOSTING MACHINE
1.boosting的算法流程
2.针对排序问题的具体算法
这里F(x)为我们针对指定query的x文档的打分结果。
对于树h,需要满足:
代码实现中˜yi的结果为正或者为负,最佳切分点S定义在:
构建树的时候,输入为(xi,lambdai),其中lambdai代表着对xi的评分(影响排序结果,是增大还是减少)。
最好的划分点,就是把增大的划分到一起(全部为正值,相加结果为sumA),减少的划分到一起(全部为负值,相加结果为sumb).此时的sumA*sumA/countA+sumB*sumB/countB为最大。
因此,这里的S的含义为:该划分点尽量把正值和负值区分开。 正值表示:后续评分调大;负值表示:后续评分调小;
源码分析:
ciir.umass.edu.learning.tree.MART类:
对 求导,得到
protected void computePseudoResponses()
{
for(int i=0;i<martSamples.length;i++)
pseudoResponses[i] = martSamples[i].getLabel() - modelScores[i];
}
根据构建的回归树,求得pm=(某个叶子节点下所有残差之和的平均值,决定是增大评分,还是减少评分)
protected void updateTreeOutput(RegressionTree rt)
{
List<Split> leaves = rt.leaves();
for(int i=0;i<leaves.size();i++)
{
float s1 = 0.0F;
Split s = leaves.get(i);
int[] idx = s.getSamples();
for(int j=0;j<idx.length;j++)
{
int k = idx[j];
s1 += pseudoResponses[k];
}
s.setOutput(s1/idx.length);
}
}
GRBT与LambdaMART的区别
两者的区别在于,其损失函数不一样,求导的形式不一样,求叶子赋值的方式pm不一样。
GRBT的损失函数:
求满足L最小值的F,对F求导的结果为 。
根据残差(yi-Fm-1(xi),即L的求导值),构建回归树,并求每个叶子的值ρm,使得
对h进行切分的时候,使得残差为负的尽量聚集在一起,残差为正的尽量聚集在一起。因此每个叶子的
ρm最后为该叶子下的残差的平均值。 如果残差为负的聚集在一起,得到一个负的平均值pm, (残差-pm)的平方会尽量的小(是否是最小。这个需要大神来证明一下);残差为正的,情况于残差为负的相同。
LambdaMART的损失函数:
这里的C代表着NDCG,因此求满足C最大值的S,C对si(xi的评分)求导的结果如图中所示。
其回归树的每个叶子的值如下面的公式计算:
rkm的公式解释:
假设Si要更新为Si=Si+r,将更新后的Si代入到下面的C中
求满足C取最大值时的r。
设r的初值为0,根据Newton-Raphson,求函数最小值为:
这里求最大值,则用加
这部分参考:
From RankNet to LambdaRank to LambdaMART: An Overview的第6节:MART for Two Class Classification。