Learning to rank总结

一、Ranknet

在使用搜索引擎的过程中,对于某一Query(或关键字),搜索引擎会找出许多与Query相关的URL,然后根据每个URL的特征向量对该URL与主题的相关性进行打分并决定最终URL的排序,其流程如下:
这里写图片描述
排序的好坏完全取决于模型的输出,而模型又由其参数决定,因而问题转换成了如何利用带label的训练数据获得最优的模型参数w。Ranknet提供了一种基于Pairwise的训练方法。

1、Cost function

预测相关性概率

对于任意一个URL对(Ui,Uj),模型输出的score分别为si和sj,那么根据模型的预测,Ui比Uj与Query更相关的概率为 P i j = P ( U i > U j ) = 1 1 + e σ ( s i s j ) ,其中 σ 是个参数。

真实相关性概率

定义真实相关性概率为 P i j ¯ = 1 2 ( 1 + S i j ) ,对于训练数据中的Ui和Uj,它们都包含有一个与Query相关性的真实label,如果Ui比Uj更相关,那么Sij=1;如果Ui不如Uj相关,那么Sij=−1;如果Ui、Uj与Query的相关程度相同,那么Sij=0。

代价函数定义

C ( P i j ¯ , P i j )

= U i > U j , U i < U j , U i = U j P i j ¯ l o g P i j

= P i j ¯ l o g P i j ( 1 P i j ¯ ) l o g ( 1 P i j ) 1 2 l o g 1 2

= P i j ¯ l o g P i j ( 1 P i j ¯ ) l o g ( 1 P i j )
化简如下:


下图展示了 C i j P i j ¯ P i j 的变化情况:

图中t表示 s i s j ,可以看到当 S i j = 1 时,模型预测的 s i s j 越大,其代价越小; S i j = 1 时, s i s j 越小,代价越小; S i j = 0 时,代价的最小值在 s i s j 相等处取得。该代价函数有以下特点:
1)当两个相关性不同的文档算出来的模型分数相同时,损失函数的值大于0,仍会对这对pair做惩罚,使他们的排序位置区分开
2)损失函数是一个类线性函数,可以有效减少异常样本数据对模型的影响,因此具有鲁棒性

总代价

C = ( i , j ) I C i j ,I表示所有URL pair的集合,对于 ( i , j ) I 的pair,i>j,即 S i j = 1

2、梯度下降更新模型参数W

w k := w k α d C d w k

d C d w k = ( i , j ) I ( d c i j d s i d s i d w k + d c i j d s j d s j d w k )

d C i j d s i = σ ( 1 2 ( 1 s i j ) 1 1 + e σ ( s i s j ) ) = d C i j d s j = λ i j

d C d w k = ( i , j ) I ( λ i j d s i d w k λ i j d s j d w k ) = ( i , j ) I λ i j ( d s i d w k d s j d w k )

λ i = j : ( i , j ) I λ i j j : ( j , i ) I λ i j

d C d w k = i λ i d s j d w k

综上 w k := w k α i λ i d s j d w k

二、LambdaRank

RankNet以错误pair最少为优化目标,然而NDCG或者ERR等评价指标就只关注top k个结果的排序,所以修改cost function如下。

1、Cost function

C i j = l o g ( 1 + e σ ( s i s j ) ) | Δ N D C G |

λ i j = σ 1 + e σ ( s i s j ) | Δ N D C G |

优化方式与RankNet相似。

三、LambdaMART

以上两个方法都是通过cost function,采用随机梯度下降更新模型参数,使得计算URL的score值在所有URL排序中,属于最优位置。但是lambdamart是用梯度 λ i j = d C i j d s i 建立gradient boosting CART回归树,最后得到回归树的加法模型作为最终模型。下面从简单的模型讲解,一步步推导至lambdaMART。

1、AdaBoost算法

AdaBoost思想就是提高那些被前一轮弱分类器错误分类样本的权值,而降低那些被正确分类样本的权值;加大分类误差率小的弱分类器的权值,使其在表决中起较大的作用,减小分类误差率大的弱分类器的权值,使其在表决中起较小作用。

