- 摘要
本文介紹了一種基於乘積量化的近似最近鄰搜索方法。 這個想法是將空間分解為低維子空間的笛卡爾積,並分別量化每個子空間。 矢量由其子空間量化索引和短碼表示。 可以從它們的碼字有效地估計兩個矢量之間的歐氏距離。 非對稱版本增加了精度,因為它計算向量和碼字之間的近似距離。 實驗結果表明,我們的方法有效地搜索最近鄰居,特別是與倒置文件系統相結合。 SIFT和GIST圖像描述符的結果顯示出優異的搜索精度,優於三種最先進的方法。 我們的方法的可擴展性在20億個向量的數據集上得到驗證。
- 簡介
在本文中,我們使用量化構造短碼字。 目標是使用向量到質心距離來估計距離,即,不對量化查詢向量,僅將代碼分配給數據庫向量。 這減少了量化噪聲並隨后提高了搜索質量。 為了獲得精確的距離,必須限制量化誤差。 因此,質心的總數k應該足夠大,例如,對於64位代碼,k = 2^64。 這引發了關於如何學習碼本和分配的幾個問題:首先,學習量化器所需的樣本數量很大,即幾倍於k。 其次,算法本身的復雜性令人望而卻步。 最后,地球上可用的計算機內存量不足以存儲表示質心的浮點值。
分層k均值(HKM)提高了學習階段和相應分配程序的效率[13]。 然而,上述限制仍然適用,特別是關於存儲器使用和學習集的大小。 另一種可能性是標量量化器,但就存儲器和重建誤差之間的權衡而言,它們提供了差的量化誤差特性。 格子量化器為均勻矢量分布提供了更好的量化特性,但現實世界矢量很少滿足這種條件。 實際上,這些量化器在索引任務中的表現明顯比k均值差[20]。 在本文中,我們關注乘積量化器。 據我們所知,這種半結構化量化器從未在任何最近鄰搜索方法中被考慮過。
我們的方法的優點是雙重的。 首先,可能的距離數量明顯高於競爭漢明嵌入方法[18],[15],[17],因為這些技術中使用的漢明空間僅允許幾個不同的距離。 其次,作為該方法的副產品,我們得到了預期平方距離的估計,這是“ - 半徑搜索或使用Lowe的距離比率標准[21]所需的。在[18]中使用漢明空間的動機, [15],[17]是有效地計算距離。但是,請注意,計算漢明距離的最快方法之一是使用表查找。我們的方法使用相似數量的表查找,從而產生可比較的效率。
查詢向量與所有碼字的詳盡比較對於非常大的數據集來說是禁止的。 因此,我們引入了修改的反向文件結構,以快速訪問最相關的向量。 粗量化器用於實現該反轉文件結構,其中對應於簇(索引)的向量存儲在相關列表中。 列表中的向量由我們的乘積量化器計算的短碼表示,其在此用於編碼關於簇中心的殘差向量。
我們的方法的興趣在兩種向量上得到驗證,即局部SIFT [21]和全局GIST [16]描述符。 與現有技術的比較表明,我們的方法優於現有技術,特別是頻譜散列[17],Hamming嵌入[18]和FLANN [7]。
- 背景:量化,乘積量化
關於矢量量化的文獻很多,參見[22]的調查。 在本節中,我們將限制在本文其余部分中使用的符號和概念。
- 向量量化
量化是一種破壞性過程,已在信息理論中得到廣泛研究[22]。 其目的是減少表示空間的基數,特別是當輸入數據是實值時。 形式上,量化器是將D維向量映射到向量q,我從現在開始的索引集假定為有限,再現值ci稱為質心。 該組再現值C是大小為k的碼本。
映射到給定索引i的向量的集合Vi是稱為(Voronoi)單元。
量化器的k個單元形成IRD的分區。 根據定義,位於相同單元Vi中的所有矢量由相同的質心ci重建。 量化器的質量通常通過輸入矢量x與其再現值之間的均方誤差來測量。
為了使量化器最佳,它必須滿足稱為勞埃德最優性條件的兩個性質。 首先,就歐氏距離而言,向量x必須量化為其最近的碼本質心:argmin d(x,ci)
結果,單元由超平面界定。 第二個勞埃德條件是重建值必須是位於Voronoi單元格中的向量的期望:ci=∫p(x)xdx
Lloyd量化器對應於k均值聚類算法,通過迭代地將訓練集的向量分配給質心並從指定的點重新估計這些質心來找到接近最優的碼本。 在下文中,我們假設兩個Lloyd條件成立,因為我們使用k-means學習量化器。 然而,注意,k均值僅在量化誤差方面找到局部最優。
- 乘積量化
讓我們考慮一個128維向量,例如,SIFT描述符[21]。 產生64位碼字的量化器,包含k個2^64質心。 因此,不可能使用勞埃德算法甚至HKM,因為所需的樣本數量和學習量化器的復雜度是k的幾倍。 甚至不可能存儲表示k個質心的DXk浮點值。
乘積量化是解決這些問題的有效解決方案。 這是源編碼中的常用技術,它允許我們選擇要聯合量化的組件的數量(例如,可以使用強大的Leech點陣量化24個組件的組)。 輸入向量x被分成m個不同的子向量,維度D*=D /m,其中D是m的倍數。 使用m個不同的量化器分別量化子向量。 因此,給定的向量x映射如下:
其中qj是與第j個子向量相關聯的低復雜度量化器。 利用子量化器qj,我們將索引集Ij,碼本Cj和相應的再現值cj, i相關聯。
乘積量化器的再現值由乘積索引集元素標識。 因此,碼本被定義為笛卡爾積:
並且該集合的質心是m個子量化器的質心的串聯。 從現在開始,我們假設所有子量化器具有相同的有限數量k的再現值。 在這種情況下,質心的總數由下式給出
k=(k*)^m
注意,在m = D的極值情況下,矢量x的分量都被分別量化。 然后,乘積量化器證明是標量量化器,其中與每個分量相關聯的量化函數可以是不同的.
乘積量化器的強度是從幾組小質心產生大量質心:與子量化器相關的質心。 當使用Lloyd算法學習子量化器時,使用有限數量的向量,但是在某種程度上,碼本仍然適合於要表示的數據分布。 學習量化器的復雜性是使用維度D的k個質心執行k均值聚類的復雜度的m倍。
明確存儲碼本C效率不高。 相反,我們存儲所有子量化器的mXk*個質心,即mD* k*=k* D個浮點值。 量化元素需要k* D浮點運算。 表1總結了與k-means,HKM和產品k-means相關的資源需求。 乘積量化器顯然是唯一可以在內存中為大k值索引的量化器。
為了在選擇k*的常數值時提供良好的量化特性,每個子矢量平均應具有可比較的能量。 確保該屬性的一種方法是在量化之前將矢量乘以隨機正交矩陣。 但是,對於大多數矢量類型,這不是必需的,也不推薦使用,因為連續的組件通常通過構造相關聯,並且與相同的子量化器一起更好地量化。 由於子空間是正交的,因此與乘積量化器相關的平方失真是
可以觀察到,對於固定數量的比特,最好使用具有許多質心的少量子量化器而不是具有少量比特的許多子量化器。 在極端情況下,當m = 1時,乘積量化器變為常規的k均值碼本。
高k*值會增加量化器的計算成本,如表1所示。它們還會增加存儲質心的內存使用量(k* X D浮點值),如果質心查找表在緩存中不再適合,則會進一步降低效率。 在m=1的情況下,我們不能使用超過16位來保持這種成本易處理。 使用k*=256和m=8通常是合理的選擇。
- 搜索量化
最近鄰搜索取決於查詢向量與數據庫向量之間的距離,或者等效於平方距離。 本節介紹的方法基於量化指標對矢量進行比較。我們首先解釋乘積量化器屬性如何用於計算距離。 然后我們提供了距離估計誤差的統計界限,並提出了歐氏距離平方的精細估計。
- 使用量化碼計算距離
讓我們考慮查詢向量x和數據庫向量y。 我們提出了兩種計算這些矢量之間的近似歐氏距離的方法,一種是對稱的,一種是非對稱的。 有關說明,請參見圖2。