资讯专栏INFORMATION COLUMN

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

sixgo / 1418人阅读

摘要:届时就可以组合使用关键词查询或其他基于深度学习的查询结果了。四结论我们展示了如何应用深度学习向量来实现高效的搜索。

本文首发于 vivo 互联网技术微信公众号 https://mp.weixin.qq.com/s/wLMvJPXXaND9xq-XMwY2Mg
作者: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/EikeDehlin...

三、集成工作

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

安装 Elasticsearch 插件

PCA降维(Python/sklearn 或者 Java/Smile)

索引降维后的完整向量到 Elasticsearch 中(以及其他必要属性)

整装待发!

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

四、结论

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

更多内容敬请关注 vivo 互联网技术 微信公众号

注:转载文章请先与微信号:labs2020 联系。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/20559.html

相关文章

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

    摘要:届时就可以组合使用关键词查询或其他基于深度学习的查询结果了。四结论我们展示了如何应用深度学习向量来实现高效的搜索。 本文首发于 vivo 互联网技术微信公众号 https://mp.weixin.qq.com/s/wLMvJPXXaND9xq-XMwY2Mg作者:Eike Dehling翻译:杨振涛 本文由来自 Textkernel 的软件与数据工程师 Eike Dehling 于20...

    Tychio 评论0 收藏0
  • DeepLearning.ai 深度学习笔记》发布,黄海广博士整理

    摘要:在这堂课中,学生将可以学习到深度学习的基础,学会构建神经网络,包括和等。课程中也会有很多实操项目,帮助学生更好地应用自己学到的深度学习技术,解决真实世界问题。 深度学习入门首推课程就是吴恩达的深度学习专项课程系列的 5 门课。该专项课程最大的特色就是内容全面、通俗易懂并配备了丰富的实战项目。今天,给大家推荐一份关于该专项课程的核心笔记!这份笔记只能用两个字形容:全面! showImg(...

    wenhai.he 评论0 收藏0
  • 提高深度学习性能四种方式

    摘要:可以参见以下相关阅读创造更多数据上一小节说到了有了更多数据,深度学习算法通常会变的更好。 导语我经常被问到诸如如何从深度学习模型中得到更好的效果的问题,类似的问题还有:我如何提升准确度如果我的神经网络模型性能不佳,我能够做什么?对于这些问题,我经常这样回答,我并不知道确切的答案,但是我有很多思路,接着我会列出了我所能想到的所有或许能够给性能带来提升的思路。为避免一次次罗列出这样一个简单的列表...

    JessYanCoding 评论0 收藏0
  • Deep Learning深度学习相关入门文章汇摘

    摘要:深度学习通过组合低层特征形成更加抽象的高层表示属性类别或特征,以发现数据的分布式特征表示。深度学习的概念由等人于年提出。但是自年以来,机器学习领域,取得了突破性的进展。 深度学习是机器学习研究中的一个新的领域,其动机在于建立、模拟人脑进行分析学习的神经网络,它模仿人脑的机制来解释数据,例如图像,声音和文本。深度学习是无监督学习的一种。 深度学习的概念源于人工神经网络的研究。含多隐层的多层感知...

    Riddler 评论0 收藏0
  • 128篇论文,21大领域,深度学习最值得看资源全在这了

    摘要:对于大多数想上手深度学习的小伙伴来说,我应当从那篇论文开始读起这是一个亘古不变的话题。接下来的论文将带你深入理解深度学习方法深度学习在前沿领域的不同应用。 对于大多数想上手深度学习的小伙伴来说,我应当从那篇论文开始读起?这是一个亘古不变的话题。而对那些已经入门的同学来说,了解一下不同方向的论文,也是不时之需。有没有一份完整的深度学习论文导引,让所有人都可以在里面找到想要的内容呢?有!今天就给...

    tracymac7 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<