一季度净值型理财产品发行量同比增长66.46%,
06-18
前段时间流行的《天才基本法》,男女主角利用贝叶斯网络寻找最有可能发生事故的地点。当我们进行搜索优化时,我们也可以使用类似的方法来找到可以使返回结果最相关的搜索参数组合。
有多种方法可以使用 Elasticsearch Query DSL 来解决构建全文搜索体验(例如常见问题解答搜索或 wiki 搜索)时的挑战。对于全文搜索,我们的武器库中有许多可用选项,从最简单的匹配查询到强大的间隔查询。
同时,不仅仅是查询类型的选择,还可以通过调整参数列表来获得优化。虽然Elasticsearch为查询参数使用了良好的默认值,但为了提高相关性,我们可以根据底层索引(语料库)中的文档以及用户在搜索时使用的查询字符串的特定类型来改进这些参数的使用。
为了完成此任务,本文将指导您按照结构化和客观的流程完成优化查询的步骤和技术。在开始之前,让我们考虑一下这个 multi_match 查询示例,该示例在文档的两个字段上搜索查询字符串: 代码语言:javascript Copy GET /_search { "query": { "multi_match": { "query": " this is a test", "fields": [ "subject^3", "message" ] } } }这里,我们使用 field boost 参数来指定在 subject 字段上的匹配分数应该提升并乘以三倍。
我们这样做是为了提高查询的整体相关性——对查询最有意义的文档应该在可能的结果中排名最高。但是我们如何选择合适的boost值呢?当我们面对的不仅仅是两个字段,而是十多个字段时,我们应该如何设置boost参数呢?相关性调整的过程就是了解这些不同参数的影响的过程。
在您可以调整和调整的所有参数中,您应该尝试哪些参数、使用哪些值以及以什么顺序?虽然不应忽视对评分和相关性调整的深入理解,但我们如何采取更有原则的方法来优化查询?我们是否可以使用来自用户点击或明确反馈(例如,对结果的赞成或反对)的数据来驱动对查询参数的调整以提高搜索相关性?我们可以,所以让我们开始吧!为了配合这篇博文,我们整理了一些示例代码和 Jupyter Notebook,以引导您完成使用下面概述的技术优化查询的步骤。首先阅读本文,然后转到代码并查看所有运行部分。
截至撰写本文时,我们正在使用 Elasticsearch 7.10,并且一切都应该适用于任何 Elasticsearch 许可证。 MS MARCO简介为了更好地解释查询参数调优的原理和效果,我们将使用一个名为MS MARCO的公共数据集。
MS MARCO 数据集是由 Microsoft Research 策划的大型数据集,其中包含从网络上抓取的 10,000 个文档以及来自真实 Bing 网络搜索查询的 10,000 多个查询。 MS MARCO 有多个子数据集和相关挑战,因此我们将在本文中特别关注文档排名挑战,因为它最适合传统的搜索体验。
面临的挑战是如何有效地为 MS MARCO 数据集中选定的一组查询提供最佳相关性排名。该挑战向公众开放,任何研究人员或从业者都可以通过提交自己的尝试来参与,以得出一组查询的最佳相关性排名。
在本文后面,您将看到我们使用此处概述的技术所取得的成果。目前的提交排名可以查看官方排行榜。
数据集和工具 现在我们有了通过调整查询参数来提高相关性的粗略目标,让我们看看我们将使用的工具和数据集。首先,让我们更正式地描述我们想要实现的目标和我们需要的数据。
输入:语料库(索引中的文档) 带参数的搜索查询 相关数据的标记集 衡量相关性的指标 输出:最大化所选指标的查询参数值 相关数据的标记集 现在您可能会想, “等等,等等,带标签的相关数据集到底是什么?我在哪里可以获得?”简而言之,带标签的相关数据集是一组带有相关级别标签的查询结果。下面是一个只有一个查询的非常小的数据集示例: 代码语言:javascript Copy { "id": "query1", "value": "tuning Elasticsearch for相关性", "results": [ { "rank" : 1, "id": "doc2", "label_id": 2, "label": "相关" }, { "rank": 2, "id": "doc1", "label_id": 3, "label" : "非常相关" }, { "rank": 3, "id": "doc8", "label_id": 0, "label": "不相关" }, { "rank": 4, "id": " doc7 ", "label_id": 1, "label": "相关" }, { "rank": 5, "id": "doc3", "label_id": 3, "label": "非常相关" } ]} 在在这个例子中,我们用每个文档的相关性强度来标记它。
(3) 非常相关,(2) 相关,(1) 相关,(0) 不相关。这些标签是任意的,你可以选择不同的尺度,但是上面的四个标签是很常见的。
获得这些标签的一种方法是通过人类判断。一群人可以查看您的搜索查询历史记录并为每个结果提供标签。
这可能非常耗时,因此许多人选择直接从用户那里收集这些数据。他们记录用户点击并使用点击模型将点击活动转换为相关性标签。
这个过程的细节远远超出了本博文的范围,但请看一下关于点击模型的介绍和研究(附录:1、2、3)。一个好的开始是收集点击事件进行分析,一旦有了足够的用户行为数据,就可以查看点击建模。
请查看另一篇博客文章使用 Elasticsearch 和 Elastic Stack 分析在线搜索相关性指标以了解更多信息。 MS MARCO 文档数据集 正如简介中所讨论的,出于演示目的,我们将使用 MS MARCO 排名挑战的文档和相关数据集,其中包含我们需要的一切:语料库和标记的相关数据集。
MS MARCO 最初是为了对问答 (Q&A) 系统进行基准测试而构建的,数据集中的所有查询实际上都是某种形式的问题。例如,您不会找到任何看起来像“规则冠军联赛”等典型关键字查询的查询。
相反,您会看到诸如“欧洲冠军联赛的足球规则是什么?”之类的查询字符串。由于这是一个问答数据集,因此标记的相关数据集看起来也有点不同。
由于问题通常只有一个最佳答案,因此结果要么具有“相关”标签 (1),要么根本没有。该文档非常简单,仅包含三个字段:url、title 和 body。
以下是文档的示例(片段): 代码 语言:文本 副本编号:D 网站:Answers.com? Wiki Answers? 类别 历史、政治和社会历史 战争和军事史 第二次世界大战 <片段> 这是战争 两个最秘密的项目(密码工作是第一个)。这是战争中最优先的项目,其代号为“白银”,凌驾于所有其他战时优先事项之上。
花了 2 美元,,,$。
编辑 Pat Shea 3,战争和军事史中的贡献回答曼哈顿计划的秘密项目是什么?曼哈顿计划是第二次世界大战期间制造第一个核武器——原子弹的计划的代号。正如您所看到的,文档已被处理并且 HTML 标记已被删除,但它们有时可能包含各种元数据。
正如我们在上面看到的,对于用户生成的内容尤其如此。衡量搜索相关性我们在这篇博文中的目标是建立一种系统方法来调整查询参数,以提高搜索结果的相关性。
为了衡量我们实现这一目标的程度,我们需要定义一个指标来捕获给定搜索查询的结果满足用户需求的程度。换句话说,我们需要一种方法来衡量相关性。
幸运的是,我们已经在 Elasticsearch 中为此提供了一个工具,称为排名评估 API。该 API 允许我们获取上述数据集并计算许多搜索相关性指标之一。
为了实现这一点,API 对标记的相关性数据集执行查询,并将每个查询的结果与标记的结果进行比较,以计算相关性指标,例如精度、召回率或平均倒数排名 (_mean reciprocalrank,_MRR)。在我们的例子中,MS MARCO 文档排名挑战选择了先前结果 (MRR@) 的平均倒数排名 (MRR) 作为相关性度量。
这对于问答数据集是有意义的,因为 MRR 只关心结果集中第一个正确答案的排名。它是使用排名的倒数(1 / 排名)计算的,并对所有查询进行平均。
(即对于一个标记文档,如果是返回结果中的第一个结果,则得分为1,如果是第二个匹配,则得分为0.5,如果是第n个匹配,则得分为1/n ,如果没有匹配的句子,则得分为 0 ,最终得分为所有得分之和) MRR 公式 通过下图,我们可以直观地了解: MRR 计算示例搜索模板 现在我们已经确定了如何计算借助排名评估 API 来衡量相关性,接下来,我们需要了解如何修改查询参数以允许我们尝试不同的值。回想一下介绍中的基本示例,我们如何在字段 multi_match 上设置主题字段的 boost 值: 代码语言:javascript Copy GET /_search { "query": { "multi_match": { "query": "this is a test" , "fields": [ "subject^3", "message" ] } } } 当我们使用排名评估 API 时,我们会指定指标、标记的相关性数据集以及用于每个查询模板的可选搜索。
下面描述的方法实际上非常强大,因为我们可以依赖搜索模板。事实上,我们可以将搜索模板中可以参数化的任何内容转换为可以优化的参数。
这是另一个 multi_match 查询,但使用 MS MARCO 文档数据集中的真实字段并为每个查询设置 boost 参数: 代码语言:javascript Copy { "query": { "multi_match": { "query": "{{ query_string} }", "fields": [ "url^{{url_boost}}", "title^{{title_boost}}", "body^{{body_boost}}" ] } } } 当我们运行排名评估 API 时,每次我们想要测试新的参数值时,query_string 将被替换,并且这些 boost 参数将被设置。同样,如果您使用具有不同参数的查询(例如tie_breaker),则可以使用相同的模板来修改参数。
(有关更多详细信息,请参阅搜索模板文档) 参数优化 接下来,我们将把所有这些部分放在一起。我们已经了解了每个必要的组件: 语料库标记数据集 用于测量相关性的指标 带参数的搜索模板 对于此示例,我们将使用 Python 脚本将其全部拼接在一起,以向排名评估 API 提交请求并编排工作流程。
工作流程非常简单:向排名评估 API 提交带有参数值的调用进行尝试,获取指标分数 (MRR@),记录产生该指标分数的参数值,并通过选择迭代尝试新的参数值。最后,我们返回产生最佳指标分数的参数值。
此工作流程是一个参数优化过程,我们寻找一组最大化指标分数的参数。参数优化工作流程 在图 3 的工作流程中,我们可以看到所有数据集和工具的位置,排名评估 API 占据中心位置来运行查询并通过提供的指标衡量相关性。
我们唯一没有涉及的是如何选择在每次迭代中尝试哪些参数值。在接下来的部分中,我们将讨论选择参数值的两种不同方法:网格搜索和贝叶斯优化。
不过,在讨论方法之前,我们需要先介绍一下参数空间的概念。参数空间 当我们谈论参数(例如,上面的示例中:url_boost、title_boost 或 body_boost)以及它们可以采用的可能值时,我们使用术语“参数空间”。
参数空间是指所有参数组合的可能值的世界。在参数优化(选择最大化某些指标或分数的参数值)的背景下,搜索参数是我们的自变量,相关性指标是我们的因变量。
我们举一个简单的例子,大小为2的参数空间或者参数为x和y的二维参数空间。由于我们只有二维,因此我们可以轻松地将参数空间绘制为三维。
在本例中,我们使用等高线图,其中第三个维度(颜色梯度)表示相关性度量得分。颜色渐变从蓝色(最低指标分数)到黄色(越高越好) 参数空间等高线图 网格搜索 为了生成我们在上面看到的图,我们使用两个参数的所有可能性 排名调用排名评估 API 并存储每次返回的相关性指数得分。
在伪代码中,它可能如下所示: 代码语言:javascript Copy for x in [1, 2, 3, 4, 5]: for y in [1, 2, 3, 4, 5]: params = { 'x' : x, 'y': y} Score =rank_eval(search_template,relevance_data,metric,params) 然后,这个双循环将生成一个相关性度量分数表: 代码语言:javascript 复制 1 2 3 4 5 5: 0 5 7 3 0 4: 5 7 9 7 5 3: 0 7 9 10 4 2: 0 5 7 9 0 1: 0 2 6 5 2参数空间如图4所示,其中x和y的大小范围为5,这意味着我们调用排名评估API 25(5*5)次。如果我们将每个参数范围的大小加倍到 10,我们将得到大小为 (10*10) 的参数空间。
如果我们增加参数的数量,比如 z 维度,但保持范围相同,我们会得到更多的排名评估 API 执行次数: : 次 (5*5*5)。当参数空间较小时,网格搜索是一个不错的选择,因为它是详尽的 - 它测试所有可能的组合。
然而,由于对于具有高基数的参数,对排名评估 API 的调用次数有时会呈指数增长,因此网格搜索变得不切实际,因为它可能会将优化查询所需的时间增加到数小时。甚至好几天。
请记住,调用排名评估 API 时,它将执行数据集中的所有查询。这可能需要在每次调用上运行数百或数千个查询,即使在大型 Elasticsearch 集群上处理大型语料库或复杂的搜索查询,这也可能非常耗时。
贝叶斯优化一种计算效率更高的参数优化方法是贝叶斯优化。贝叶斯优化不是像网格搜索中那样尝试所有可能的参数值组合,而是根据先前的相关性度量分数来决定下一步要尝试哪些参数值。
贝叶斯优化将寻找尚未见过但看起来可能包含更好相关性度量分数的参数空间区域。以下面的参数空间为例。
带有测量参数标记的参数空间等值线图 在上图中,我们随机放置了 10 个黑色 X 标记。红色 X 标记参数空间中具有最大度量得分的点。
根据随机的黑色X标记,我们已经可以了解参数空间。左下角和右下角的 X 标记看起来不是很有希望的区域,并且可能不值得在该区域测试更多参数值。
如果我们查看参数空间的顶部,我们可以看到一些具有较高度量分数的点。我们看到这四个领域的价值特别高。
X 标记位于中间,这看起来是一个更有希望找到最大指标分数的区域。贝叶斯优化将使用这些初始随机点及其尝试的任何后续点,并应用一些统计数据来选择下一个要尝试的参数值。
统计数据对我们有用——感谢贝叶斯!结果 使用此处概述的技术,并基于对各种分析器、查询类型和优化的一系列评估,我们在 MS MARCO 文档排名挑战中相对于基线、未优化的查询取得了一些改进。所有实验的完整详细信息和解释可以在我们共享的 Jupyter 笔记本中找到,但您可以在下面看到我们结果的摘要。
我们看到从简单的、未优化的查询到参数优化的进展,导致查询具有更高的 MRR@ 分数(越高越好,每个笔记本的最佳分数以红色突出显示)。这告诉我们,我们确实可以使用数据和有原则的方法,通过优化查询参数来提高搜索的相关性!参考笔记本实验 MRR@- 分析器 默认分析器,组合每个匹配字段 0. 自定义分析器,组合每个匹配字段 0. 默认分析器,multi_match cross_fields(默认参数) 0. 自定义分析器,multi_match cross_fields(默认参数) 0. 默认分析器, multi_match best_fields(默认参数) 0. 自定义分析器、multi_match best_fields(默认参数) 0.1 - 查询调整multi_match cross_fields 基线:默认参数 0.multi_match cross_fields 调整(逐步) tie_breaker:minimum_should_match 0.multi_match cross_fields 调整(逐步):所有参数 0。
multi_match cross_fields 调优(一体式 v1):所有参数 0 .multi_match cross_fields 调优(一体式 v2,细化参数空间):所有参数 0.multi_match cross_fields 调优(一体式 v3,随机):所有参数 0.2 - 查询调整 - best_fieldsmulti_match best_fields 基线:默认参数 0.multi_match best_fields 调整(全合一):所有参数 0。更新(11 月 25 日):我们的正式提交已在,我们在 上实现了 0 的 MRR@评估查询集(仅用于排行榜排名)。
这为我们提供了排行榜上非神经(不使用深度学习)排名器的最佳分数!请继续关注更多更新。更新(1 月 20 日):我们在第一次提交的基础上进行了改进,添加了一项名为 doc2query (T5) 的技术,以及其他一些小的修复和改进。
通过新的提交,我们在 MRR@ 的评估查询集上比之前的提交有了改进!得分:0。更多详细信息可以在项目自述文件和随附的 Jupyter Notebook 中找到。
成功指南 我们现在已经了解了两种优化查询的方法以及我们可以在 MS MARCO 文档排名挑战赛中取得什么样的结果。为了帮助您成功优化查询,请记住以下提示和一般准则。
由于这些方法是数据驱动的,因此拥有足够的高质量数据非常重要。数据和方法同样重要。
“足够”通常意味着至少数百个带有标记结果的查询。 “质量”意味着数据应该准确并代表您尝试改进和优化的查询类型。
这并不能完全替代手动相关性调整:调试分数、构建良好的分析器、了解用户及其信息需求等。贝叶斯优化对其自身参数很敏感。
观察您需要多少次总迭代以及您使用多少次随机初始化来为其播种。如果参数空间很大,则应考虑使用逐步分解方法。
使用大参数空间时要小心过度拟合。考虑交叉验证来帮助纠正这个问题,但请注意,您现在需要自己在 Python 中执行此操作。
将针对特定语料库和查询集调整参数。除非其他语料库和查询集的总体统计数据足够相似,否则它们可能不会迁移。
这也可能意味着您需要定期重新调整以保持最佳参数。结论 这篇博文涉及很多内容,我们希望您能一直关注我们!代码示例和 Jupyter Notebook 非常具体地展示了如何传递和调整查询。
这些原理不仅限于查询参数,因此还有一个示例笔记本展示了如何调整 BM25 参数。我们希望您有机会查看这些示例并亲自做一些实验。
我们使用大型、隔离的弹性云集群取得了最大的成功,我们可以在需要时上下旋转这些集群。现在继续使用您自己的数据来优化您的查询!不要忘记将您的问题或成功案例带到我们的论坛。
引言 1 单击网络搜索模型,作者:Aleksandr Chuklin、Ilya Markov 和 Maarten de Rijke 2 转换模型:Doug Turnbull 构建学习排名训练数据 3 Olivier Chapelle 用于网络搜索排名的动态贝叶斯网络点击模型 4 我们在单个排名阶段对所有内容进行排名文档,然后选择 MRR 的顶部文档。这被认为是一种“完全排名”方法,与“重新排名”相反,“重新排名”仅尝试对预定结果列表中的前 1 个候选文档进行重新排名。
5 这些结果是截至本文撰写之日的最新结果,但如果我们继续尝试新技术,项目自述文件将包含最新结果。
版权声明:本文内容由互联网用户自发贡献,本站不拥有所有权,不承担相关法律责任。如果发现本站有涉嫌抄袭的内容,欢迎发送邮件 举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。
标签:
相关文章
06-18
06-18
06-17
06-18
06-18
06-17
最新文章
【玩转GPU】ControlNet初学者生存指南
【实战】获取小程序中用户的城市信息(附源码)
包雪雪简单介绍Vue.js:开学
Go进阶:使用Gin框架简单实现服务端渲染
线程池介绍及实际案例分享
JMeter 注释 18 - JMeter 常用配置组件介绍
基于Sentry的大数据权限解决方案
【云+社区年度征文集】GPE监控介绍及使用