美文网首页
LambdaMART之见底之解

LambdaMART之见底之解

作者: 南朝容止 | 来源:发表于2019-04-22 10:40 被阅读0次

引入

lambdamart是什么呢? 无非是 lamda + mart. lambda 和 mart又是什么呢?

lambda

 大师强制定义的梯度。含义是:指明下一次移动的方向和强度。

 为什么有上面含义呢?

 先上一盘公式,瞅一眼:

梯度公式

公式浅层理解

这个公式很显然是一个负数,肯定是个负梯度,我们知道负梯度肯定是使损失函数下降的方向,用这个公式,肯定回事损失函数降低,不会升高,所以可以放心的用,但是我们想想公式定义的这么繁琐,难道没有点其他的事情要搞吗?要不然对的起如此繁琐的公式???

公式深层理解

当然了, 真正的物理的意义远远远远远远超出了上面分析的简单的方向。

我们看公式的第一个部分:

ranknet梯度

这一部分是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。 即不同文档比较下的相对相关性。

那么我们如何学习这种比较下的相对相关性呢?也就是 【要学的公式 】 是啥?

Ranknet不同文档相对相关性度量公式

有了这个公式,我们就能量化,两个不同文档的,相比较下相关性强弱。

如果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为label=1.右侧为不相关的doc. label =0 

左边的doc list共有13个pair-wise error,右边共有11个pair-wise error RankNet可能会进行从左到右的“优化”

优化右边的doc list时,RankNet的梯度大小类似于黑色箭头, 而我们更需要红色箭头那样的梯度大小。

为什么ranknet不能做到红色剪头效果呢?

ranknet是想做的是让不同的结果打出不同的分数,不同的分数可以比较相关性强弱就行,我比你强,那么我的分数就要比你大 ,哪怕只是大一点点点点都行。那么在这种情况下,我们在理解下ranknet的损失函数,他并不关心线上的顺序,他只是给每个结果算出仅仅能够表示强弱的分数即可,只要能让损失降调最小。

而红色部分不一样,他不仅考虑到了上面强弱,还考虑到了位置信息,每一次迭代都朝着对整体排序效果有利的方向前进。


OK,以上是Ranknet部分,回到上面部分,我们再看lambda第一部分:

就是ranknet的损失函数,优点是通过降低损失减少逆序对,缺点是调序的盲目性,未考虑到topk的相关性逐渐减弱。

再看公式的第二部分:

第二部分其实就是质量评价指标, 

DCG的变化

DCG是:

其中li = label_i

回到上图,比较左右两个排序结果的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,其相关性是相同的。

相关文章

网友评论

      本文标题:LambdaMART之见底之解

      本文链接:https://www.haomeiwen.com/subject/gpgegqtx.html