searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

向量数据库介绍

2023-07-11 01:01:15
74
0

       当有许多狗狗的图片时,熟悉犬类的朋友能很快的区分出它们的品种,因为我们可以从不同的角度观察它们的特征,比较体型的大小,毛长,鼻子的长短等等,如果以坐标点的形式呈现,每只狗狗都对应多维空间上的一个坐标点。

       扩展到世界上的其他事物,不同的事物在不同的维度中有不同的特征表现,或者说不同的数值,最终都会在高维的特征空间中对应着一个坐标点。而更为接近的事物在空间中的点更为聚集,如果我们把每个点都当做从原点出发的向量,那么我们就可以进行很多美妙的计算,比如当猫向量减去鼠向量的值与警察向量减去小偷向量的值十分接近,我们可以任务警察和小偷的关系类似于猫和鼠的关系。

       如果我们对图片进行向量化,就可以通过检索图片实现以图搜图的功能,如果对视频进行向量化,就可以通过搜索相似向量实现相关视频推荐,如果对商品进行向量化,就可以针对用户当前浏览商品进行相关推荐,如果对文本进行向量化,就能在一个智能问答系统中实现,找到一些已经解决过的相似问题以供参考。随着以chatGPT为代表的大语言模型的如火如荼,如果我们把chatGPT的对话内容进行向量化,便可以用当前的对话搜索到历史中最相关的一些对话,再把这些最相关的记忆提示给大模型,将极大的提高大模型输出的效果。

       而传统的数据库不适合用来存储和检索向量数据,所以需要向量数据库来处理这些问题。与传统数据库存储数据表和进行精准搜索的传统数据库不同,向量数据库存储的是向量数据,检索时是找到和当前向量最为相似的一些向量,具有一定的模糊性。这也是所谓的“最近邻”问题,而能实现这一点的称为最近邻搜索算法。

       常见的最近邻搜索算法有暴力搜索即枚举全部向量,找到最为相似的向量,计算向量相似度的方法有很多,比如计算两个向量间的夹角,欧式距离等等,显然这种方法会导致极高的搜索时间,但是它的搜索结果也是完美的,如果数据量较小,使用这种算法也是可以的。

       进一步对暴搜进行优化的方法是,先对向量进行聚类,找到当前向量最近的聚类中心点,再对聚类中心所在的那一类向量进行搜索,当然这种方法并不是完美的,有可能距离当前向量最近的向量所在的聚类中心距离当前向量并不是最近的,所以也被称为近似最近邻算法(ANN)。

       还有一种比较流行的ANN算法是位置敏感哈希算法(LSH),利用哈希碰撞将同一类事物分到同一组,称这种哈希函数为位置敏感哈希函数,这种哈希函数的实现方法是,以二维空间举例,随机生成无数条直线,将平面划分为正面0和反面1,距离越近的向量,被划分到同一面的概率越大,最后通过判断由01组成的哈希值相似程度,得到两个向量的相似程度。

       对于海量的数据,除了搜索速度外,内存的开销也是十分值得注意的。如果一个向量是由128维的浮点数组成,那么一个向量占用的大小就是512字节,如果我们有一千万向量,那么总共占用的内存就是4.77GB,由于每个向量都是很重要的,不太可能通过压缩每个向量维度来降低内存。

       有一种降低内存的方法是乘积量化(PQ),采用每个聚类质心的向量代表质心所在类的全部向量,类似于照片的有损压缩,这样,我们只需保存质心向量的“码本”,其余向量只需存码本中的索引即可。乍一看,这种方法确实节省了很多内存空间,但是一个致命的问题是,当向量分布的比较均匀时,我们需要更多的质心才能更好的分类,而且存在维度灾难的问题,例如均匀数据在1维空间中只需要分为3类的情况下,在2维空间中会变得更加稀疏,且随着维度的增加,稀疏度在不断增加,质心数据随着维度增加呈现指数增加,这样码本的开销很大,并不能起到节省内存的效果。

       为了解决维度灾难的问题,我们可以进行降维,将3维空间的分类,看做是多个2维空间的组合,将质心数量随着维度的指数增长,变成线性增加。

      虽然,内存开销、速度、精度是3个评估相似性算法的重要指标,但是内存方面,用户感知不到,如果可以通过牺牲内存保证较高的速度和精度,也是一种不错的方法,一种基于图的“导航小世界”(NSW)算法正是如此,根据FaceBook的报告,我们每个人平均只需3.7个人就能跟另一个人发生关联,这种算法正是利用了这种思想,随机从某个向量出发,不断跳到最相似的向量去,构建图的时候,我们需要保证每个点都有直接连接的友节点,如果两个点之间的距离近到一定程度,一定要连接起来形成友节点的关系,并在在这2点的基础上保证连线最少。这种构建方法称为德劳内三角剖分法。但是这种方法也存在缺点,比如当两个点距离很远时,要经过很长的跳跃才行。为了解决这个问题,NSW算法先把所有点拿出来,依次放入,并与最近的3个点建立连接,这样形成的图结构,即存在类似于德劳内三角剖分法的连接,也存在一些较远的连接,跳跃时就可以利用先粗后细来加快速度。

      在NSW的基础上,又提出了HNSW,分层的导航小世界,越上层连接越粗远,越下层的连接越精细,相比于NSW,HNSW的粗细更容易控制,搜索先粗快,后细慢更加稳定。但是HNSW的内存开销极大,不仅没有对向量进行压缩,还需要维护图结构。

      目前常见的向量数据库往往集成了大量的ANN算法,还保留了普通数据库的各种功能,目前使用较多的向量数据库有:

  1. Milvus:一个开源的向量数据库,支持高效的向量索引和查询,并提供了 Python、Java 和 Go 等多种语言的客户端 SDK。

  2. Faiss:一个 Facebook 开源的向量搜索库,提供了高效的向量索引和查询算法,并支持多种距离度量方法。

  3. Annoy:一个 C++ 开源的近似最近邻搜索库,可以用于高维向量的索引和查询,支持多种距离度量方法。

  4. Hnswlib:一个 C++ 开源的近似最近邻搜索库,可以用于高维向量的索引和查询,支持多种距离度量方法。

  5. NMSLIB:一个 C++ 开源的近似最近邻搜索库,提供了多种索引和查询算法,并支持多种距离度量方法。

