编程语言
首页 > 编程语言> > 搜索排序算法

搜索排序算法

作者:互联网

排序模型LTR(L2R,learning to rank)

Pairwise模型是指所有文档两两组成一个pair,比如(X1,X2),如果X1的分值大于X2则将该pair当作正例+1,否则为负例-1. Pairwise的效果通常好于Pointwise(学术界是如此,工业界也越来越多用Pairwise了)。

下面介绍几个排序经典模型:

RankSVM

RankSVM是配对法排序学习(Pairwise)的经典模型,通过SVM对query-doc pair进行打分和排序。RankSVM的输入特征维query-doc pair的特征差值,即 \(X_1-X_2\),标签为相对顺序(+1,-1).

GBRank

GBRank由雅虎的员工提出。基本学习器是梯度提升器(Gradient Boosting Machine,GBM)。对于所有的x>y的N个偏序对的训练样本,其损失函数可定义为:
\[ L_1=\sum_{i=1}^N \max(0,h(y_i)-h(x_i)) \\ || \\ L_2={1\over 2}\sum_{i=1}^N (\max(0,h(y_i)-h(x_i)))^2 \]
在使用梯度下降求解时,第m次迭代更新h:\(h(y_i^m)=h_{m-1}(y_i)-\rho_m\times{\partial L_2^{m-1}\over \partial y_i}\).只有当偏序预测错误时才进行更新,此时有\(h(y_i^m)=h(x_i^{m-1});\ h(x_i^m)=h(y_i^{m-1})\).在偏序学习正确时还需要保证学习的更健壮,因此需要让差值足够大,损失函数修改如下:
\[ L_3={1\over 2}\sum_{i=1}^N (\max(0,\tau+h(y_i)-h(x_i)))^2 \]
这样在偏序学错后,更新:\(h(y_i^m)=h(x_i^{m-1})-\tau;\ h(x_i^m)=h(y_i^{m-1})+\tau\).

GBRank对所有GBM采用了归一化处理:\(h_m(x)={mh_{m-1}(x)+\eta g_m(x)\over m+1}\),其中\(\eta\)为收缩率。

RankNet

RankNet由微软的博格斯提出(ICML2005),比GBRank更早的提出观点:偏序学习可以避免建模过程中将每条样本映射为确切的排序值,而只需学习排序先后的偏序关系即可。RankNet通过神经网络来学习先后偏序的概率。设学习的目标概率是\(\bar P_{xy}\),当x排序在y之前(x>y)时,\(\bar P_{xy}=1\),反之为0,不能确定偏序关系时值为0.5. 设输入x,y对应的输出值分别为\(f(x),f(y),O_{xy}=f(x)-f(y)\),偏序预测值为\(\text{sigmoid}(O_{xy})={1\over 1+e^{-O_{xy}}}\). 损失函数定义为交叉熵损失(对数几率损失):
\[ \begin{align} L_{xy}&=-\bar P_{xy}\log P_{xy}-(1-\bar P_{xy})\log(1-P_{xy}) \\ &=-\bar P_{xy}[O_{xy}-\log(1+e^{O_{xy}})]+(1-\bar P_{xy})\log(1+O_{xy}) \\ &=-\bar P_{xy}O_{xy}+\log(1+e^{O_{xy}}) \end{align} \]
由于pair的偏序概率具有传递性,因此RankNet可以是O(n)的复杂度。由于RankNet以减少错误pair为优化目标,因此对NDCG(关心相关文档所在的位置)等指标衡量的效果不是太好(同样的RankSVM、GBDT等排序模型亦是如此)。后续的改进模型包括LambdaRank、LambdaMart。

开源代码实现:Ranklib包含了多种算法实现。

LambdaMART

这是微软在 Bing 中使用了较长时间的模型,也在L2R这个领域享有盛誉。博格斯的团队意识到 RankNet 并不能直接优化搜索的评价指标(NDCG 或者 MAP 等)之后提出了 LambdaRank,使用NDCG的变化量对模型参数进行优化。随后把
LambdaRank 和 GBDT 的思想结合起来,提出了更强的 LambdaMART。
Lambda 是被定义为两个文档 NDCG 的变化量(实际上用这个变化量乘以对数几率损失的梯度)。Lambda梯度更关注位置靠前的优质文档的排序位置的提升,有效的避免了下调位置靠前优质文档的位置这种情况的发生。

Learning to rank 评价指标

Precision and Recall(P-R)

P-R的有两个明显缺点:

Discounted Cumulative Gain(DCG)

