Ranking 是信息检索领域的基本问题,也是搜索引擎背后的重要组成模块。本文将对结合机器学习的 ranking 技术——learning2rank——做个系统整理,包括 pointwise、pairwise、listwise 三大类型,它们的经典模型,解决了什么问题,仍存在什么缺陷。关于一些扩展话题和具体应用,可能会在下一篇文章介绍,包括在 QA 领域的实践情况。
本文主要参考刘铁岩老师的《Learning to Rank for Information Retrieval》和李航老师的《Learning to rank for information retrieval and natural language processing》。
Ranking 模型可以粗略分为基于相关度和基于重要性进行排序的两大类。
早期基于相关度的模型,通常利用 query 和 doc 之间的词共现特性(如布尔模型)、VSM(如 TFIDF、LSI 等)、概率排序思想(BM25、LMIR 等)等方式。
基于重要性的模型,利用的是 doc 本身的重要性,如 PageRank、TrustRank 等。
这里我们关注基于相关度的 ranking。
即评估 query 与 docs 之间的真实排序与预测排序的差异。
大部分评估指标都是针对每组 query-docs 进行定义,然后再在所有组上进行平均。常用的基于度量的 ranking 错误率如下
MAP
首先,suppose we have binary judgment for the documents, i.e., the label is one for relevant documents and zero for irrelevant documents,定义docs 排序列表 π 中位置 k 的 precision 为
其次,令 m 为该 query 对应的 docs 数量,m_1 为该 query 对应的标签为1的 docs 数量,则有 average precision(AP)为
最后,对所有 query 求得 AP 进行平均,即得到 MAP。
NDCG
首先,Discounted cumulative gain (DCG)考量了 relevance judgment in terms of multiple ordered categories,以及对位置信息进行了折扣考量。定义 docs 排序列表 π 中位置 k 的 DCG 为
其中,函数 G 是 对应 doc 的 rating 值,通常采用指数函数,如 G(x)=2^x-1,函数 η 即位置折扣因子,通常采用 η(j)=1/log(j+1)。
其次,对 DCG@k 进行归一化,规整到0-1,Z_k 表示 DCG@k 的可能最大值,从而有 NDCG
可以发现,这些评估指标具备两大特性:
一方面,这些指标离散不可微,从而没法应用到某些学习算法模型上;另一方面,这些评估指标较为权威,通常用来评估基于各类方式训练出来的 ranking 模型。因此,即使某些模型提出新颖的损失函数构造方式,也要受这些指标启发,符合上述两个特性才可以。这些细节在后面会慢慢体会到。
Learning2Rank 即将 ML 技术应用到 ranking 问题,训练 ranking 模型。通常这里应用的是判别式监督 ML 算法。经典 L2R 框架如下
根据上图的基本元素(输入空间、假设空间、输出空间、损失函数)方面的差异,L2R可以分为三大类,pointwise 类,pairwise 类,listwise 类。总结如下,后面章节将进行详细说明。
Pointwise 类方法,其 L2R 框架具有以下特征:
这里讨论下,关于人工标注标签怎么转换到 pointwise 类方法的输出空间:
根据使用的 ML 方法不同,pointwise 类可以进一步分成三类:基于回归的算法、基于分类的算法,基于有序回归的算法。下面详细介绍。
此时,输出空间包含的是实值相关度得分。
采用 ML 中传统的回归方法即可。
此时,输出空间包含的是无序类别。
对于二分类,SVM、LR 等均可;对于多分类,提升树等均可。
此时,输出空间包含的是有序类别。
通常是找到一个打分函数,然后用一系列阈值对得分进行分割,得到有序类别。采用 PRanking、基于 margin 的方法都可以。
回顾概述中提到的评估指标应该基于 query 和 position,
Pointwise 类算法也可以再改进,比如在 loss 中引入基于 query 的正则化因子的 RankCosine 方法。
Pairwise 类方法,其 L2R 框架具有以下特征:
这里讨论下,关于人工标注标签怎么转换到 pairwise 类方法的输出空间:
pairwise 类方法基本就是使用二分类算法即可。
经典的算法有 基于 NN 的 SortNet,基于 NN 的 RankNet,基于 fidelity loss 的 FRank,基于 AdaBoost 的 RankBoost,基于 SVM 的 RankingSVM,基于提升树的 GBRank。
虽然 pairwise 类相较 pointwise 类 model 到一些 doc pair 间的相对顺序信息,但还是存在不少问题,回顾概述中提到的评估指标应该基于 query 和 position,
pairwise 类方法也有一些尝试,去一定程度解决上述缺陷,比如:
Listwise 类方法,其 L2R 框架具有以下特征:
这里讨论下,关于人工标注标签怎么转换到 listwise 类方法的输出空间:
根据损失函数构造方式的不同,listwise 类可以分成两类直接基于评价指标的算法,间接基于评价指标的算法。下面详细介绍。
直接取优化 ranking 的评价指标,也算是 listwise 中最直观的方法。但这并不简单,因为前面说过评价指标都是离散不可微的,具体处理方式有这么几种:
上述方法的优化目标都是直接和 ranking 的评价指标有关。现在来考虑一个概念,informativeness。通常认为一个更有信息量的指标,可以产生更有效的排序模型。而多层评价指标(NDCG)相较二元评价(AP)指标通常更富信息量。因此,有时虽然使用信息量更少的指标来评估模型,但仍然可以使用更富信息量的指标来作为 loss 进行模型训练。
这里,不再使用和评价指标相关的 loss 来优化模型,而是设计能衡量模型输出与真实排列之间差异的 loss,如此获得的模型在评价指标上也能获得不错的性能。
经典的如 ,ListNet,ListMLE,StructRank,BoltzRank。
listwise 类相较 pointwise、pairwise 对 ranking 的 model 更自然,解决了 ranking 应该基于 query 和 position 问题。
listwise 类存在的主要缺陷是:一些 ranking 算法需要基于排列来计算 loss,从而使得训练复杂度较高,如 ListNet和 BoltzRank。此外,位置信息并没有在 loss 中得到充分利用,可以考虑在 ListNet 和 ListMLE 的 loss 中引入位置折扣因子。
实际上,前面介绍完,可以看出来,这三大类方法主要区别在于损失函数。不同的损失函数知音了不同的模型学习过程和输入输出空间。