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

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

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

徐博From RankNet to LambdaRank to LambdaMART: An Overview

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

本文主要参考微软研究院2010年发表的文章From RankNet to LambdaRank to LambdaMART: An Overview11,并结合自己的理解,试图将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的特征向量x∈Rnx∈Rn映射为一个实数f(x)∈Rf(x)∈R。RankNet采用pairwise的方法进行模型训练。具体地,给定特定query下的两个文档UiUi和UjUj,其特征向量分别为xixi和xjxj,经过RankNet进行前向计算得到对应的分数为si=f(xi)si=f(xi)和sj=f(xj)sj=f(xj)。用Ui⊳UjUi⊳Uj表示UiUi比UjUj排序更靠前(如对某个query来说,UiUi被标记为“good”,UjUj被标记为“bad”)。继而可以用下面的公式来表示UiUi应该比UjUj排序更靠前的概率:

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

这个概率实际上就是深度学习中经常使用的sigmoid函数,参数σσ决定sigmoid函数的形状。对于特定的query,定义Sij∈{0,±1}Sij∈{0,±1}为文档ii和文档jj被标记的标签之间的关联,即

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

定义P¯¯¯¯ij=12(1+Sij)P¯ij=12(1+Sij)表示UiUi应该比UjUj排序更靠前的已知概率,则可以用交叉熵定义优化目标的损失函数:

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

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

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

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

对于Sij=1Sij=1,

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

然而对于Sij=−1Sij=−1,

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

可以看出损失函数CC具有对称性,也即交换ii和jj的位置,损失函数的值不变。

分析损失函数CC的趋势发现,如果对文档UiUi和UjUj的打分可以正确地拟合标记的标签,则CC趋向于0,否则CC趋向于线性函数。具体地,假如Sij=1Sij=1,也即UiUi应该比UjUj排序高,如果si>sjsi>sj,则拟合的分数可以正确排序文档ii和文档jj,

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

如果si<sjsi<sj,则拟合的分数不能正确排序文档ii和文档jj,

limsi−sj→∞C=limsi−sj→∞log(1+e−σ(si−sj))=log(e−σ(si−sj))=−σ(si−sj)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)wk←wk−η∂C∂wk=wk−η(∂C∂si∂si∂wk+∂C∂sj∂sj∂wk)

损失函数CC对sisi和sjsj的偏导数为:

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

sisi和sjsj对wkwk的偏导数可根据神经网络求偏导数的方式求得。求得了损失函数CC对神经网络模型参数wkwk的偏导数之后,就可以使用梯度下降算法对其更新。这里的学习率ηη也是一个正数,因为ηη需要满足下面的不等式:

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

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

2.1节中定义的RankNet,对于每一个文档对(Ui(Ui,Uj)Uj)都将计算损失函数对神经网络的参数wkwk的偏导数,然后更新模型参数wkwk。这样做的缺点在于,对模型参数更新慢,耗时长。所以本节讲解如何通过分解组合的方式加快这一训练过程。

对于给定的文档对UiUi和UjUj,损失函数CC对参数wkwk的偏导数为:

∂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)∂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))λij=∂C(si−sj)∂si=σ(12(1−Sij)−11+eσ(si−sj))

定义II为索引对{i,j}{i,j}的集合,在不损失信息量的情况下,可以将集合II中的索引对都转换成满足Ui⊳UjUi⊳Uj的形式。另外集合II中的索引对还应该满足最多只出现一次的条件。在此基础上,累加权重参数wkwk的更新量:

δwk=−η∑(i,j)∈I(λij∂si∂wk−λij∂sj∂wk)=−η∑iλi∂si∂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=∑j:{i,j}∈Iλij−∑j:{j,i}∈Iλij

通俗地说,λiλi就是集合II中所有{i,j}{i,j}的λijλij的和−−集合II中所有{j,i}{j,i}的λijλij的和。如果还是不太明白,那看下面这个例子就明白了。集合I={{1,2},{2,3},{1,3}}I={{1,2},{2,3},{1,3}},则

