文献分享: 高维ANN算法的综述

文章目录


原文章

0.   \textbf{0. } 0. 写在前面

0.1.   \textbf{0.1. } 0.1. 一些预备知识

1️⃣最邻近查询

  1. 精确最邻近查询:从数据库中找到与查询对象最近的对象
    • 最邻近( NNS \text{NNS} NNS):与查询点最近的唯一点
    • k - {k\text{-}} k-最邻近( k-NNS \text{k-NNS} k-NNS):与查询点距离最近的 k k k个点
  2. 近似最邻近查询:
    • 是啥:最邻近查询的 Recall<100% \text{Recall<100\%} Recall<100%版本,即 ANNS/k-ANNS \text{ANNS/k-ANNS} ANNS/k-ANNS
    • 原由:高维空间找到精确最邻近很难(突破暴力解法),即所谓维度诅咒(灾难)
  3. (r,c)-ANN \text{(r,c)-ANN} (r,c)-ANN:给定距离阈值 r r r/查询点 q q q,考虑数据库点 e i e_i ei q q q周围 r r r以及 c r cr cr范围的分布
    image-20240803185122335
    Case \textbf{Case} Case ∃ e i 使D ∈ [ 0 , r ] \exist{}e_i使\text{D}\in[0,r] ei使D[0,r] ∃ e i 使D ∈ [ r , c r ] \exist{}e_i使\text{D}\in{}[r,cr] ei使D[r,cr] ∃ e i 使D ∈ [ c r , ∞ ] \exist{}e_i使\text{D}\in[cr,\infin{}] ei使D[cr,]返回对象
    Case 1 \text{Case 1} Case 1一定可能可能满足 D ≤ c r D\leq{cr} Dcr e i e_i ei
    Case 2 \text{Case 2} Case 2不可能不可能不可能寂寞
    Case 3 \text{Case 3} Case 3不可能一定可能满足 D ≤ c r D\leq{cr} Dcr e i e_i ei
    • 表中 D=dist ( q , e i ) \text{D=}\text{dist}(q,e_i) D=dist(q,ei)
    • 该问题主要应用在基于 LSH \text{LSH} LSH的方法中

2️⃣关于 k -Mean k\text{-Mean} k-Mean算法:

  1. 什么是 k -Mean k\text{-Mean} k-Mean:将空间分为 k \text{k} k个尽可能内部紧凑/互相远离的部分,分为以下两个阶段
    • 数据分配:将每个数据点分给最近的聚类中心,复杂度为 O ( n k ) O(nk) O(nk)
    • 重置中心点:重新计算每个聚类的中心点,复杂度为 O ( n ) O(n) O(n)
  2. 关于 k -Mean k\text{-Mean} k-Mean的大聚类数目
    • 是什么:在进行聚类时,选取 k {k} k等于一个很大的数,以至于达到 Θ ( n ) \Theta{}{(n)} Θ(n)规模
    • 为何不能 k = Θ ( n ) k\text{=}\Theta(n) k=Θ(n):数据分配复杂度为 O ( n k ) = O ( n 2 ) O(nk)\text{=}O(n^2) O(nk)=O(n2),查询(计算与 k k k个中心距离)为 O ( n ) O(n) O(n)
    • 关于如何规避 k = Θ ( n ) k\text{=}\Theta(n) k=Θ(n)则见后续 FLANN / Annoy / OPQ \text{FLANN}/\text{Annoy}/\text{OPQ} FLANN/Annoy/OPQ

0.2.   \textbf{0.2. } 0.2. 本文的主要研究

1️⃣在不同领域的数据集上对比不同领域的 ANN \text{ANN} ANN算法

  1. 当前问题:一些 ANN \text{ANN} ANN的提出只针对特定领域,且只在特定领域的数据集上测试
  2. 本文工作:选取不同领域的多个最先进算法,在不同领域的多个数据集上测试

2️⃣评估了算法在多种设置和指标下的性能

  1. 性能类:搜索的时间复杂度,搜索质量(精确度/正确率)
  2. 资源类:索引大小
  3. 耐草类:可扩展性,鲁棒性
  4. 维护类:可更新性,更新参数的成本

3️⃣设计了一种改进新基于图的算法 DPG \text{DPG} DPG

0.3.   \textbf{0.3. } 0.3. 本文一些研究限制

1️⃣算法选择:只选择当前最先进的算法,排除被明显超过的其它算法

2️⃣算法实现:注重算法技术本身,削弱实现时的优化 (如取消多线程/多 CPU \text{CPU} CPU等)

3️⃣密集向量:默认向量都密集,不考虑对稀疏数据的特殊处理

4️⃣标签:将每个点的真实 k k k个最邻近点作为标签,以便得到召回率

1.   \textbf{1. } 1.  三大类 ANN \textbf{ANN} ANN算法回顾以及 DPG \textbf{DPG} DPG

