向量数据库|第1期|从零开始学习

news2024/11/28 16:37:23

向量数据库|第1期|从零开始学习

1、向量数据库中的基本概念

1.1 什么是余弦

余弦函数是一种三角函数,在直角三角形中,某个锐角的余弦为:临边与斜边的比值,如下图cosA=b/c。引申到任意三角形中,即余弦定理:a2 =b2+c2-2bc*cosA,任意三角形的任一边的平方等于其他两边的平方和减去这两边与夹角余弦乘积的两倍。该公式转换下,余弦为:cosA=( b2+c2- a2 )/2bc

1.2 向量

万物皆向量,比如经常看到的地铁指示牌“前方500米”,就是一个向量,给出我们信息:方向和大小。可以将向量表示在平面直角坐标系中:

这仅是一个二维向量,那么所谓的“向量数据”:由多个数值组成的序列,可以表示一个数据量的大小和方向。通过embedding技术,图像、声音、文本可以表示为一个高维的向量。比如一个图片可以转换成一个由像素值构成的向量。

注:简单来讲embedding是一种将高维数据转换成较低维的向量表示的技术。比如显示的地理地形信息远超过三维,但是地图通过颜色和等高线等来最大化表现现实的地理信息。

1.3 向量间的加减法和点积

1)向量加法

同原点的情况下,可以做一个平行四边形(平行四边形法则),如上图所示,红色的对角线即为c=a+b

当然,也可以根据三角形原则,将b向右平移,和向量a形成一个首尾相接,那么a+b结果即为和向量a起使点相同,指向平移后的向量b

2)向量减法

a-b可以认为是a+(-b) ,-b和向量b大小相同,方向相反。

3)向量点积

1.4 向量间的相似度

向量间的相似度用于衡量两个向量在数值上的接近程度。相似度计算是向量分析的核心工作之一。常用的相似度计算方法:余弦相似度、内积和欧式距离。

1)余弦相似度

余弦相似度是一种衡量两个向量之间相似程度的量度,通过计算两个向量夹角的余弦值来评估。返回到向量减法小节,(a-b)·(a-b)=c·c,左边继续展开,a·a-a·b-b·a+b·b=a·a-2a·b+b·b;假设ab夹角为A:c·c=a·a+b·b-2|a|·|b|cosA。那么|a|·|b|cosA=2a·b,所以cosA=(a·b)/(|a|·|b|),即两个向量的余弦就等于他们的点积除以他们模长的乘积。如此,只要植到向量的值,就可以得出他们之间的余弦相似性了。需要注意,使用余弦相似性时,长度不重要,方向才重要,也就是两个向量之间的夹角大小,夹角为0,表示两个向量完全相同或者指向同一个方向;若是90度,则方向完全不相似,没有相关性;若为180度,则方向相反。

2)欧式距离

也就是欧几里得空间中两点之间的直线距离,可以直观地表示两点之间的远近程度。两个向量的欧式距离,通过计算对应分量插值的平方和,再开方得到,它关注的是向量之间的绝对距离,适用于比较两个向量再空间中的相对位置:

其中,n表示他是n维向量,上图表示两个向量在第i维度上的分量差平方和,然后在开方就是两个向量的欧式距离。

1.5 准确率、精确率与召回率

准确率就是被正确预测出来的数量除以所有样本。精确率和召回率的分母与准确率的分母不一样。

精确率的分母是预测到的正类,它的提出为了让模型现有的预测结果尽可能不出错,你可以漏检但不能预测不对。地震模型为例,以天为单位记某一天地震为正样本,不地震为负样本,需要预测接下来100天的地震情况。假设知道第20和第30天会地震,其余时间不会地震。为了不误报地震,仅预测了第20天可能发生地震,那么此时精确率:1/1=100%。

再比如预测了第10天、第20天、第30天、第40天、第50天地震,那么此时的精确率:2/5=40%

也就是说精确率的分母是预测到的正类数,分子为预测到的正类中预测对的数量

召回率:分母是原本的正类,他的提出是让模型预测到所有想被预测到的样本(多预测一些错的也是可以接受的)。假设知道第20、第25天、第30天和第40天会地震,其余时间不会地震比如预测了第10天、第20天、第35天、第40天、第50天地震,那么此时的召回率:2/4=50%,即分母为原本真正会地震的天数,分子为预测结果中正确的天数。

1.6 KNN与ANN检索

