PQ以及有關索引的筆記Faiss: The Missing Manual

參考Faiss

索引結構總結:

各種方法的對比
為了加深記憶,介紹一下Inverted File Index(IVF)的名字由來:
IVF索引的名字源自“倒排文件”(Inverted File)的概念。在傳統的信息檢索中,倒排文件是一種索引結構,用于記錄每個詞匯和文檔之間的關系,從而快速定位包含特定詞匯的文檔。
“倒排”是相對于文檔順序的“正排”而言的。在傳統的信息檢索中,文檔是按照其自然順序存儲的,稱為“正排文件”(Forward File)。在這種結構中,每個文檔包含的信息是完整的,比如文檔的內容以及可能包含的所有詞匯。如果需要搜索某個詞匯,系統就需要遍歷所有文檔,逐個檢查是否包含這個詞匯,這樣效率會非常低。

而“倒排文件”(Inverted File)則是通過將詞匯和文檔之間的關系“倒轉”過來實現的。它先建立一個詞匯表(詞典),然后為每個詞匯記錄它所出現的文檔編號或位置。這樣,當查詢某個詞匯時,系統可以直接通過倒排文件快速定位到包含該詞匯的文檔,而不需要逐一掃描所有文檔。這種方法顯著提高了檢索速度。

在向量相似性搜索中,IVF索引借用了這種倒排結構的思想,但將其應用于向量空間。數據集的向量被劃分到多個“簇”(clusters)或“細胞”(cells)中。這些簇是通過對向量進行聚類(Clustering)創建的,每個簇有一個中心點(Centroid)。查詢向量(Query Vector)通過與中心點的比較確定屬于哪個簇,然后搜索范圍限制在該簇或多個簇中。這種方法減少了搜索范圍,提高了搜索效率。

PQ(Product Quantization)

名字的由來

Product(產品、乘積)一詞的核心意義在于:

  • 向量的整體量化是多個子空間量化的“乘積”,通過將整體問題分解成多個子問題,從而減少計算復雜性(所以這里product有點類似“分解”的意思)。
  • 通過將一個高維向量拆分為多個子向量,并分別對這些子向量進行量化,最終的編碼可以看作這些獨立量化的“笛卡爾乘積”。

“Quantization”:指的是“量化”過程。量化的目的是用有限的質心(centroids)來近似表示連續向量空間,從而大幅降低存儲和計算成本。

“Product Quantization”表達了該技術的核心思想:通過對向量進行分解(product)和量化(quantization)以高效處理大型數據集。這種方法在保持精確性的同時顯著減少了存儲需求和計算開銷。

如何做查詢

如何構建參看上述Faiss鏈接
已知構建好后數據集中的data都可以表示為質心ID。

查詢方法一:

  1. 查詢向量量化:查詢向量同樣被分割為子向量,并映射到其各自子空間的最近質心,這使得查詢向量也可以被表示為一組質心ID。
  2. 計算距離:系統利用這些質心的編碼信息來快速計算查詢向量與數據庫中存儲向量之間的距離。由于向量被量化到有限的質心集合,這種計算變得更加高效。
  3. 最近鄰檢索:最終,系統基于計算的距離返回最接近查詢向量的多個候選向量(通常是 Top-k 結果)。

這里詳細解釋一下計算距離的操作,既然大家都是查詢編號了,我們是可以把查詢編號反映射回向量的,所以直接計算對應質心向量之間的(每個子空間的)距離結果求和(而非把重構的結果組合成完整的高維向量再做計算距離)的,但是這樣太慢了。
可以發現我們總是在求質心之間的距離,其實非常沒必要,我們可以是事先把每個子空間中的質心之間的的距離提前計算出來存著,要計算對應兩個質心的距離時直接查表即可(這樣也就不用映射回向量了!)。

查詢方法二:

  1. 查詢向量量化:查詢向量同樣被分割為子向量<但不映射為對應的ID,方法一在映射時也需要計算查詢向量的子向量到對應質心的向量的距離來判斷對應哪個ID>。
  2. 計算距離:詳見下。
  3. 最近鄰檢索:最終,系統基于計算的距離返回最接近查詢向量的多個候選向量(通常是 Top-k 結果)。

