Learning to Rank系列之概述
背景
排序问题是信息检索、新闻推荐、自然语言处理等领域中一个非常热门的研究问题。以google搜索为例,比如你在搜索框内输入“machine learning”,回车之后google就会返回这样一个结果列表
简单介绍一下这个过程,我(用户)从google首页的搜索框输入“machine learning”(query),搜索引擎通过后台的算法,从一个非常大的网页候选集里召回了和这个query相关的网页,并且通过某些算法把召回的网页根据和query的相关度排好序,返回给我(用户)。如果一个query相关的网页只有非常少的几个,那么对于返回的结果排序的效果好坏甚至是否有排序其实影响并不大,但是当一个query相关的候选结果集非常大的时候,我们希望越相关的网页(文档)出现的位置越靠前,相关度低的网页(文档)出现在结果列表靠后的位置。
可以看到,和“machine learning”这个query相关的网页有639,000,000条,数量非常庞大,如果不对这些相关网页进行一个相关度的排序,那么我们获取相要的结果就会非常麻烦。于是Learning to Rank应运而生。
Learning to Rank(以下简称L2R)是一个有监督的学习方法,它将机器学习技术应用到排序问题中,通过有标注的样本来训练模型,最终解决排序问题。L2R方法主要分为三类:
- pointwise
- pairwise
- listwise
pointwise方法
pointwise方法是将排序问题转化为分类或者回归问题,如果是分类问题,可以用query和相关文档的特征,类别结果作为训练样本来得到模型参数;如果是回归问题,可以用文档和query的相关度得分作为样本来训练模型。为简单起见,我们以分类问题为例。
对于一个query,我们通过人工标注或者其它方法,得到与其相关的文档的一个类别(label),一般分为五类 { perfact,excellect,good,fair,bad },用5,4,3,2,1代表对应的类别,数值越大相关度越高。
- 输入: query以及每个文档的特征向量
- 输出: 每个文档的分类结果
- 损失函数: mse或者logloss
- 常见模型: Subset Ranking,PRank
pointwise方法通过优化损失函数求解最优的参数,可以看到pointwise方法非常简单,工程上也易实现,但是它只考虑单个文档同query的相关性,没有考虑文档间的关系,另外通过分类只是把不同的文档做了一个简单的区分,同一个类别里的文档则无法深入区别。还有,很多时候,排序结果的top k条的顺序重要性远比剩下全部顺序重要性要高,对于位置考前但是排序错误的文档应该加大惩罚。
pairwise方法
pairwise方法是当前比较流行的排序方法,它考虑两个文档的相对顺序,对于query召回的候选集里的文档,构造文档对样本 doc1, doc2 ,如果doc1排在doc2之前,则记为一个正样本,label为1,反之为负样本,label为-1,通过两两比较之后对文档进行排序。在构造训练样本时,我们设想能有一个函数 ,对于文档对 doc1, doc2 ,如果doc1在doc2前面,那么关于两个文档的特征向量 ,满足 ,反之 。
因此我们可以根据这一假设来构造模型,首先想到的自然是最简单的线性模型,,比较两个文档的顺序我们可以利用线性模型来判断,
上式可转化为:
我们用 表示模型输出结果
- 输入: query和文档对特征向量
- 输出: 文档对相对顺序判断结果
- 损失函数: 分类loss
- 常见模型: Ranking SVM、RankBoost、RankNet、GBRank、IR SVM
Pairwise 方法通过考虑两两文档之间的相关对顺序来进行排序,相比pointwise方法有明显改善。但 Pairwise 方法仍有如下问题:
- 使用的是两文档之间相关度的损失函数,而它和真正衡量排序效果的指标之间存在很大不同,甚至可能是负相关的,如可能出现 Pairwise Loss 越来越低,但 NDCG 分数也越来越低的现象。
- 只考虑了两个文档的先后顺序,且没有考虑文档在搜索列表中出现的位置,导致最终排序效果并不理想。
- 不同的查询,其相关文档数量差异很大,转换为文档对之后,有的查询可能有几百对文档,有的可能只有几十个,模型会优先考虑文档对数量多的查询,减少这些查询的loss,最终对机器学习的效果评价造成困难。
Listwise方法
Listwise 算法相对于 Pointwise 和 Pairwise 方法来说,它不再将排序问题转化为一个分类问题或者回归问题,而是直接针对评价指标对文档的排序结果进行优化,如常用的 MAP、NDCG 等。
- 输入: query和整个文档列表的特征
- 输出: 所有文档的打分或者排列顺序
- 损失函数: 评价指标如 NDCG、MAP
- 常见模型: ListNet、ListMLE、SVM MAP、AdaRank、SoftRank、LambdaRank、LambdaMART
评价指标
L2R 的评价指标主要有 MAP、NDCG、WTA、MRR 等,这里逐个介绍一下
1、MAP
MAP(Mean Average Precision):单个主题的平均准确率是同主题内每篇相关文档检索出后的准确率的平均值。主集合的平均准确率(MAP)是每个主题的平均准确率的平均值。MAP 是反映系统在全部相关文档上性能的单值指标。系统检索出来的相关文档越靠前(rank 越高),MAP就可能越高。如果系统没有返回相关文档,则准确率默认为0。
例如:假设有两个主题,主题1有4个相关网页,主题2有5个相关网页。某系统对于主题1检索出4个相关网页,其rank分别为1, 2, 4, 7;对于主题2检索出3个相关网页,其rank分别为1,3,5。对于主题1,平均准确率为(1/1+2/2+3/4+4/7)/4=0.83。对于主题2,平均准确率为(1/1+2/3+3/5+0+0)/5=0.45。则MAP= (0.83+0.45)/2=0.64
2、NDCG
NDCG(Normalized Discounted Cumulative Gain):计算相对复杂。对于排在结位置n处的NDCG的计算公式如下图所示:
在MAP中,四个文档和query要么相关,要么不相关,也就是相关度非0即1,。而NDCG中对此有了一些优化,相关度从0到r共r+1个等级,当r=4时,如下图。
Relevance Rating | Value(Gain) |
---|---|
Perfect | |
Excellent | |
Good | |
Fair | |
Bad |
假设现在有一个query={ abc },返回下图左列的Ranked List(URL),当假设用户的选择与排序结果无关(即每一级都等概率被选中),则生成的累计增益值如下图最右列所示
Id | URL | Gain | Cumulative Gain |
---|---|---|---|
1 | http://abc.go.com/ | 15 | 15 |
2 | http://www.abcteach.com/ | 3 | 18=15+3 |
3 | http://abcnews.go.com/section/scitech/ | 7 | 25=15+3+7 |
4 | http://www.abc.net.au/ | 7 | 32=15+3+7+7 |
5 | http://abcnews.go.com/ | 7 | 39=15+3+7+7+7 |
6 | … | … | … |
但是现实中,用户往往会优先点击排序考前的搜索结果,所以我们引入一个折算因子(discounting factor),log(2)/log(1+rank),加上折算因子后如下
Id | URL | Gain | Discounted Cumulative Gain |
---|---|---|---|
1 | http://abc.go.com/ | 15 | 15 |
2 | http://www.abcteach.com/ | 3 | 16.89=15+3*log(2)/log(1+2) |
3 | http://abcnews.go.com/section/scitech/ | 7 | 20.39=16.89+7*log(2)/log(1+3) |
4 | http://www.abc.net.au/ | 7 | 23.4=20.39+7*log(2)/log(1+5) |
5 | http://abcnews.go.com/ | 7 | 26.13=23.4+7*log(2)/log(1+5) |
6 | … | … | … |
为了使不同等级上的搜索结果的得分值容易比较,需要将DCG值归一化的到NDCG值。操作如下图所示,首先计算理想返回结果List的DCG值:
Id | URL | Gain | Max DCG |
---|---|---|---|
1 | http://abc.go.com/ | 15 | 15 |
2 | http://abcnews.go.com/section/scitech/ | 7 | 19.41=15+7*log(2)/log(1+2) |
3 | http://www.abc.net.au/ | 7 | 22.91=19.41+7*log(2)/log(1+3) |
4 | http://abcnews.go.com/ | 7 | 25.92=22.91+7*log(2)/log(1+4) |
5 | http://www.abcteach.com/ | 3 | 27.09=25.92+3*log(2)/log(1+5) |
6 | … | … | … |
然后用DCG/MaxDCG就得到NDCG值,如下图所示:
Id | URL | Gain | DCG | Max DCG | NDCG |
---|---|---|---|---|---|
1 | http://abc.go.com/ | 15 | 15 | 15 | 1=15/15 |
2 | http://www.abcteach.com/ | 3 | 16.89 | 19.41 | 0.87=16.89/19.41 |
3 | http://abcnews.go.com/section/scitech/ | 7 | 20.39 | 22.91 | 0.89=20.39/22.91 |
4 | http://www.abc.net.au/ | 7 | 23.4 | 25.92 | 0.9=23.4/25.92 |
5 | http://abcnews.go.com/ | 7 | 26.13 | 27.09 | 0.96=26.13/27.09 |
6 | … | … | … |
3、MRR
MRR(Mean Reciprocal Rank):是把标准答案在被评价系统给出结果中的排序取倒数作为它的准确度,再对所有的问题取平均。相对简单,举个例子:有3个query如下图所示:
Query | Results | Correct response | Rank | Reciprocal Rank |
---|---|---|---|---|
cat | catten, cati, cats | cats | 3 | 1/3 |
torus | torii, tori, toruses | tori | 2 | 1/2 |
virus | viruses, virii, viri | viruses | 1 | 1/1 |
故这个系统的MRR值为:(1/3+1/2+1/1)/3=11/18
4、WTA
WTA,全称 Winners Take All,对于给定的查询 Query,如果模型返回的结果列表中,第一个文档是相关的,则 WTA =1, 否则为 0。
如对于一个 Query,本来有 5 个相关结果,查询结果中如果第一个结果是相关的,那么 WTA = 1,如果第一个结果是不相关的,则 WTA = 0。
参考资料:
1、http://kubicode.me/2016/02/15/Machine%20Learning/Learning-To-Rank-Base-Knowledge/
2、https://www.cnblogs.com/eyeszjwang/articles/2368087.html
3、https://blog.****.net/yuhushangwei/article/details/48547151