1)KNN(k-nearest neighbors)即K近邻算法,以下面例子说明

假设有以下一组二维数据点,每个数据点有两个特征(x和y坐标)以及对应的类别(红色和蓝色):

x

y

类别

2

4

红色

3

5

红色

5

7

蓝色

6

8

蓝色

7

9

蓝色

现在要对一个新的数据点(4,6)进行分类,首先确定K值,假设K为3,计算新数据点每个已有数据点的距离,可以使用欧式距离公式,与每个点的距离分别为:2\sqrt{2}\sqrt{2}\sqrt{2}2\sqrt{2}3\sqrt{2};找出距离最近的K=3个数据点,这里是(3,4)、(5,7)、(4,4),他们类别都是红色,通过投票所以数据点(4,6)被分类是红色。

缺点:必须计算与数据库中每个向量的举例,如果必须搜索数百万个向量,这将非常低效。

2)ANN(Approximate nearest neighbor)相似最近邻

这里我们以局部敏感哈希来说明,局部敏感哈希的核心思想是通过设计特殊的哈希函数,使得相似的对象在经过哈希后有较大概率被映射到相同的哈希桶中,而不相似的对象被映射相同的哈希桶的概率较小。

举例:假设有一个包含许多二维数据点的数据集:(1,2)、(3,4)、(5,6)、(7,8)、(9,10),现在要为查询点Q=(4,5)找近似最近邻。首先构建hash函数,将所有数据集通过hash函数构建到hash表中,然后Q点也用通用的hash函数进行计算。假设(1,2)、(3,4)被映射到桶A,(5,6)、(7,8)被映射到桶B,(9,10)被映射到桶C;计算Q的哈希值,确定所在桶,假设映射到A,从A中取出数据点(1,2)、(3,4),计算他们与Q的举例,假设(3,4)的距离最近,暂时将(3,4)作为近似最近邻;为了提高准确性,可以进一步检查相邻桶比如B的数据点,计算B中的数据与Q的距离,若发现有比(3,4)更近的,则更新近似最近邻。

通过这种方式,可以在相对较短的时间内找到较为接近的数据点。

2、为什么出现向量数据库

传统数据库技术,不管是关系型还是非关系型,他们都是面向结构化数据的存储和高效访问而设计的。而我们社会中,更多数据没办法简单抽象出来并结构化,比如书中大量文本数据、音乐中的音频、图像数据等。向量数据与传统的结构话数据的四个差异:1)维数差异:向量数据格式的维度比较多,无法简单将向量数据各维度拆分后存储到传统数据库的行和列里面。2)字段内相关性差异:向量数据多个维度之间的数据相关性很强,往往需要多个字段组合计算才能比较准确地衡量两个向量的相似度。3)优化手段差异:向量数据的格式单一,每个维度的数据往往是固定格式数据(浮点数、二进制整数等),比如对于相关的数学运算可以更好地利用CPU缓存机制加速,也可以利用CPU/GPU硬件特性等。4)使用方法差异:例如对于文本数据,传统数据格式基于关键词进行精确匹配,不会理解词语背后的语义,而向量数据的匹配基于语义理解。

另外,对于音频、图片、视频这些非结构化数据,传统的关系型数据库更难进行索引。为更好接近向量数据的存储、索引和查询,有必要结合向量数据的特点设计专门的向量数据库。

3、向量数据库核心能力

向量数据库需要对向量数据进行各种操作:

  1. 向量检索:根据给定向量,找出数据库中与之最相似的向量。比如用户输入一张图片进行搜索时,先将这个图片转换成一个向量,通过向量之间的近似检索,找到与输入图片最相似的图片
  2. 向量聚类:根据给定的相似度度量,将数据库中的向量进行分类,例如根据图片的内容或风格将图片分成不同主题
  3. 向量降维:根据给定的目标维度,将数据库中的高维向量转成低维向量,以便可视化或压缩存储
  4. 向量计算:根据给定算法或模型,对数据库中的向量进行计算或分析

我们下面主要介绍向量数据库中的索引。向量数据库通常通过向量索引提高对向量数据的访问和查询效率。业界主流向量数据库通常支持扁平索引、HNSW索引和IVF索引等向量索引方法。

3.1、扁平索引

将原始的向量数据平坦地摆放到内存中,不增加任何辅助机制。在检索时需要计算每个向量与目标向量的相似性,也称为“暴力索引”,本质上就是全内存+KNN检索,召回率100%,但是对与大规模数据集查询效率低

