机器学习在高德搜索建议中的应用优化实践

导读:高德的愿景是:链接真实世界,让出行更美好。为了实现愿景,咱们要处理好LBS大数据和用户之间的智能连接。信息检索是其中的关键技术,而搜索建议又是检索服务不可或缺的组成部分。前端

本文将主要介绍机器学习在高德搜索建议的具体应用,尤为是在模型优化方面进行的一些尝试,这些探索和实践都已历经验证,取得了不错的效果,而且为后来几年个性化、深度学习、向量索引的应用奠基了基础。算法

对搜索排序模块作重构session

搜索建议(suggest服务)是指:用户在输入框输入query的过程当中,为用户自动补全query或POI(Point of Interest,兴趣点,地理信息系统中能够是商铺、小区、公交站等地理位置标注信息),罗列出补全后的全部候选项,并进行智能排序。机器学习

咱们但愿经过suggest服务:智能提示,下降用户的输入成本。它的特色是:响应快、不承担复杂query的检索,能够把它理解为一个简化版的LBS领域信息检索服务。函数

和通用IR系统同样,suggest也分为doc(LBS中的doc即为POI)的召回和排序两个阶段。其中,排序阶段主要使用query和doc的文本相关性,以及doc自己的特征(weight、click),进行加权算分排序。学习

但随着业务的不断发展、特征规模愈来愈大,人工调参逐渐困难,基于规则的排序方式已经很可贵到满意的效果。这种状况下,为了解决业务问题,将不得不打上各类补丁,致使代码难以维护。测试

所以,咱们决定对排序模块进行重构,Learning to Rank无疑是一个好的选择。大数据

面临的挑战:样本构造、模型调优优化

Learning to Rank(LTR)是用机器学习的方法来解决检索系统中的排序问题。业界比较经常使用的模型是gbrank,loss方案用的最多的是pair wise,这里也保持一致。通常应用LTR解决实际问题,最重要的问题之一就是如何得到样本。设计

首先,高德地图天天的访问量巨大,这背后隐藏的候选POI更是一个天文数字,想要使用人工标注的方法去得到样本明显不现实。

其次,若是想要使用一些样本自动构造的方法,好比基于用户对POI的点击状况构建样本pair ,也会遇到以下的问题:

•容易出现点击过拟合,之前点击什么,之后都给什么结果。
•有时,用户点击行为也没法衡量真实满意度。
•suggest前端只展现排序top10结果,更多的结果没有机会展示给用户,天然没有点击。
•部分用户习惯本身输入完整query进行搜索,而不使用搜索建议的补全结果,统计不到这部分用户的需求。

对于这几个问题总结起来就是:无点击数据时,建模很迷茫。但就算有某个POI的点击,却也没法表明用户实际是满意的。

最后,在模型学习中,也面临了特征稀疏性的挑战。统计学习的目标是全局偏差的一个最小化。稀疏特征因为影响的样本较少,在全局上影响不大,经常被模型忽略。可是实际中一些中长尾case的解决却每每要依靠这些特征。所以,如何在模型学习过程当中进行调优是很重要。

系统建模过程详解

上一节,咱们描述了建模的两个难题,一个是样本如何构造,另外一个是模型学习如何调优。 先看下怎么解决样本构造难题,咱们解决方案是:

•考量用户在出行场景的行为session,不光看在suggest的某次点击行为,更重要的是,考察用户在出行场景下的行为序列。好比suggest给出搜索建议后,继续搜索的是什么词,出行的地点是去哪里,等等。

•不是统计某个query下的点击, 而是把session看做一个总体,用户在session最后的点击行为,会泛化到session中的全部query上。

详细方案
第一步,融合服务端多张日志表,包括搜索建议、搜索、导航等。接着,进行session的切分和清洗。最后,经过把输入session中,末尾query的点击计算到session中全部query上,以此知足实现用户输入session最短的优化目标。

以下图所示:

最终,抽取线上点击日志超过百万条的随机query,每条query召回前N条候选POI。利用上述样本构造方案,最终生成千万级别的有效样本做为gbrank的训练样本。

特征方面,主要考虑了4种建模需求,每种需求都有对应的特征设计方案:

•有多个召回链路,包括:不一样城市、拼音召回。所以,须要一种特征设计,解决不一样召回链路间的可比性。
•随着用户的不断输入,目标POI不是静态的,而是动态变化的。须要一种特征可以表示不一样query下的动态需求。
•低频长尾query,无点击等后验特征,须要补充先验特征。
•LBS服务,有很强的区域个性化需求。不一样区域用户的需求有很大不一样。为实现区域个性化,作到千域千面,首先利用geohash算法对地理空间进行分片,每一个分片都获得一串惟一的标识符。从而能够在这个标识符(分片)上分别统计特征。

详细的特征设计,以下表所示:

完成特征设计后,为了更好发挥特征的做用,进行必要的特征工程,包括尺度缩放、特征平滑、去position bias、归一化等。这里不作过多解释。

第一版模型,下掉全部规则,在测试集上MRR 有5个点左右的提高,但模型学习也存在一些问题,gbrank特征学习的很是不均匀。树节点分裂时只选择了少数特征,其余特征没有发挥做用。

以上就是前面提到的,建模的第二个难题:模型学习的调优问题。具体来讲就是如何解决gbrank特征选择不均匀的问题。接下来,咱们详细解释下。

先看下,模型的特征重要度。以下图所示:

通过分析,形成特征学习不均衡的缘由主要有:

•交叉特征query-click的缺失程度较高,60%的样本该特征值为0。该特征的树节点分裂收益较小,特征没法被选择。然而,事实上,在点击充分的状况下,query-click的点击比city-click更接近用户的真实意图。
•对于文本类似特征,虽然不会缺失,可是它的正逆序比较低,所以节点分裂收益也比city-click低,一样没法被选择。

综上,因为各类缘由,致使树模型学习过程当中,特征选择时,不停选择同一个特征(city-click)做为树节点,使得其余特征未起到应有的做用。解决这个问题,方案有两种:

•方法一:对稀疏特征的样本、低频query的样本进行过采样,从而增大分裂收益。优势是实现简单,但缺点也很明显:改变了样本的真实分布,而且过采样对全部特征生效,没法灵活的实现调整目标。咱们选择了方法二来解决。
•方法二: 调loss function。按两个样本的特征差值,修改负梯度(残差),从而修改该特征的下一轮分裂收益。例如,对于query-click特征非缺失的样本,学习错误时会产生loss,调loss就是给这个loss增长惩罚项loss_diff。随着loss的增长,下一棵树的分裂收益随之增长,这时query-click特征被选做分裂节点的几率就增长了。

具体的计算公式以下式:

以上公式是交叉熵损失函数的负梯度,loss_diff 至关于对sigmod函数的一个平移。

差值越大,loss_diff越大,惩罚力度越大,相应的下一轮迭代该特征的分裂收益也就越大。

调loss后,从新训练模型,测试集MRR在第一版模型的基础又提高了2个点。同时历史排序case的解决比例从40%提高到70%,效果明显。

写在最后
Learning to Rank技术在高德搜索建议应用后,使系统摆脱了策略耦合、依靠补丁的规则排序方式,取得了明显的效果收益。gbrank模型上线后,效果基本覆盖了各频次query的排序需求。

目前,咱们已经完成了人群个性化、个体个性化的建模上线,而且正在积极推动深度学习、向量索引、用户行为序列预测在高德搜索建议上的应用。


原文连接 本文为云栖社区原创内容,未经容许不得转载。

相关文章
相关标签/搜索