转自:infoQ
全球性的搜索引擎 Google,看似简单的搜索框背后隐藏的是极其复杂的系统架构和搜索算法,其中排序(以下统称 Ranking)的架构和算法更是关键部分。Google 正是通过 PageRank 算法深刻改变搜索排序而一举击败众多竞争对手。本文将介绍有关搜索引擎排序的相关技术内容。
Ranking 是搜索引擎的核心技术,本文以搜索引擎的 Ranking 技术为切入点,从搜索引擎架构、检索模型、机器学习算法、点击模型、搜索效果评估等方面将达观数据在搜索引擎 Ranking 的构建与优化过程中的一些实践经验与大家做分享。
通常在线搜索引擎要求实时响应(毫秒级)用户的搜索请求,使得在线对每个文档进行基于模型的 Ranking 复杂计算不太现实,因而搜索的过程被分成两个阶段。
第一阶段,是使用相对简单的常用检索模型对用户 query 从索引中快速检索出 Top-k 候选结果集。常用检索模型主要有向量空间模型 (Vector Space Model)、布尔模型 (Boolean Model)、概率检索模型 BM25 等,通常 Top-k 的候选集选取还结合离线计算质量分高的文档以排除掉文本相关但质量分太低的文档;
第二阶段,则使用计算相对复杂的机器学习排序模型对 Top-k 候选结果集进行精确的重排序,因为 Top-K 的候选结果集数据量级一般不会很大,这一步计算可控。
图 1:一个经典的搜索引擎排序架构
Ranking 模型的训练数据主要由 query、文档以及 query 与文档的相关度组成,相关度可以标记成好、不好两个级别或细粒度更高的 Perfect、Excellent、Good、Fair、Bad 五个级别。
训练数据主要有两种获取方式:方式一是由搜索评测人员标记 query 与每个文档的相关度进行手工的评测整理;方式二是通过自动分析搜索点击日志生成。显然,对于大规模机器学习排序模型的训练数据人工标注的成本过高,而且人工也无法对模型进行相对实时的更新。我们(www.datagrand.com)主要通过方式二生成训练数据,自动分析搜索点击日志,分析用户在同一个搜索 session 内对 query 的各种变换、对搜索结果中不同位置的文档的点击行为以及后继的筛选、翻页等行为,综合计算出一个可以标记训练数据的搜索满意度得分。
我们的搜索实践表明,通过分析搜索点击日志可以实现模型训练数据的自动生成和实时更新,同时也可以达到比较满意的搜索效果。
图 2 达观搜索引擎架构
搜索引擎架构从底往上分别是分布式数据存储层、索引构建与模型训练层、索引数据与模型数据分发层、搜索核心层、开放接口层,同时系统架构还支持搜索引擎的索引配置和 Ranking 策略配置、以及搜索分析与效果评估。
搜索核心层是由 query 分析引擎、索引引擎、Ranking 引擎构成。其中 query 分析引擎(QUERY ANALYSIS ENGINE)负责对用户的 query 进行语义分析和意图识别,包括 query 分词、中心词提取、query 纠错、query 自动提示、query 扩展等。索引引擎(INDEX ENGINE)执行 Top-k 候选结果选取,这里我们综合考虑了检索模型的搜索相关性评分和文档的静态质量分(离线计算),另外在这一层还根据用户的筛选条件以及业务层面的搜索结果配置进行了搜索结果的筛选和融合。排序引擎(RANKING ENGINE)利用机器学习模型对 Top-k 的候选集执行第二轮的精确排序。RANKING ENGINE 内置一个算法插件框架,可以根据用户配置的搜索排序策略加载相应的排序算法插件以及排序算法模型,同时还支持用户对搜索流量划分到不同的排序算法插件,以实现多个算法策略的同时在线 A/B testing 对比。
常见的检索模型主要有布尔模型 (Boolean Model)、向量空间模型 (Vector Space Model)、概率检索模型 BM25 与 BM25F。
布尔(Boolean)模型是基于集合论和布尔代数的一种简单检索模型。它的特点是查找那些对于某个查询词返回为“真”的文档。在该模型中,一个查询词就是一个布尔表达式,包括关键词以及逻辑运算符。通过布尔表达式,可以表达用户希望文档所具有的特征。由于集合的定义是非常直观的,Boolean 模型提供了一个信息检索系统用户容易掌握的框架。查询串通常以语义精确的布尔表达式的方式输入。
布尔模型的主要优点是直观和简单,缺陷在于完全匹配会导致被返回的结果文档太多或者太少。
VSM 概念简单,即把对文本内容的处理简化为向量空间中的向量运算,并且它以空间上的相似度表达语义的相似度,直观易懂。当文档被表示为文档空间的向量,就可以通过计算向量之间的相似性来度量文档间的相似性。文本处理中最常用的相似性度量方式是余弦距离。
向量空间模型中通常采用 TF* IDF 的方式计算权重。Wij = TFij * IDFij 表示 termi 在文档 dj 的权重,Wiq = TFiq * IDFiq 表示 termi 在 query q 中的权重。
VSM 的优点:
1) 对 term 的权重的计算可以通过对 term 出现频率的统计方法自动完成,使问题的复杂性大为降;
2) 支持部分匹配和近似匹配,并可以根据 query 和文档之间的相似度对结果进行排序。
VSM 缺点:
1) 基于 term 之间的独立性假设,也即权重计算没有考虑 term 之间的位置关系,也没有考虑 term 的长度对权重的影响;
2) 计算量大。新文档加入需要重新计算 term 的权重。
概率统计检索模型 (Probabilistic Retrieval Model) 是另一种普遍使用的信息检索算法模型,它应用文档与查询相关的概率来计算文档与查询的相似度。
词汇独立性假设: 文档里面出现的词没有任何关联,这样一个文档的出现就可以转为各个单词出现概率的乘积。
对于同时出现查询 qi 以及文档 di 的时候,对 qi 在 di 中出现的单词进行“相关文档 / 不相关文档”统计,即可得到查询与文档的相关性估计值
其中:
N 表示是文档集中总的文档数;
R 表示与 query 相关的文档数;
ri 表示与 query 相关的文档中含有的第 i 个 term 文档个数;
ni 表示含有的第 i 个 term 文档总数;
0.5 是平滑因子,避免出现 log(0)。
BM25 模型在 BIM 模型的基础上考虑了查询词在 Query 以及 Doc 中的权重,并通过实验引入了一些经验参数。BM25 模型是目前最成功的内容排序模型。
改进之后的 BM25 模型的拟合公式如下:
公式的第 1 部分同 BIM 独立模型,公式的第 2 部分是查询词的 term 在 Doc 中的权重,第 3 部分是查询词的 term 在查询本身的权重。
fi 表示 term 在 D 中的词频,K 因子表示文档长度的考虑,其计算公式为:
其中:
k1 为经验参数, k1 一般设置为 1.2;
b 为调节因子,将 b 设为 0 时,文档长度因素将不起作用,经验表明一般 b=0.75;
dl 代表当前文档的长度;
avdl 代表所有文档的平均长度;
qfi 表示在查询中的词频,k2 也为调节因子,因为在短查询下这部分一般为 1,为了放大这部分的差异,k2 一般取值为 0~1000。
综上所述,BM25 模型结合了 BIM 因子、文档长度、文档词频和查询词频进行公式融合,并利用 k1,k2,b 对各种因子进行权重的调整。
BM25F 模型对 BM25 模型的改进之处在于考虑了文档不同区域的加权统计,例如文档的标题和描述被赋予了不同的区域权重,在各个不同区域分别统计词频。
BM25F 模型的计算公式为:
其中:
文档 D 来自不同的 u 个域;
各个域对应的全总为 Wk;
fui 表示词频;
Bu 表示各个域的长度;
ulu 为域的实际长度,uvulu 表示域的平均长度;
bu 为各个域长度的调节因子。
每种检索模型各有千秋,适用不同的场景和应用。布尔模型、空间向量模型、概率模型等传统检索模型的排序方法一般通过构造相关性函数实现,然后按照相关性进行排序。检索模型尤其概率模型比较适用于内容相关性排序,但内容相关性一般仅考虑 query 和 doc 的 tf,idf,dl,avdl 等因素,很难融合点击反馈、文档质量分、点击模型等更多的排序因素。一个大型搜索引擎排序因子往往多达数十个乃至上百个(Google 搜索排序因子超过 200 个),如果模型中参数过多,调参会变得非常困难,也很容易导致过拟合现象。
但正如前文所述,搜索引擎需要快速响应用户搜索请求,无法在毫秒级时间内对每一个召回结果进行精确的机器学习排序,业界的主流的做法是首先进行第一轮的 Top-k 选取再对 Top-k 结果进行第二轮的精确重排序。传统检索模型尤其概率模型比较适用于文本内容相关性排序,能够满足快速获取 Top-k 候选结果集的需求。达观数据(www.datagrand.com)搜索在第一轮 Top-k 选取中选用的是 BM25F 检索模型。BM25F 模型相比 BM25 模型考虑了文档不同区域的加权统计,可以获得更好的文本相关性,是目前最优的文本检索模型。
机器学习排序(Machine Learning to rank)方法很容易融合多种特征,且有成熟深厚的数学理论基础,通过迭代优化参数,对于数据稀疏、过拟合等问题也有比较成熟的理论和实践。
机器学习排序系统一般分为离线学习系统和在线预测排序系统。离线系统的设计需要靠特征的选择、训练集的标注、MLR 方法的选定、确定损失函数、以最小化损失函数为目标进行优化,以获取排序模型的相关参数。在线预测排序系统将待预测结果输入到机器学习得到的排序模型,即可得到结果的相关性得分,进而依据相关性得分得到搜素结果的最终排序。
排序模型的选择直接影响在线预测的效果。在类似电商时效性强的应用场景中,业务上经常需要根据商品库存、价格等变化及时调整排序结果,由于排序模型的高度复杂性,人工干预只能做局部小范围的调整,更多的还是要对模型进行实时的自动化更新。
对于这个问题,我们在实践中总结出了一个在线 - 近线 - 离线的三层系统架构,即 Online-Nearline-Offline(在线 - 近线 - 离线)三层混合机制。离线系统负责 day 级全量训练数据的学习、近线系统负责 hour 级模型的学习与更新、在线系统负责 minut 级的准实时反馈数据的学习与模型的更新。
特征是算法、模型的养料之源。特征选择的好坏直接关系到算法训练学习出的模型的效果。与传统的文本分类不同,MLR 输出的是给定 query 的文档集合的排序,不仅要考虑文档自身的特征,还要考虑 query 与文档关联关系的特征。综合来说,MLR 需要考虑三个方面的特征:
1) 文档本身的静态特征,包括文档的文本特征,如带权重的词向量,文档不同域(主标题、段落标题、描述内容、锚文本、URL 链接等)的 TF、IDF、BM25 和其他语言模型得分,也包括文档的质量分、网页文档的 PageRank 等重要性得分。关于文档的质量分,达观搜索根据不同的业务场景有不同的计算指标,比如电商相关的商品的质量分计算除了要考虑商品本身的文本与图片丰富度,更多的还要考虑商品的各种业务指标如销量变化、收藏、价格、库存、类别、上架时间、评论、商家信誉等级、是否作弊等,而媒体相关的文章的则需要考虑阅读数、转发数、赞数、收藏、评论、发文时间、主题类型等。
2) 文档和 query 关联的特征,比如 query 对应文档的 TD-IDF score, BM25 score 等。
3) query 本身的特征,比如文本特征,带权重的词向量,query 长度,query 所述的分类或主题,query 的 BM25 的 sum/avg/min/max/median 分数,query 上个月的热度等。
在 query 与文档的特征工程中,除了从词法上分析,还需要从“被阐述”的词法所“真正想表达”的语义即概念上进行分析提取。比如一词多义,同义词和近义词,不同的场景下同一个词表达不同的意思,不同场景下不同的词也可能表达相同的意思。LSA(隐语义分析)是处理这类问题的著名技术,其主要思想是映射高维向量空间到低维的潜在语义空间或概念空间,也即进行降维。具体做法是将词项文档矩阵做奇异值分解(SVD)
其中:
C 是以文档为行,词项 terms 为列的矩阵(假设 M x N),元素为 term 的 tf-idf 值。C 被分解成 3 个小矩阵相乘;
U 的每一列表示一个主题,其中的每个非零元素表示一个主题与一篇文章的相关性,数值越大越相关;
V 表示 keyword 与所有 term 的相关性;
∑ 表示文章主题和 keyword 之间的相关性。
MLR 一般来说有三类方法:单文档方法(Pointwise),文档对方法(Pairwise),文档列表方法(Listwise)。
Pointwise 把文档当成单个的点分别进行计算,实际上把一个 Ranking 问题转化成二值分类问题、回归问题或多值分类问题。Query 与文档之间的相关度作为 label,label 一般划分为: {Perfect, Excellent, Good, Fair, Bad} 。
Pointwise 方法主要包括:Pranking (NIPS 2002), OAP-BPM (EMCL 2003), Ranking with Large Margin Principles (NIPS 2002), Constraint Ordinal Regression (ICML 2005)
Pointwise 的不足之处:
Pointwise 使用传统的分类,回归或者 Ordinal Regression 来对给定 query 下的单个文档的相关度进行建模,没有文档位置对排序结果的影响,而回归和分类的损失函数会尽量拟合所有的数据,算法为了整体损失最小,有可能把排在前面的文档的损失变得更大,或者把排在后面的文档的损失变得更小,从而导致排序难以取得良好的效果。
在 Pairwise 中 query 与文档对 <di, dj> 结合,假设在同一 Query 下,di 的相关性大于 dj,那么我们可以把 di-dj 标记为 +1,dj-di 标记为 -1,从而可以把原问题转换为一个分类或回归问题。
Pairwise 方法主要包括:Ranking SVM (ICANN 1999), RankBoost (JMLR 2003), LDM (SIGIR 2005), RankNet (ICML 2005), Frank (SIGIR 2007), GBRank (SIGIR 2007), QBRank (NIPS 2007), MPRank (ICML 2007), IRSVM (SIGIR 2006) 。
Pairwise 的不足:
1) 文档较多时,pair 的数目是平方级增长的,计算量太大;
2) Pair 对不同级别之间的区分度一致对待,没有对排在前面的结果作更好的区分。对于搜索引擎而言,用户更倾向于点击前几页的结果;
3) 相关文档集大小带来模型的偏置。如果一个 query 下文档远多于另一 query, 支持向量就会向该 query 偏置,导致分类器对后者区分不好。
Listwise 的输入是 query 对应的一个文档列表,计算每个 query 对应的文档列表的得分。
Listwise 有一种基于文档排列的概率分布进行训练的方法,通过对训练实例的训练找到一个最优的打分函数 f, 使得 f 对 query 的打分结果的概率分布与训练数据的实际排序尽可能相同。损失是按照训练数据的实际排序概率分布与模型输出的概率分布之间的 KL 距离来度量的。
Listwise 算法主要包括:LambdaRank (NIPS 2006), AdaRank (SIGIR 2007), SVM-MAP (SIGIR 2007), SoftRank (LR4IR 2007), GPRank (LR4IR 2007), CCA (SIGIR 2007), RankCosine (IP&M 2007), ListNet (ICML 2007), ListMLE (ICML 2008),p-ListMLE 。
相比于 Pointwise 和 Pairwise 方法,Listwise 方法直接优化给定查询下整个文档集合的序列,所以比较好的解决了以上算法的缺陷。Listwise 方法中的 LambdaMART(是对 RankNet 和 LambdaRank 的改进) 在 Yahoo Learning to Rank Challenge 表现出最好的性能。
我们在搜索排序中使用了一种 position-aware ListMLE(p-ListMLE) 的算法,ListMLE 考虑了排序位置信息,但没有对不同位置的重要程度进行区分。达观搜索的实践显示同样的条件下 p-ListMLE 的搜索效果指标 nDCG 要优于 ListMLE.
我们在排序实践中还发现 MLR 无法充分利用用户对搜索结果的点击反馈。俗话说群众的眼睛是雪亮的,用户对不同位置的搜索结果的点击行为直接反应了搜索结果的好坏。我们根据用户的历史点击记录生成了点击模型,通过点击模型对 MLR 的结果再进行一次调整。
点击模型又称为点击调权,搜索引擎根据用户对搜索结果的点击,可以挖掘出哪些结果更符合查询的需求。点击模型基于如下基本假设:
1) 用户的浏览顺序是从上至下的。
2) 需求满足好的结果,整体点击率一定高。
3) 同一个 query 下,用户点击的最后一个结果之后的结果,可以假设用户已经不会去查看了 (一定程度上减弱了位置偏见)。
4) 用户进行了翻页操作,或者有效的 query 变换,则可以认为前页的结果用户都浏览过,并且不太满意。
5) 用户点击的结果,如果引发后继的转化行为(比如电商搜索中的加购物车),则更有可能是用户满意的结果。
点击模型日志:
图 4 点击模型(日志收集)
达观搜索中 MLR 算法优化 + 点击模型对结果调权后搜索效果的显著提升。
图 5 达观数据搜索上线前后的效果对比
搜索引擎的排序是一个复杂的过程,特征的选择、算法的变化、模型的更新都会导致排序结果的变化。那如何衡量一个排序结果的好坏呢?MLR 是用机器学习的方法来进行排序,所以评价 MLR 效果的指标就是评价排序的指标,主要包括一下几种:
1) WTA(Winners take all) 对于给定的查询 q,如果模型返回的结果列表中,第一个文档是相关的,则 WTA(q)=1,否则为 0.
2) MRR(Mean Reciprocal Rank) 对于给定查询 q,如果第一个相关的文档位置是 R(q),则 MRR(q)=1/R(q)。
3) MAP(Mean Average Precision) 对于每个真实相关的文档 d,考虑其在模型排序结果中的位置 P(d),统计该位置之前文档集合的分类准确率,取所有这些准确率的平均值。
4) NDCG(Normalized Discounted Cumulative Gain) 是一种综合考虑模型排序结果和真实序列之间关系的一种指标,也是最常用的衡量排序结果指标,详见 Wikipedia。
使用评价指标主要有手工标注答案和自动化评估两种。手工标注方式既费时费力,又无法及时进行评估效果反馈。自动化评估方式对提高评估效率十分重要。最常用的自动评估方法是 A/B testing 系统。
A/B testing 系统将用户的流量在算法模型 A/B 之间进行分配,即将通过用户的分组号 (bucket id) 将用户流量分别导入不同的算法分支,用户在不同算法分支的行为连同分组号被记录下来,后台分析系统分析这些行为数据可以生成一系列对比指标,通过这些指标可以直观的分析算法模型优劣。
本文从搜索引擎排序的架构、检索模型、机器学习排序模型与算法到搜索效果评估,全面介绍了达观搜索引擎排序实践方面的一些经验。
桂洪冠,达观数据(www.datagrand.com)联合创始人 & 技术副总裁,中国计算机学会(CCF)会员。曾服务于阿里、盛大、腾讯几家公司,任腾讯文学、盛大文学数据中心高级研究员、阿里搜索技术专家等职务,主要负责搜索与广告团队。
感谢杜小芳对本文的审校。