很多搜索达人都有这样一种冲动,想要“通过机器学习获得最优权重”然后用于搜索查询中。对于搜索这件事儿来说有点像打地鼠游戏,正如通常人们所说的“如果我能选择优化‘标题匹配’的权重还是‘内容匹配’的权重,那我肯定会做得更好”!
这种学习何种权重应用于查询的本能,就是最简化机器学习排序(learning to rank,LTR)模型的根本原理:线性模型。没错,就是传说中的线性回归!线性回归非常简单易用,甚至感觉一点儿都不像是机器学习;更像是高中生的统计学一样,理解该模型及其原理也非常地容易。
本系列文章中,我想先介绍成功实施LTR背后的关键算法,从线性回归开始,逐步到梯度 boosting(不同种类的boosting算法一起)、RankSVM和随机森林等算法。
LTR首先是一个回归问题
对于本系列的文章,正如你在前一篇及中了解到的,我想把LTR映射为一个更加通用的问题:回归。回归问题需要训练一个模型,从而把一组数值特征映射到一个预测数值。
举个例子:你需要什么样的数据才能预测一家公司的利润?可能会有,手边的历史公共财务数据,包括雇员数量、股票价格、收益及现金流等。假设已知某些公司的数据,你的模型经过训练后用于预测这些变量(或其子集)的函数即利润。对于一家新公司,你可以使用这个函数来预测该公司的利润。
LTR同样是一个回归问题。你手头上有一系列评价数据,来衡量一个文档与某个查询的相关度等级。我们的相关度等级取值从A到F,更常见的情况是取值从0(完全不相关)到4(非常相关)。如果我们先考虑一个关键词搜索的查询,如下示例:
grade,movie,keywordquery
4,Rocky,rocky
0,Turner and Hootch,rocky
3,Rocky II,rocky
1,Rambo,rocky
...
当构建一个模型来预测作为一个时间信号排序函数的等级时,LTR就成为一个回归问题。 相关度搜索中的召回,即我们所说的信号,表示查询和文档间关系的任意度量;更通用的名称叫做特征,但我个人更建议叫长期信号。原因之一是,信号是典型的独立于查询的——即该结果是通过度量某个关键词(或查询的某个部分)与文档的相关程度;某些是度量它们的关系。因此我们可以引入其他信号,包括查询特有的或者文档特有的,比如一篇文章的发表日期,或者一些从查询抽取出的实体(如“公司名称”)。
来看看上面的电影示例。你可能怀疑有2个依赖查询的信号能帮助预测相关度:
一个搜索关键词在标题属性中出现过多少次
一个搜索关键词在摘要属性中出现过多少次
扩展上面的评价,可能会得到如下CSV文件所示的回归训练集,把具体的信号值映射为等级:
grade,numTitleMatches,numOverviewMatches
4,1,1
0,0,0
3,0,3
1,0,1
你可以像线性回归一样应用回归流程,从而通过其他列来预测第一列。也可以在已有的搜索引擎像Solr或Elasticsearch之上来构建这样一个系统。
我回避了一个复杂问题,那就是:如何获得这些评价?如何知道一个文档对一个查询来说是好还是坏?理解用户分析?专家人工分析?这通常是最难解决的——而且是跟特定领域非常相关的!提出假设数据来建立模型虽然挺好的,但纯属做无用功!
线性回归LTR
如果你学过一些统计学,可能已经很熟悉线性回归了。线性回归把回归问题定义为一个简单的线性函数。比如,在LTR中我们把上文的第一信号(一个搜索关键词在标题属性中出现过多少次)叫做t,第二信号(一个搜索关键词在摘要属性中出现过多少次)叫做o,我们的模型能生成一个函数s,像下面这样对相关度来打分:
我们能评估出最佳拟合系数c0,c1,c2等,并使用最小二乘拟合的方法来预测我们的训练数据。这里就不赘述了,重点是我们能找到c0,c1,c2等来最小化实际等级g与预测值s(t,o)之间的误差。如果温习下线性代数,会发现这就像简单的矩阵数学。