暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

[译] 什么是矢量数据?

原创 Bigbig 2022-05-09
4707

原文地址:https://dzone.com/articles/what-are-vector-databases
原文作者: Frank Liu

在这篇介绍性文章中,我们将介绍与矢量数据库有关的概念,这是一种旨在存储、管理和搜索嵌入矢量的新型技术。矢量数据库正被用于越来越多的应用中,包括但不限于图像搜索、推荐系统、文本理解、视频总结、药物发现、股票市场分析等等。

关联性并不够

数据无处不在。在互联网的早期,数据大多是结构化的,大家可以很容易地在关系型数据库中存储和管理。以图书数据库为例。

image.png

如上图所示,关系型数据库的设计目的是基于表格的数据中存储和搜索。数据库中的每一行都代表一本特定的书,而列则对应于一个特定的信息类别。当用户通过在线服务查询一本书时,他们可以通过数据库中的任何一列名称进行查询。例如,查询作者姓名为Bill Bryson的总体结果时,会返回Bill Bryson的所有书籍。

随着互联网的发展和演变,非结构化数据(杂志文章、共享照片、短视频等)变得越来越普遍。与结构化数据不同,没有简单的方法可以将非结构化数据的内容存储在关系型数据库中。想象一下,例如,试图从不同角度搜索类似的鞋子;这在关系型数据库中是不可能的,因为纯粹从图像的原始像素值来理解鞋子的样式、尺寸、颜色等是不可能的。

X2vec: 一种理解数据的新方法

现在我们回到矢量数据库。非结构化数据的日益普遍,导致了为理解这些数据而训练的机器学习模型的使用稳步上升。Word2vec是一种自然语言处理(NLP)算法,它使用神经网络来学习单词关联,是这方面的一个著名的早期例子。word2vec模型能够将单个单词(各种语言,不仅仅是英语)转化为一列浮点值,或向量。由于机器学习模型的训练方式,彼此相近的向量代表了彼此相似的单词,因此被称为嵌入向量。

把一段非结构化数据变成一个数值列表的想法并不新鲜。随着深度学习在学术界和工业界的发展,代表文本、音频和图像的新方法应运而生。所有这些表示方法的一个共同组成部分是它们使用由经过训练的深度神经网络生成的嵌入向量。回到word2vec的例子,我们可以看到,生成的嵌入包含了重要的语义信息。

早期的计算机视觉和图像处理依赖于局部特征描述符,将图像变成一个嵌入向量的 “袋子”–每个检测到的关键点都有一个向量。SIFT、SURF和ORB是你可能听说过的三个著名的特征描述符。这些特征描述符虽然对相互匹配图像很有用,但被证明是一种相当糟糕的表示音频(通过频谱图)和图像的方式。

from gensim.models import KeyedVectors model = KeyedVectors.load_word2vec_format('GoogleNews-vectors-negative300.bin', binary=True)

举个例子:“苹果”是公司还是水果,还是都两者都属于呢?

苹果 "这个词既可以指公司,也可以指美味的红色水果。在这个例子中,我们可以看到Word2Vec保留了这两个意思。

print(model.most_similar(positive=['samsung', 'iphone'], negative=['apple'], topn=1)) print(model.most_similar(positive=['fruit'], topn=10)[9:])

[(‘droid_x’, 0.6324754953384399)].
[(‘apple’, 0.6410146951675415)].
“Droid” refers to Samsung’s first 4G LTE smartphone (“Samsung” + “iPhone” - “Apple” = “Droid”), while “apple” is the 10th closest word to “fruit”.

image.png

虽然有更新更好的深度学习算法/模型,但概念仍然相同。

从多层神经网络生成的矢量有足够的高层信息,适用于各种任务。

向量嵌入并不仅仅限于自然语言。在下面的例子中,我们使用towhee库为三个不同的图像生成嵌入向量,其中两个具有类似的内容。