0条评论
0 / 1000
陈****蓉
1文章数
0粉丝数
陈****蓉
1 文章 | 0 粉丝
陈****蓉
1文章数
0粉丝数
陈****蓉
1 文章 | 0 粉丝
原创

向量数据库介绍

2023-07-11 01:01:15
74
0

       当有许多狗狗的图片时,熟悉犬类的朋友能很快的区分出它们的品种,因为我们可以从不同的角度观察它们的特征,比较体型的大小,毛长,鼻子的长短等等,如果以坐标点的形式呈现,每只狗狗都对应多维空间上的一个坐标点。

       扩展到世界上的其他事物,不同的事物在不同的维度中有不同的特征表现,或者说不同的数值,最终都会在高维的特征空间中对应着一个坐标点。而更为接近的事物在空间中的点更为聚集,如果我们把每个点都当做从原点出发的向量,那么我们就可以进行很多美妙的计算,比如当猫向量减去鼠向量的值与警察向量减去小偷向量的值十分接近,我们可以任务警察和小偷的关系类似于猫和鼠的关系。

       如果我们对图片进行向量化,就可以通过检索图片实现以图搜图的功能,如果对视频进行向量化,就可以通过搜索相似向量实现相关视频推荐,如果对商品进行向量化,就可以针对用户当前浏览商品进行相关推荐,如果对文本进行向量化,就能在一个智能问答系统中实现,找到一些已经解决过的相似问题以供参考。随着以chatGPT为代表的大语言模型的如火如荼,如果我们把chatGPT的对话内容进行向量化,便可以用当前的对话搜索到历史中最相关的一些对话,再把这些最相关的记忆提示给大模型,将极大的提高大模型输出的效果。

       而传统的数据库不适合用来存储和检索向量数据,所以需要向量数据库来处理这些问题。与传统数据库存储数据表和进行精准搜索的传统数据库不同,向量数据库存储的是向量数据,检索时是找到和当前向量最为相似的一些向量,具有一定的模糊性。这也是所谓的“最近邻”问题,而能实现这一点的称为最近邻搜索算法。

       常见的最近邻搜索算法有暴力搜索即枚举全部向量,找到最为相似的向量,计算向量相似度的方法有很多,比如计算两个向量间的夹角,欧式距离等等,显然这种方法会导致极高的搜索时间,但是它的搜索结果也是完美的,如果数据量较小,使用这种算法也是可以的。

       进一步对暴搜进行优化的方法是,先对向量进行聚类,找到当前向量最近的聚类中心点,再对聚类中心所在的那一类向量进行搜索,当然这种方法并不是完美的,有可能距离当前向量最近的向量所在的聚类中心距离当前向量并不是最近的,所以也被称为近似最近邻算法(ANN)。

       还有一种比较流行的ANN算法是位置敏感哈希算法(LSH),利用哈希碰撞将同一类事物分到同一组,称这种哈希函数为位置敏感哈希函数,这种哈希函数的实现方法是,以二维空间举例,随机生成无数条直线,将平面划分为正面0和反面1,距离越近的向量,被划分到同一面的概率越大,最后通过判断由01组成的哈希值相似程度,得到两个向量的相似程度。

       对于海量的数据,除了搜索速度外,内存的开销也是十分值得注意的。如果一个向量是由128维的浮点数组成,那么一个向量占用的大小就是512字节,如果我们有一千万向量,那么总共占用的内存就是4.77GB,由于每个向量都是很重要的,不太可能通过压缩每个向量维度来降低内存。

       有一种降低内存的方法是乘积量化(PQ),采用每个聚类质心的向量代表质心所在类的全部向量,类似于照片的有损压缩,这样,我们只需保存质心向量的“码本”,其余向量只需存码本中的索引即可。乍一看,这种方法确实节省了很多内存空间,但是一个致命的问题是,当向量分布的比较均匀时,我们需要更多的质心才能更好的分类,而且存在维度灾难的问题,例如均匀数据在1维空间中只需要分为3类的情况下,在2维空间中会变得更加稀疏,且随着维度的增加,稀疏度在不断增加,质心数据随着维度增加呈现指数增加,这样码本的开销很大,并不能起到节省内存的效果。

       为了解决维度灾难的问题,我们可以进行降维,将3维空间的分类,看做是多个2维空间的组合,将质心数量随着维度的指数增长,变成线性增加。

      虽然,内存开销、速度、精度是3个评估相似性算法的重要指标,但是内存方面,用户感知不到,如果可以通过牺牲内存保证较高的速度和精度,也是一种不错的方法,一种基于图的“导航小世界”(NSW)算法正是如此,根据FaceBook的报告,我们每个人平均只需3.7个人就能跟另一个人发生关联,这种算法正是利用了这种思想,随机从某个向量出发,不断跳到最相似的向量去,构建图的时候,我们需要保证每个点都有直接连接的友节点,如果两个点之间的距离近到一定程度,一定要连接起来形成友节点的关系,并在在这2点的基础上保证连线最少。这种构建方法称为德劳内三角剖分法。但是这种方法也存在缺点,比如当两个点距离很远时,要经过很长的跳跃才行。为了解决这个问题,NSW算法先把所有点拿出来,依次放入,并与最近的3个点建立连接,这样形成的图结构,即存在类似于德劳内三角剖分法的连接,也存在一些较远的连接,跳跃时就可以利用先粗后细来加快速度。

      在NSW的基础上,又提出了HNSW,分层的导航小世界,越上层连接越粗远,越下层的连接越精细,相比于NSW,HNSW的粗细更容易控制,搜索先粗快,后细慢更加稳定。但是HNSW的内存开销极大,不仅没有对向量进行压缩,还需要维护图结构。

      目前常见的向量数据库往往集成了大量的ANN算法,还保留了普通数据库的各种功能,目前使用较多的向量数据库有:

  1. Milvus:一个开源的向量数据库,支持高效的向量索引和查询,并提供了 Python、Java 和 Go 等多种语言的客户端 SDK。

  2. Faiss:一个 Facebook 开源的向量搜索库,提供了高效的向量索引和查询算法,并支持多种距离度量方法。

  3. Annoy:一个 C++ 开源的近似最近邻搜索库,可以用于高维向量的索引和查询,支持多种距离度量方法。

  4. Hnswlib:一个 C++ 开源的近似最近邻搜索库,可以用于高维向量的索引和查询,支持多种距离度量方法。

  5. NMSLIB:一个 C++ 开源的近似最近邻搜索库,提供了多种索引和查询算法,并支持多种距离度量方法。

文章来自个人专栏
文章 | 订阅
0条评论
0 / 1000
请输入你的评论
0
0