可以直接計算查詢向量的子向量到對應子空間的所有質心的距離,做成一個表<查詢向量與質心的表,注意與查詢一是構建質心之間的距離表>(不需要映射到最近的質心了,但其實也遍歷了與質心計算,少了對q的編碼那一步)。因為數據集中的數據已經表示為對應的質心ID了,所以到查詢向量到數據集中的data只需要查表然后累加。
相對簡潔些。

IVFPQ(Inverted File Index + Product Quantization)

相較于IndexPQ直接對向量 x x x 進行 PQ 量化,IVFPQ 先用 IVF 聚類,再對殘差進行PQ,相對量化誤差小,精度高,當然速度上會遜于單純的IndexPQ。

1. 預處理階段(構建索引)

在執行查詢之前,系統已經執行了以下步驟:
1.1 構建 IVF(倒排文件索引)

  • 對所有數據庫向量運行 K-Means 聚類,得到 K 個簇中心(centroids)
  • 每個數據庫向量x被分配到距離它最近的簇中心 C i C_i Ci?,并存儲在該簇的倒排列表中

1.2 對簇內的向量進行 PQ(產品量化)

  • 對每個數據庫向量的偏移量 x ? C i x-C_i x?Ci?進行PQ
  • 只存儲PQ編碼不存儲原始向量

2.查詢階段

給定查詢向量 q q q,IVFPQ 執行以下步驟來查找最近鄰:

Step 1:使用 IVF 找候選集

用 IVF 簇中心索引快速篩選候選集,避免遍歷整個數據庫。

  • 計算 q q q 到所有K 個聚類中心的距離: d ( q , C i ) d(q,C_i) d(q,Ci?)
  • 選取最近的前n個簇(通常 n < < K n<<K n<<K),只在這些簇的數據庫向量中進行搜索,而不掃描整個數據庫。
Step 2:計算查詢向量到候選向量的距離(使用 PQ)

對候選向量使用 PQ 查表計算近似距離,加速計算。
對于每個候選簇中的數據庫向量:

  1. 計算查詢向量相對簇中心的偏移量: q ′ = q ? C i q'=q-C_i q=q?Ci?
  2. 利用 PQ 查找表計算近似距離:(1)預計算查詢向量到PQ質心的距離表<方式二>;(2)讀取數據庫向量的 PQ 編碼,從查找表中快速查找距離;(3)每個向量的距離計算變成了查表 + 加法操作,而不需要逐維計算歐幾里得距離
Step 3:返回最近鄰

在候選集中排序,選取最近的 k k k個向量作為最終查詢結果。

為什么是對殘差進行PQ

  1. 減少量化誤差
  • 直接對整個數據庫向量 x x x進行 PQ 時,可能會出現較大的量化誤差。
  • 但如果先用 IVF 找到最接近的簇中心,然后對其 殘差進行 PQ 量化,則編碼更加精細,可以減少誤差。
  1. 提高檢索精度
  • 由于每個簇內的向量與簇中心的偏移較小(即殘差較小),因此殘差的值域更小,產品量化的效果更好。
  • 這樣,查詢時可以用更少的 PQ 碼字(即更低的存儲成本)來獲得更高的搜索精度。

問題:nprobe 的選擇(找候選集的個數)

較低的nprobe會進一步加快速度,但是同時也大概率降低recall,可以適當提高nprobe
這里放上手冊中的對比圖:
對比

總結:PQ很快但是召回率較低,注意使用場景

這里給上GPT的回答:
各壓縮方法對比
補充一下里面未涉及的有關量化的方法:
SQ
VQ
HNSW+SQ/PQ

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/900063.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/900063.shtml
英文地址,請注明出處:http://en.pswp.cn/news/900063.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

win10徹底讓圖標不顯示在工具欄

