机器学习之PQ量化算法

什么是PQ量化算法

PQ算法属于一种经典的ANN(approximate nearest neighbor,近似最近邻算法)算法,ANN不是寻找最近邻向量,而是退而求其次寻找近似最近邻向量。所以必然会带来一些误差,为了尽量减少误差,很多算法都做了一系列的优化,同样PQ系列也是。
相对全量运算优点:
(1)减少存储:实际应用中样本向量巨大,可能是百亿或千亿级别,存储开销很大;
(2)减少运算量:逐个遍历时间在O(n)量级,遍历时间耗费很大;
(3)减少运算量:完全计算两组数据之间的欧式距离开销很大。

算法实现

PQ系列的算法大致的套路分三个阶段:训练、量化、查询.

训练&量化

有n个训练样本,每个样本维度D是64。把每个样本分割为M=8段,对每一段聚类,聚为K=256类,得到MK个类中心,每个类中心维度为D/M,这些类中心称为码本,训练得到码本,保存。
机器学习之PQ量化算法
对于每个子段m,去K个类中心中寻找距离最近的类中心U(m)
机器学习之PQ量化算法
存储每一个类对应子类的标签列表。
这样训练完成,对N个样本,最后存下来的仅有K
M个类中心和N*M个样本对应类中心的标签,大大的减少了数据的存储量,节省了内存。

数据检索

距离计算通常有两方法

分别为 “对称距离计算” 和 “非对称距离计算” ,分别如下左右图所示:
机器学习之PQ量化算法
对称距离计算:直接使用两个压缩向量x,y的索引值所对应的码字q(x),q(y)之间的距离代替之,而q(x),q(y)之间的距离可以离线计算,因此可以把q(x),q(y)之间的距离制作成查找表,只要按照压缩向量的索引值进行对应的查找就可以了,所以速度非常快;
非对称距离计算:使用x,q(y)之间的距离代替x,y之间的距离,其中x是测试向量。虽然y的个数可能有上百万个,但是q(y)的个数只有k个,对于每个x,我们只需要在输入x之后先计算一遍x和k个q(y)的距离,制成查找表(因为只有k个,所以速度是非常快的),然后按照y对应的压缩向量索引值进行取值操作就可以了。

计算过程

(1)计算查询向量和类中心的距离,得到距离表
(2)根据标签表和距离表,计算每个样本与查询向量的距离和
(3)返回k个距离和最接近的样本
机器学习之PQ量化算法

如何得到精确结果

这种算法是基于量化的,所以必然存在量化误差,所以距离的计算并不是完全准确的。通常通过这种算法迅速返回k个结果,然后再在k个结果中进行进一步的匹配计算,得到比较准确的结果。

扩展

不管哪种计算方法都可以实现快速的距离计算,但是非对称距离计算由于只量化了y,所以计算的距离精度更高,效果也更好。距离计算过程中只需要存储码书和对应的索引值就可以完全抛弃原始的图像表达向量,实现数据的压缩和距离的快速计算。
在原文中,还有基于PQ的非线性计算方法IVFADC,它的速度更快,精度反而更高了,有时间再介绍。其实后续人们不断改进了PQ算法,如OPQ,Multi-ADC,DPQ,AQ/APQ,TQ,LOPQ等等,其中OPQ,Multi-ADC的提升效果还是比较明显的。