在Elasticsearch中应用机器学习排序LTR

众所周知,机器学习正在重构很多行业。搜索领域同样如此,很多公司竭尽全力通过手动调优搜索相关度来实现非常微小的改进;更成熟的搜索团队则希望进一步超越已经“足够好”的人工优化,从而构建更加智能的、自学习的搜索系统。

因此,我们很激动地发布了Elasticsearch的LTR(Learning to Rank,机器学习排序)插件。什么是LTR?一个团队可以通过LTR训练一个机器学习模型,来学习用户认为什么是最相关的。

实现LTR时需要做到:

通过分析来衡量用户所反馈的相关度,并构建一个评价列表,将文档分级为精确相关的、模糊相关的和无关的,并用于查询。

猜想哪些特征可能有助于相关度预测,比如特定属性匹配程度的TF-IDF相关度、新颖性,以及搜索用户的个性化特征等。

训练一个模型,将这些特征准确无误地映射到一个相关性得分上。

部署该模型到你的搜索基础设施中,在线上环境中使用它来对搜索结果排序。

不要自欺欺人:这些步骤里面的每一个都是非常复杂和困难的技术或非技术问题,并没有什么所谓的银弹。就像我们在《相关性搜索》一书中提到的,搜索结果的人工调优与一个好的机器学习排序算法面对着许多相同的挑战。我们会在今后的博客文章中探讨更多关于成熟的机器学习排序解决方案会面临的许多基础设施、技术性及非技术性挑战的内容。

本文中介绍的是我们如何把LTR集成到了Elasticsearch。几乎在每一个关于相关性的咨询案例中客户都会问我们,这项技术是否可以帮助到他们。在Solr中要感谢Bloomberg给出了一个明确的路径来达到目的,而Elasticsearch中并没有。在为搜索技术栈做技术选型时,很多客户看重Elasticsearch与时俱进的高效特性,但同时也发现缺少了这个关键性的特性。

实际上Elasticsearch查询语句能够通过其强大的能力和复杂的结构来对结果进行排序。一个技能娴熟的相关度工程师能使用查询语句来计算多种可能涉及信号相关度的查询时特征,并定量地回答以下问题:

搜索的词项在标题中被提及多少次?

文章/电影/其他已经发布多久了?

文档是如何与用户的浏览行为关联的?

产品比买家的预期昂贵多少?

用户的检索词项与文章的标题在概念上有多相关?

 

在搜索引擎中这些特征很多都不是文档的静态属性,相反地它们依赖于查询——它们度量用户或用户的查询与一个文档之间的关联关系。对于《相关性搜索》的读者,这便是我们在该书中所说的信号。

所以现在问题变成了,如何才能把机器学习的能力与已有的Elasticsearch Query DSL查询语言的能力结合起来?这恰恰就是我们的插件所做的事情:把Elasticsearch查询语言所构造的查询作为特征输入到一个机器学习模型中。

工作原理 长话短说

该插件集成了RankLib和Elasticsearch。RankLib有一个输入文件作为评价依据,并输出一个模型,该模型是内置的可阅读格式。接下来RankLib可通过编程或命令行来训练模型。一旦有了模型,Elasticsearch插件就会包含以下内容:

一个自定义的Elasticsearch脚本语言,叫做ranklib,它把RankLib生成的模型作为一个Elasticsearch脚本

一个自定义的LTR查询,它输入一个包含Query DSL查询(那些特征)、一个模型名称(就是第一步中上传的模型)和打分结果的列表

由于LTR模型的实现成本很高,人们几乎不会直接使用LTR查询,而是对结果的Top N重新打分,比如:

{ "query": {/*a simple base query goes here*/}, "rescore": { "window_size": 100, "query": { "rescore_query": { "ltr": { "model": { "stored": "dummy" }, "features": [{ "match": { "title": <users keyword search> } } ... 更多重要细节:来看看这个完整的LTR函数示例的强大之处吧!

你可以在项目脚本目录里仔细研究下这个功能完整的示例。这是一个严谨的示例,使用了TMDB数据库中的电影人工评分数据。我创建了一个Elasticsearch索引叫TMDB,用来执行查询,并通过命令行训练了一个RankLib模型。接下来把模型保存在Elasticsearch中,并提供一个脚本通过改模型来实现检索。

千万别被这个简单的例子给误导了。实践中一个真正的LTR解决方案有着非常大量的工作要做,包括用户研究、分析处理、数据工程以及特征工程等。这样说并不是为了吓唬你,因为付出是值得的,想想你的投入回报吧。小规模团队使用手工调优的ROI可能会获得更好的结果。

训练并加载LTR模型

现在使用我手工创建的迷你评价列表,来演示下如何训练一个模型。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/856bfe50b5faa87316b980abaffd104e.html