生成嵌入

from towhee import pipeline
p = pipeline(‘image-embedding’)
dog0_vec = p(dog0)
dog1_vec = p(dog1)
car_vec = p(car)

from sklearn.preprocessing import normalize
dog0_vec = normalize(dog0_vec[0])
dog1_vec = normalize(dog1_vec[0])
car_vec = normalize(car_vec[0])
现在让我们用towhee来为我们的图像生成嵌入物。

现在我们来计算一下距离

import numpy as np
print(‘dog0 to dog1 distance:’, np.linalg.norm(dog0_vec - dog1_vec))
print(‘dog0 to car distance:’, np.linalg.norm(dog0_vec - car_vec))

跨越矢量搜索

现在我们已经看到了矢量嵌入的表现力,再来简单讨论一下矢量的索引。

像关系数据库一样,向量数据库需要可搜索,以便真正有用:仅仅存储向量及其相关元数据是不够的。这被称为近邻搜索,或简称为NN搜索,由于提出的解决方案数量庞大,单独可以被视为机器学习和模式识别的一个子领域。

矢量搜索一般分为两部分:相似性度量和索引。相似性度量定义了如何评估两个向量之间的距离,而索引是一种数据结构,可以促进搜索过程。相似性度量是相当直接的:最常见的相似性度量是L2准则的逆值(也被称为欧氏距离)。另一方面,存在着多种多样的指数,每一种指数都有自己的优势和劣势。只要知道,如果没有它们,一个查询向量就需要与数据库中的所有其他向量进行比较,使查询过程变得异常漫长。

把它们放在一起

现在我们已经了解了嵌入向量的表示能力,并对向量搜索的工作原理有了一个很好的概括,现在是时候把这两个概念放在一起了。

什么是矢量数据库?它是专门为存储、索引和查询通过机器学习模型传递非结构化数据产生的嵌入矢量而设计的数据库。

当扩展到巨大数量的向量嵌入时,在嵌入向量之间进行搜索(即使有索引)可能会非常昂贵。尽管如此,最好的和最先进的矢量数据库将允许你在数百万甚至数十亿的目标矢量之间插入和搜索,此外还可以指定你选择的索引算法和相似性指标。

像可用于生产的关系型数据库一样,矢量数据库在实际生产环境中部署前应满足几个关键的性能目标。

  • 可扩展性。就绝对内存而言,嵌入向量相当小,但为了方便读写速度,它们通常被存储在内存中(基于磁盘的NN/ANN搜索是另一篇博文的主题)。当扩展到数十亿个嵌入向量甚至更多时,存储和计算很快就会成为单台机器无法处理的问题。分片可以解决这个问题,但这需要将索引分割到多台机器上。

  • 可靠。现代关系型数据库是容错的。复制允许云原生企业数据库避免出现单点故障,实现优雅的启动和关闭。矢量数据库也不例外,应该能够处理内部故障而不丢失数据,并且对操作影响最小。

  • 快速。查询和写入速度很重要,即使对于矢量数据库也是如此。一个越来越常见的用例是实时处理和索引数据库的输入。对于像Snapchat和Instagram这样的平台,每秒可能有数百或数千张新照片(一种非结构化数据)上传,速度成为一个令人难以置信的重要因素。

随着数据以前所未有的速度产生,通过矢量数据库对所有数据进行理解将变得越来越重要。

世界上最先进的矢量数据库

Milvus,一个开源的矢量数据库,是这个领域的领导者。Milvus提供了许多演示,你可以用来评估矢量数据库的能力和使用案例。随着Milvus 2.0 GA的发布,Milvus现在是一个云原生、容错的系统,能够扩展到数十亿的矢量。设置是通过一个简单的docker命令完成的,而整个Milvus的插入和查询可以通过我们的Python、Go、Node.js或Java绑定完成。

最后修改时间:2022-05-10 14:04:39
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论