Searching with Deep Learning 深度学习的搜索应用

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
简介: 对于 Elasticsearch 来说,也有一些插件(https://github.com/muhleder/elasticsearch-vector-scoring)提供了相似度计算功能,但是它们的速度并不怎么样,因为它们只计算了向量相似度而没有做过滤。

作者:Eike Dehling
翻译:杨振涛
本文由来自 Textkernel 的软件与数据工程师 Eike Dehling 于2018年10月23日发布与其Linkedin 的 pulse 上,已获得翻译授权。
英文原文链接:https://www.linkedin.com/pulse/searching-deep-learning-eike-dehling/

目录:
一、Fast Nearest Neighbours
二、Elasticsearch 插件
三、集成工作
四、结论

最近我在帮一个数据科学家同事工程化一个基于深度学习模型的搜索系统。他们的项目是关于在文档嵌入应用深度学习模型,然后使用嵌入向量到我们的搜索系统中来查找相似文档。

一个文档嵌入本质上其实是一个(长的)数值数组,查找相似文档就相当于查找其他与其较相近的(长的)数值数组;可以采用诸如欧氏距离等来衡量相似性。

可以借此来查找相似文档,但是因为不是直接基于关键词而是基于“嵌入”,所以可以自动获得与同义词扩展相媲美的效果。它会查找相关文档,即使它们使用不同的关键词,因此能比关键词检索表现更好。

已经有解决这种问题的工具了,比如 facebook 的 FAISS 库(https://github.com/facebookresearch/faiss)。这个类库速度非常快,并且支持多种智能方法使用嵌入向量实现快速检索。不过它不能友好地集成到类似 Elasticsearch 这样的搜索引擎中。

对于 Elasticsearch 来说,也有一些插件(https://github.com/muhleder/elasticsearch-vector-scoring)提供了相似度计算功能,但是它们的速度并不怎么样,因为它们只计算了向量相似度而没有做过滤。

所以我们自己动手实现了更好的解决方案。

一、Fast Nearest Neighbours

为了更快速检索通常会使用各种“索引”,这种数据结构支持高效地过滤出相关的匹配,而无需单独评估每一个匹配。基于关键词的检索一般使用“倒排索引”;基于地理位置的检索,一般使用一种叫做 KD树 的数据结构。我们也需要诸如此类的机制来快速过滤出最相关的匹配,因此我们只需要在这个较小的集合上计算精确得分。这一点非常重要,因为在一个高维向量的超大集合上计算距离,是代价非常高昂(慢)的操作。

上文提到的 FAISS 库提供了多种方式来解决这个问题:

  • PCA 降维
  • K 均值聚类
  • 局部敏感哈希
  • 可能还有其他我不知道方法

这些方法中的每一种都能实现高效的索引方法,因此可以快速地筛选出较近邻的文档,然后通过计算精确的距离来查找最近邻文档。在降维以后就可以使用 KD树,聚类或者局部敏感哈希后也可以使用倒排索引。

上图揭示了如何通过过滤数据集来加速计算,需要计算精确距离的文档数与计算时间之间是线性关系;同时也说明了高效地过滤掉不相似文档多么重要。

当然所有这些方法都是有可能在 Elasticsearch 里得到实现的,其优点是便于和其他检索系统集成。届时就可以组合使用关键词查询或其他基于深度学习的查询结果了。

实验表明在我们的数据集上,结合了 PCA 降维后再使用 KD 树索引,能带给我们速度和精度的最佳y组合。

上图揭示了缩小数据集是如何影响结果精确度的。能够看到,过滤得太狠意味着我们会丢失一些最近邻文档;而如果过滤掉 50k 到 75k 的文档,就可以找到所有的最近邻文档,同时计算时间只占暴力计算所有距离的很小一部分。

二、Elasticsearch 插件

在 Lucene 即 Elasticsearch的底层类库中,KD树的数据结构已经实现了,但还没有通过 Elasticsearch 的 API 暴露出来。已经有插件可以计算精确的向量距离,所以我们只需要开发一个小插件来支持使用这种索引结构即可。参见这里:https://github.com/EikeDehling/vector-search-plugin

三、集成工作

现在集成工作只是相当于把拼图图片按照正确的顺序拼到一起:

  • 安装 Elasticsearch 插件
  • PCA降维(Python/sklearn 或者 Java/Smile)
  • 索引降维后的完整向量到 Elasticsearch 中(以及其他必要属性)
  • 整装待发!

安装插件、创建索引以及添加文档请参考这里(https://github.com/EikeDehling/vector-search-plugin)。完成这些步骤后,现在就可以使用我们的嵌入向量了!请注意 pca_reduced_vector 上的范围查询,这才是我们新插件起到的作用。

POST my_index/_search
{
  "query": {
    "function_score": {
      "query": {
        "range": {
          "pca_reduced_vector": {
            "from": "-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5",
            "to": "0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5"
          }
        }
      },
      "functions": [
        {
          "script_score": {
            "script": {
              "inline": "vector_scoring",
              "lang": "binary_vector_score",
              "params": {
                "vector_field": "full_vector",
                "vector": [ 0.0, 0.0716, 0.1761, 0.0, 0.0779, 0.0, 0.1382, 0.3729 ]
              }
            }
          }
        }
      ],
      "boost_mode": "replace"
    }
  },
  "size": 10
}

四、结论

我们展示了如何应用深度学习向量来实现高效的搜索。这一方法适用于想要寻找相似文档而普通关键词查询不够好的任何应用场景。其中的嵌入向量,可以使用诸如 doc2vec 等来实现。

相关实践学习
使用阿里云Elasticsearch体验信息检索加速
通过创建登录阿里云Elasticsearch集群,使用DataWorks将MySQL数据同步至Elasticsearch,体验多条件检索效果,简单展示数据同步和信息检索加速的过程和操作。
ElasticSearch 入门精讲
ElasticSearch是一个开源的、基于Lucene的、分布式、高扩展、高实时的搜索与数据分析引擎。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr(也是基于Lucene)。 ElasticSearch的实现原理主要分为以下几个步骤: 用户将数据提交到Elastic Search 数据库中 通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据 当用户搜索数据时候,再根据权重将结果排名、打分 将返回结果呈现给用户 Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。
目录
相关文章
|
13天前
|
机器学习/深度学习 API 语音技术
|
19小时前
|
机器学习/深度学习 边缘计算 监控
深度学习赋能智能监控:图像识别技术的革新与应用
【4月更文挑战第23天】 随着人工智能的迅猛发展,深度学习技术在图像处理领域取得突破性进展,特别是在智能监控系统中,基于深度学习的图像识别已成为提升系统智能化水平的核心动力。本文旨在探讨深度学习如何优化智能监控系统中的图像识别过程,提高监控效率和准确性,并分析其在不同应用场景下的具体实施策略。通过深入剖析关键技术、挑战及解决方案,本文为读者提供了一个关于深度学习图像识别技术在智能监控领域应用的全面视角。
|
22小时前
|
机器学习/深度学习 存储 边缘计算
深度学习在图像识别中的应用与挑战
【4月更文挑战第23天】 随着人工智能技术的飞速发展,深度学习作为其重要分支之一,在图像识别领域取得了显著的成果。本文将探讨深度学习在图像识别中的应用,分析其优势和面临的挑战,并展望未来的发展趋势。
|
2天前
|
机器学习/深度学习 数据采集 自动驾驶
基于深度学习的图像识别技术在自动驾驶系统中的应用
【4月更文挑战第21天】 本文章深入探讨了深度学习技术在自动驾驶车辆图像识别领域的应用。不同于传统的摘要方式,本文将直接点出研究的核心价值和实际应用成果。我们专注于卷积神经网络(CNN)的创新设计,其在复杂道路场景下的行人和障碍物检测中的高效表现,以及这些技术如何整合到自动驾驶系统中以增强安全性和可靠性。通过实验验证,我们的模型在公开数据集上达到了行业领先水平的准确率,并且在真实世界的测试场景中展现了卓越的泛化能力。
|
3天前
|
机器学习/深度学习 算法 云计算
深度学习在图像识别中的应用与挑战
【4月更文挑战第21天】 随着计算机视觉技术的飞速发展,深度学习已经成为图像识别任务的核心动力。本文旨在探讨深度学习技术在图像识别领域的应用进展,分析其面临的主要挑战,并提出可能的解决方案。通过对卷积神经网络(CNN)的深入研究,我们揭示了其在图像分类、目标检测和语义分割中的关键作用。同时,数据不平衡、模型泛化能力和计算资源限制等问题也被详细讨论。文章最终指出了未来研究的方向,包括网络结构的优化、无监督学习的发展以及跨领域知识迁移的可能性。
|
4天前
|
机器学习/深度学习 传感器 自动驾驶
基于深度学习的图像识别技术在自动驾驶系统中的应用研究
【4月更文挑战第20天】 本研究聚焦于深度学习技术在图像识别领域的应用,并探讨其在自动驾驶系统中的实际效用。文章首先回顾了深度学习与图像处理技术的基础知识,随后详细分析了卷积神经网络(CNN)在车辆环境感知中的关键作用。通过实验数据对比分析,本文验证了所提出算法在提高自动驾驶车辆对周围环境的识别准确性和实时性方面的有效性。最后,讨论了目前技术的局限性及未来可能的研究方向,旨在为进一步的技术突破提供参考。
|
5天前
|
机器学习/深度学习 监控 算法
深度学习驱动下的智能监控革新:图像识别技术的前沿应用
【4月更文挑战第19天】 在数字时代,智能监控系统作为城市安全和效率的守护者,正经历着前所未有的技术变革。本文深入探讨了基于深度学习的图像识别技术如何重塑智能监控领域,通过算法创新提升识别准确率,实时处理大量数据,并在各种环境条件下稳定运行。我们将分析当前最前沿的技术应用案例,探讨其在实际应用中遇到的挑战及未来发展趋势,从而为相关领域的研究者和实践者提供参考和启示。
|
5天前
|
机器学习/深度学习 传感器 人工智能
基于深度学习的图像识别技术在自动驾驶系统中的应用
【4月更文挑战第18天】 随着人工智能的快速发展,深度学习技术在图像处理和识别领域取得了显著进展。特别是在自动驾驶系统中,基于深度学习的图像识别技术已成为关键技术之一。本文将探讨深度学习在自动驾驶系统中的应用,重点关注卷积神经网络(CNN)和循环神经网络(RNN)在车辆检测、行人识别和交通标志识别等方面的应用。通过对比传统图像识别方法,我们将展示深度学习技术如何提高自动驾驶系统的准确性和鲁棒性。
|
6天前
|
机器学习/深度学习 传感器 自动驾驶
基于深度学习的图像识别技术在自动驾驶系统中的应用
【4月更文挑战第18天】 随着人工智能的快速发展,特别是深度学习技术的突破性进步,图像识别已成为自动驾驶领域的核心组成部分。本文旨在探讨基于深度学习的图像识别技术如何优化自动驾驶系统的性能,并分析其在实时交通场景中处理复杂视觉信息的能力。文中将介绍几种主要的深度学习模型,包括卷积神经网络(CNN)和递归神经网络(RNN),以及它们在图像分类、目标检测和语义分割中的应用。同时,文章还将讨论当前技术面临的挑战和未来的发展方向。
|
6天前
|
机器学习/深度学习 传感器 自动驾驶
基于深度学习的图像识别技术在自动驾驶汽车中的应用
【4月更文挑战第18天】 随着人工智能技术的迅猛发展,深度学习已成为推动多个技术领域革新的关键力量。尤其在图像识别领域,深度学习技术通过模仿人类视觉系统的处理机制,显著提高了机器对视觉信息的理解和分析能力。本文将探讨深度学习在图像识别领域的核心技术原理,并重点分析其在自动驾驶汽车中的应用,如何通过精确的图像识别来增强车辆的环境感知能力,从而实现更安全、更高效的驾驶体验。