排序学习是一个有监督的机器学习过程,对每一个给定的查询-文档对,抽取特征,通过日志挖掘或者人工标注的方法获得真实数据标注。然后通过排序模型,使得输入能够和实际的数据相似。
1. LTR的流程
- Collect Training Data (Queries and their labeled documents)
- Feature Extraction for Query-document Pairs
- Learning the Ranking Model by Minimizing a Loss Function on the Training Data
- Use the Model to Answer Online Queries
2. 训练数据的获取
有2种获取训练数据的来源:1)人工标注;2)搜索日志。
- 1) 人工标注
从搜索日志中随机选取一部分Query,让受过专业训练的数据评估员对”Query-Url对”给出相关性判断。常见的是5档的评分:差、一般、好、优秀、完美。以此作为训练数据。人工标注是标注者的主观判断,会受标注者背景知识等因素的影响。
- 2) 搜索日志
使用点击日志的偏多。比如,结果ABC分别位于123位,B比A位置低,但却得到了更多的点击,
那么B的相关性可能好于A。
- 3) 公开数据集
现存一批公开的数据集可以使用
- LETOR, http://research.microsoft.com/en-us/um/beijing/projects/letor/
- Microsoft Learning to Rank Dataset, http://research.microsoft.com/en-us/projects/mslr/
- Yahoo Learning to Rank Challenge, http://webscope.sandbox.yahoo.com/
3. 特征提取(特征工程)
搜索引擎会使用一系列特征来决定结果的排序。
feature可以分为:
- Doc本身的特征:Pagerank、内容丰富度、是否是spam等
- Query-Doc的特征:文本相关性、query和doc共现的词在文档/查询中出现的次数等
此阶段就是要抽取出所有的特征,供后续训练使用。(一般是最耗时间和最影响模型结果的步骤)
4. 模型
常用的排序学习分为三种类型:PointWise,PairWise和ListWise。
PointWise
输入:单独的一篇文档
过程:文档->特征向量->模型得到回归/分类结果
输出:根据模型得到的文档的score;然后根据score排序。
优点:
速度快,复杂度低.
缺点:
效果一般
没有考虑到文档之间的相对关系
忽略了文档相关度与查询的关联,比如Top Query排在后面的相关性比Tial Query排在前面的都要高,导致训练样本不一致
PairWise
对于搜索任务来说,系统接收到用户查询后,返回相关文档列表,所以问题的关键是确定文档之间的先后相对顺序关系,
而Pairwise则将重点转向对文档关系是否合理的判断.
虽然Pairwise方法对Pointwise方法做了改进,但是也明显存在两个问题:
- 只考虑了两个文档的先后顺序,没有考虑文档出现在搜索列表中的位置
- 不同的查询,其相关文档数量差异很大,转换为文档对之后,有的查询可能有几百对文档,有的可能只有几十个,最终对机器学习的效果评价造成困难
ListWise
与Pointwise和Pairwise不同,Listwise是将一个查询对应的所有搜索结果列表作为一个训练实例,因此也称为文档列方法.
5. 模型评估
- MAP
MAP(Mean Average Precision)表示文档在排序中的平均精度均值,是用于衡量个query查询见过的平均精度值AP,
系统检索出来的相关文档越靠前(rank 越高),MAP就可能越高。如果系统没有返回相关文档,则准确率默认为0。
- NDCG
NDCG表示表示归一化折损累积增益,主要是衡量实际相关性越高的文档排在越前面
5. 综述
搜索引擎时敲定特征分的权重是非常疼的一件事儿,而LTR正好帮你定分,LTR的三种实现方法其实各有优劣:
- 难点主要在训练样本的构建(人工或者挖日志),另外就是训练复杂
- 虽说Listwise效果最好,pointwise使用还是比较多,参考这篇文章综述LTR体验下
- 在工业界用的比较多的应该还是Pairwise,因为他构建训练样本相对方便,并且复杂度也还可以,所以Rank SVM就很火
结合ES和LTR
https://github.com/o19s/elasticsearch-learning-to-rank