3.2、HNSW索引

Hierarchical Navigable Small World,分层导航小世界,是一种经典的图结构索引。优势在于性能和召回率都比较稳定。用于支撑ANN索引的一种方式。

首先需要了解什么是NSW:将每个点在入库时和它最近的若干个点建立索引,也就是互为邻居。当图构建完毕时,每个点都可以很快地访问到自己最近的几个邻居。

1)在下图二维空间上构建一个NSW索引,该层有一个entry点,找一个最近邻,下图中的红色点。需要找到search向量(蓝色点)的最近邻

寻找最近邻的直观方法:首先找entry点相邻的点中距离search vector最近的点,如下图所示,假设该点时1st;然后找1st相邻的点中距离search vector最近点,假设时2nd;依次类推,假设2nd的所有邻居距离search vector都没有2nd近,搜索结束,2nd就作为最近邻结果

2)insert流程和search流程类似。首先找到待插入向量最近的k个邻居,这里假设为3,那么就和这3个最近的邻居构建索引,即添加一个边

假设度为5,但是这里看到添加后,如下图黄色的两个点超过了,那么就需要进行裁剪

同样计算黄色的两个点的k-nearest邻居,这里的k就是度5,如下图,将虚线部分去掉,最终构建出NSW索引

HNSW在NSW索引上添加了分层架构,可以让检索更快。这个idead和调表结构类似,底层即0层的NSW包含所有信息。随机选一些向量放到上层(越上层向量越少,并且也是NSW索引),搜索从最上层开始,使用该层的最近邻作为下层的entry点:

1)索引查询:首先从layer2开始,找到该层的最近邻点,将其作为layer1的entry点;在layer1层找entry点的最近邻;依次类推知道最底层layer0,找到k-nearest邻居(下图是3-nearest)

2)插入:插入前需要决定插入那一层,HNSW论文中使用的计算方法:

如下图所示,我们决定在level1这一层插入:

在level1层找到最近的k个邻居,这里是2个,然后建立索引,也就是将他们连接起来;然后继续到下一层,也就是level0,同样的方法找到最近的2个邻居

当然,这里会有一个问题,如下图所示:每层中的度是有阈值的,若超过就需要进行裁剪;在插入Q之前A和B之间有连接,插入Q后若A的度超过了,进行裁剪时需要裁剪掉A和B之间的线,那么R1和R2的范围就产生了孤岛,如果entry点在R2,查询节点在R1,就永远找不到合适的结果。HNSW为解决这个问题,设计了新的搜索算法,假设被重构点的top k近邻全部挤在一起,就舍弃其中几个,选择保留相对较远的其他近邻。

如下图所示:选择保留R到C的连接(索引)

3.3、IVF索引

倒排文件索引,首先对向量数据进行聚类,然后在聚类内部构建一个倒排索引信息,并且可以叠加量化和压缩算法。查询精度相对较低,召回率低,需要预先构建聚类算法,实时性相对较差。

什么是倒排索引呢?以文本文档搜索为例,若要搜索包含给定单词的文档,正排索引会存储每个文档的单词列表(文档号-->该文档中的单词),需要检索每个文档才能找到相关文档。而倒排索引则是单词-->文档的映射,每个单词都有一个该单词所在的文档索引列表。可以将搜索限制在选定的映射列表中。

通常IVF和FLAT会结合在一起,即IVF-FLAT索引,这种索引定义了集群中心,对于每个集群中心都有属于该集群的向量索引列表,只需要选定特定集群,就可以加快搜索速度。当然,召回率就相对较低了。

下面介绍下IVF-FLAT索引的构建

1)假设我们在二维空间有向量,如下图所示

2)可以使用K-means算法找到上面向量的质心(聚类概念),每个质心对应一个桶,每个桶存储一簇向量。到两个质心欧式距离相等的点构成边,表示每个桶的分隔线:

3)现在有了质心,算法就可以遍历所有向量,并根据距向量最近的质心将它们放入相应的桶中:

4)INSERT

找到距离向量最近的质心并将向量放入该桶中,下图例子,红色顶点加入到A桶

5)查询

以下图为例,红色顶点是用户想要查找的基准向量,他有5个最近邻。如果我们近从A桶中查找(红色顶点所在桶),会找到桶A的5个顶点。然而,有可能在A桶的邻居B桶中存在到基准探测向量更近的点。因此,为了提高查找的准确性,最好探查多个桶以得到更近准确的最近邻。