计算第m次迭代训练数据更新的权值 D m + 1
  1. 初始化训练数据的权值分布 D 1 为均值:
    D 1 = ( w 11 , . . . , w 1 i , . . . , w 1 N ) , w 1 i = 1 N , i = 1 , 2 , . . . , N
  2. 第m次迭代的弱分类器 G m ( x ) 在训练数据集上的分类误差率:
    e m = P ( G m ( x i ) y i ) = i = 1 N w m i I ( G m ( x i ) y i )
  3. 更新训练数据集的权值分布
    D m + 1 = ( w m + 1 , 1 , . . . , w m + 1 , i , . . . , w m + 1 , N )
    w m + 1 , i = w m i e α m y i G m ( x i ) Z m ,i=1,2,..,N, α m 为当前迭代的弱分类器的权重。
    Z m 是规范化因子 Z m = i = 1 N w m i e α m y i G m ( x i ) ,规范后使得 D m + 1 成为一个概率分布。
    1)当 G m ( x ) = y i 时, w m + 1 , i = w m i e α m Z m ,正确分类样本权值缩小
    2)当 G m ( x ) y i 时, w m + 1 , i = w m i e α m Z m ,错误分类样本权值增大
计算第m次迭代的弱分类器 G m ( x ) 权值 α m

G m ( x ) 的权值: α m = 1 2 l o g 1 e m e m ,对数为自然对数。
其中 1 e m e m = 1 e m 1
1)当 e m 大, 1 e m e m 小, a m 小,分类器权重变低
2)当 e m 小, 1 e m e m 大, a m 大,分类器权重变高。

算法

输入:训练数据集 T = ( x 1 , y 1 ) , ( x 2 , y 2 ) , . . . , ( x N , y N ) ,其中 x i χ R n y i y { 1 , + 1 } ; 弱学习算法
输出:最终分类器G(x).

1.初始化训练数据的权值分布
D 1 = ( w 11 , . . . , w 1 i , . . . , w 1 N ) , w 1 i = 1 N , i = 1 , 2 , . . . , N

2.对m=1,2,…,M
(a)使用具有权值分布 D m 的训练数据集学习,得到基本分类器 G m ( x ) G m ( x ) : χ ->{1,-1}

(b)计算 G m ( x ) 在训练数据集上的分类误差率 e m = P ( G m ( x i ) y i ) = i = 1 N w m i I ( G m ( x i ) y i )

(c)计算 G m ( x ) 的系数 α m = 1 2 l o g 1 e m e m ,对数为自然对数

(d)更新训练数据集的权值分布
       D m + 1 = ( w m + 1 , 1 , . . . , w m + 1 , i , . . . , w m + 1 , N )
       w m + 1 , i = w m i e α m y i G m ( x i ) Z m ,i=1,2,..,N
       Z m 是规范化因子 Z m = i = 1 N w m i e α m y i G m ( x i ) ,规范后使得 D m + 1 成为一个概率分布

3.构建基本分类器的线性组合 f ( x ) = m = 1 M α m G m ( x ) ,得到最终分类器 G ( x ) = s i g n ( f ( x ) ) = s i g n ( m = 1 M α m G m ( x ) )

等价算法-前向分步加法算法

当前向分步算法的损失函数是指数函数时,就是AdaBoost算法。也就是说,前项分步加法算法每次直接通过最小化指数损失函数 L ( y i , f m 1 ( x i ) + α G ( x i ) ) = e x p [ y i ( f m 1 ( x i ) + α G ( x i ) ) ] ,得到弱分类器的参数和权值 α AdaBoost算法是其具体做法,每次通过带权的训练数据学习弱分类器参数,根据分类误差率计算当前迭代弱分类器的权值 α 以及训练数据的权值,而训练数据的权值也是为了下一次迭代求弱分类器的参数,目标为了最小化最终分类器的误分率,否则每次训练数据权重一样,每次学出来的分类器都是一样的,改变训练数据权重是为了让不同分类器侧重不同的特征。

1)加法模型

f ( x ) = m = 1 M β m b ( x ; γ m ) ,其中 b ( x ; γ m ) 为基函数, γ m 为基函数的参数, β m 为基函数的系数。

在给定训练数据及损失函数 L ( y , f ( x ) ) ,通过最小化损失函数 m i n β , γ i = 1 N L ( y i , β m b ( x i ; γ m ) ) 学习加法模型f(x)。

2)前向分步算法

输入:训练数据集 T = ( x 1 , y 1 ) , ( x 2 , y 2 ) , . . . , ( x N , y N ) ;损失函数 L ( y , f ( x ) ) ;基函数集 { b ( x ; γ ) } ;
输出:加法模型f(x)

1. 初始化 f 0 ( x ) = 0

2. 对m=1,2,…,M

