【推荐系统】Faiss index选择

index选择

考虑因素:候选向量的数量级、index所占内存的大小、检索所需时间(是离线检索还是在线检索)、index构建时间、检索的召回率。

Faiss入门及应用经验记录 - 知乎

Flat :暴力检索 IVFx Flat :倒排暴力检索 PQx :乘积量化 IVFxPQy 倒排乘积量化 LSH 局部敏感哈希 HNSWx
优点 该方法是Faiss所有index中最准确的,召回率最高的方法,没有之一; IVF利用倒排索引思想,拿出每个聚类中心下的向量ID,每个中心ID后面挂上一堆非中心向量,每次查询向量的时候找到最近的几个中心ID,分别搜索这几个中心下的非中心向量。通过减小搜索范围,提升搜索效率。 利用乘积量化的方法,改进了普通k-means,将一个向量的维度切成x段,每段分别进行k-means。因此速度很快,而且占用内存较小,召回率也相对较高(切4段) 工业界大量使用此方法,各项指标都均可以接受。 不同于传统哈希尽量不产生碰撞,局部敏感哈希依赖碰撞来查找近邻。高维空间的两点若距离很近,那么设计一种哈希函数对这两点进行哈希值计算,使得他们哈希值有很大的概率是一样的,若两点之间的距离较远,他们哈希值相同的概率会很小。不同距离度量的哈希函数不同,不是所有距离度量(如内积)都能找到对应局部敏感哈希。 - 训练非常快,支持分批导入,index占内存很小,检索也比较快 基于图检索的改进方法,检索速度极快,10亿级别秒出检索结果,而且召回率几乎可以媲美Flat,能达到惊人的97%。检索的时间复杂度为loglogn,几乎可以无视候选向量的量级了。并且支持分批导入,极其适合线上任务,毫秒级别体验。
缺点 速度慢,占内存大。 速度也还不是很快 召回率相较于暴力检索,下降较多。 召回率非常拉垮。在候选语料比较多的时候(百万级别),检索也不是特别快,大概是秒级别的。 构建索引极慢,占用内存极大(是Faiss中最大的,大于原向量占用的内存大小
使用情况 向量候选集很少,在50万以内,并且内存不紧张。 向量候选集很少,在50万以内,并且内存不紧张。 内存及其稀缺,并且需要较快的检索速度,不那么在意召回率 同PQx 候选向量库非常大,离线检索,内存资源比较稀缺的情况 不在乎内存,并且有充裕的时间来构建index
是否GPU
是否训练 是,因为倒排索引需要训练k-means,因此需要先训练index,再add向量 是,因为倒排索引需要训练k-means,因此需要先训练index,再add向量 同PQx
参数 IVFx中的x是k-means聚类中心的个数 PQx中的x为将向量切分的段数,因此,x需要能被向量维度整除,且x越大,切分越细致,时间复杂度越高 同PQx HNSWx中的x为构建图时每个点最多连接多少个节点,x越大,构图越复杂,查询越精确,当然构建index时间也就越慢,x取4~64中的任何一个整数。
上一篇:树莓派系统最小化备份


下一篇:js执行机制(1)