0

0

向量检索模型落地:瓶颈及解法!

雪夜

雪夜

发布时间:2025-07-23 10:29:52

|

1059人浏览过

|

来源于php中文网

原创

稠密向量检索模型在实际应用中面临的巨大内存占用问题一直是其落地的一大障碍。实际上,dpr生成的768维稠密向量中可能存在大量冗余信息,我们可以通过某种压缩方法以少量的精度损失换取内存占用的大幅下降。

本文分享了一篇来自EMNLP 2021的论文,探讨了三种简单有效的压缩方法:

  1. 无监督PCA降维
  2. 有监督微调降维
  3. 乘积量化

实验结果表明,简单的PCA降维具有很高的性价比,能够以少于3%的top-100准确度损失换取48倍的压缩比,以少于4%的top-100准确度损失换取96倍的压缩比。

向量检索模型落地:瓶颈及解法!

Simple and Effective Unsupervised Redundancy Elimination to Compress Dense Vectors for Passage Retrieval

Introduction

近两年来,以DPR为代表的稠密向量检索模型在开放域问答等领域得到了广泛应用。虽然DPR能够提供更准确的检索结果,但其生成的向量索引内存占用非常大。

例如,当我们对维基百科建立索引时,基于倒排索引的BM25仅占用2.4GB的内存,而DPR生成的768维稠密向量则需要占用61GB的内存,这比BM25足足多出了24倍,而这多出的24倍的内存仅换取了平均2.5%的指标提升(Top-100 Accuracy)。

可以推测,DPR生成的768维稠密向量可能太大了,存在大量冗余。我们可以通过少量的精度损失换取内存占用的大幅下降。针对这个问题,本文探索了三种简单有效的稠密向量压缩方法,包括主成分分析(Principal Component Analysis, PCA)、乘积量化(Product Quantization, PQ)和有监督降维(Supervised Dimensionality Reduction)。

Quantifying Redundancy

首先,我们确认DPR稠密向量是否存在冗余,作者给出了两个常用指标:PCA的「解释方差比」(explained variance ratio)和v_q 与v_d 的「互信息」(mutual information)。

PCA利用特征分解将一组可能存在相关性的向量变换到线性无关的特征向量构成的坐标系下,并保留方差较大的方向,丢弃方差较小的方向,而解释方差比则是度量PCA降维效果的指标:

[ \frac{\sum{i=1}^{m} \sigma{i}^{2}}{\sum{i=1}^{n} \sigma{i}^{2}} ] 其中(\sigma_i^2)是从大到小第i个特征值对应的方差,n和m分别表示PCA降维前和降维后的维度。该比值说明了保留前m个特征向量能保留原始稠密向量方差的比例。

另一种衡量向量冗余度的方法是计算v_q和v_d的互信息,互信息可以根据公式(\mathcal{I}(Q ; D)=H(Q)-H(Q \mid D))得到:

[ \begin{aligned} &\mathcal{I}(Q ; D) \ &\approx\frac{1}{N} \sum{i=1}^{N} \mathbb{E}{p\left(D \mid Q=q{i}\right)}\left[\ln p\left(D \mid Q=q{i}\right)\right] \ &\quad -\mathbb{E}{p(D)}\left[\ln \frac{1}{N} \sum{i=1}^{N} p\left(D \mid Q=q{i}\right)\right] \end{aligned} ] 其中(p\left(D \mid Q=q{i}\right))可以利用DPR的优化目标近似计算:

[ \begin{aligned} &\mathcal{L}\left(q, d^{+}, d{1}^{-}, d{2}^{-}, \cdots, d{m}^{-}\right) \ &=-\log p\left(D=d^{+} \mid Q=q\right) \ &=-\log \frac{\exp \left(v{q}^{\top} v{d^{+}}\right)}{\exp \left(v{q}^{\top} v{d^{+}}\right)+\displaystyle\sum{i=1}^{m} \exp \left(v{q}^{\top} v{d_{i}^{-}}\right)} \end{aligned} ] 互信息的上界是(\ln N),为了和PCA对比,我们可以对互信息做标准化(\mathcal{I}(Q ; D) / \ln N)。

经过不同程度的PCA降维,解释方差比和标准互信息随向量维度的变化趋势如下图所示。我们可以发现,200维左右是一个甜区,「将768维的向量降维到200维,降维后的向量能够保留90%的方差和99%的互信息,而进一步降维会导致信息量的急速下降。」

向量检索模型落地:瓶颈及解法!

Dense Vector Compression

接下来,我们尝试三种简单的方法来压缩稠密向量:

