度歸一化評(píng)分:RaBitQ量化偏差消除技巧如何大幅提升召回率)
turbovec長(zhǎng)度歸一化評(píng)分RaBitQ量化偏差消除技巧如何大幅提升召回率【免費(fèi)下載鏈接】turbovecA vector index built on TurboQuant, written in Rust with Python bindings項(xiàng)目地址: https://gitcode.com/GitHub_Trending/tu/turbovecturbovec是一個(gè)用 Rust 編寫、帶 Python 綁定的向量索引基于 Google 的 TurboQuant 量化算法構(gòu)建。它的核心技巧之一是長(zhǎng)度歸一化評(píng)分length-renormalized scoring——一個(gè)借鑒自 RaBitQ 論文的量化偏差消除方法用每個(gè)向量額外存儲(chǔ)的一個(gè)標(biāo)量把系統(tǒng)性偏低的內(nèi)積估計(jì)修正為無偏估計(jì)且檢索時(shí)零額外開銷。對(duì)于用 2-bit / 4-bit 低比特量化做向量檢索的工程師這是召回率提升最直接的一招。什么是量化偏差為什么低比特下更嚴(yán)重向量檢索常用內(nèi)積衡量相似度。但量化把 float32 向量壓成 2~4 比特的整數(shù)碼會(huì)引入一個(gè)隱蔽問題量化重建出的單位方向會(huì)比原向量略短導(dǎo)致內(nèi)積被系統(tǒng)性低估。比特越高如 8-bit重建越接近原向量偏差越小比特越低2-bit縮短效應(yīng)越明顯低估越嚴(yán)重結(jié)果就是某些本該排在前列的候選向量分?jǐn)?shù)被壓低召回率下降。對(duì)新手來說一個(gè)直覺理解Lloyd-Max 標(biāo)量量化的重建值平均比原值縮水一點(diǎn)1536 個(gè)坐標(biāo)逐個(gè)縮水后內(nèi)積整體被拉低。RaBitQ 的長(zhǎng)度歸一化修正原理一句話RaBitQSIGMOD 2024 論文提出的思路非常簡(jiǎn)潔turbovec 將其適配進(jìn)自己的編碼管線編碼時(shí)對(duì)每個(gè)向量計(jì)算一個(gè)標(biāo)量原向量的范數(shù) ÷旋轉(zhuǎn)后的單位向量與其量化重建的內(nèi)積即||v|| / ?u, x??檢索時(shí)把每個(gè)候選的量化內(nèi)積分?jǐn)?shù)乘以這個(gè)標(biāo)量即可把向下偏的估計(jì)校正為無偏。關(guān)鍵在于代價(jià)極低編碼時(shí)只多算一次 d 維點(diǎn)積官方給出的實(shí)測(cè)100 萬(wàn)個(gè) d1536 向量額外編碼耗時(shí)不到 1 秒每個(gè)向量只多存1 個(gè) float32檢索內(nèi)核在堆插入前乘一下零檢索時(shí)計(jì)算開銷收益在低比特位寬下最顯著——那里量化收縮最大。turbovec 的 README 明確說明Lloyd-Max 碼本已逼近香農(nóng)失真率下界2.7 倍以內(nèi)而這個(gè)長(zhǎng)度歸一化步驟消除的正是碼本在內(nèi)積估計(jì)器本身上的殘余偏差。 核心公式score_corrected ?query_code, candidate_code? × (||v|| / ?u, x??)編碼管線中的位置歸一化 → 旋轉(zhuǎn) → 量化 → 長(zhǎng)度歸一化turbovec 的編碼流程中長(zhǎng)度歸一化是最后一步評(píng)分修正與前面幾步緊密配合歸一化剝離向量長(zhǎng)度norm單獨(dú)存為一個(gè)浮點(diǎn)數(shù)向量變成超球面上的單位方向確定性正交旋轉(zhuǎn)全局置換 塊 Hadamard讓每個(gè)坐標(biāo)服從已知的近高斯分布且跨平臺(tái)逐比特一致TQ 校準(zhǔn)可選每坐標(biāo)擬合 shift/scale 兩個(gè)標(biāo)量把有限維度下的分布漂移映射回碼本設(shè)計(jì)目標(biāo)Lloyd-Max 標(biāo)量量化按數(shù)學(xué)預(yù)計(jì)算的最優(yōu)分桶2-bit 用 4 桶、4-bit 用 16 桶長(zhǎng)度歸一化評(píng)分計(jì)算每向量的修正標(biāo)量||v|| / ?u, x??與壓縮碼一起落盤。 相關(guān)實(shí)現(xiàn)可參考turbovec/src/encode.rs 中的標(biāo)量推導(dǎo)注釋以及 README.md 的管線說明。在磁盤格式上這組標(biāo)量被存放在.tv文件的scales 段n_vectors × f32緊跟在 codes 段之后見 docs/api.md 的格式定義。早期版本中該標(biāo)量只存||v||后來才升級(jí)為 RaBitQ 風(fēng)格的||v|| / ?u_rot, x??修正記錄見 CHANGELOG.md。對(duì)使用者的實(shí)際影響召回率與相似度模式召回率提升官方基準(zhǔn)100K 向量、對(duì)比 FAISSIndexPQ顯示帶長(zhǎng)度歸一化修正的 TQ 在 OpenAI d1536 / d3072 多個(gè)格點(diǎn)上 R1 領(lǐng)先 0.9~2.9 個(gè)百分點(diǎn)在低維、漂移更大的 GloVe d200 上2-bit R1 達(dá)到 0.572超過 FAISS 的 0.564。低比特位寬下這一修正正是少花內(nèi)存還能反超的關(guān)鍵。cosine 模式下的長(zhǎng)度歸一化如果你用的是框架集成LangChain / LlamaIndex / Haystack / Agnoturbovec 提供兩種相似度模式而長(zhǎng)度歸一化在其中又有一層含義cosine默認(rèn)文檔向量和查詢向量在進(jìn)索引前先做L2 歸一化除以各自的范數(shù)于是引擎的原始內(nèi)積就是 [-1, 1] 區(qū)間內(nèi)的真實(shí)余弦相似度與向量幅度無關(guān)——這是長(zhǎng)度歸一化在評(píng)分語(yǔ)義上的直接體現(xiàn)dot_product向量原樣存儲(chǔ)分?jǐn)?shù)是原始內(nèi)積排序?qū)Ψ让舾虚撝敌枰磾?shù)據(jù)集校準(zhǔn)。零向量無法歸一化norm 為 0實(shí)現(xiàn)中會(huì)保持原樣與參考文檔庫(kù)的行為一致。 實(shí)現(xiàn)見 turbovec-python/python/turbovec/_similarity.py 中的l2_normalize_rows??焖偕鲜? 行代碼用上這些能力from turbovec import TurboQuantIndex index TurboQuantIndex(dim1536, bit_width2) # 低比特下長(zhǎng)度歸一化修正收益最大 index.add(vectors) scores, indices index.search(query, k10)不需要手動(dòng)做任何修正——長(zhǎng)度歸一化標(biāo)量在add()時(shí)自動(dòng)計(jì)算并隨write()/sync()持久化檢索內(nèi)核自動(dòng)應(yīng)用。常見問題 FAQQ1這個(gè)修正會(huì)增加檢索延遲嗎不會(huì)。修正量在編碼時(shí)一次算好檢索內(nèi)核只是堆插入前多乘一個(gè)浮點(diǎn)數(shù)屬于零檢索時(shí)開銷設(shè)計(jì)。Q2高比特如 8-bit還需要它嗎仍會(huì)自動(dòng)應(yīng)用收益小但無損主要受益場(chǎng)景是 2-bit 和 4-bit 低比特位寬。Q3它和 TQ 校準(zhǔn)是什么關(guān)系兩者互補(bǔ)TQ 校準(zhǔn)index.calibrate(sample)修正分布漂移長(zhǎng)度歸一化修正內(nèi)積低估前者可顯式開啟、后者默認(rèn)生效。Q4想深入了解源碼從哪看推薦順序turbovec/src/encode.rs 的標(biāo)量推導(dǎo) → docs/api.md 的.tv格式定義 → README.md 的管線總覽 → turbovec-python/python/turbovec/_similarity.py 的相似度模式。【免費(fèi)下載鏈接】turbovecA vector index built on TurboQuant, written in Rust with Python bindings項(xiàng)目地址: https://gitcode.com/GitHub_Trending/tu/turbovec創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考