關閉需要不顯示的軟件 打開 例此時我關閉了IDEA的顯示 如果說只是隱藏&#xff0c;鼠標拖動一個道理 例QQ 如果說全部顯示不隱藏

關稅核爆72小時!跨境矩陣防御戰緊急打響

一、T86崩塌&#xff1a;全球貿易鏈的至暗時刻 &#xff08;配圖&#xff1a;美國海關系統深夜彈出紅色警報&#xff09; 5月2日凌晨2:17&#xff0c;杭州某光伏企業的供應鏈系統突然發出刺耳警報——其價值1800萬美元的逆變器模塊被劃入34%關稅清單。這場代號"黑天鵝突…

藍橋杯Java B組省賽真題題型近6年統計分類

困難題 題號題型分值代碼量難度通過率內容2024-F解答1581困難0.12最短路問題 Dijkstra 期望2024-G解答20116困難0.19模擬 暴力 搜索 DFS 剪紙 枚舉2023-H解答2070困難0動態規劃2022-H解答20109困難0.032022-J解答25141困難0搜索2021-H解答2041困難0.18二分 思維 規律2021-I解答…

【網絡流 圖論建模 最大權閉合子圖】 [六省聯考 2017] 壽司餐廳

題目描述&#xff1a; P3749 [六省聯考 2017] 壽司餐廳 題目描述 Kiana 最近喜歡到一家非常美味的壽司餐廳用餐。 每天晚上&#xff0c;這家餐廳都會按順序提供 n n n 種壽司&#xff0c;第 i i i 種壽司有一個代號 a i a_i ai? 和美味度 d i , i d_{i, i} di,i?&…

前端面試題(三):axios有哪些常用的方法

Axios 是一個基于 Promise 的 HTTP 客戶端&#xff0c;用于瀏覽器和 Node.js 中發送 HTTP 請求。它提供了一些常用的方法來處理不同類型的請求。以下是 Axios 中常用的一些方法&#xff1a; 1. axios.get() 用于發送 GET 請求&#xff0c;從服務器獲取數據。 axios.get(/api/d…

python match case語法

學習路線&#xff1a;B站 普通的if判斷 def if_traffic_light(color):if color red:return Stopelif color yellow:return Slow downelif color green:return Goelse:return Invalid colorprint(if_traffic_light(red)) # Output: Stop print(if_traffic_light(yellow)) …

LLaMA-Factory大模型微調全流程指南

該文檔為LLaMA-Factory大模型微調提供了完整的技術指導&#xff0c;涵蓋了從環境搭建到模型訓練、推理和合并模型的全流程&#xff0c;適用于需要進行大模型預訓練和微調的技術人員。 一、docker 容器服務 請參考如下資料制作 docker 容器服務&#xff0c;其中&#xff0c;掛…

【HCIA】靜態綜合實驗練習筆記

實驗拓撲圖如下&#xff1a; 實驗配置思路如下&#xff1a; 1、網段劃分、配置IP地址 2、配置DHCP&#xff0c;使客戶端獲得ip地址 3、配置靜態明細路由&#xff0c;內網全網通 4、配置空接口防環 5、配置優先級&#xff0c;實現選路最佳 6、配置缺省路由&#xff0c;實現公網通…

大數據(4.5)Hive聚合函數深度解析:從基礎統計到多維聚合的12個生產級技巧

目錄 背景一、Hive聚合函數分類與語法1. 基礎聚合函數2. 高級聚合函數 二、6大核心場景與案例場景1&#xff1a;基礎統計&#xff08;SUM/COUNT&#xff09;場景2&#xff1a;多維聚合&#xff08;GROUPING SETS&#xff09;場景3&#xff1a;層次化聚合&#xff08;ROLLUP&…

RTOS基礎 -- NXP M4小核的RPMsg-lite與端點機制回顧

一、RPMsg-lite與端點機制回顧 在RPMsg協議框架中&#xff1a; Endpoint&#xff08;端點&#xff09; 是一個邏輯通信端口&#xff0c;由本地地址&#xff08;local addr&#xff09;、遠程地址&#xff08;remote addr&#xff09;和回調函數組成。每個消息都會發送到特定的…

