LTR 算法通常有三种手段,分别是:Pointwise、Pairwise 和 Listwise。Pointwise 和 Pairwise 类型的LTR算法,将排序问题转化为回归、分类或者有序分类问题。Listwise 类型的 LTR 算法则另辟蹊径,将用户查询(Query)所得的结果作为整体,作为训练用的实例(Instance)。
Pointwise
Pointwis方法的主要思想是将排序问题转化为多类分类问题或者回归问题。假设对于查询query,与其相关的文档集合为:{d1, d2, …, dn}。那么:
- 多类分类:将query与di之间的相关度的程度作为label,一般的label等级划分方式为:{Perfect, Excellent, Good, Fair, Bad},一共五个类别。于是,对于一个查询及其文档集,可以形成n个训练实例。有了训练实例,我们可以使用任一种多类分类器进行学习,比如最大熵,SVM。
- 回归:将query与di之间的相关度作为value,利用regression model来得到一个query与document之间相关度的预测。
缺点 : Pointwise完全从单文档的分类角度计算,没有考虑文档之间的相对顺序。而且它假设相关度是查询无关的,只要(query,di)的相关度相同,那么他们就被划分到同一个级别中,属于同一类。然而实际上,相关度的相对性是和查询相关的,比如一个常见的查询它会有很多相关的文档,该查询和它相关性相对靠后的文档的label标注级别时可能会比一个稀有的查询和它为数不多的高度相关文档的label标准级别更高。这样就导致训练样本的不一致,并且对于预测为同一label级别的文档之间也无法相对排序。
Pairwise
Pairwise方法是目前比较流行的方法,效果也非常不错。它的主要思想是将Ranking问题形式化为二元分类问题。常用的机器学习的方法比较多,比如Boost、SVM、神经网络等。
- 对于同一query的相关文档集中,对任何两个不同label的文档,都可以得到一个训练实例(di,dj),如果di>dj则赋值+1,反之-1,于是我们就得到了二元分类器训练所需的训练样本了,如下图所示。
-
测试时,只要对所有pair进行分类就可以得到所有文档的一个偏序关系,从而实现排序。
缺点 : 尽管Pairwise对Pointwise做了改进,但该方法还是存在明显的问题
- 只考虑了两篇文档的相对顺序,没有考虑他们出现在搜索结果列表中的位置。排在前面的文档更为重要,如果出现在前面的文档判断错误,惩罚函数要明显高于排在后面判断错误。因此需要引入位置因素,每个文档对根据其在结果列表中的位置具有不同的权重,越排在前面权重越大,如果排错顺序其受到的惩罚也越大。
- 对于不同的查询相关文档集的数量差异很大,转换为文档对后,有的查询可能只有十几个文档对,而有的查询可能会有数百个对应的文档对,这对学习系统的效果评价带来了偏置。假设查询1对应500个文档对,查询2对应10个文档对,假设机器学习系统对应查询1能够判断正确480个文档对,对应查询2能够判断正确2个。对于总的文档对该系统准确率是(480+2)/(500+10)=95%,但从查询的角度,两个查询对应的准确率分别为:96%和20%,平均为58%,与总的文档对判断准确率相差巨大,这将使得模型偏向于相关文档集大的查询。
Pairwise有很多的实现,比如Ranking SVM,RankNet,Frank,RankBoost等。
Listwise
Listwise与上述两种方法不同,它是将每个查询对应的所有搜索结果列表作为一个训练样例。Listwise根据训练样例训练得到最优评分函数F,对应新的查询,评分F对每个文档打分,然后根据得分由高到低排序,即为最终的排序结果。
目前主要有两种优化方法:
- 直接针对Ranking评价指标进行优化。比如常用的MAP, NDCG(下面介绍)。这个想法非常自然,但是往往难以实现,因为MAP、NDCG这样的评价指标通常是非平滑(连续)的,而通用的目标函数优化方法针对的都是连续函数。
- 优化损失函数 loss function。比如LambdaRank、LambdaMART。
- - - - - - - - - - - - - - - --- 华丽分割线 --- - - - - - - - - - - - - - - -
From RankNet to LambdaRank to LambdaMART
LambdaMART 是一种 Listwise 类型的 LTR 算法,它基于 LambdaRank 算法和 MART (Multiple Additive Regression Tree) 算法,将搜索引擎结果排序问题转化为回归决策树问题。MART 实际就是梯度提升决策树(GBDT, Gradient Boosting Decision Tree)算法。GBDT 的核心思想是在不断的迭代中,新一轮迭代产生的回归决策树模型拟合损失函数的梯度,最终将所有的回归决策树叠加得到最终的模型。LambdaMART 使用一个特殊的 Lambda 值来代替上述梯度,也就是将 LambdaRank 算法与 MART 算法加和起来。
考虑到 LambdaRank 是基于 RankNet 算法的,所以在搞清楚 LambdaMART 算法之前,我们首先需要了解 MART、RankNet 和 LambdaRank 是怎么回事。
RankNet
RankNet是2005年微软提出的一种pairwise的Learning to rank算法,它从概率的角度来解决排序问题。RankNet提出了一种概率损失函数来学习Ranking Function,并应用Ranking Function对文档进行排序。这里的Ranking Function可以是任意对参数可导的模型,也就是说,该概率损失函数并不依赖于特定的机器学习模型,在论文中,RankNet是基于神经网络实现的。除此之外,GDBT等模型也可以应用于该框架。
学习过程
变量定义:
A排序在B之前的目标概率:
(a_i)
$
$\overline{P_(ij)}$
\overline{P_(ij)}
\begin{equation}
a_i
\end{equation}
\[J\alpha(x) = \sum{m=0}^\infty \frac{(-1)^m}{m! \Gamma (m + \alpha + 1)} {\left({ \frac{x}{2} }\right)}^{2m + \alpha}\]
A排序在B之前的模型概率:$$P_{ij}$$
映射函数:$$f(x_i)$$
值:$$o_i = f(x_i)$$
值:$$o_{ij} = f(x_i)-f(x_j)$$
交叉熵损失函数:$$C_{ij}$$
$$C_{ij} = C(o_{ij}) = -\overline{P_{ij}}logP_{ij}$$