《Product Quantization for Nearest Neighbor Search》 (2011, IEEE)
近似近邻计算(approximate nearest neighbor)(ANN): 给一个测试样本,有一定误差的找到库里最近邻的样本们;
例:128维float向量,分成8组,每组128/8=16维,每组聚类(KMeans)成256类(用8bit可编码),每组有一个codebook(code->聚类中心的16维float向量);量化之后的样本编码成8bit*8=64bit的数据;
测试样本x,和库里所有样本y计算相似度,有两种方式:
1. x和y都量化:预处理,所有y量化好;x来了就先量化,计算x的量化值和y的量化值的相似度(计算8组,加到一起);每组的256个量化值两两之间的相似度,预处理阶段做好,使用阶段直接查表;
2. x不量化,y量化:预处理,所有y量化好;x来了,分8组,计算该组x到该组256个量化值之间的相似度(计算8*256次),存到表里(8*256个值);对每个y, y的8组量化值对应表里8个位置,直接查表最后相加即可;
方法2没有对x量化,因此精度损失比1小,效果更好!
两级量化:
1. 粗量化,同上;
2. 细量化:粗量化里每一组,库里的所有的y要和每个聚类中心计算"残差"(相减即可),对残差再聚类,这样每一组有N个残差中心
粗量化是计算: d(x, rc(y)); 两级量化是计算:d( x - rc(x), rq(y - rc(y)) ) y是属于rc(x)那个粗聚类的样本们,即rc(x)==rc(y)