NineData云原生智能數據管理平臺新功能發布|2025年3月版

本月發布 15 項更新&#xff0c;其中重點發布 3 項、功能優化 11 項、性能優化 1 項。 重點發布 基礎服務 - MFA 多因子認證 新增 MFA 多因子認證&#xff0c;提升賬號安全性。系統管理員開啟后&#xff0c;所有組織成員需綁定認證器&#xff0c;登錄時需輸入動態驗證碼。 數…

DAY 35 leetcode 202--哈希表.快樂數

題號202 編寫一個算法來判斷一個數 n 是不是快樂數。 「快樂數」 定義為&#xff1a; 對于一個正整數&#xff0c;每一次將該數替換為它每個位置上的數字的平方和。然后重復這個過程直到這個數變為 1&#xff0c;也可能是 無限循環 但始終變不到 1。如果這個過程 結果為 1&a…

Maven+Spring實現后端開發

一、前置知識的介紹 1.Spring 輕量級的 DI / IoC 和 AOP 容器的開源框架 容器的開源框架網址&#xff1a;https://spring.io/projects/spring-framework 作用&#xff1a;可簡化管理創建和組裝對象之間的依賴關系 將controller----->service------->dao層的依賴配置…

解鎖界面設計密碼,打造極致用戶體驗

界面設計是對軟件、網站、移動應用等產品的用戶界面進行設計的過程&#xff0c;旨在為用戶提供美觀、易用、高效的交互體驗。以下是關于界面設計的一些主要方面&#xff1a; 一、設計原則 用戶中心原則&#xff1a;以用戶為中心&#xff0c;了解用戶的需求、期望、行為和習慣…

Joint Receiver Design for Integrated Sensing and Communications

摘要——在本文中&#xff0c;我們研究了集成感知與通信(ISAC)系統的聯合接收機設計&#xff0c;其中通信信號和目標回波信號同時被接收和處理&#xff0c;以在兩種功能之間實現平衡性能。特別地&#xff0c;我們提出了兩種設計方案來解決聯合感知和通信問題中的接收信號處理。…

DeepSeek接入飛書多維表格,效率起飛!

今天教大家把DeepSeek接入飛書表格使用。 準備工作&#xff1a;安裝并登錄飛書&#xff1b;可以準備一些要處理的數據&#xff0c;確保數據格式正確&#xff0c;如 Excel、CSV 等&#xff0c;也可直接存儲到飛書多維表格。 創建飛書多維表格&#xff1a;打開飛書&#xff0c;點…

【C語言入門】由淺入深學習指針 【第二期】

目錄 1. 指針變量為什么要有類型&#xff1f; 2. 野指針 2.1 未初始化導致的野指針 2.2 指針越界導致的野指針 2.3 如何規避野指針 3. 指針運算 3.1 指針加減整數 3.2 指針減指針 3.3 指針的關系運算 4. 二級指針 5. 指針數組 5.1 如何使用指針數組模擬二維數組 上…

OpenCV 圖形API(13)用于執行兩個矩陣(或圖像)逐元素乘法操作的函數mul()

操作系統&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 編程語言&#xff1a;C11 描述 計算兩個矩陣的每個元素的縮放乘積。 mul函數計算兩個矩陣的逐元素乘積&#xff1a; dst ( I ) saturate ( scale ? src1 ( I ) ? src2 ( I ) ) …

人工智能混合編程實踐:C++調用封裝好的DLL進行圖像超分重建

人工智能混合編程實踐:C++調用封裝好的DLL進行圖像超分重建 前言相關介紹C++簡介ONNX簡介ONNX Runtime 簡介**核心特點**DLL 簡介**核心特點****創建與使用****應用場景****優點與挑戰**圖像異常檢測簡介應用場景前提條件實驗環境項目結構C++調用封裝好的DLL進行圖像超分重建C…