PQ算法全称ProductQuantization,中文名为乘积量化。该算法来源于图像检索,本质上是对向量做压缩。
假如总共有N个数据点,数据的维度是D维。给定一个Query做近邻检索,如果采用暴力检索方式,那么计算复杂度就是N*D(遍历N个点计算距离,每个点计算的复杂度是D)。如果可以对向量进行压缩,比如压缩后的向量维度只有原来的一半,那么复杂度就可以降低一半。
如下图所示,假如原始的向量长度为128(D=128),将向量分为8段(M=8),每段的长度是16维。
采用聚类算法,对于每段训练一个256个(k=256)中心的聚类模型,用聚类中心id表示每一段。由于聚类id有256个,所以只需要8-bits就可以表示一个id。注意每一段都是独立的聚类模型和聚类中心点。
SDC全称symmetric distancecomputation,是将query向量做压缩,转化为用每段用聚类中心id的向量表示。然后计算距离(此时所有待检索的数据点都已经预先转化完成向量压缩)。而ADC算法,则是不对Query向量做压缩,直接计算Query向量到各个聚类中心的距离。一般认为ADC的误差更小一些。
(图片引自知乎:工牌厂程序猿)