Introduction
这是一篇关于向量数据库索引的论文,主要研究基于图的索引结构。
作者介绍了常见的基于哈希、树、量化、图的索引,并且指出,基于图的索引很难进行分析,所以,作者从图的入度和出度出发进行优化。
并依次提出了三种对于度的调整方案:
- a static degreeadjustment method for deriving an adjusted graph from the edges and reversed edges of a KNNG to roughly adjust the indegrees and outdegrees.
- a degree-adjustment method with constraints for more precisely adjusting the indegrees and outdegrees.
- a dynamic degree-adjustment methodfor dynamically determining the optimal outdegree from the required accuracy at the beginning of a search considering that individual users require different levels of accuracy for each search.
Detail
关于算法一
这个算法其实就是正常的KNN搜索+剪枝。
G是构建好的邻近图,q为查询向量,,S是遍历候选集,R是结果集
- 首先在临近图中按特定方法选取出可能的邻近点放入S中,依次遍历
- 如果当前遍历的点s在q的近似邻域r*(1+)中,按照与向量q的距离远近依次访问其邻居集M
- 令当前访问的邻居是n。
- 如果n在q的近似邻域内,即d(n,q)<r * (1+),那么把n放入候选集S。
- 如果n在q的精确邻域内,即d(n,q)<r,那么把n放入结果集R。
- 将结果集R大小裁剪为k以下。如果恰好为k,则将r更新为R中距离q最远的点对应的距离。
KNNG,BKNNG,TKNNG
BKNNG是KNNG对应的双向邻域图,TKNNG是KNNG的反向图,作者发现这几种邻域图的QPS和precision有明显的区别。
- 原因在于KNNG中的点拥有的出度固定,而有很多点的入度为0,或是极少,被访问的概率很低。
- 而TKNNG作为KNNG的反向图,它的点入度固定,相反获得了更多的出度,这也意味着从一个点出发可以访问更多的邻居
- BKNNG作为KNNG的双向图,通过度调整方法,可以获得更好的搜索性能
结论:
• High outdegrees that increase query time should be reduced.
• Low indegrees that reduce precision should be increased.
静态度调整
# 简单用python+伪代码翻译一下
# 对一个邻域图G的度进行调整,将出度和入度调整到预期度e_o和e_i或以下
def ConstructAdjustedGraph( G(V,E) , e_o , e_i):
VV = V,EE = {} # 一开始不选取任何边
for v,index in VV: # 遍历每一个点
s = {v的邻居结点}
while len(s) > 0 and index <= e_o and index <= e_i:
n = v的最近邻
s中去掉n这个点
if index < e_o:
EE += <v,n>
if index < e_i:
EE += <n,v>
return G(VV,EE)
带约束的静态度调整
静态调整会带来高出度的点?
这个算法获得G_t时将设置为了0,得到一个空图?自相矛盾?
路径调整
路径调整的思路就是裁剪不必要的边,什么是不必要的边呢?
如上图b,存在路径和,那么第一条路径就是不必要的。
但是图a中另一条路径长度为3,不可以 删除。
即,对于点a、点b,有直达路径和绕行路径s,且len(s)=2,如果s上每一条边的长度都小于那么就可以把s删除(图c中的绕行路径就不可以删除,因为)
建图
评估
损失函数
Conclution
就是在原有的ANNG图上加上了度的调整,牺牲了建图的效率换取检索时间。同时论文中还改进了检测点是否被访问过的方法。(怎么说呢,有点水,当然思路还是有一定的参考价值的)