δwk=−η∑{i,j}∈I(λij∂si∂wk−λij∂sj∂wk)=−η(λ12∂s1∂wk−λ12∂s2∂wk+λ13∂s1∂wk−λ13∂s3∂wk+λ23∂s2∂wk−λ23∂s3∂wk)=−η((λ12+λ13)∂s1∂wk+(λ23−λ12)∂

转载于:https://www.cnblogs.com/mfryf/p/11432976.html

机器学习排序算法:RankNet to LambdaRank to LambdaMART相关推荐

  1. 徐博 From RankNet to LambdaRank to LambdaMART: An Overview

    徐博 From RankNet to LambdaRank to LambdaMART: An Overview 新闻来源:IR实验室       发布时间:2012/10/17 15:44:39   ...

  2. 排序学习(LTR)经典算法:RankNet、LambdaRank和LambdaMart

    ©PaperWeekly 原创 · 作者 | yancy 单位 | 字节跳动 研究方向 | 推荐系统 背景 在许多场景中我们都需要模型学习到排序的能力,比如网页搜索场景下我们需要根据搜索词和文档的相关 ...

  3. 员外带你读论文:From RankNet to LambdaRank to LambdaMART: An Overview

    严格来说,这并不是一篇论文,只是一个  ,里面系统的介绍了三个比较著名的排序模型 ,链接 Rank[1] 本篇博文将分析总结下这三个排序模型.其参考的代码RankNet.LambdaRank[2],L ...

  4. RankNet,LambdaRank,LambdaMart

    1. RankNet RankNet是2005年微软提出的一种pairwise的Learning to Rank算法,它从概率的角度来解决排序问题.RankNet的核心是提出了一种概率损失函数来学习R ...

  5. From RankNet to LambdaRank to LambdaMART: An Overview

    Abstract LambdaMART 是 LambdaRank 的提升树版本,而 LambdaRank 又是基于 RankNet 的.RankNet, LambdaRank, 以及 LambdaMA ...

  6. 排序算法(Learn to rank)的一些看法

    1.序言 回来自我隔离期,出不了小区加上倒春寒阴天:疯与快疯之间,重读了微软研究院Learn to Rank几篇经典论文,参考的看了CSDN上不少博主的观点.总觉得对于文章,有些思路上的点没有点透:尝 ...

  7. 机器学习(二十二)——推荐算法中的常用排序算法, Tri-training

    推荐算法中的常用排序算法 Pointwise方法 Pranking (NIPS 2002), OAP-BPM (EMCL 2003), Ranking with Large Margin Princi ...

  8. 链接分析算法系列-机器学习排序

    这个系列的文章:原文 一:链接分析算法之:HITS算法: HITS(HITS(Hyperlink - Induced Topic Search) ) 算法是由康奈尔大学( Cornell Univer ...

  9. 再谈排序算法的pairwise,pointwise,listwise

    NewBeeNLP·干货 作者:DOTA 大家好,这里是 NewBeeNLP. 最近因为工作上的一些调整,好久更新文章和个人的一些经验总结了,下午恰好有时间,看了看各渠道的一些问题和讨论,看到一个熟悉 ...

最新文章

  1. python获取文本光标_使用python readline时如何获取(并设置)当前bash光标位置?
  2. 从github上下载项目到eclipse
  3. Java基础之Comparable接口和Comparator接口的比较
  4. Android系统中的任意文件读写方法
  5. etcd使用之ttl不准确问题
  6. 北京地铁线路图纯算法附带求极权值(原创) 性能提升版
  7. SQL Server 2008 阻止保存要求重新创建表的更改问题
  8. 最小二乘法移动最小二乘法
  9. /*携程面试*/四个数组,都已经排好序,找出四个数组的交集
  10. 矩池云上nvidia opencl安装及测试教程
  11. mysql语句获取当前时间,系列篇
  12. 大文件数据导出(后台执行,自动生成)
  13. mysql备份与恢复的一些方法
  14. iOS获取当前app的名称和版本号
  15. Citrix 桌面云 XenApp_XenDesktop_7.15 部署系列(一)前期准备
  16. Mysql数据库查询优化日常笔记
  17. 2022年全球与中国电动汽车充电设备市场现状及未来发展趋势
  18. JavaScript统计图表插件 Echarts
  19. 计算机启动黑屏时间很长,win10开机后黑屏时间很长且进不了安全模式怎么解决?...
  20. Windows cmd窗口的切换目录命令无法切换盘符

热门文章

  1. 长期换衣行人重识别(Long-Term Clothes-Changing Person Reid)数据集汇总
  2. PythonThinking_FOR、IF以及while
  3. 《大数据处理实践探索》 ---- kibana 小技巧
  4. 微信本地模拟开发环境搭建
  5. OPA2376AIDGKR
  6. 小米4A千兆版刷机telnet失败解决办法
  7. 电脑用HDMI外界显示器后,没有声音
  8. vue element-ui 中走马灯自适应图片高度
  9. IOS下载并解压zip文件
  10. 通过howler.js实现在Android下的微信浏览器自动播放音频