(a)极小化损失函数 ( β m , γ m ) = a r g m i n β , γ i = 1 N L ( y i , f m 1 ( x i ) + β b ( x i ; γ ) ) ,得到参数 β m , γ m

(b)更新 f m ( x ) = f m 1 ( x ) + β m b ( x ; γ m )

3. 得到加法模型 f ( x ) = f M ( x ) = m = 1 M β m b ( x ; γ m )

3)由指数损失的前向分步算法推导至AadBoost

假设经过m-1轮迭代,前向分步算法已经得到 f m 1 ( x ) ,第m轮迭代目标是得到 α m G m ( x ) ,然后得到 f m ( x ) = f m 1 ( x ) + α m G m ( x ) ,使得 f m ( x ) 在训练数据集上的指数损失最小,损失函数为: L ( y i , f m ( x ) ) = i = 1 N e x p [ y i ( f m 1 ( x i ) + α G ( x i ) ) ]

( α m , G m ( x ) ) = a r g m i n α , G i = 1 N e x p [ y i ( f m 1 ( x i ) + α G ( x i ) ) ]

化简,令 w ¯ m i = e x p [ y i f m 1 ( x i ) ]

得到 ( α m , G m ( x ) ) = a r g m i n α , G i = 1 N w ¯ m i e x p [ y i α G ( x i ) ]

(1)求 G m ( x )

对任意 α 0 G m ( x ) = a r g m i n G i = 1 N w ¯ m i I ( y i G ( x i ) ) ,即AdaBoost的基本分类器。

(2)求 α

L = i = 1 N w ¯ m i e x p [ y i α G ( x i ) ]

= y i = G m ( x i ) w ¯ m i e α + y i G m ( x i ) w ¯ m i e α

= e α ( i = 1 N w ¯ m i i = 1 N w ¯ m i I ( y i G ( x i ) ) ) + e α ( i = 1 N w ¯ m i I ( y i G ( x i ) ) )

= ( e α e α ) i = 1 N w ¯ m i I ( y i G ( x i ) ) + e α i = 1 N w ¯ m i

d L d α = 0

( e α + e α ) i = 1 N w ¯ m i I ( y i G ( x i ) ) e α i = 1 N w ¯ m i = 0

( e α + e α ) i = 1 N w ¯ m i I ( y i G ( x i ) ) = e α i = 1 N w ¯ m i

( e α + e α ) e α = i = 1 N w ¯ m i i = 1 N w ¯ m i I ( y i G ( x i ) )

e 2 α = i = 1 N w ¯ m i i = 1 N w ¯ m i I ( y i G ( x i ) ) 1

α = 1 2 l o g [ i = 1 N w ¯ m i i = 1 N w ¯ m i I ( y i G ( x i ) ) 1 ]

其中 e m = i = 1 N w ¯ m i I ( y i G ( x i ) ) i = 1 N w ¯ m i ,为分类误差率,分错的样本加权求和除以总的样本加权求和。

α = 1 2 l o g ( 1 e m 1 ) = 1 2 l o g ( 1 e m e m ) ,即AdaBoost算法的分类器权重计算方式。

(3)更新每轮样本权值

f m ( x ) = f m 1 ( x ) + α m G m ( x ) , w ¯ m , i = e x p [ y i f m 1 ( x i ) ] ,可知

w ¯ m + 1 , i = e x p [ y i f m ( x i ) ]

= e x p [ y i ( f m 1 ( x i ) + α m G m ( x i ) ) ]

= w ¯ m , i e x p [ y i α m G m ( x i ) ) ] ,即AdaBoost算法训练数据权值更新的计算方式,但此处权值归一化放在了 e m 计算时。

综上,指数损失的前向分步算法就是AdaBoost算法。

2、CART回归树

CART是在给定输入随机变量X条件下输出随机变量Y的条件概率分布的学习方法,一般为二叉树,递归的二分每个特征。

算法

输入:训练数据集D;
输出:回归树f(x)
1. 遍历所有的j和s,选择最优切分变量j(特征)与切分点s(特征值),即求解 m i n j , s [ m i n c 1 x i R 1 ( j , s ) ( y i c 1 ) 2 + m i n c 2 x i R 2 ( j , s ) ( y i c 2 ) 2 ]
c 1 是所有划分到 R 1 区域的样本的 y i 的均值】

2. 用选定的对(j,s)划分区域并决定相应的输出值:
R 1 ( j , s ) = x | x ( j ) s , R 2 ( j , s ) = x | x ( j ) s

c m = 1 N m x i R m ( j , s ) y i

