漫谈Learning to Rank

大概去年10月份开始接触Learning to Rank,最初的Motivation是由于在实验中遇到排序的任务,然而传统的排序公式虽然简单,易调,但是能利用到的特征非常少,无法挖掘出其内在支配排序的信息,导致排序的性能不理想。因此才想到使用Supervised learning的方法,藉以指导排序。参考的主要几篇文章如下:

1: Adapting Ranking SVM to Document Retrieval. (Liu Tie Yan. et al. MSRA) 【 PDF 】

2: Learning to rank for Information Retrieval– tutorial. (Liu Tie Yan. et al. MSRA) 【 PDF 】

2: Learning to rank: From Pairwise Approach to Listwise Approace. (Liu Tie Yan. et al. MSRA) 【 PDF 】

        最近发现身边的Engineer和Researcher们对Learning to Rank越来越感兴趣,而且在这一次的全国大学生数据挖掘邀请赛中,我们也比较好地将Learning to rank的方法融入模型中,所以我觉得有必要在此总结一下Learning to Rank的方法以及原理,还有相关工具的使用。

 

        Learning to rank有个中文名,叫做排序学习。顾名思义,它是一种基于Supervised Learning的排序方法。传统的排序方法一般是通过构造一个排序函数(Scoring Function)来实现,该排序函数可以体现不同的标准,在IR领域一般是按照相关度进行排序。比较典型的,在搜索引擎中,对于一条查询query,搜索引擎将返回一个相关的文档(document)列表,然后根据(query, document)之间的相关度,对列表中的文档进行排序,并返回给用户。影响相关度的因素有很多,比如tf, idf, dl等等。有很多经典的模型来完成这一任务,比如VSM(向量空间模型),boolean model(布尔模型)等,这里将不对这种传统的方法进行展开讨论,每一本关于Information Retrieval的书上都会有详细的分析。

        对于传统的排序模型,如果参数较多的话,会使得经验方法调参特别困难。于是,人们很自然地想到用机器学习来解决这一问题。所以,就有了Learning to Rank的出现。

        想法其实是非常简单的!我们平常使用Machine Learning做的最多的两个任务,即分类(Classification)和回归(Regression)。因此,人们想,能否把排序问题转化为分类或者回归问题呢?如果可以,暂且不论模型优劣,至少可以帮助我们解决排序这个任务。

        基于这样的思想,人们提出了三种方法:

1. Pointwise 
2. Pairwise 
3. Listwise

        下面将较详细地讨论这三种方法,从原理,方法,再到相关工具。

 

一、 Pointwise Approach

        Pointwis方法的主要思想是将排序问题转化为多类分类问题或者回归问题。以多类分类为例进行说明:假设对于查询query,与其相关的文档集合为:{d1, d2, …, dn}。那么首先对这n个pair:(query, di)抽取特征并表示成特征向量。将query与di之间的相关度作为label,一般的label等级划分方式为:{Perfect, Excellent, Good, Fair, Bad},一共五个类别。于是,对于一个查询及其文档集,可以形成n个训练实例。有了训练实例,我们可以使用任一种多类分类器进行学习,比如最大熵,SVM。

        由于Pointwise比较简单,这里不作形式化展开。简单分析一下它的特点。

        在Pointwise方法中隐含了这样一个假设:绝对相关度假设,它假设相关度是查询无关的,即query-independent。也就是说,只要(query, document)的相关度相同,比如都为“perfect”,那么它们就被放在同一个类别里,即属于同一类的实例,而无论query是什么。然而实际上,相关度并非查询无关的。对于非常常见的查询和它的一个不相关文档,它们之间的tf可能会比一个非常稀有的查询和它的一个相关文档之间的tf更高。这样就会导致训练数据不一致,难以取得好的效果。同时,对于预测为同一类别的文档,也无法作出排序。

        实现Pointwise方法的工具有McRank(NIPS, 2007)。

二、 Pairwise Approach

        Pairwise方法是目前比较流行的方法,效果也非常不错。它的主要思想是将Ranking问题形式化为二元分类问题。

        下面这张图很直观地表达了pairwise方法的思想,同时也给出了构造训练实例的方法。

        对于同一条query,在它的所有相关文档集里,对任两个不同label的文档,都可以得到一个训练实例(pair),比如图中的( )分别对应label为5和3,那么对于这个pair实例,给它赋予类别+1(5>3),反之则赋予类别-1。于是,按照这种方式,我们就得到了二元分类器训练所需的样本了。预测时,只需要对所有pair进行分类,便可以得到文档集的一个偏序关系,从而实现排序。

        Pairwise方法有很多的实现,比如我实验中用到的SVM Rank(开源), 还有RankNet(C. Burges, et al. ICML 2005), FRank(M.Tsai, T.Liu, et al. SIGIR 2007),RankBoost(Y. Freund, et al. JMLR 2003)等等。

        相比于Pointwise方法,Pairwise方法不再对相关度作独立假设,因为它只对同一个query里的文档集生成训练样本。然而,Pairwise模型也有一些缺点:1.它对不同级别之间的区分度是一致对待的。在信息检索领域,尤其对于搜索引擎而言,人们更倾向于只点击搜索引擎返回的前几页结果,甚至只是前几条。所以我们对相关度高(Perfect)的文档应该作更好的区分。2.相关文档集大小带来的模型偏置。假设query1对应的相关文档集大小为5,query2的相关文档集大小为1000,那么从后者构造的训练样本数远远大于前者,从而使得分类器对相关文档集小的query所产生的训练实例区分不好,甚至视若无睹。

        还有一个重要的因素也会影响Pairwise方法的排序性能。以Ranking SVM为例,它优化的目标是使得正负样本之间的Margin最大,而并非以排序性能为优化目标。就像BP神经网络以训练误差为目标优化函数,从而使得它很容易过拟合。优化目标本身的差异将导致模型本身的功能偏置。于是,基于这个特性,人们提出了Listwise的方法。

