尽管使用乘积量化的方案,我们已经可以用很低的代价来遍历所有的样本向量,计算每个样本向量和查询向量的距离了。但是我们依然希望能用更高效的检索技术代替遍历,来提高检索效率。因此,结合前面的知识,我们可以将聚类、乘积量化和倒排索引综合使用,让整体检索更高效。下面,我就来具体说说,在建立索引和查询这两个过程中,它们是怎么综合使用的。
首先,我们来说建立索引的过程,我把它总结为 3 步。
- 使用 K-Means 聚类,将所有的样本向量分为 1024 个聚类,以聚类 ID 为 Key 建立倒排索引。
- 对于每个聚类中的样本向量,计算它们和聚类中心的差值,得到新的向量。你也可以认为这是以聚类中心作为原点重新建立向量空间,然后更新该聚类中的每个样本向量。
使用乘积量化的方式,压缩存储每个聚类中新的样本向量。
建好索引之后,我们再来说说查询的过程,它也可以总结为 3 步。当查询向量到来时,先计算它离哪个聚类中心最近,然后查找倒排表,取出该聚类中所有的向量。
- 计算查询向量和聚类中心的差值,得到新的查询向量。
- 对新的查询向量,使用乘积量化的距离计算法,来遍历该聚类中的所有压缩样本向量,取出最近的 k 个结果返回。
这样,我们就同时结合了聚类、乘积量化和倒排索引的检索技术,使得我们能在压缩向量节省存储空间的同时,也通过快速减少检索空间的方式,提高了检索效率。通过这样的组合技术,我们能解决大量的图片检索问题。比如说,以图搜图、拍照识物,人脸识别等等。
实际上,除了图像检索领域,在文章推荐、商品推荐等推荐领域中,我们也都可以用类似的检索技术,来快速返回大量的结果。尤其是随着 AI 技术的发展,越来越多的对象需要用特征向量来表示。所以,针对这些对象的检索问题,其实都会转换为高维空间的近似检索问题,那我们今天讲的内容就完全可以派上用场了。