Faiss是Facebook的AI团队开源的一套用于做聚类或者相似性搜索的软件库。由于推荐业务的召回模块需要在50ms以内拿到结果,而Faiss几乎可以在10ms内完成百万*百万以上的向量距离计算。
- 余弦值:范围在[-1,1]之间,值越趋近于1,代表两个向量的方向越接近;越趋近于-1,他们的方向越相反;
- 欧式距离:即L2距离,x与y每维分量之差的平方和,距离越小代表越相近
- 内积:x与y每维分量的点积之和,值越大代表越相近(越大夹角越小,方向越一致)
首先介绍一下里面涉及的概念:
检索算法介绍
- 暴力搜索:顾名思义,
query
和base
一一比对,选择最近的;IVF
:首先在具有代表性的数据上训练聚类中心,然后将base
加入到最近的聚类中心的桶里,在search
的时候,query
先和聚类中心比对,再在一定数目的桶里做暴力搜索;IVFPQ
:在IVF
的基础上,将base
做PQ
量化,加速比对
Faiss中最常用的是索引Index,而后是PCA降维、PQ乘积量化,这里针对Index和PQ进行说明,PCA降维从流程上都可以理解。
IVF 【推荐系统】倒排索引
倒排PQ乘积量化(IVFPQ)是PQ乘积量化的更进一步加速版
PQ编码
Product quantization(乘积量化PQ),PQ是一种建立索引的方式。这里参考这篇文章为大家说明:http://www.fabwrite.com/productquantization
假设有50,000张图片组成的图片集,使用 CNN 提取特征后,每张图片可以由1024维的特征表示。那么整个图片集由50000*1024的向量来表示。然后我们把1024维的向量平均分成m=8个子向量,每组子向量128维。如下图。
对于这8组子向量的每组子向量,使用 kmeans 方法聚成k=256类。也就是说,每个子向量有256个中心点(centroids)。如下图。
在product quantization方法中,这256个中心点构成一个码本。这些码本的笛卡尔积就是原始D维向量对应的码本。用qj表示第j组子向量,用Cj表示其对应学习到的码本,那么原始D维向量对应的码本就是 ,码本大小为
。
注意到每组子向量有其256个中心点,我们可以中心点的 ID 来表示每组子向量中的每个向量。中心点的 ID只需要 8位()来保存即可。这样,初始一个由32位浮点数组成的1,024维向量,可以转化为8个8位整数组成。如下图。
再回到Faiss
ntotal——
参考:
---- PQ
---- Faiss
---- index
问题?faiss中的id mapping如何理解?