3. 继续对两个子区域调用步骤1、2,直至满足停止条件

4. 将输入空间划分为M个区域 R 1 , R 2 , . . . , R M (即M个叶子节点),生成决策树: f ( x ) = m = 1 M c m I ( x R m ) ,判断样本属于哪个叶子节点,输出就赋值该叶子节点的均值。

3、提升树(AdaBoost+CART)

提升树模型就是决策树的加法模型,对于分类问题,损失函数为指数损失函数,故只需要将AdaBoost算法中的分类器限定为二类分类树即可,也就是说分类提升树就是AdaBoost的一个特例。而对于回归提升树, f M ( x ) = m = 1 M T ( x ; Θ m ) ,其中, T ( x ; Θ m ) 表示决策树, Θ m 为决策树的参数;M为树的个数。由于是回归模型,此处默认所有基函数参数为1。

若将输入空间划分成J个互不相交的区域 R 1 , R 2 , . . . , R J (即决策树的叶子节点),并在每个区域上确定输出常量 c j ,决策树可表示为 T ( x ; Θ m ) = j = 1 J c j I ( x R m ) Θ m = { ( R 1 , c 1 ) , ( R 2 , c 2 ) , . . . , ( R J , c J ) }

采用平方误差损失函数
L ( y , f ( x ) ) = ( y f ( x ) ) 2 = [ y f m 1 ( x ) T ( x ; Θ m ) ] 2 ,为了让损失函数最小,只需要让 T ( x ; Θ m ) 接近前一次迭代的加法模型输出与真实输出的残差 r = y f m 1 ( x )

综上,对回归问题的提升树算法来说,最小化损失函数只需要简单地拟合当前模型的残差。

算法

输入:训练数据集 T = ( x 1 , y 1 ) , ( x 2 , y 2 ) , . . . , ( x N , y N ) ,其中 x i χ R n y i y R ;
输出:提升树 f M ( x )

1. 初始化 f 0 ( x ) = 0

2. 对m=1,2,…,M

(a)计算残差 r m i = y i f m 1 ( x i )

(b)拟合残差 r m i 学习一个回归树,得到第m棵树的叶节点区域 R m j ,j=1,2,…,J

(c)对j=1,2,…,J,计算叶子节点的输出 c m j = a v e ( y i | x i R m j ) , 得到 T ( x ; Θ m ) = j = 1 J c m j I ( x R m j )

(d)更新 f m ( x ) = f m 1 ( x ) + T ( x ; Θ m )

3. 得到回归问题提升树 f M ( x ) = m = 1 M T ( x ; Θ m )

4、GBDT(Gradient Boosting+CART)

当损失函数是平方损失(回归提升树,采用前向加法算法)和指数损失(二分类提升树,直接用AdaBoost算法)时,每一步优化是很简单的。但对一般损失函数而言,并不那么容易。
GBDT利用最速下降法的近似方法,关键在于利用损失函数关于 f m 1 ( x ) 的负梯度(让损失函数沿着梯度方向的下降)近似回归提升树的残差,拟合一个回归树。
【主要思想】
求f(x),使得

m i n f ( x ) x i R L ( y , f ( x ) )

将f(x)看成一个参数,用梯度下降迭代求解f(x):
f ( x ) := f ( x ) d d f ( x ) x i R L ( y , f ( x ) )

算法

输入:训练数据集 T = ( x 1 , y 1 ) , ( x 2 , y 2 ) , . . . , ( x N , y N ) ,其中 x i χ R n y i y R ; 损失函数 L ( y , f ( x ) )
输出:回归树f(x)

1. 初始化 f 0 ( x ) = a r g m i n c i = 1 N L ( y i , c ) ,估计使损失函数极小化的常数值,它是只有一个根节点的树, f 0 ( x i ) = c ,为了方便第一次迭代计算 r 1 i

2. 对m=1,2,…,M

(a)对i=1,2,…,N,计算 r m i = [ d L ( y i , f ( x i ) ) d f ( x i ) ] f ( x ) = f m 1 ( x )

(b)对 r m i 拟合一个回归树,得到第m棵树的叶节点区域 R m j ,j=1,2,…,J,估计回归树叶节点区域,以拟合残差的近似值

(c)对j=1,2,…,J,计算叶子节点的输出 c m j = a r g m i n c x i R m j L ( y i , f m 1 ( x i ) + c ) ,普通的回归树损失函数为平方损失,

相关文章
相关标签/搜索