ARTICLE DETAIL

资讯详情

深耕商务建站与企业官网运营的一线实战洞察。

turbovec长度归一化评分:RaBitQ量化偏差消除技巧如何大幅提升召回率

turbovec长度归一化评分:RaBitQ量化偏差消除技巧如何大幅提升召回率 turbovec长度归一化评分RaBitQ量化偏差消除技巧如何大幅提升召回率【免费下载链接】turbovecA vector index built on TurboQuant, written in Rust with Python bindings项目地址: https://gitcode.com/GitHub_Trending/tu/turbovecturbovec是一个用 Rust 编写、带 Python 绑定的向量索引基于 Google 的 TurboQuant 量化算法构建。它的核心技巧之一是长度归一化评分length-renormalized scoring——一个借鉴自 RaBitQ 论文的量化偏差消除方法用每个向量额外存储的一个标量把系统性偏低的内积估计修正为无偏估计且检索时零额外开销。对于用 2-bit / 4-bit 低比特量化做向量检索的工程师这是召回率提升最直接的一招。什么是量化偏差为什么低比特下更严重向量检索常用内积衡量相似度。但量化把 float32 向量压成 2~4 比特的整数码会引入一个隐蔽问题量化重建出的单位方向会比原向量略短导致内积被系统性低估。比特越高如 8-bit重建越接近原向量偏差越小比特越低2-bit缩短效应越明显低估越严重结果就是某些本该排在前列的候选向量分数被压低召回率下降。对新手来说一个直觉理解Lloyd-Max 标量量化的重建值平均比原值缩水一点1536 个坐标逐个缩水后内积整体被拉低。RaBitQ 的长度归一化修正原理一句话RaBitQSIGMOD 2024 论文提出的思路非常简洁turbovec 将其适配进自己的编码管线编码时对每个向量计算一个标量原向量的范数 ÷旋转后的单位向量与其量化重建的内积即||v|| / ⟨u, x̂⟩检索时把每个候选的量化内积分数乘以这个标量即可把向下偏的估计校正为无偏。关键在于代价极低编码时只多算一次 d 维点积官方给出的实测100 万个 d1536 向量额外编码耗时不到 1 秒每个向量只多存1 个 float32检索内核在堆插入前乘一下零检索时计算开销收益在低比特位宽下最显著——那里量化收缩最大。turbovec 的 README 明确说明Lloyd-Max 码本已逼近香农失真率下界2.7 倍以内而这个长度归一化步骤消除的正是码本在内积估计器本身上的残余偏差。 核心公式score_corrected ⟨query_code, candidate_code⟩ × (||v|| / ⟨u, x̂⟩)编码管线中的位置归一化 → 旋转 → 量化 → 长度归一化turbovec 的编码流程中长度归一化是最后一步评分修正与前面几步紧密配合归一化剥离向量长度norm单独存为一个浮点数向量变成超球面上的单位方向确定性正交旋转全局置换 块 Hadamard让每个坐标服从已知的近高斯分布且跨平台逐比特一致TQ 校准可选每坐标拟合 shift/scale 两个标量把有限维度下的分布漂移映射回码本设计目标Lloyd-Max 标量量化按数学预计算的最优分桶2-bit 用 4 桶、4-bit 用 16 桶长度归一化评分计算每向量的修正标量||v|| / ⟨u, x̂⟩与压缩码一起落盘。 相关实现可参考turbovec/src/encode.rs 中的标量推导注释以及 README.md 的管线说明。在磁盘格式上这组标量被存放在.tv文件的scales 段n_vectors × f32紧跟在 codes 段之后见 docs/api.md 的格式定义。早期版本中该标量只存||v||后来才升级为 RaBitQ 风格的||v|| / ⟨u_rot, x̂⟩修正记录见 CHANGELOG.md。对使用者的实际影响召回率与相似度模式召回率提升官方基准100K 向量、对比 FAISSIndexPQ显示带长度归一化修正的 TQ 在 OpenAI d1536 / d3072 多个格点上 R1 领先 0.9~2.9 个百分点在低维、漂移更大的 GloVe d200 上2-bit R1 达到 0.572超过 FAISS 的 0.564。低比特位宽下这一修正正是少花内存还能反超的关键。cosine 模式下的长度归一化如果你用的是框架集成LangChain / LlamaIndex / Haystack / Agnoturbovec 提供两种相似度模式而长度归一化在其中又有一层含义cosine默认文档向量和查询向量在进索引前先做L2 归一化除以各自的范数于是引擎的原始内积就是 [-1, 1] 区间内的真实余弦相似度与向量幅度无关——这是长度归一化在评分语义上的直接体现dot_product向量原样存储分数是原始内积排序对幅度敏感阈值需要按数据集校准。零向量无法归一化norm 为 0实现中会保持原样与参考文档库的行为一致。 实现见 turbovec-python/python/turbovec/_similarity.py 中的l2_normalize_rows。快速上手3 行代码用上这些能力from turbovec import TurboQuantIndex index TurboQuantIndex(dim1536, bit_width2) # 低比特下长度归一化修正收益最大 index.add(vectors) scores, indices index.search(query, k10)不需要手动做任何修正——长度归一化标量在add()时自动计算并随write()/sync()持久化检索内核自动应用。常见问题 FAQQ1这个修正会增加检索延迟吗不会。修正量在编码时一次算好检索内核只是堆插入前多乘一个浮点数属于零检索时开销设计。Q2高比特如 8-bit还需要它吗仍会自动应用收益小但无损主要受益场景是 2-bit 和 4-bit 低比特位宽。Q3它和 TQ 校准是什么关系两者互补TQ 校准index.calibrate(sample)修正分布漂移长度归一化修正内积低估前者可显式开启、后者默认生效。Q4想深入了解源码从哪看推荐顺序turbovec/src/encode.rs 的标量推导 → docs/api.md 的.tv格式定义 → README.md 的管线总览 → turbovec-python/python/turbovec/_similarity.py 的相似度模式。【免费下载链接】turbovecA vector index built on TurboQuant, written in Rust with Python bindings项目地址: https://gitcode.com/GitHub_Trending/tu/turbovec创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表
PREV
查看更多资讯
NEXT
返回资讯列表