索引查找中,您需要探测指定数量个质心桶,从每个桶中检索k个最近邻居(我们称之为本地结果),并进行top-n排序以获得k个最近邻居(全局结果)。

参考

https://www.modb.pro/doc/129775
https://zhuanlan.zhihu.com/p/708821188
https://www.modb.pro/doc/131625
https://www.modb.pro/doc/134473
https://www.modb.pro/db/1765287755676979200
https://www.modb.pro/db/103254
https://cloud.baidu.com/doc/VDB/s/5lvesvssy
https://www.timescale.com/blog/nearest-neighbor-indexes-what-are-ivfflat-indexes-in-pgvector-and-how-do-they-work/
https://www.datastax.com/guides/what-is-a-vector-index
https://zhuanlan.zhihu.com/p/712991028

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2189433.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2024年7月大众点评全国酒吧前百名城市分析

在做一些城市分析、学术研究分析、商业选址、商业布局分析等数据分析挖掘时,大众点评的数据参考价值非常大,截至2024年7月,大众点评美食店铺剔除了暂停营业、停止营业后的最新数据情况分析如下。 分析研究的字段维度包括大众点评数字id、字母…

LSM6DSV16X基于MLC智能笔动作识别(3)----MEMS Studio训练数据

LSM6DSV16X基于MLC智能笔动作识别.3--MEMS Studio训练数据 概述视频教学样品申请源码下载硬件准备选择MEMS导入数据配置窗口长度和量程配置滤波器选择特征数据设备树生成决策树生成参考程序转换UCF文件 概述 MEMS-Studio是一套完整的桌面软件解决方案,专为开发嵌入…

认知杂谈98《抵御噪声干扰》

内容摘要: “能量掠夺”是指他人负面言行对我们情绪和心理状态的不良影响,使我们感到沮丧或愤怒。这种影响可能源于我们内心对自身价值认同的不坚定,以及过分在意他人的看法。 要避免能量掠夺,我们需要建立心理防线,学…

Xilinx Vitis IDE启动时失去响应的解决办法

在启动Xilinx Vitis IDE时,有时候会遇到卡死的情况,无论是直接启动还是从Vivado的菜单中启动都一样。参考Xilinx官网的解决办法:(一直到2023.1版本都是可以解决的,之后的版本没测过。) Widget (amd.com) …

Leetcode—279. 完全平方数【中等】

2024每日刷题&#xff08;169&#xff09; Leetcode—279. 完全平方数 实现代码 class Solution { public:int numSquares(int n) {vector<int> dp(n 1, n);dp[0] 0;dp[1] 1;for(int i 2; i < n; i) {for(int j 1; j * j < i; j) {dp[i] min(dp[i], dp[i -…

Oracle中ADD_MONTHS()函数详解

文章目录 前言一、ADD_MONTHS()的语法二、主要用途三、测试用例总结 前言 在Oracle数据库中&#xff0c;ADD_MONTHS()函数用于在日期中添加指定的月数。 一、ADD_MONTHS()的语法 ADD_MONTHS(date, n) 其中&#xff0c;date是一个日期值&#xff0c;n是一个整数值&#xff0c…

C语言高阶【2】--动态内存管理【2】--柔性数组(这是个全新的知识点,不想了解一下吗?)

本章概述 柔性数组总结C/C中程序内存划分彩蛋时刻&#xff01;&#xff01;&#xff01;&#xff01; 柔性数组 数组这个东西&#xff0c;我想大家应该都不陌生了吧。但是&#xff0c;柔性数组这个东西可能你是第一次听说。 柔性数组概念&#xff1a;在C99之前是没这个东西的…

基于Flux的文生高清图片

Flux模型生成的图片画质极佳&#xff0c;改进修复了手的问题&#xff0c;支持字体生成和排版&#xff0c;训练参数大&#xff0c;风格多样&#xff0c;分辨率弹性好&#xff0c;embedding通用性好&#xff0c;不需要输入负面提示词。 安装ComfyUI ComfyUI下载安装 下载和配置…

计算机网络:计算机网络概述 —— 网络拓扑结构

文章目录 网络拓扑总线型拓扑特点缺陷 星型拓扑特点缺陷 环型拓扑特点缺陷 网状型拓扑优点缺陷 树型拓扑特点缺陷 网络拓扑 网络拓扑指的是计算机网络中节点&#xff08;计算机、交换机、路由器等&#xff09;之间物理或逻辑连接的结构。网络拓扑定义了节点之间的布局、连接方…

