liam0205.github.io icon indicating copy to clipboard operation
liam0205.github.io copied to clipboard

LambdaMART 不太简短之介绍 | 始终

Open Liam0205 opened this issue 6 years ago • 18 comments

https://liam.page/2016/07/10/a-not-so-simple-introduction-to-lambdamart/

传统的搜索引擎排序(Ranking)问题,通常会涉及到很多的排序策略。这些策略根据不同的特征,在不同的适用范围中起作用。因此,一个传统的排序算法,至少涉及到两方面的内容:策略的制定,以及不同策略的组合。策略的组合需要考虑策略分析适用的特征,以及相应策略的适用情况。根据这些内容,通过人工或者半机器半人工的方式组合起来,才能组成一个可堪使用的排序算法。 和自然语言处理中遇到的情况一样,随着数据量的增加

Liam0205 avatar Jan 12 '19 08:01 Liam0205

您好!读了您的文章,我受益匪浅!最近在学习LambdaMART算法,正在尝试实现,想请教您一个问题:在算法伪代码中有一步计算叶子节点的值,不是很清楚这里牛顿法具体是用来做什么的?不知道您能不能够解答一下我的疑惑,非常感谢您!祝您一切顺利!

LynnZiQi avatar Feb 19 '19 12:02 LynnZiQi

@LynnZiQi 您好!读了您的文章,我受益匪浅!最近在学习LambdaMART算法,正在尝试实现,想请教您一个问题:在算法伪代码中有一步计算叶子节点的值,不是很清楚这里牛顿法具体是用来做什么的?不知道您能不能够解答一下我的疑惑,非常感谢您!祝您一切顺利!

叶子结点的值,是「使得所有落在该叶子结点上的样本的损失之和最小的值」。而损失是关于叶子结点的值的一元二次函数,参数是一阶导数和二阶导数(忽略高阶导数)。

你想想看,这是不是牛顿迭代法?

还不清楚的话,看下我这篇 slides: https://liam.page/uploads/slides/gb-xgb-lm.pdf Page 13, 14 上有以泰勒展开的角度的介绍(二阶泰勒展开就是牛顿迭代)。注意符号与这篇文章不一致。

Liam0205 avatar Feb 19 '19 16:02 Liam0205

文章写得很好,最近刚好需要用到这个。推导过程中有一处符号笔误了,在"注意有下面对称性"后的数式倒数第二行,其中的一个加号应该是减号。

fyang93 avatar Mar 26 '19 12:03 fyang93

@fyang93 文章写得很好,最近刚好需要用到这个。推导过程中有一处符号笔误了,在"注意有下面对称性"后的数式倒数第二行,其中的一个加号应该是减号。

你讲得对,我这就修正。

Liam0205 avatar Mar 26 '19 12:03 Liam0205

计算二者的偏序概率那里 -sigma*(si-sj)应该没有负号

hujh818 avatar Apr 10 '19 15:04 hujh818

您好,请问MART算法流程第10步那里,是像GBDT一样用回归树拟合负梯度(计算均方误差进行树的分裂),还是像XGBoost一样用牛顿法的方式,根据损失函数二阶展开极小值的减小量当做树的分裂标准?

miyayabo avatar Jun 19 '19 07:06 miyayabo

@miyayabo 您好,请问MART算法流程第10步那里,是像GBDT一样用回归树拟合负梯度(计算均方误差进行树的分裂),还是像XGBoost一样用牛顿法的方式,根据损失函数二阶展开极小值的减小量当做树的分裂标准?

你说的是 LambdaMART 吧?

实际上,XGBoost 的做法是你讲的「GBDT 是拟合负梯度」的一种实现方式。在我看来,并无本质差异。

就 LambdaMART 来说,MART 是 GBDT(的别称),只是一个可以套用梯度下降的算法框架。具体怎么实现,其实无关紧要。不管怎么实现,它都是 LambdaMART。XGBoost 中的 rank:ndcg 就是 LambdaMART。

Liam0205 avatar Jun 19 '19 12:06 Liam0205

