使用机器学习排序算法LambdaMART有一段时间了,但一直没有真正弄清楚算法中的所有细节。

学习过程中细读了两篇不错的博文,推荐给大家:

梯度提升树(GBDT)原理小结

徐博From RankNet to LambdaRank to LambdaMART: An Overview

但经过一番搜寻之后发现,目前网上并没有一篇透彻讲解该算法的文章,所以希望这篇文章能够达到此目的。

本文主要参考微软研究院2010年发表的文章From RankNet to LambdaRank to LambdaMART: An Overview1,并结合自己的理解,试图将RankNet、LambdaRank和LambdaMART这三种算法的所有算法细节讲解透彻。

1. 概述

RankNet、LambdaRank和LambdaMART是三个关系非常紧密的机器学习排序算法。简而言之,RankNet是最基础,基于神经网络的排序算法;而LambdaRank在RankNet的基础上修改了梯度的计算方式,也即加入了lambda梯度;LambdaMART结合了lambda梯度和MART(另称为GBDT,梯度提升树)。这三种算法在工业界中应用广泛,在BAT等国内大厂和微软谷歌等世界互联网巨头内部都有大量应用,还曾经赢得“Yahoo!Learning To Rank Challenge(Track 1)"的冠军。本人认为如果评选当今工业界中三种最重要的机器学习算法,以LambdaMART为代表的集成学习算法肯定占有一席之地,另外两个分别是支持向量机和深度学习。

2. RankNet

2.1 算法基础定义

RankNet解决如下搜索排序问题:给定query集合,每个query都对应着一个文档集合,如何对每个query返回排序后的文档集合。可以想象这样的场景:某位高考生在得知自己的成绩后,准备报考志愿。听说最近西湖大学办得不错,所以就想到网上搜搜关于西湖大学的资料。他打开一个搜索引擎,输入“西湖大学”四个字,然后点击“搜索”,页面从上到下显示了10条搜索结果,他认为排在上面的肯定比下面的相关,所以就开始从上往下一个个地浏览。所以RankNet的目标就是对所有query,都能将其返回的文档按照相关性进行排序。

RankNet网络将输入query的特征向量Uj排序更靠前的概率:

Pij≡P(Ui⊳Uj)≡11+e−σ(si−sj)

这个概率实际上就是深度学习中经常使用的sigmoid函数,参数j被标记的标签之间的关联,即

 

 

Sij={1文档i比文档j更相关0文档i和文档j相关性一致−1文档j比文档i更相关

 

定义Uj排序更靠前的已知概率,则可以用交叉熵定义优化目标的损失函数:

C=−P¯ijlogPij−(1−P¯ij)log(1−Pij)

 

如果不太熟悉什么是交叉熵,可以参考宗成庆老师的《统计自然语言处理》2.2节“信息论基本概念”,里面将熵、联合熵、互信息、相对熵、交叉熵和困惑度等概念都讲得相当清楚。

结合以上多个公式,可以改写损失函数C为:

C=12(1−Sij)σ(si−sj)+log(1+e−σ(si−sj))

 

对于Sij=1,

C=log(1+e−σ(si−sj))

 

然而对于Sij=−1,

C=log(1+e−σ(sj−si))

 

可以看出损失函数j的位置,损失函数的值不变。

分析损失函数j,

limsi−sj→∞C=limsi−sj→∞log(1+e−σ(si−sj))=log1=0

 

如果j,

limsi−sj→∞C=limsi−sj→∞log(1+e−σ(si−sj))=log(e−σ(si−sj))=−σ(si−sj)

 

利用神经网络对模型进行训练,目前最有效的方法就是反向传播算法。反向传播算法中最核心部分就是损失函数对模型参数的求导,然后可以使用下面的公式对模型参数进行迭代更新:

 

wk←wk−η∂C∂wk=wk−η(∂C∂si∂si∂wk+∂C∂sj∂sj∂wk)

 

损失函数sj的偏导数为:

∂C∂si=σ(12(1−Sij)−11+eσ(si−sj))=−∂C∂sj

 

η需要满足下面的不等式:

δC=∑k∂C∂wkδwk=∑k∂C∂wk(−η∂C∂wk)=−η∑k(∂C∂wk)2<0

 

2.2 RankNet分解形式:加速RankNet训练过程

2.1节中定义的RankNet,对于每一个文档对wk。这样做的缺点在于,对模型参数更新慢,耗时长。所以本节讲解如何通过分解组合的方式加快这一训练过程。

对于给定的文档对wk的偏导数为:

∂C∂wk=∂C∂si∂si∂wk+∂C∂sj∂sj∂wk=σ(12(1−Sij)−11+eσ(si−sj))(∂si∂wk−∂sj∂wk)=λij(∂si∂wk−∂sj∂wk)

 

其中:

λij=∂C(si−sj)∂si=σ(12(1−Sij)−11+eσ(si−sj))

 

定义wk的更新量:

δwk=−η∑(i,j)∈I(λij∂si∂wk−λij∂sj∂wk)=−η∑iλi∂si∂wk

 

其中:

λi=∑j:{i,j}∈Iλij−∑j:{j,i}∈Iλij

 

通俗地说,I={{1,2},{2,3},{1,3}},则

 

相关文章:

  • 2021-12-20
  • 2021-09-19
  • 2021-11-02
  • 2021-10-18
  • 2022-01-09
  • 2022-12-23
  • 2021-05-21
  • 2021-09-22
猜你喜欢
  • 2021-05-01
  • 2021-08-10
  • 2021-11-15
  • 2022-12-23
  • 2021-06-05
相关资源
相似解决方案