DCG解决了 P-R 的这两个问题。对于一个关键词,所有的文档可以分为多个相关性级别,这里以\(rel_1,rel_2,...\)来表示。文章相关性对整个列表评价指标的贡献随着位置的增加而对数衰减,位置越靠后,衰减越严重。

NDCG 这个指标的假设是,在一个排序结果里,相关信息要比不相关信息排得更高,而最相关信息需要排在最上面,最不相关信息排在最下面。任何排序结果一旦偏离了这样的假设,就会受到“扣分”或者说是“惩罚”。NDCG 是针对测试集的一个排序评价指标。

NDCG 是考虑到评分的排序,说到NDCG就需要从CG开始说起。CG(cumulative gain,累计增益)可以用于评价基于打分/评分的个性推荐系统。假设我们推荐k个物品,这个推荐列表的CGk计算公式如下:

\[ CG_k=\sum_{i=1}^k \text{rel}_i \]

\(\text{rel}_i\) 表示第k个物品的相关性或者评分。假设我们共推荐k个电影,\(\text{rel}_i\) 可以是用户对第i部电影的评分。

比如豆瓣给用户推荐了五部电影: M1,M2,M3,M4,M5

该用户对这五部电影的评分分别是:5, 3, 2, 1, 2

那么这个推荐列表的CG等于
CG5=5+3+2+1+2=13.
CG没有考虑推荐的次序,在此基础之后我们引入对物品顺序的考虑,就有了DCG(discounted CG),折扣累积增益。公式如下:

\[ DCG_k=\sum_{i=1}^k \frac{2^{\text{rel}_i}-1}{\log_2(i+1)} \]

那么这个推荐列表的DCG等于
\[ DCG_5=\frac{2^5-1}{\log_2 2}+\frac{2^3-1}{\log_2 3}+\frac{2^2-1}{\log_2 4}+\frac{2^1-1}{\log_2 5}+\frac{2^2-1}{\log_2 6}=31+4.4+1.5+0.4+1.2=38.5 \]

对于排序引擎而言,不同请求的结果列表长度往往不相同。当比较不同排序引擎的综合排序性能时,不同长度请求之间的DCG指标的可比性不高。DCG没有考虑到推荐列表和每个检索中真正有效结果个数,目前在工业界常用的是Normalized DCG(NDCG),它假定能够获取到某个请求的前p个位置的完美排序列表,这个完美列表的分值称为Ideal DCG(IDCG),NDCG等于DCG与IDCG比值。所以NDCG是一个在0到1之间的值。

完美结果下的DCG,即IDCG的定义如下:

\[ \text{IDCG}_p=\sum_{i=1}^{|REL|}{2^{rel_i}-1 \over \log_2(i+1)} \]

|REL|代表按照相关性排序好的最多到位置p的结果列表。

\[ NDCG_k=\frac{DCG_k}{IDCG_k} \]

继续上面的例子,如果相关电影一共有7部:M1,M2,M3,M4,M5,M6,M7
该用户对这七部电影的评分分别是:5, 3, 2, 1, 2 , 4, 0

把这7部电影按评分排序:5, 4, 3, 2, 2, 1, 0

这个情况下的完美DCG是
\[ IDCG_5=\frac{2^5-1}{\log_2 2}+\frac{2^4-1}{\log_2 3}+\frac{2^3-1}{\log_2 4}+\frac{2^2-1}{\log_2 5}+\frac{2^2-1}{\log_2 6}=31+9.5+3.5+1.3+1.2=46.5 \]
所以, \(NDCG_5 = \frac{DCG_5}{IDCG_5}=\frac{38.5}{46.5}=0.827\)
NDCG是0到1的数,越接近1说明推荐越准确。

参考: http://sofasofa.io/forum_main_post.php?postid=1002561

Expected Reciprocal Rank(ERR)

与DCG相比,除了考虑位置衰减和允许多种相关级别(以R1,R2,R3...来表示)以外,ERR更进了一步,还考虑了排在文档之前所有文档的相关性。举个例子来说,文档A非常相关,排在第5位。如果排在前面的4个文档相关度都不高,那么文档A对列表的贡献就很大。反过来,如果前面4个文档相关度很大,已经完全解决了用户的搜索需求,用户根本就不会点击第5个位置的文档,那么文档A对列表的贡献就不大。
ERR的定义如下:

\[ ERR=\sum_{r=1}^n{1\over r}\prod_{i=1}^{r-1}(1-R_i)R_r \]

标签:frac,log,DCG,算法,xy,搜索,NDCG,排序
来源: https://www.cnblogs.com/makefile/p/l2r.html