本文主要参考自:A Survey of Product Quantization,2018 by ITE Transactions on Media Technology and Applications (MTA)。Yusuke Matsui , Yusuke Uchida , Herv´e J´egou,Shin’ichi Satoh (member)
notation:M,D,K:每个D维的vector分成M段,每段D/M维,每段聚K类
1.Pre-rotation(OPQ)
PQ只是简单地将维度划分成M份,不考虑数据分布,子向量没有含义,原文提出可以先将数据用正交矩阵旋转一下。
OPQ实现了这一点:迭代计算正交矩阵,使得量化误差最小。训练阶段分两步:
- 所有训练数据都用R旋转,接下来codeword和PQ一样处理。
- 给定训练过的codeword,用Orthogonal Procrustes Problem的处理方法来更新R。
OPQ是对PQ的直接扩展,通常情况下,应用旋转矩阵的附加损失适中,但增加了精度。
2.Generalization(AQ,CQ)
Additive Quantization和Composite Quantization泛化了PQ表示。原始PQ用M个D/M维向量concat而成,AQ和CQ表示M个D维向量的和向量。
第m个子码书表示为,其中。输入向量x依然编码成M份,但重组的向量变为求第m份K个向量的和。(这个重组向量就相当于过去的编(聚类)号后concat的那个,比如x~=[0001 0011 0010]现在就是x~=6,如理解有错请指正)
过去:现在:
这句话不理解:If we restrict each sub-codeword such that only values for mth region is nonzero, Eq. (10) becomes Eq. (6).
This shows that PQ is a special case of AQ/CQ.其中Eq6和Eq10分别是上面左右两个公式。
给定查询y,和AQ/CQ码ix,AQ/CQ的非对称距离计算方式是:
第一项忽略,因为查询过程中不变;第二项和PQ中一样可以预先计算O(DKM),在线查表即可O(M);第三项的计算是个问题,要是和第二项一样处理,在线过程时间复杂度是O(M^2),成为了计算瓶颈,AQ和CQ对此提出了不同解决方式。
AQ中使用额外的一字节标量量化来存储这一项,查询时时间复杂度是O(1);CQ训练子codeword(子codeword的内积),第三项近似成一个常数。注意在原始PQ中这一项总是0,因为子codebook是正交的。
3.编码策略