1.1.   \textbf{1.1. } 1.1. 基于哈希的:高维数据 → \to 低维哈希码

1.1.1.   LSH \textbf{1.1.1. LSH} 1.1.1. LSH:有理论保证

1️⃣ LSH \text{LSH} LSH原理:当对于 e i , e j e_i,e_j ei,ej哈希函数的选择是随机独立的( CIKM’13 \text{CIKM'13} CIKM’13),则以下

输入点 e i , e j e_i,e_j ei,ej → 局部敏感哈希函数 \xrightarrow{局部敏感哈希函数} 局部敏感哈希函数 映射结果
相似度高,即 dist ( e i , e j ) < r \text{dist}(e_i,e_j)<r dist(ei,ej)<r → 局部敏感哈希函数 \xrightarrow{局部敏感哈希函数} 局部敏感哈希函数 高概率被映射到相同哈希码
相似度低,即 dist ( e i , e j ) > c r \text{dist}(e_i,e_j)>cr dist(ei,ej)>cr → 局部敏感哈希函数 \xrightarrow{局部敏感哈希函数} 局部敏感哈希函数 高概率被映射到不同哈希码

2️⃣ LSH \text{LSH} LSH函数:影响性能的关键

  1. 针对欧几里得空间的: SCG’04 \text{SCG'04} SCG’04 / FOCS’06 \text{FOCS'06} FOCS’06 / SODA’14 \text{SODA'14} SODA’14 / WADS’07 \text{WADS'07} WADS’07 / STOC’15 \text{STOC'15} STOC’15
  2. 基于随机线性投影的: SCG’04 \text{SCG'04} SCG’04 / VLDB’99 \text{VLDB'99} VLDB’99 / SODA’06 \text{SODA'06} SODA’06 / SIGMOD’09 \text{SIGMOD'09} SIGMOD’09

3️⃣ LSH \text{LSH} LSH函数及 LSH \text{LSH} LSH方法的改进研究

  1. LSH \text{LSH} LSH函数的连接:将多个哈希函数首尾相连,但增加了哈希表数量(时空开销)
  2. 动态 LSH \text{LSH} LSH函数
  3. 启发式寻桶

1.1.2.   Learning   to   Hash(L2H) \textbf{1.1.2. Learning to Hash(L2H)} 1.1.2. Learning to Hash(L2H):无理论保证

1️⃣原理:学习原有数据的分布 → 生成 \xrightarrow{生成} 生成 特定哈希,使得原空间中的近似关系在哈希空间得到保留

2️⃣类型:

Type \textbf{Type} Type Pub. \textbf{Pub.} Pub.
成对相似性保持类 ICML’11 \text{ICML'11} ICML’11 / NIPS’08 \text{NIPS'08} NIPS’08 / NIPS’14 \text{NIPS'14} NIPS’14 / KDD’10 \text{KDD'10} KDD’10 / CVPR’13 \text{CVPR'13} CVPR’13
多重相似性保持类 ICCV’13 \text{ICCV'13} ICCV’13 / MM’13 \text{MM'13} MM’13
隐式相似性保持类 CVPR’11 \text{CVPR'11} CVPR’11 / ICCV’13 \text{ICCV'13} ICCV’13
量化类 TPAMI’11 \text{TPAMI'11} TPAMI’11 / TPAMI’13 \text{TPAMI'13} TPAMI’13 / NIPS’12 \text{NIPS'12} NIPS’12

3️⃣关于量化类方法:最有效的 L2H \text{L2H} L2H方法

  1. 核心:最小化量化失真 (及 min ⁡ ∑ \min\displaystyle\sum min 每个数据点 ↔ \xleftrightarrow{ } 其最邻近指的差)
  2. PQ(Product Quantization) \text{PQ(Product Quantization)} PQ(Product Quantization)算法, TPAMI’11 \text{TPAMI'11} TPAMI’11 / TIT’06 \text{TIT'06} TIT’06( Quantization \text{Quantization} Quantization)

4️⃣基于神经网络的(无监督)哈希方法

  1. Semantic哈希:
    • 原理:构建多层 RBM(Restricted Boltzmann Machines) \text{RBM(Restricted Boltzmann Machines)} RBM(Restricted Boltzmann Machines)
    • 目标:为文本(文档)学习紧凑的二进制代码
  2. 如何学习二进制代码
  3. 二进制约束的优化问题

1.2.   \textbf{1.2. } 1.2. 基于划分的方法

1️⃣原理:

  1. 构建:将整个高维空间(递归式)划分为多个不相交的区域
  2. 核心:默认如果 q q q r q r_q rq内,则 q q q的最邻近也在 r q r_q rq(或其附近)

2️⃣空间的划分方式

  1. 枢轴法( pivoting \text{pivoting} pivoting):
  2. 超平面法( hyperplane \text{hyperplane} hyperplane):
  3. 紧凑法( compact \text{compact} compact):

1.3.   \textbf{1.3. } 1.3. 基于图的方法

1️⃣原理:

  1. 构建:数据 ↔ 对应 \xleftrightarrow{对应} 对应 图结点 + + +数据邻近关系 ↔ 对应 \xleftrightarrow{对应} 对应 图边 → 组成 \xrightarrow{组成} 组成 邻近图
  2. 核心:默认邻居的邻居也是邻居
  3. 方法:通过迭代扩展邻居的邻居 + + +遵循边的最佳优先搜索策略

2️⃣第一大类:构建近似 KNN-Graph \text{KNN-Graph} KNN-Graph,图中每个节点指向最近的 k k k个邻居

  1. 在高维空间的应用: IJCAI’11 \text{IJCAI'11} IJCAI’11 / CVPR’12 \text{CVPR'12} CVPR’12 / CoRR’17 \text{CoRR'17} CoRR’17 / WWW’11 \text{WWW'11} WWW’11
  2. 关于算法初始点:

3️⃣第二大类: SW(Small-World)-Graph \text{SW(Small-World)-Graph} SW(Small-World)-Graph,图中任两节点可较少步到达 ( Nature’20 \text{Nature'20} Nature’20)

  1. NSW \text{NSW} NSW方法:通过迭代插入点来构建 SW-Graph \text{SW-Graph} SW-Graph ( IS’14 \text{IS'14} IS’14)
  2. HNSW \text{HNSW} HNSW方法: NSW \text{NSW} NSW的扩展,最有效的 ANNS \text{ANNS} ANNS算法之一 ( CoRR’16 \text{CoRR'16} CoRR’16)

1.4.   \textbf{1.4. } 1.4. 关于 DPG \textbf{DPG} DPG

1.4.1.   \textbf{1.4.1. } 1.4.1. 传统 KNN \textbf{KNN} KNN图:连通性较差

1️⃣原因之一:最邻近聚集在一个方向

  1. 实例:如下 2-NN \textbf{2-NN} 2-NN图中,搜索路径只能 p → { a 3 , a 4 } p\text{→}\{a_3,a_4\} p{a3,a4}而不能 p → b p\text{→}b pb即使 p ↔ b p\xleftrightarrow{}b p b很近
    image-20240928155307724
  2. 咋整:选取邻居时不仅考虑距离,还需考虑角度

2️⃣原因之二:中心性问题

  1. 是啥: KNN \text{KNN} KNN图中很多的点没有入度,即不作为其他点的最邻近( JMLR’11 \text{JMLR'11} JMLR’11),如上图点 p p p
  2. 咋整:将单向边变成双向边

1.4.2.   DPG \textbf{1.4.2. DPG} 1.4.2. DPG

1️⃣相似度:给定 p p p及其 K K K最邻近列表 L \mathcal{L} L,对于 x , y ∈ L x,y\in{}\mathcal{L} x,yL用角度 θ ( x , y ) = ∠ x p y \theta(x, y)\text{=}\angle x p y θ(x,y)=xpy衡量 x y xy xy的相似度

2️⃣ DPG \text{DPG} DPG的构建算法:

  1. 算法流程
    • 对于 p p p,先找出其 K K K个最邻近点(组成 L \mathcal{L} L列表)
    • L \mathcal{L} L列表中选择子集 S \mathcal{S} S( | S |= κ \text{|}\mathcal{S}\text{|=}\kappa |S|=κ)使 S \mathcal{S} S中两点平均角度最大;选择方法遵循以下贪婪启发式算法
      image-20241012235132614
    • 将所有边双向化,即 ∀ u ∈ S \forall{}u\in\mathcal{S} uS ( p , u ) (p, u) (p,u) ( u , p ) (u, p) (u,p)都包括在邻近图中
  2. 关于构建算法
    • 时间复杂度为 O ( κ 2 K n ) O\left(\kappa^2 K n\right) O(κ2Kn),本文也实现了一个简化的性能较差版本复杂度为 O ( K 2 n ) O\left(K^2 n\right) O(K2n)
    • | S |= κ \text{|}\mathcal{S}\text{|=}\kappa |S|=κ选取 K K K至关重要,实证表明 K = 2 κ K\text{=}2 \kappa K=2κ最佳

3️⃣搜索过程:与 KGraph \text{KGraph} KGraph的搜索完全相同

2.   \textbf{2. } 2. 实验前

2.1.   \textbf{2.1. } 2.1. 参与实验的算法

1️⃣基于 LSH \text{LSH} LSH QALSH \small\text{QALSH} QALSH( VLDB’15 \small\text{VLDB'15} VLDB’15), SRS \small\text{SRS} SRS( VLDB’14 \small\text{VLDB'14} VLDB’14), FALCONN \small\text{FALCONN} FALCONN( NIPS’15 \small\text{NIPS'15} NIPS’15)

2️⃣基于 L2H \text{L2H} L2H

算法类型算法
基于二进制 SGH \small\text{SGH} SGH( IJCAI’15 \small\text{IJCAI'15} IJCAI’15), AGH \small\text{AGH} AGH( ICML’11 \small\text{ICML'11} ICML’11), NSH \small\text{NSH} NSH( VLDB’15 \small\text{VLDB'15} VLDB’15)
基于量化 OPQ \small\text{OPQ} OPQ( TPAMI’14 \small\text{TPAMI'14} TPAMI’14), CQ \small\text{CQ} CQ( ICML’14 \small\text{ICML'14} ICML’14)
其它 SH \small\text{SH} SH( SIGKDD’15 \small\text{SIGKDD'15} SIGKDD’15), NAPP \small\text{NAPP} NAPP( VLDB’15 \small\text{VLDB'15} VLDB’15)

3️⃣基于划分的:

  1. FLANN \text{FLANN} FLANN类: FLANN/FLANN-HKM/FLANN-KD \small\text{FLANN/FLANN-HKM/FLANN-KD} FLANN/FLANN-HKM/FLANN-KD( TPAMI’14 \small\text{TPAMI'14} TPAMI’14), Annoy \small\text{Annoy} Annoy
  2. VP \text{VP} VP树( TPAMI’14 \small\text{TPAMI'14} TPAMI’14)

4️⃣基于图的:

算法类型算法
基于小世界的 SW \small\text{SW} SW( IJCAI’15 \small\text{IJCAI'15} IJCAI’15), HNSW \small\text{HNSW} HNSW( CoRR’16 \small\text{CoRR’16} CoRR’16)
基于 KNN \text{KNN} KNN KGraph \small\text{KGraph} KGraph( WWW’11 \small\text{WWW'11} WWW’11), DPG \small\text{DPG} DPG(本文)
基于树 RCT \small\text{RCT} RCT( TPAMI’15 \small\text{TPAMI’15} TPAMI’15)

2.2.   \textbf{2.2. } 2.2. 数据集与查询负载

1️⃣数据集概述: 18 \text{18} 18个真实数据集(图像/音频/视频/文本) + + + 2 \text{2} 2个合成( Synthetic \text{Synthetic} Synthetic)数据集

 Name  n ( × 1 0 3 ) d  RC   LID   Type   Nus  ∗ 269 500 1.67 24.5  Image   Gist  ∗ 983 960 1.94 18.9  Image   Rand  ∗ 1 , 000 100 3.05 58.7  Synthetic   Glove  ∗ 1 , 192 100 1.82 20.0  Text   ....  . . . . . . . . . . . . . . . .  ....  \small\begin{array}{cccccc}\hline \text { Name } & n\left(\times 10^3\right) & d & \text { RC } & \text { LID } & \text { Type } \\\hline \text { Nus }^* & 269 & 500 & 1.67 & 24.5 & \text { Image } \\\text { Gist }^* & 983 & 960 & 1.94 & 18.9 & \text { Image } \\\text { Rand }^* & 1,000 & 100 & 3.05 & 58.7 & \text { Synthetic } \\\text { Glove }^* & 1,192 & 100 & 1.82 & 20.0 & \text { Text } \\\text { .... } & .... & .... & .... & .... & \text { .... } \\\hline\end{array}\\{}  Name  Nus  Gist  Rand  Glove  .... n(×103)2699831,0001,192....d500960100100.... RC 1.671.943.051.82.... LID 24.518.958.720.0.... Type  Image  Image  Synthetic  Text  .... 

2️⃣度量数据集难度的指标

  1. 相对对比度( RC \text{RC} RC):
    • 计算: RC= 每两点距离的平均 每点与其最邻近距离的平均 \text{RC=}\cfrac{\small\text{每两点距离的平均}}{\small\text{每点与其最邻近距离的平均}} RC=每点与其最邻近距离的平均每两点距离的平均
    • 含义:较小的 RC \text{RC} RC会导致最邻近不易区分,导致搜索难度变大
  2. 局部内在维度( LID \text{LID} LID):数据集在某个局部区域的内在维度,越高意味着结构越复杂难以查询

3️⃣查询负载

  1. 对每个数据集:从每个数据集中移出 200 \text{200} 200个点作为查询点
  2. 对于 k-NN \text{k-NN} k-NN图算法:进行性能测试时,默认 k=20 \text{k=20} k=20

2.3.   \textbf{2.3. } 2.3. 实验设置

2️⃣测试配置

  1. 选择并使用来自 NMSLIB \text{NMSLIB} NMSLIB库中已经实现的几种算法( NAPP/VP-Tree/SW/HNSW \text{NAPP/VP-Tree/SW/HNSW} NAPP/VP-Tree/SW/HNSW)
    • NMSLIB \text{NMSLIB} NMSLIB库:专用于非度量空间的开源库,实现并提供了诸多高维相似性搜索算法
    • 度量空间:距离计算具备传统的几何性质,比如欧几里得空间
  2. 仔细调整了每个算法的超参数
  3. 关闭了特定的硬件优化,比如禁用 KGraph \text{KGraph} KGraph的多线程等

3️⃣环境:

  1. 系统: Linux \text{Linux} Linux服务器
  2. 计算: Intel Xeon e5-2690 + 32G RAM \text{Intel Xeon e5-2690}+\text{32G RAM} Intel Xeon e5-2690+32G RAM
  3. 编译: C \text{C} C++由 g \text{g} g++ 4.7 \small\text{4.7} 4.7编译, MATLAB \text{MATLAB} MATLAB MATLAB 8.5 \text{MATLAB 8.5} MATLAB 8.5编译

2.4.   \textbf{2.4. } 2.4. 评估指标

1️⃣查询精度指标:运行算法找到 N \text{N} N个候选最邻近,将 N \text{N} N点按离查询点的距离排序,引出以下指标

  1. 基础指标:
    指标含义
    Recall \text{Recall} Recall N个候选项目中真实最邻近的数目 k \cfrac{\text{N}个候选项目中真实最邻近的数目}{\text{k}} kN个候选项目中真实最邻近的数目
    Precision \text{Precision} Precision N个候选项目中真实最邻近的数目 k \cfrac{\text{N}个候选项目中真实最邻近的数目}{\text{k}} kN个候选项目中真实最邻近的数目
    F1 Score \text{F1 Score} F1 Score 2 × Precision+Recall Precision+Recall 2\text{×}\cfrac{\text{Precision+Recall}}{\text{Precision+Recall}} 2×Precision+RecallPrecision+Recall
  2. AP(Average Precision) = ∑ i = 1 N [ P(i)×Rel(i) ] N中真实最邻近数量 \text{AP(Average Precision)}=\cfrac{\displaystyle{}\sum_{i=1}^{\small\text{N}}[\text{P(i)×Rel(i)}]}{\text{N}中真实最邻近数量} AP(Average Precision)=N中真实最邻近数量i=1N[P(i)×Rel(i)]
    • 位置参数 i i i:介于 1→N \text{1→N} 1→N间用于标记候选点, i = 1 i\text{=}1 i=1表示距离查询点最近, i =N i\text{=}\text{N} i=N表示最远
    • 相关性标记:将候选 N \text{N} N个最邻近点中,真实的最邻近点标记为相关记作 Rel(i)=1 \text{Rel(i)=1} Rel(i)=1
    • 精确率:定义为 P(i)= 截至位置 i 时 , 最邻近的数目 i \text{P(i)=}\cfrac{截至位置i时,最邻近的数目}{ i} P(i)=i截至位置i,最邻近的数目
    • mAP \text{mAP} mAP:就是所有查询点的 AP \text{AP} AP的平均,本文采用此指标
  3. Accuracy = ∑ i = 0 k dist(q, kANN(q)[i]) dist(q, kNN(q)[i]) \text{Accuracy}=\displaystyle{}\sum_{i=0}^k \cfrac{\text{dist(q, kANN(q)[i])}}{\text{dist(q, kNN(q)[i])}} Accuracy=i=0kdist(q, kNN(q)[i])dist(q, kANN(q)[i])参数含义如下,越接近 1 1 1表示最邻近查找越精准
    • dist(q, kANN(q)[i]) \text{dist(q, kANN(q)[i])} dist(q, kANN(q)[i]):查询点 ↔ 距离 \xleftrightarrow{距离} 距离 使用某个 ANN \text{ANN} ANN算法排序后第 i i i个最邻近点
    • dist(q, kNN(q)[i]) \text{dist(q, kNN(q)[i])} dist(q, kNN(q)[i]):查询点 ↔ 距离 \xleftrightarrow{距离} 距离 真实的第 i i i个最邻近点

2️⃣查询效率(时间)指标:

  1. 加速比 t ˉ t ′ \cfrac{\bar{t}}{t^{\prime}} ttˉ:即查询时间比上线性暴力扫描的时间
  2. 文中还提到了,除了基于图的算法,都可以用调整 N \text{N} N的方法调整查询指标

3️⃣其它指标:

  1. 索引指标:索引构建时间,索引大小,索引内存
  2. 可扩展性

3.   \textbf{3. } 3. 实验

3.1.   \textbf{3.1. } 3.1. 第一轮:类别内评估

1️⃣评估工作:

  1. 评估流程:
    • 将所有算法置于 Sift/Notre \text{Sift/Notre} Sift/Notre数据集上测试
    • 权衡查询速度/召回的 Trade Off \text{Trade Off} Trade Off,以从每个类别中选出算法进行下一轮评估
  2. 评估标准:
    • 认为相同召回率下速度提升更大的为更优
    • 对于算法数据存在外部的( IO \text{IO} IO次数决定速度),故将总页数/搜索时访问页数作为速率提升

2️⃣评估结果:进入第二轮实验的算法

image-20240928160353049 image-20240928160425131

image-20240928160500641 image-20240928160814641

类别评估选取的结果
LSH \text{LSH} LSH SRS/QALSH \text{SRS/QALSH} SRS/QALSH间选取 SRS \text{SRS} SRS FALCONN \text{FALCONN} FALCONN L2 \text{L2} L2距离下性能缺乏保证故放第二轮
L2H \text{L2H} L2H选取 OPQ \text{OPQ} OPQ
空间分割类排除 VP-Tree \text{VP-Tree} VP-Tree
基于图类选取 KGraph \text{KGraph} KGraph HNSW \text{HNSW} HNSW DPG \text{DPG} DPG延后到下一轮

3.2.   \textbf{3.2. } 3.2. 第二轮评估

image-20240928171652969

3.2.1.   \textbf{3.2.1. } 3.2.1. 对查询质量/事件的评估

1️⃣加速比 @ Recall=0.8 + Recall @ @\text{Recall=0.8}+\text{Recall}@ @Recall=0.8+Recall@加速比 =50 \text{=50} =50:

  1. DPG \text{DPG} DPG HNSW \text{HNSW} HNSW性能最佳
  2. 其中 DPG \text{DPG} DPG KGraph \text{KGraph} KGraph的改良显著,尤其在难数据集上
  3. SRS \text{SRS} SRS及其拉跨,源于其没有利用数据集的分布

2️⃣加速比 @ Recall=0→1 @\text{Recall=0→1} @Recall=0→1

  1. HNSW/KGraph/Annoy \text{HNSW/KGraph/Annoy} HNSW/KGraph/Annoy整体性能优越
  2. DPG/KGraph \text{DPG/KGraph} DPG/KGraph在高 Recall \text{Recall} Recall下性能优越,但整体不如 HNSW \text{HNSW} HNSW

3️⃣ Recall @ \text{Recall}@ Recall@访问数据比 = 0 % → 100 % \text{=}0\%\text{→}100\% =0%100%

  1. HNSW \text{HNSW} HNSW外基于图的算法在百分比低时拉跨,源于其算法入口点随机
  2. HNSW \text{HNSW} HNSW的分层结构中每层入口不随机,所以性能保持优越

4️⃣ Accuracy @ \text{Accuracy}@ Accuracy@ Recall= 0 → 1 \text{Recall}\text{=}0\text{→}1 Recall=01:专为 c-ANN \text{c-ANN} c-ANN设计的 SRS \text{SRS} SRS FLACONN \text{FLACONN} FLACONN性能优越

3.2.2.   \textbf{3.2.2. } 3.2.2.  对索引空间的评估

1️⃣ index size data size \cfrac{\text{index size}}{\text{data size}} data sizeindex size的评估

  1. 索引大小规模
    • 最大: Annoy \text{Annoy} Annoy(大于数据大小),源于其需要维护数量庞大的 Tree \text{Tree} Tree结构
    • 最小: OPQ/SRS \text{OPQ/SRS} OPQ/SRS
  2. 索引大小与维度无关: DPG/KGraph/HNSW/SRS/FLACONN \text{DPG/KGraph/HNSW/SRS/FLACONN} DPG/KGraph/HNSW/SRS/FLACONN
  3. 索引大小剧烈变化: FLANN \text{FLANN} FLANN,源于其有三种不同索引结构供选择

2️⃣索引构建时间

  1. 索引时间最小: FALCOMNN \text{FALCOMNN} FALCOMNN,其次是 SRS \text{SRS} SRS
  2. 索引时间与维度无关: OPQ \text{OPQ} OPQ,源于其涉及子码字的计算
  3. 相比于 DPG/KGraph \text{DPG/KGraph} DPG/KGraph DPG \text{DPG} DPG在图的多样化构建上没花太多额外时间

3️⃣索引内存成本: OPO \text{OPO} OPO在索引构建时内存开销低,由此在大规模数集上高效

4.   \textbf{4. } 4. 试验后

4.1.   \textbf{4.1. } 4.1. 算法选择策略

1️⃣计算/主存足够时:选择 DPG/HNSW \text{DPG/HNSW} DPG/HNSW,其次选 Annoy \text{Annoy} Annoy以在硬件和搜索性能上折中

2️⃣看重索引构建时间时:选择 FALCONN \text{FALCONN} FALCONN

3️⃣处理大规模数据: OPQ/SRS \text{OPQ/SRS} OPQ/SRS,源于二者内存成本/构建时间较小

4.2.   \textbf{4.2. } 4.2. 进一步分析:空间划分类算法

1️⃣ k -Mean k\text{-Mean} k-Mean类的 ANN \text{ANN} ANN算法:如何规避 k = Θ ( n ) k\text{=}\Theta(n) k=Θ(n)

  1. FLANN / Annoy \text{FLANN}/\text{Annoy} FLANN/Annoy(递归树思想):每个结点将数据划为 k k k块(子节点)直到叶节点
    • 二者在基于划分的算法中性能最佳
    • FLANN \text{FLANN} FLANN在大多情况下选择 FLANN-HKM \text{FLANN-HKM} FLANN-HKM(层次 k -Mean k\text{-Mean} k-Mean)
  2. OPQ \text{OPQ} OPQ(子空间划分思想):将整体分为 M \text{M} M → \to 每块中进行 k ′ -Mean k'\text{-Mean} k-Mean( k ′ k' k较小) → \to 组合每块聚类结果
  3. 实验证明:在 Audio \text{Audio} Audio类型数据上,除了使用 k -Means k\text{-Means} k-Means的暴力方法, FLANN-HKM \text{FLANN-HKM} FLANN-HKM( L=2 \text{L=2} L=2)最好
    image-20240928171748672

2️⃣进一步实验证明:多层次 k -Means k\text{-Means} k-Means树的 FLANN-HKM \text{FLANN-HKM} FLANN-HKM(类似 Annoy \text{Annoy} Annoy)不能提高性能

image-20240928171949136

4.3.   \textbf{4.3. } 4.3. 进一步分析:图类算法

1️⃣为何基于图的算法( KGraph/DPG/HNSW \text{KGraph/DPG/HNSW} KGraph/DPG/HNSW)表现好

  1. 图结构上:高连通性 + + +全局可达性
  2. 搜索算法上:得益于高连通性,算法可沿边逼近最邻近 + + +存在多条路径(避免局部最优)

2️⃣ KGraph \text{KGraph} KGraph在部分数据集上不佳:算法入口点随机 + + +缺乏跨聚类的

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于递推式最小二乘法的PMSM参数辨识MATLAB仿真模型

微❤关注“电气仔推送”获得资料&#xff08;专享优惠&#xff09; 模型简介 最小二乘法是一种回归估计法&#xff0c;适用于被辨识的参数与系统输出为线性关 系的情况。它是在一定数据量下&#xff0c;基于系统输出误差的平方和最小的准则对参 数进行辨识的方法。此模型通过…

案例分享-优秀蓝色系UI界面赏析

蓝色UI设计界面要提升舒适度&#xff0c;关键在于色彩搭配与对比度。选择柔和的蓝色调作为主色&#xff0c;搭配浅灰或白色作为辅助色&#xff0c;能营造清新、宁静的氛围。同时&#xff0c;确保文字与背景之间有足够的对比度&#xff0c;避免视觉疲劳&#xff0c;提升阅读体验…

CatVTON:AI 虚拟换装的卓越之选

在时尚与科技融合的时代&#xff0c;CatVTON 作为一款创新的 AI 虚拟换装工具&#xff0c;正引领着时尚界的变革。它由中山大学、美图、Pixocial 和鹏城实验室等机构联合开发&#xff0c;以其独特的优势和卓越的性能&#xff0c;为时尚爱好者、电商从业者以及设计师们带来了前所…

URL路径以及Tomcat本身引入的jar包会导致的 SpringMVC项目 404问题、Tomcat调试日志的开启及总结

一、URL路径导致的 SpringMVC项目 404问题 SpringMVC项目的各项代码都没有问题&#xff0c;但是在页面请求时仍然显示404&#xff0c;编译的时候报了下面的问题&#xff1a; org.apache.jasper.servlet.TldScanner.scanJars 至少有一个JAR被扫描用于TLD但尚未包含TLD。 为此记录…

Windows下搭建VUE开发环境

Windows下搭建VUE开发环境 文章目录 Windows下搭建VUE开发环境第一步 安装nodejs下载nodejs安装nodejs配置环境变量安装测试配置npm的路径配置npm的国内代理安装必要工具测试工具安装的使用 第二步 安装vscode下载vscode安装插件Chinese (Simplified) (简体中文) Language Pack…

从0到1构建Next.Js项目SSG和SSR应用

最近在探索学习前端工程化相关内容&#xff0c;在如今前后端分离的架构下&#xff0c;为了提升首屏渲染速度和 SEO 效果&#xff0c;兜兜转转&#xff0c;又回到了服务端渲染。 本文主要是讲讲如何使用 Next.js 框架实现服务端渲染&#xff0c;重构或优化现有前端应用的 SEO 和…

光伏工程造价单自动生成

光伏工程造价单依据光伏设计图自动生成。 一、组件 类型&#xff1a;光伏组件是光伏电站的核心设备&#xff0c;负责将太阳能转化为电能。常见的类型包括单晶硅组件、多晶硅组件、薄膜组件等。 规格型号&#xff1a;具体规格型号取决于电站的设计需求&#xff0c;例如功率、…

企业博客SEO优化:8个必备工具与资源指南

在当今数字化时代&#xff0c;企业博客已远远超越了传统意义上的信息展示平台。它不仅是企业展示品牌形象、传递品牌价值的重要窗口&#xff0c;更是吸引潜在客户、增强用户粘性、提升网站流量和搜索引擎排名的关键。通过精心策划和高质量的内容创作&#xff0c;企业博客能够建…

【OpenGL】创建窗口/绘制图形

需要云服务器等云产品来学习Linux可以移步/-->腾讯云<--/官网&#xff0c;轻量型云服务器低至112元/年&#xff0c;新用户首次下单享超低折扣。 目录 一、创建窗口 1、代码流程图 2、运行结果 3、代码 二、三角形 1、顶点缓冲对象&#xff1a;Vertex Buffer Object…

【Qt】控件——Qt控件的介绍、QWidget的介绍、QWidget的属性、QWidget的函数

文章目录 Qt1. 控件的概念2. QWidgetenabledgeometrywindowTitlewindowIconwindowOpacitycursorfonttoolTiptoolTipDuringstyleSheet Qt 1. 控件的概念 Widget 是 Qt 中的核心概念。英文原义是 “小部件”&#xff0c;我们此处也把它翻译为 “控件”。控件是构成一个图形化界面…

吴恩达深度学习笔记(7)

误差分析&#xff1a; 你运行一个算法代替人类计算&#xff0c;但是没有达到人类的效果&#xff0c;需要手动检查算法中的错误&#xff0c;对模型的一些部分做相应调整&#xff0c;才能更好地提升分类的精度。如果不加分析去做&#xff0c;可能几个月的努力对于提升精度并没有…

Linux文件你不知道的那些事,搞清楚磁盘空间占用的问题

在进行采集日志时&#xff0c;日志文件明明被滚动压缩并转移走了&#xff0c;但是发现磁盘空间还是在不断增长&#xff0c;统一目录下的总文件大小&#xff0c;发现与实际占用也不符&#xff0c;于是想到可能是文件句柄未释放导致的&#xff0c;本文就来记录一下文件及文件句柄…

git clone 国内镜像

比如 git clone https://github.com/HKUST-Aerial-Robotics/A-LOAM.git 改成 git clone https://gitclone.com/github.com/HKUST-Aerial-Robotics/A-LOAM.git

MySQL 查询按照更新时间排序遇到相同更新时间的会少数据

MySQL分页后出现重复数据或丢失记录的原因可能包括&#xff1a;SQL查询条件不一致、使用了不稳定的排序、LIMIT语句与ORDER BY配合问题、缓存设置不当或数据库复制配置错误。需要检查查询逻辑和系统配置以解决这些问题。 MySQL分页导致数据重复的原因&#xff1a; 1、排序算法…

补题:C. Paprika and Permutation

C. Paprika and Permutation 传送门&#xff1a;Problem - 1617C - Codeforces 题意&#xff1a; 思路&#xff1a; 首先这个题要知道这个结论&#xff1a; 当 x > a[i] 时&#xff0c;a[i] mod x a[i] 当 x < a[i] 时&#xff0c;0 < a[i] % x < ( a[i] 1 )…

【unity小技巧】Unity6 LTS版本安装和一些修改和新功能使用介绍

文章目录 前言安装新功能变化1、官方推荐使用inputsystem进行输入控制2、修复了InputSystem命名错误导致listen被遮挡的bug3、自带去除unity启动画面logo功能4、unity官方的behavior行为树插件5、linearVelocity代替过时的velocity方法待续 完结 前言 2024/10/17其实unity就已…

ChatGPT 现已登陆 Windows 平台

今天&#xff0c;OpenAI 宣布其人工智能聊天机器人平台 ChatGPT 已开始预览专用 Windows 应用程序。OpenAI 表示&#xff0c;该应用目前仅适用于 ChatGPT Plus、Team、Enterprise 和 Edu 用户&#xff0c;是一个早期版本&#xff0c;将在今年晚些时候推出"完整体验"。…

【Java函数篇】Java8中函数接口Function使用详解

文章目录 函数接口Function函数式接口只允许有一个抽像方法通过Lambda表达式实现接口 FunctionalInterface注解构建一个函数式接口使用自己创建的函数式接口 JDK中的函数式接口Function函数最常用的Function<T,R>使用apply(T t)andThen(Function<? super R,? extend…

CTF(五)

导言&#xff1a; 本文主要讲述在CTF竞赛中&#xff0c;web类题目easyphp。 靶场链接&#xff1a;攻防世界 (xctf.org.cn) 参考文章原文链接&#xff1a;Web安全攻防世界05 easyphp&#xff08;江苏工匠杯&#xff09;_攻防世界 easyphp-CSDN博客 一&#xff0c;观察页面。…

OpenCV学习笔记5——图像的数值计算

目录 一、简单数值计算 二、opencv中提供函数进行计算 三、cv2.addWeighted 一、简单数值计算 在opencv中&#xff0c;我们有许多可以获取图像各类数值的办法&#xff0c;许多函数能获得各种方面的数据。但如果我们什么都不用&#xff0c;仅仅对图像上每一个点做加法运算会…