方法重载(Overload)

前言 在前面的学习中&#xff0c;我们学到了重写(Override),这里我们主要进行重载(Overload)的介绍&#xff0c;同时对重写和重载的区别进行分析。 1. 重载(Overload) #方法重载 在同一个类中定义多个同名但参数不同的方法。我们称方法与方法之间构成方法重载 在Java中&…

【宽搜】1. 层序遍历模板讲解

题目描述 题目链接&#xff1a;N叉树的层序遍历 层序遍历流程 请仔细阅读下图&#xff1a; 根据上图的流程&#xff0c;下面再明确几个问题&#xff1a; 1. 为什么要使用队列&#xff1f; 队列是先进先出的数据结构&#xff0c;在数的层序遍历中&#xff0c;需要先将节点p…

Pikachu-Sql Inject-宽字节注入

基本概念 宽字节是相对于ascII这样单字节而言的&#xff1b;像 GB2312、GBK、GB18030、BIG5、Shift_JIS 等这些都是常说的宽字节&#xff0c;实际上只有两字节 GBK 是一种多字符的编码&#xff0c;通常来说&#xff0c;一个 gbk 编码汉字&#xff0c;占用2个字节。一个…

【C++打怪之路Lv6】-- 内存管理

&#x1f308; 个人主页&#xff1a;白子寰 &#x1f525; 分类专栏&#xff1a;C打怪之路&#xff0c;python从入门到精通&#xff0c;数据结构&#xff0c;C语言&#xff0c;C语言题集&#x1f448; 希望得到您的订阅和支持~ &#x1f4a1; 坚持创作博文(平均质量分82)&#…

软考鸭微信小程序:助力软考备考的便捷工具

一、软考鸭微信小程序的功能 “软考鸭”微信小程序是一款针对软考考生的备考辅助工具&#xff0c;提供了丰富的备考资源和功能&#xff0c;帮助考生提高备考效率&#xff0c;顺利通过考试。其主要功能包括&#xff1a; 历年试题库&#xff1a;小程序内集成了历年软考试题&…

PyTorch实现卷积神经网络CNN

一、卷积神经网络CNN 二、代码实现&#xff08;PyTorch&#xff09; 1. 导入依赖库 import torch from torch import nn, optim from torchvision import datasets, transforms from torch.utils.data import DataLoader nn&#xff1a;包含了torch已经准备好的层&#xff0c…

Pikachu-Unsafe Fileupload-服务端check

MIME MIME是Multipurpose Internet Mail Extensions &#xff08;多用途互联网邮件扩展类型&#xff09;的缩写&#xff0c;用来表示文件、文档、或字节流的性质和格式。是设定某种扩展名的文件用一种应用程序来打开的方式类型&#xff0c;当该扩展名文件被访问的时候&#xff…

论文阅读笔记-A Comparative Study on Transformer vs RNN in Speech Applications

前言 介绍 序列到序列模型已广泛用于端到端语音处理中,例如自动语音识别(ASR),语音翻译(ST)和文本到语音(TTS)。本文着重介绍把Transformer应用在语音领域上并与RNN进行对比。与传统的基于RNN的模型相比,将Transformer应用于语音的主要困难之一是,它需要更复杂的配…

【hot100-java】【分割回文串】

回溯篇 class Solution {//ret是需要返回的结果//path是回溯过程中的记录private final List<List<String>> retnew ArrayList<>();private final List<String> path new ArrayList<>();private String s;public List<List<String>>…

建筑资质的未来发展趋势

&#x1f3d7;️建筑资质是建筑企业进入市场的通行证&#xff0c;它不仅关系到企业的竞争力&#xff0c;也影响着整个建筑行业的健康发展。随着政策的调整和技术的进步&#xff0c;建筑资质管理正面临着新的变革。 1. 资质管理的数字化转型&#xff1a;&#x1f310; 随着信息技…

JavaScript-上篇

JS 入门 JS概述 JavaScript&#xff08;简称JS&#xff09;是一种高层次、解释型的编程语言&#xff0c;最初由布兰登艾奇&#xff08;Brendan Eich&#xff09;于1995年创建&#xff0c;并首次出现在网景浏览器中。JS的设计初衷是为Web页面提供动态交互功能&#xff…