「Supervised Approach:」我们可以在双塔编码器的顶部分别增加两个线性层W_q和Wp来降维,在训练时可以冻结下层参数,仅微调线性层,同时我们还可以增加一个正交规范化损失(\left|W{p} W{q}^{\top}-I\right|{2})鼓励W_q和W_p互相正交,这能使得降维后的点积相似度和降维前的scale是一致的。「Unsupervised Approach:」我们可以将d_q和d_p混在一起,然后对这一向量集拟合一个线性PCA变换,在推理阶段,使用拟合到的PCA变换对DPR生成的向量进行降维。「Product Quantization:」我们还可以使用乘积量化来进一步压缩向量大小,其基本原理是将d维的向量分解成s个子向量,每个子向量采用k-means量化,并使用t比特存储。比如,一个768维的向量占用了768\times 32比特,通过将其分解为192个8比特的子向量,该向量的大小便压缩到了192\times 8比特,即原始大小的1/16,平均来说,每个维度所占用的比特数从32降低到了2。

AI封面生成器
AI封面生成器

专业的AI封面生成工具,支持小红书、公众号、小说、红包、视频封面等多种类型,一键生成高质量封面图片。

下载

Experiment & Results

作者在NQ、TriviaQA、WQ、CuratedTREC、SQuAD上测试了DPR的top-k准确率(前k个召回结果中至少有一个正确的比例),实验细节可参见原文。

Dimensionality Reduction

我们首先对比有监督降维和无监督降维的表现,其中PCA-*Linear-*分别是无监督PCA降维和有监督微调降维(仅微调线性层)的结果,而DPR-*表示不冻结下层参数,与线性层联合微调的结果。可以发现,在向量维度较大的时候(256、128),无监督PCA的表现更好,当向量维度较小的时候(64),有监督微调的表现会更好,然而这时候模型性能下降得也非常明显,因此总体来说无监督PCA更有实用价值。

虽然理论上Linear-*可以学习到PCA-*拟合的线性映射,但想要让参数收敛到一个好的解并不简单。另外,冻结下层参数(Linear-*)比不冻结(DPR-*)的结果都要好,这同样是训练不充分所导致的。综上,在大多数情况下,我们仅需要做简单的线性PCA变换,就能获取很不错的压缩比了。

向量检索模型落地:瓶颈及解法!

Product Quantization

乘积量化是一种非常有效的压缩方法,作者在上述实验结果的基础上进一步加入了乘积量化,实验结果如下表所示,其中PQ-2表示经过量化之后每个维度所占用的比特数为2。从下表可以看出,PQ-1压缩过于激进了,虽然其压缩比是PQ-2的两倍,但指标下降却不止两倍,这是很不划算的。

综上,我们认为PCA降维加乘积量化是最好的压缩方式。如果我们将指标下降幅度限制在平均4%以内,我们可以使用PCA-128+PQ2将稠密向量压缩96倍,将维基百科的向量索引的内存占用从61GB降低到642MB,同时将推理时间从7570ms降低到416ms。

向量检索模型落地:瓶颈及解法!

Hybrid Search

大量研究已表明结合稀疏向量检索(BM25)和稠密向量检索能够提升性能,其中最简单有效的方法是对分数做线性加权求和:

[ \text{score}{\text{dense}} + \alpha \cdot \text{score}{\text{sparse}} ] 这里我们简单地设定(\alpha=1),即稠密检索和稀疏检索等权。

加入混合检索可以进一步提升性能,下图展示了不同压缩方法的检索准确率和索引大小的关系,其中每条曲线从左到右依次为PQ1PQ2w/o PQ,图中的黑色虚线为帕累托边界,原始的768维DPR向量并没有落在帕累托边界上,表明其的确有改进的空间。具体来说,「PCA-256+PQ2+Hybrid Search的压缩策略将61GB的索引大小降低到了3.7GB,其Top-100准确率甚至比原始DPR更好(+0.2%)。」

向量检索模型落地:瓶颈及解法!

Discussion

限制稠密向量检索模型落地的一大瓶颈就是推理时延和内存消耗的问题。这篇论文通过实验证明了简单的主成分分析加上乘积量化,在辅以稀疏向量检索,就能在保证准确度的前提下大幅减少内存占用,提升检索速度,颇具实用价值。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
JavaScript浏览器渲染机制与前端性能优化实践
JavaScript浏览器渲染机制与前端性能优化实践

本专题围绕 JavaScript 在浏览器中的执行与渲染机制展开,系统讲解 DOM 构建、CSSOM 解析、重排与重绘原理,以及关键渲染路径优化方法。内容涵盖事件循环机制、异步任务调度、资源加载优化、代码拆分与懒加载等性能优化策略。通过真实前端项目案例,帮助开发者理解浏览器底层工作原理,并掌握提升网页加载速度与交互体验的实用技巧。

