LTR(Learning to Rank)学习排序已经被广泛应用到文本挖掘、搜索推荐系统的很多领域,比如IR中排序返回的相似文档,推荐系统中的候选产品召回、用户排序等,机器翻译中排序候选翻译结果等等。

排序学习是搜索推荐系统、计算广告领域的核心方法。同时排序结果的好坏,在搜索推荐任务中很大程度直接影响用户点击、转化、用户体验和收入等。

在《推荐系统技术演进趋势:重排篇》一文中,作者张俊林介绍了在重排环节,推荐系统里Learning to Rank做排序,我们知道常见的有三种优化目标:Point Wise、Pair Wise和List Wise。最简单的损失函数定义是Point-wise,就是输入用户特征和单个物品特征,对这个物品进行打分,物品之间的排序,就是谁应该在谁前面,不用考虑。而Pair-wise损失在训练模型时,直接用两个物品的顺序关系来训练模型,就是说优化目标是物品A排序要高于物品B,类似这种优化目标。 List-wise的Loss更关注整个列表中物品顺序关系,会从列表整体中物品顺序的角度考虑,来优化模型。

 

Learning to Rank:X-wise_python

上面我们对Point-wise、Pair-wise、List-wise这三种方式,做了一个简单的介绍。但Permutation-wise是什么呢?其实,十方同学在《排序(rank)后重排(re-rank)》一文中,为我们介绍了Permutation-wise的文章,文章中给出了一个真实的案例,如下图。

 

Learning to Rank:X-wise_编程语言_02

这个图给了个真实的案例,一个User,给他展示了A、B、C就不会买任何item,给他展示了B、A、C就后购买A。

论文《Revisit Recommender System in the Permutation Prospective》给了个例子,如果把贵的商品B放前面,用户就会觉得A便宜,值得购买。好像很有道理,所以我们看到,如果是list-wise的模型给排好序的的B->A->C分别预估一个分(0.38, 0.40, 0.36),然后按照这个分重排序,就会得到A->B->C,用户就不会购买了。

如果我们提供多个候选排列队列: A->B->CB->A->C,然后把list-wise的分加起来,得到不同排列的分,那就会得到最优解,B->A->C。但是一般情况下,需要重排序的item可能有上百个,上百个item做排列,再过list-wise模型预估,这是不现实的,于是论文提出了两阶段的重排序框架PRS(Permutation Retrieve System),分别是PMatch阶段和PRank阶段,整体架构如下图所示:

 

Learning to Rank:X-wise_python_03

关于具体PMatch和PRank的细节,感兴趣的可以直接阅读《排序(rank)后重排(re-rank)》一文。

 

Learning to Rank:X-wise_大数据_04

Pair-wise的方法是将同一个查询中两个不同的Item作为一个样本,主要思想是把rank问题转换为二值分类问题。对于同一Query的相关文档集中,对任何两个不同label的文档,都可以得到一个训练实例(di,dj),如果di>dj则赋值+1,反之-1,于是我们就得到了二元分类器训练所需的训练样本了。

 

Learning to Rank:X-wise_大数据_05

常用Pair-wise实现有SVMRank、RankBoost、RankNet等。

 

Learning to Rank:X-wise_编程语言_06
  • 输出空间中样本是 pairwise preference;
  • 假设空间中样本是二变量函数;
  • 输入空间中样本是同一 query 对应的两个 doc和对应 query构成的两个特征向量;
  • 损失函数评估 doc pair 的预测 preference 和真实 preference 之间差异;

 

Learning to Rank:X-wise_python_07
  • 只考虑了两篇文档的相对顺序,没有考虑他们出现在搜索结果列表中的位置;即:Pair-wise方法仅考虑了doc-pair的相对位置,损失函数还是没有模型到预测排序中的位置信息;
  • 对于不同的查询相关文档集的数量差异很大,转换为文档对后,有的查询可能只有十几个文档对,而有的查询可能会有数百个对应的文档对,这对学习系统的效果评价带来了偏置;
  • Pair-wise对噪声标注更敏感,即一个错误标注会引起多个doc-pair标注错误;

 

Learning to Rank:X-wise_算法_08

Point-wise排序是将训练集中的每个Item看作一个样本获取rank函数,主要解决方法是把分类问题转换为单个item的分类或回归问题。就是输入用户特征和单个Item特征,对这个物品进行打分,物品之间的排序,就是谁应该在谁前面,不用考虑。Point-wise方法很好理解,即使用传统的机器学习方法对给定查询下的文档的相关度进行学习,比如CTR就可以采用PointWise的方法学习,但是有时候排序的先后顺序是很重要的,而Point-wise方法学习到全局的相关性,并不对先后顺序的优劣做惩罚。

明显这种方式无论是训练还是在线推理,都非常简单直接效率高,但是它的缺点是没有考虑物品直接的关联,而这在排序中其实是有用的。

 

Learning to Rank:X-wise_编程语言_09

常用Point-wise实现基于回归的算法、基于分类的算法、基于有序回归的算法等。

 

Learning to Rank:X-wise_算法_10
  • 使用传统的机器学习方法对给定查询下的文档的相关度进行学习;
  • 输入空间中样本是单个document和对应query构成的特征向量;
  • 输出空间中样本是单个documen和对应query的相关度;
  • 假设空间中样本是打分函数,损失函数评估单个 doc 的预测得分和真实得分之间差异。

 

Learning to Rank:X-wise_算法_11
  • Point-wise类方法并没有考虑同一个query对应的documents间的内部依赖性,完全从单文档的分类角度计算,没有考虑文档之间的相对顺序;
  • 和Pair-wise类似,损失函数也没有模型到预测排序中的Position位置信息;

 

Learning to Rank:X-wise_算法_12

List-wise排序是将整个item序列看作一个样本,通过直接优化信息检索的评价方法和定义损失函数两种方法来实现。它是直接基于评价指标的算法非直接基于评价指标的算法。在推荐中,List-wise损失函数因为训练数据的制作难,训练速度慢,在线推理速度慢等多种原因,尽管用的还比较少,但是因为更注重排序结果整体的最优性,所以也是目前很多推荐系统正在做的事情。

和其他X-wise方法比较,List-wise方法往往更加直接,它专注于自己的目标和任务,直接对文档排序结果进行优化,因此往往效果也是最好的。Listwise常用方法有AdaRank、SoftRank、LambdaMART、LambdaRank等。

 

Learning to Rank:X-wise_机器学习_13
  • 输入空间中样本是同一query对应的所有documents构成的多个特征向量;
  • 输出空间中样本是这些documents和对应query的相关度排序列表或者排列;
  • 假设空间中样本是多变量函数,对于documents得到其排列,实践中,通常是一个打分函数,根据打分函数对所有documents的打分进行排序得到documents相关度的排列;
  • listwise 类相较 pointwise、pairwise 对 ranking 的 model 更自然,解决了 ranking 应该基于 query 和 position 问题。

 

Learning to Rank:X-wise_大数据_14
  • 一些ranking算法需要基于排列来计算 loss,从而使得训练复杂度较高,如 ListNet和 BoltzRank。
  • 位置信息并没有在loss中得到充分利用,可以考虑在ListNet和ListMLE loss中引入位置折扣因子。