Background
如何在資料海量的內容庫中快速檢索出Top-k的資訊候選?
- 縮小查詢的範圍,快速找到最有可能成為近鄰的一個粗集合
- 對Embedding向量做壓縮,快速計算兩個Embedding的距離。
本實踐內容的程式碼管理在Codes24/FlashCIM/資料夾下的pq_lib中
Vector Quantization
將一個向量空間中的點用其中的一個有限子集來進行編碼的過程。
透過Vector Quantization進行壓縮的原理是減少表示影像的灰度級數。例如,我們可以使用 8 個值而不是 256 個值。因此,這意味著我們可以有效地使用 3 位元而不是 8 位元來編碼單個畫素,從而將記憶體使用量減少約 2.5 倍。
假設1個資料集中包含N個元素,每個元素是D維向量,使用K-MEANS演算法進行聚類,最終產生K個聚類中心,如K=256,那麼可用8bit進行表示,0-255表示每個cluster ID,透過cluster ID查詢到中心的向量,用中心向量作為該元素的近似表示。
\(CSR=\frac{8bit}{32bit\times D}\)
Product quantization
把D維向量分成m組,每組進行Kmeans聚類。可以實現m組子向量的Kmeans演算法並行求解,但同時表示空間增大,變為\(K^m\)。
為什麼要進行乘積量化?主要是為了減少索引的記憶體佔用。乘積量化工作棧如下:
- 將一個大的、高維的向量分成大小相等的塊,建立子向量。
- 為每個子向量確定最近的質心,將其稱為再現或重建值。
- 用代表相應質心的唯一id替換這些再現值。
在生成碼錶和量化後,經常會求解一個query的最近鄰或topk近鄰,主要有SDC和ADC兩種方法。
- SDC:x和y的距離等於經過encoding後的x和y的距離,即distance(q(x), q(y))。
- ADC:x和y的距離等於x和encoding後的y的距離, 即distance(x, q(y))。
IVFPQ
IVFPQ 是一種用於資料檢索的索引方法,它結合了倒排索引(Inverted File)和乘積量化(Product Quantization)的技術。
- 倒排索引(Inverted File): 這是一種資料結構,用於加速搜尋。對於每個特徵向量,倒排索引儲存了包含該特徵向量的資料的列表,這使得在查詢時可以快速定位包含相似特徵的資料。
- 乘積量化(Product Quantization): 這是一種降維和量化的技術。在資料檢索中,通常使用很高維度的特徵向量來描述資料。乘積量化透過將這些高維向量分解成較小的子向量,並對每個子向量進行獨立的量化,從而減少了儲存和計算的複雜性。這有助於加快檢索速度。
還有圖v用這個i有如下:
- 建立索引: 在建立索引階段,首先將資料庫中的每個資料提取出高維度的特徵向量。然後使用乘積量化將這些高維度的特徵向量對映到低維度的碼本中。最後在低維度的碼本上構建倒排索引,為每個碼本對應的資料建立一個倒排列表。
- 查詢處理: 當進行查詢時,首先將查詢資料的特徵向量進行乘積量化,對映到碼本中。然後,透過倒排索引找到包含與查詢碼本相似的倒排列表。
- 倒排列表剪枝: 利用倒排列表的資訊,可以剪枝掉一些明顯不相似的資料,從而減小搜尋空間。這是透過檢查查詢碼本與倒排列表中的碼本之間的距離進行的。
- 精確匹配: 對於剩餘的倒排列表中的資料,透過計算它們的原始特徵向量與查詢特徵向量之間的距離,進行更精確的匹配。這可以使用標準的相似性度量,如歐氏距離或餘弦相似度。
- 返回結果: 根據相似性度量的結果,返回與查詢資料相似度最高的資料作為搜尋結果。
參考資料
https://github.com/GoGoDuck912/pytorch-vector-quantization/tree/main
https://blog.csdn.net/deephub/article/details/135102464
https://zhuanlan.zhihu.com/p/645783024