23

2026.03.06

Rust内存安全机制与所有权模型深度实践
Rust内存安全机制与所有权模型深度实践

本专题围绕 Rust 语言核心特性展开,深入讲解所有权机制、借用规则、生命周期管理以及智能指针等关键概念。通过系统级开发案例,分析内存安全保障原理与零成本抽象优势,并结合并发场景讲解 Send 与 Sync 特性实现机制。帮助开发者真正理解 Rust 的设计哲学,掌握在高性能与安全性并重场景中的工程实践能力。

68

2026.03.05

PHP高性能API设计与Laravel服务架构实践
PHP高性能API设计与Laravel服务架构实践

本专题围绕 PHP 在现代 Web 后端开发中的高性能实践展开,重点讲解基于 Laravel 框架构建可扩展 API 服务的核心方法。内容涵盖路由与中间件机制、服务容器与依赖注入、接口版本管理、缓存策略设计以及队列异步处理方案。同时结合高并发场景,深入分析性能瓶颈定位与优化思路,帮助开发者构建稳定、高效、易维护的 PHP 后端服务体系。

162

2026.03.04

AI安装教程大全
AI安装教程大全

2026最全AI工具安装教程专题:包含各版本AI绘图、AI视频、智能办公软件的本地化部署手册。全篇零基础友好,附带最新模型下载地址、一键安装脚本及常见报错修复方案。每日更新,收藏这一篇就够了,让AI安装不再报错!

84

2026.03.04

Swift iOS架构设计与MVVM模式实战
Swift iOS架构设计与MVVM模式实战

本专题聚焦 Swift 在 iOS 应用架构设计中的实践,系统讲解 MVVM 模式的核心思想、数据绑定机制、模块拆分策略以及组件化开发方法。内容涵盖网络层封装、状态管理、依赖注入与性能优化技巧。通过完整项目案例,帮助开发者构建结构清晰、可维护性强的 iOS 应用架构体系。

113

2026.03.03

C++高性能网络编程与Reactor模型实践
C++高性能网络编程与Reactor模型实践

本专题围绕 C++ 在高性能网络服务开发中的应用展开,深入讲解 Socket 编程、多路复用机制、Reactor 模型设计原理以及线程池协作策略。内容涵盖 epoll 实现机制、内存管理优化、连接管理策略与高并发场景下的性能调优方法。通过构建高并发网络服务器实战案例,帮助开发者掌握 C++ 在底层系统与网络通信领域的核心技术。

29

2026.03.03

Golang 测试体系与代码质量保障:工程级可靠性建设
Golang 测试体系与代码质量保障:工程级可靠性建设

Go语言测试体系与代码质量保障聚焦于构建工程级可靠性系统。本专题深入解析Go的测试工具链(如go test)、单元测试、集成测试及端到端测试实践,结合代码覆盖率分析、静态代码扫描(如go vet)和动态分析工具,建立全链路质量监控机制。通过自动化测试框架、持续集成(CI)流水线配置及代码审查规范,实现测试用例管理、缺陷追踪与质量门禁控制,确保代码健壮性与可维护性,为高可靠性工程系统提供质量保障。

79

2026.02.28

Golang 工程化架构设计:可维护与可演进系统构建
Golang 工程化架构设计:可维护与可演进系统构建

Go语言工程化架构设计专注于构建高可维护性、可演进的企业级系统。本专题深入探讨Go项目的目录结构设计、模块划分、依赖管理等核心架构原则,涵盖微服务架构、领域驱动设计(DDD)在Go中的实践应用。通过实战案例解析接口抽象、错误处理、配置管理、日志监控等关键工程化技术,帮助开发者掌握构建稳定、可扩展Go应用的最佳实践方法。

62

2026.02.28

Golang 性能分析与运行时机制:构建高性能程序
Golang 性能分析与运行时机制:构建高性能程序

Go语言以其高效的并发模型和优异的性能表现广泛应用于高并发、高性能场景。其运行时机制包括 Goroutine 调度、内存管理、垃圾回收等方面,深入理解这些机制有助于编写更高效稳定的程序。本专题将系统讲解 Golang 的性能分析工具使用、常见性能瓶颈定位及优化策略,并结合实际案例剖析 Go 程序的运行时行为,帮助开发者掌握构建高性能应用的关键技能。

51

2026.02.28

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
CSS3 教程
CSS3 教程

共18课时 | 6.8万人学习

PostgreSQL 教程
PostgreSQL 教程

共48课时 | 10.3万人学习

Git 教程
Git 教程

共21课时 | 4.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号