最后的算法伪代码有点不明白,迭代是走的梯度的正方向,这不是越来越大了吗,但是函数L定义的是cost

yozhao avatar Jul 30 '19 10:07 yozhao

@yozhao 没问题的,你看反了大概……

Liam0205 avatar Jul 30 '19 10:07 Liam0205

@Liam0205 @yozhao 没问题的,你看反了大概……

最后算法: 第7行 y = lamda 是cost函数的梯度对吧, 第8行的二阶导数是正数, 15 行就是向cost函数梯度正方向迭代,是不是cost函数越来越大了啊

yozhao avatar Jul 30 '19 15:07 yozhao

@yozhao

@Liam0205 @yozhao 没问题的,你看反了大概……

最后算法: 第7行 y = lamda 是cost函数的梯度对吧, 第8行的二阶导数是正数, 15 行就是向cost函数梯度正方向迭代,是不是cost函数越来越大了啊

你直接读 paper 吧…… http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.180.634&rep=rep1&type=pdf

Liam0205 avatar Jul 31 '19 02:07 Liam0205

@yozhao

@Liam0205 @yozhao 没问题的,你看反了大概……

最后算法: 第7行 y = lamda 是cost函数的梯度对吧, 第8行的二阶导数是正数, 15 行就是向cost函数梯度正方向迭代,是不是cost函数越来越大了啊

第七行的梯度是负梯度

miyayabo avatar Jul 31 '19 13:07 miyayabo

@miyayabo

@yozhao

@Liam0205 @yozhao 没问题的,你看反了大概……

最后算法: 第7行 y = lamda 是cost函数的梯度对吧, 第8行的二阶导数是正数, 15 行就是向cost函数梯度正方向迭代,是不是cost函数越来越大了啊

第七行的梯度是负梯度

啊 你看lamda的定义不是负梯度啊,『于是我们定义。。。』

yozhao avatar Aug 01 '19 02:08 yozhao

你好,我想问下为什么lambdamart对正例和负例的比例不敏感?

lcliuchen123 avatar Dec 07 '21 13:12 lcliuchen123

@lcliuchen123 因为它是把 n 个整理和 m 个负例组成 n * m 个 pair。

Liam0205 avatar Dec 08 '21 03:12 Liam0205

@Liam0205 @lcliuchen123 因为它是把 n 个整理和 m 个负例组成 n * m 个 pair。

好的,多谢解答。

lcliuchen123 avatar Dec 10 '21 07:12 lcliuchen123

关于LambdaMART,我一直有两个疑问,希望大佬帮忙解答一下,如果方便,加个微信深入探讨更好了,我的微信:718229223。我的两个疑问如下: 1)为什么伪代码中的lambda是负梯度? 2)计算叶子节点时,为什么不按照常规的牛顿法一样,这里前面少一个符号?原文中的注释是:note the change in sign since here we are maximizing。没太理解这句话~ 希望大佬看到的话,回复一下,十分感激~

fly-adser avatar Dec 20 '21 14:12 fly-adser

@Liam0205

@LynnZiQi 您好!读了您的文章,我受益匪浅!最近在学习LambdaMART算法,正在尝试实现,想请教您一个问题:在算法伪代码中有一步计算叶子节点的值,不是很清楚这里牛顿法具体是用来做什么的?不知道您能不能够解答一下我的疑惑,非常感谢您!祝您一切顺利!

叶子结点的值,是「使得所有落在该叶子结点上的样本的损失之和最小的值」。而损失是关于叶子结点的值的一元二次函数,参数是一阶导数和二阶导数(忽略高阶导数)。

你想想看,这是不是牛顿迭代法?

还不清楚的话,看下我这篇 slides: https://liam.page/uploads/slides/gb-xgb-lm.pdf Page 13, 14 上有以泰勒展开的角度的介绍(二阶泰勒展开就是牛顿迭代)。注意符号与这篇文章不一致。

为什么符号与常规的牛顿法符号不一致呢?

fly-adser avatar Dec 20 '21 14:12 fly-adser