在此之前写了一篇hnswlib在大规模向量近邻检索上的使用,本篇展开来讲一下hnswlib不同参数的含义。
相关系列文章可参考:
《大规模向量相似度计算(一)——hnswlib的基本使用示例》
《大规模向量相似度计算(二)——hnswlib的参数含义》
《HNSW的基本原理及使用》
1. hnswlib支持的距离
在 hnswlib分别支持L2距离,向量内积以及cosine相似度。在构建索引的过程中对应的具体参数为:
l2
,ip
,cosine
Distance | parameter | equation |
---|---|---|
Squared L2 | ‘l2’ | d = ∑ i = 0 N ( A i − B i ) 2 d = \sum_{i=0}^{N}(A_i-B_i)^2 d=∑i=0N(Ai−Bi)2 |
Inner product | ‘ip’ | d = 1.0 − ∑ i = 0 N ( A i × B i ) d = 1.0 - \sum_{i=0}^{N}(A_i \times B_i) d=1.0−∑i=0N(Ai×Bi) |
Cosine similarity | ‘cosine’ | d = 1.0 − ∑ i = 0 N ( A i ∗ B i ) 2 ∑ i = 0 N ( A i ∗ A i ) × ∑ i = 0 N ( B i ∗ B i ) d = 1.0 - \frac{\sum_{i=0}^N(A_i * B_i)^2}{\sum_{i=0}^N(A_i * A_i) \times \sum_{i=0}^N(B_i * B_i)} d=1.0−∑i=0N(Ai∗Ai)×∑i=0N(Bi∗Bi)∑i=0N(Ai∗Bi)2 |
构建索引的时候,通过传递参数确认检索最近邻需要使用的距离:
p = hnswlib.Index(space = 'l2', dim = dim)
2 构建参数
在索引初始化阶段的代码如下:
index.init_index(max_elements=num_elements, ef_construction=200, M=16)
M
: 表示在构建期间,每个元素创建的双向链表的数量。M合理的范围是2-100。M值较高的时候在高召回率数据集上效果好,M值较低在低召回率数据集上效果好。M值决定了算法内存消耗,大概是
M
×
(
8
10
)
B
y
t
e
s
M \times (8~10)\;Bytes
M×(8 10)Bytes
ef_construction
:控制了索引时间和索引准确度,和ef参数具有相同的意义。ef_constraction越大,构建时间越长,但是索引质量更好。在某种程度上提高ef_construction并不能提高index的质量。
- 检查ef_construction的选取是否正确的一种方法是在ef=ef_construction的时候测量M最近邻搜索的召回率,如果召回率低于0.9,ef_construction可以继续改进。
num_elements
: 在index最大的元素个数。
3 检索参数
在近邻检索阶段的代码如下:
index.set_ef(int(k * 1.2))
labels, distances = index.knn_query(data, k=k)
ef
: 动态检索链表的大小。当ef设置的越大,越准确同时检索速度越慢,ef不能设置的比检索最近邻的个数K小。ef的值可以设置为k到集合大小之间的任意值。
k
: 结果中返回的最近邻的结果的个数k。knn_query
函数返回两个numpy数据。分别包括k个最近邻结果的标签和与这k个标签的距离。
搜索并关注微信公众号:【charlie_mouse】
回复:hnswlib 获取测试代码