引入
lambdamart是什么呢? 无非是 lamda + mart. lambda 和 mart又是什么呢?
lambda
大师强制定义的梯度。含义是:指明下一次移动的方向和强度。
为什么有上面含义呢?
先上一盘公式,瞅一眼:
公式浅层理解
这个公式很显然是一个负数,肯定是个负梯度,我们知道负梯度肯定是使损失函数下降的方向,用这个公式,肯定回事损失函数降低,不会升高,所以可以放心的用,但是我们想想公式定义的这么繁琐,难道没有点其他的事情要搞吗?要不然对的起如此繁琐的公式???
公式深层理解
当然了, 真正的物理的意义远远远远远远超出了上面分析的简单的方向。
我们看公式的第一个部分:
这一部分是Ranknet损失函数梯度,那么让我先看下RankNet损失函数含义,然后再回看这个梯度。
Ranknet
Ranknet是一个人
这个人认为 query-url的相关性是一个分数来度量。 score(q-u1) > score(q-u2) ,则q下,u1的相关性大于u2.
那么他认为只要算出了这个分数score(q-ux) , 就能知道了所有u的相关性,且大小都用分数来度量。
那么如何求这个分数?
作为资深数据挖掘专家,他的想法很牛逼,他不去直接去学习每个文档的相关性, 而是去比较两个文档的相关性, 他认为:
P(u1 > u2) = 1; P(u1 == u2) = 0.5; P (U1<u2) =0
所以 1, 0 , -1 就是学习的label。 即不同文档比较下的相对相关性。
那么我们如何学习这种比较下的相对相关性呢?也就是 【要学的公式 】 是啥?
有了这个公式,我们就能量化,两个不同文档的,相比较下相关性强弱。
如果score(u1) > score(u2) , 那么我们就希望 P12 = 1, 在上面sigmod函数中,其实就是越靠左越好(接近1)。
如果score(u1) < score(u2) , 那么我们就希望 P12 = -1, 在上面sigmod函数中,其实就是越靠右越好(接近0)。
如果score(u1) = score(u2) , 那么我们就希望 P12 = -1, 在上面sigmod函数中,其实就是越靠中间越好(接近0.5)。
为此:
我们无非就是学 Pij , 使其与真时的label一致。 那么这里我们用【交叉熵损失函数】:
然后用【梯度下降】求解:
这样有没有问题??
RankNet的优化方向为降低pair-wise error,并不关心最相关的doc是否排在最前面
RankNet优化过程可能如图所示
左边的doc list共有13个pair-wise error,右边共有11个pair-wise error RankNet可能会进行从左到右的“优化”
优化右边的doc list时,RankNet的梯度大小类似于黑色箭头, 而我们更需要红色箭头那样的梯度大小。
为什么ranknet不能做到红色剪头效果呢?
ranknet是想做的是让不同的结果打出不同的分数,不同的分数可以比较相关性强弱就行,我比你强,那么我的分数就要比你大 ,哪怕只是大一点点点点都行。那么在这种情况下,我们在理解下ranknet的损失函数,他并不关心线上的顺序,他只是给每个结果算出仅仅能够表示强弱的分数即可,只要能让损失降调最小。
而红色部分不一样,他不仅考虑到了上面强弱,还考虑到了位置信息,每一次迭代都朝着对整体排序效果有利的方向前进。
OK,以上是Ranknet部分,回到上面部分,我们再看lambda第一部分:
就是ranknet的损失函数,优点是通过降低损失减少逆序对,缺点是调序的盲目性,未考虑到topk的相关性逐渐减弱。
再看公式的第二部分:
第二部分其实就是质量评价指标,
DCG是:
回到上图,比较左右两个排序结果的dcg指标:
可以看到根据dcg指标,从左到右进行的是“负优化”。说明了,dcg是变小了, 变化是个负数,也就是按照ranknet优化后,前k个相关性顺序并不对。所以这里我们会选择变化最大的dcg做为梯度。然后进行后面的树拟合。
dcg变化最大的,当往好处变时,dcg会变大,越好会越大。
然后用dcg * ranknet损失函数,就能代表了,红色剪头方向和强度。 后面我们就用回归树拟合dcg * ranknet。得到当前的数。
lambdamart理解
1. 每次迭代都会算出的lambda * ndcg,表示 调整每个结果所带来的对梯度下降的影响以及对整体的影响
2. 基于算出的梯度值y值,我们接下来会用树进行拟合,实际上这个过程就将梯度值差不多的样本放到了同一个叶子节点上。
3. 这就说明了同一个叶子节点上这些样本变化时,对整个loss下降贡献差不多,因为他们就是同一类的,至少相关性是差不多的。
4. 而loss下降贡献越大,也就是某个叶子节点上的整体值越大,表示这个样本越相关,因为对调序带来的影响越大。
6. 特征好坏,主表现在能否将不同级别的相关性结果,分别放到自己级别对应的相关性节点上,如
果能放到,那么这个节点的输出值(如平均值),则更能代表这个级别的相关性值。那么最后梯度就会降的更低(因为叶子节点上的每个值大小都差不多,所以损失误差就最小)。而不好的特征,则分不开。
7. 每个样本计算lambda 或者 ndcg的变化,是将上一轮树中叶子节点中属于该query的所有结果,组成list计算的, 计算后的值就是新的梯度,作为下一轮训练树该样本的y值。而每轮训练回归树的时候,是跨query的,将所有的样本按照特征分裂到不同的树。当迭代数轮后,每个叶子节点都有属于不同query的样本,分到同一个叶子节点,同一个query下的url,其相关性是相同的。