三、 Listwise Approach

        Listwise方法相比于前两种(Pointwise,Pairwise)而言,不再将Ranking问题直接形式化为一个分类或者回归问题,而是直接对文档的排序结果(list)进行优化。目前主要有两种优化方法:

  1. 直接针对Ranking评价指标进行优化。比如常用的MAP, NDCG。这个想法非常自然,但是往往难以实现,因为NDCG这样的评价指标通常是非平滑(连续)的,而通用的目标函数优化方法针对的都是连续函数。
  2. 优化损失函数

        损失函数的构造有很多种方式。RankCosine(T. Qin, T. Liu, et al. IP&M 2007)使用正确排序与预测排序的分值向量之间的Cosine相似度(夹角)来表示损失函数。 ListNet(Z. Cao, T. Qin, T. Liu, et al. ICML 2007)使用正确排序与预测排序的排列概率分布之间的KL距离(交叉熵)作为损失函数,等等。

        以ListNet为例,其损失函数如下:

         和 分别表示正确的排序以及预测的排序。其中,概率分布由以下公式定义:

        其中 为第j个特征向量的Score。当然这个概率分布需要满足一些性质,比如,对于更佳排序,其概率值应该更高。那么,最终损失函数就可以表示为以下形式:

        从式中可以看出,ListNet对特征向量进行简单的线性加权来对Score进行预测。此时,任务转化为对权矢量w的学习。这显然是一个老生常谈的问题,梯度下降是最常用的方法。这里就不再赘述了。

        我觉得Listwise的方法是最优美的,因为它专注于自己的目标和任务。相比之下,Pairwise有点儿歪门邪道的感觉:)当然,这种方法也并非完美,还是有一些缺点的。比如Score( )如何构造?能直接使用Label么?事实上,这也是制约性能的一大原因。还有,求解KL距离时,需要对所有排列计算其概率,算法复杂度趋于 。针对这几个问题,都有相应的Solution。

        对于ListNet,据我目前所知,有两个开源的Java版本实现,一是Minorthird,这是CMU的教授 William W. Cohen 带领他的学生们做的,类似于Weka,是一个实现了大量机器学习、数据挖掘算法的开源工具,它在Sorceforge上的主页在 这儿 。另一个是罗磊同学近期做的,使用的是单层神经网络模型来调整权值。目前已经在Google code上开源,地址在 这儿 。欢迎大家使用并给出意见。我也在计划实现一个C++版本,可能会加入罗磊的project。

 

【后记】

        “取法其上,得乎其中;取法其中,得乎其下;取法其众,得其上也”。忘了这句话的原始出处,似是《论语》,又似《孙子兵法》,又似《吕氏春秋》。本文的参考文献只有三篇文章,似乎连“取法其中”的高度也没有达到,更徨论“取法其众”了。因此,若有不正确或是不深刻之处,敬请指正:)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java安全漫谈是一本关于Java安全的书籍,深入探讨了Java应用程序在网络环境中的安全性和相关的安全漏洞。该书内容涵盖了Java安全基础、Java虚拟机的安全机制、Java安全管理、Java安全开发等方面的知识。 首先,Java安全基础部分介绍了Java安全模型的原理和特点,包括Java类库的安全特性、权限管理和访问控制、安全策略配置等。这部分内容可帮助开发人员了解Java应用程序的安全需求,并提供相应的解决方案。 其次,Java虚拟机的安全机制是Java应用程序的基石。该书介绍了Java虚拟机的安全沙箱和类加载机制,并讨论了如何利用这些安全机制避免恶意代码的执行和隐患的防范。 此外,Java安全管理部分从用户角度出发,介绍了Java应用程序的安全管理工具和技术,如Java安全策略文件、权限管理和安全认证等。开发人员可以通过合理配置和使用这些工具来提高Java应用程序的安全性。 最后,该书还涉及了Java安全开发过程中的一些最佳实践和常见安全漏洞,如输入验证、跨站脚本攻击(XSS)、SQL注入、跨站请求伪造(CSRF)等。通过学习和掌握这些知识,开发人员可以编写出更加安全的Java应用程序。 总而言之,Java安全漫谈是一本全面讨论Java安全的书籍,内容涵盖了Java安全基础、Java虚拟机的安全机制、Java安全管理和Java安全开发等方面的知识。它对于开发人员和安全从业人员来说,都是一本重要的参考书,有助于提高Java应用程序的安全性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值