【IR 论文】DPR — 最早提出使用嵌入向量来检索文档的模型

news2024/11/20 1:26:00

论文:Dense Passage Retrieval for Open-Domain Question Answering
⭐⭐⭐⭐⭐
EMNLP 2020, Facebook Research
Code: github.com/facebookresearch/DPR

文章目录

    • 一、论文速读
    • 二、DPR 的训练
      • 2.1 正样本和负样本的选取
      • 2.2 In-batch negatives 技巧
    • 三、实验
      • 3.1 数据集的选用
      • 3.2 使用的模型
      • 3.3 Main Result
      • 3.4 模型训练的消融实验
      • 3.5 DPR 对比 BM25
    • 四、总结

一、论文速读

本篇文章提出的 DPR 模型是最早提出使用嵌入向量来实现文档检索的模型,也是目前 RAG 中 Retriever 的经典实现方案

在文档检索上,有两大流派:

  • Sparse Retrieval:使用 TF-IDF 或者 BM25 来实现检索
  • Dense Retrieval:向量检索

本文的 DPR 就属于 dense retrieval。

问题形式:我们有一堆文档 D = { d 1 , d 2 , … , d D } D = \{ d_1, d_2, \dots, d_D \} D={d1,d2,,dD},将这里面的每个文档切分为多个等长的 passages,passage 就是检索结果的基本单元。这些切分后的 passages 构成了我们的 corpus C = { p 1 , p 2 , … , p M } C = \{ p_1, p_2, \dots, p_M \} C={p1,p2,,pM}。而我们的任务是,给定一个 question q q q,我们需要返回与其相关的 passage 集合 C F ∈ C C_F \in C CFC

DPR 是一个 dual-encoder 架构,也就是包含两个 encoder:

  • passage encoder E P ( ⋅ ) E_P(\cdot) EP():是一个 BERT,将任意的 passage 映射为 d d d 维的 embedding 向量
  • question encoder E Q ( ⋅ ) E_Q(\cdot) EQ():也是一个 BERT,将一个 question 映射为 d d d 维的 embedding 向量

首先,DPR 会使用 encoder E P E_P EP 将 corpus 中的所有 passage 映射为 embedding 向量,并存入 FAISS 中离线构建向量索引,之后在运行时,对于到来的一个 user question,先使用 encoder E Q E_Q EQ 将其映射为 embedding 向量,然后通过比较 question embedding 和所有的 passage embedding 的相似性,选出 top-k 个 passages 作为检索结果

这里计算两个 embedding 相似性使用的是向量点积:

相似性函数

二、DPR 的训练

训练目标:找到这样一个向量空间,在这里面相关的 question 和 passage 比不相关的具有更高的相似度。

训练样本的形式:每一个 training data 的 instance 包含一个 question q i q_i qi、一个正样本 positive passage p i + p_i^+ pi+ 以及 n 个负样本 negative passages p i , j − p_{i,j}^- pi,j

损失函数:最小化正样本的负对数似然:

损失函数

2.1 正样本和负样本的选取

positive passage 比较好选,这往往是 QA 数据集已经给定了,或者可以从 answer 中找到。

而 negative passages 就比较难选了,负样本的使用是为了提高模型识别不相关文档的能力,这就需要让负样本多样化。在这篇论文中,考虑了以下三种类型的负样本类型:

  1. Random Negatives:从整个文档集合中随机选择的文档作为负样本。
  2. BM25 Negatives:使用BM25检索系统根据问题检索到的,但不包含答案的文档作为负样本。
  3. Gold Negatives:来自训练集中,与当前问题不匹配的正样本(即其他问题的正样本)作为负样本。

Gold Negatives 的 Gold 指的是这个样本是高质量的负样本,是特意选出来与当前问题不相关的样本。

2.2 In-batch negatives 技巧

这是一个在语义理解(向量索引)技术中的常见的训练技巧。

以如下 Batch size=4 的训练数据为例:

我手机丢了,我想换个手机 我想买个新手机,求推荐
求秋色之空漫画全集 求秋色之空全集漫画
学日语软件手机上的 手机学日语的软件
侠盗飞车罪恶都市怎样改车 侠盗飞车罪恶都市怎么改车

In-batch Negatives 策略的训练数据为语义相似的 Pair 对,策略核心是在 1 个 Batch 内同时基于 N 个负例进行梯度更新,将同一 Batch 内除自身之外其它所有 Source Text 的相似文本 Target Text 作为负例,例如: 上例中“我手机丢了,我想换个手机” 有 1 个正例(”我想买个新手机,求推荐“),3 个负例(1.求秋色之空全集漫画,2.手机学日语的软件,3.侠盗飞车罪恶都市怎么改车)。

具体来说,In-batch negatives策略的实施步骤如下:

  1. 选择正样本:首先从当前批次中选择出一个正样本,这个样本是模型需要正确识别的目标样本。
  2. 选择负样本:然后从同一批次中随机选择或根据特定规则选择一些负样本。这些负样本可以是与正样本相似但被错误标记的样本,也可以是完全不相关的样本。
  3. 模型训练:将正样本和负样本一起输入模型进行训练。模型需要学会区分正样本和负样本,从而提高推荐或检索的准确性。

In-batch negatives 策略的优势在于:

  • 提高模型的区分能力:通过在每个批次中引入负样本,模型被迫学习如何区分正样本和负样本,这有助于提高模型的泛化能力和区分度。
  • 利用现有数据:不需要额外的负样本库,可以直接利用当前批次中的数据作为负样本,这在数据有限的情况下尤其有用。
  • 减少计算资源消耗:与从全局样本集中采样负样本相比,In-batch negatives可以减少计算资源的消耗,因为它避免了在整个数据集上进行负采样的需要。

然而,In-batch negatives 策略也存在一些潜在的问题,例如:

  • 批次大小的限制:如果批次大小较小,可能无法提供足够多样化的负样本,这可能影响模型的学习效果。
  • 偏差问题:由于负样本是在同一个批次中选择的,可能会出现某些样本被频繁选为负样本的情况,这可能导致模型学习到的表示存在偏差。

In-batch negatives 已被证明是一个有效的训练 dual-encoder 模型的方法

In-batch negatives 的更多资料:https://github.com/paddlepaddle/PaddleNLP/tree/develop/applications/neural_search/recall/in_batch_negative

三、实验

文章做了两大类实验:Passage Retrieval 和 Question Answering,在这里我们主要关注 Passage Retrieval 上的实验。

3.1 数据集的选用

学习一下这里是如何构建数据集的

本工作通过预处理从 Wikipedia 中获取到 21,015,324 篇 passages,然后使用了多个 QA 数据集来构建本工作所用数据:

  • Natural Question(NQ)
  • TriviaQA
  • WebQuestion(WQ)
  • CuratedTREC(TREC)
  • SQuAD v1.1

具体关于数据集的详细信息,可以参考原论文。

之后,本论文工作从这些数据集中构建出本文模型所需要使用的数据,针对 QA 中的每一个 question,本文使用了 BM25 来检索出相关的 passages,并将最高排名的 passage 作为 positive passage。

3.2 使用的模型

主要使用了三个模型来进行实验:

  1. BM25:经典的 sparse retrieval 的模型
  2. DPR:本文的模型
  3. BM25 + DPR:先分别让 BM25 和 DPR 独立运行,然后将两者的输出进行聚合,使用某种线性组合或者重排序(reranking)策略来得到最终的检索列表。

3.3 Main Result

实验结果
可以看到,除了 SQuAD 数据集,DPR 模型都表现比 BM25 效果好。

作者还给出了 DPR 在 SQuAD 数据集上表现不如 BM25 的原因,是认为这个数据集是注释者在看到文章后写下问题。因此,段落和问题之间有很高的词汇重叠,这给 BM25 带来了明显的优势。其次,数据仅从500多篇维基百科文章中收集,因此训练示例的分布极有偏见。

3.4 模型训练的消融实验

分别针对以下部分做了消融实验,这里仅列出一些结论,具体可以参考原论文:

  1. Sample efficiency:作者发现,少量的训练样本就可以让 DPR 的表现超过 BM25,并且随着样本的增多,DPR 的表现也在变得更好。
  2. In-batch negative training:作者发现负样本的选择方式(前面介绍了三种)对模型表现影响不大
  3. Impact of gold passages:作者将 gold positive passage 作为正样本和将 BM25 选出来的最靠前的 passage 作为正样本继续了对比,发现前者表现更好。
  4. Similarity and loss:选择 L2 distance 作为相似性函数并相应的修改 loss func 后,并不会太影响模型的结果
  5. Cross-dataset generalization:将模型在 NQ 上训练后直接用于其他 QA Dataset 的实验,发现效果还不错,说明了 DPR 的检索能力具备通用性。

3.5 DPR 对比 BM25

这篇论文虽然实验说明 DPR 在数据集上表现比 BM25 要好,但在实际中,两者有着不同的适用场景

  • BM25 这样的术语匹配方法对高度选择性的关键词和短语很敏感
  • DPR 更好地捕捉词汇变化或语义关系

两者的效率也有明显的区别:

  • 在运行时,有 FAISS 的帮助下,DPR 的吞吐量比 BM25 明显要高
  • 但在预先构建索引阶段,DPR 向量化所有 passages 需要花费大量的时间(论文使用了 8.5h
  • ),而 BM25 的工业实现 Lucene 可以很快完成(论文使用了 30min)

这里的具体数据可以参考原论文。

四、总结

DPR 是密集向量检索的经典实现方式之一,目前也还有大量基于它的思路来实现的,对这个模型进行认真学习很有必要。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1629212.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

编写一个函数fun,它的功能是:实现两个字符串的连接(不使用库函数strcat),即把p2所指的字符串连接到p1所指的字符串后。

本文收录于专栏:算法之翼 https://blog.csdn.net/weixin_52908342/category_10943144.html 订阅后本专栏全部文章可见。 本文含有题目的题干、解题思路、解题思路、解题代码、代码解析。本文分别包含C语言、C++、Java、Python四种语言的解法完整代码和详细的解析。 题干 编写…

长度最小的子数组 ---- 滑动窗口

题目链接 题目: 分析: 解法一:暴力解法, 找到所有连续子数组, 保留满足条件的解法二: 利用滑动窗口 找子数组 因为数组中都是正整数, 通过进窗口的操作, 我们找到一组, 如示例一中的2,3,1,2, 判断满足和>7, 那么根据单调性, 我们就不再需要判断加上后面两个数的两个子数组…

在 GitHub 中掌握键盘快捷键的简短指南

你是否知道 GitHub 几乎每页都有键盘快捷键?这篇文章将带你探索 GitHub 的键盘快捷键世界,以及它们如何帮助你快速导航和执行操作。 读完这篇,你将能够: 掌握快捷键:想知道如何访问这些快捷键?在任何 Git…

记录浏览器打开网站拦截提示不安全解决方法

浏览器可能会因为多种原因显示“不安全”的警告,这通常是由于安全设置不当或配置错误造成的。以下是一些常见的原因和解决方法: 1. HTTPS未启用 原因:如果网站使用HTTP而不是HTTPS,浏览器可能会显示不安全的警告。 解决方法:配置SSL/TLS证书并使用HTTPS来加密数据传输…

64、二分-搜索二维矩阵

思路: 通过使用二分方式,对于每行进行二分,因为每行的最后一个数小于下一行的第一个数,我们就可以依次二分。首先取出行数N,然后从0-N进行二分,如果mid最后一个数小于目标值说明0-mid中没有,舍弃…

开源博客项目Blog .NET Core源码学习(19:App.Hosting项目结构分析-7)

本文学习并分析App.Hosting项目中后台管理页面的主页面。如下图所示,开源博客项目的后台主页面采用layui预设类layui-icon-shrink-right设置样式,点击主页面中的菜单,其它页面采用弹框或者子页面形式显示在主页面的内容区域。   后台主页面…

Qt设置可执行程序图标,并打包发布

一、设置图标 图标png转ico: https://www.toolhelper.cn/Image/ImageToIco设置可执行程序图标 修改可执行程序图标 添加一个rc文件,操作如下,记得后缀改为rc 打开logo.rc文件添加代码IDI_ICON1 ICON DISCARDABLE "logo.ico"在项目pro后缀名的文件中添加代码 RC_…

OpenWrt上的docker容器无法访问外网解决

容器里能ping通OpenWrt的管理地址和wan口地址,但ping外网别的ip或域名就无法访问 简单修改设置就可以: Luci>网络>防火墙>转发:接受 ->保存应用

Linux中的yum和gcc/g++

一、快速认识yum(简单介绍) 在Linux中,我们也要进行工具/指令/程序、安装、检查、卸载等等,需要使用到yum 在Linux中安装软件的方式: 源代码安装——交叉编译的工作rpm包直接安装yum/apt-get yum:yum是我们Linux预…

在no branch上commmit后,再切换到其他分支,找不到no branch分支的修改怎么办?

解决办法 通过git reflog我们可以查看历史提交记录,这里的第二条提交(fbd3ea8)就是我在no branch上的提交。 再通过git checkout -b backup fbd3ea8,恢复到上次提交的状态,并且为其创建个分支backup,此时…

FTP可替代?传输替代方案应该需要具备哪些条件?

企业对数据传输的安全性、速度和稳定性的要求日益提高。传统的FTP虽然在早期广泛使用,但随着技术的发展和业务需求的增长,其局限性逐渐显现,迫切需要替代方案以满足现代企业的需求。 FTP的局限性主要表现在以下几个方面: 安全性不…

Postman,一个功能强大的API开发和测试工具

最近有小伙伴说在找 postman 的使用教程,案例等文章。 那么今天我就来写一个。 Postman 是一个功能强大的 API 开发和测试工具,它提供了丰富的功能,帮助开发人员更好地管理、测试和文档化 API。无论是单独开发还是团队协作,Postma…

一个数据人眼中的《上游思维》

最近读了《上游思维》这本书,很受启发,我想从一个数据人的角度来聊一聊我对这本书的读后感。上游思维本质上是帮助我们解决问题,我发现在解决问题相关的每个阶段:发现问题、找到解决问题的方法、解决问题的过程中、评估问题以及预…

【C++】简易二叉搜索树

目录 一、概念: 二、代码实现: 大致结构: 1、遍历: 2、insert 3、find 4、erase 三、总结: 一、概念: 二叉搜索树又称为二叉排序树,是一种具有特殊性质的二叉树,对于每一个节…

icloud里面的通讯录怎么全部导出,通讯录格式如何转换,简单!

随着科技的发展,我们的日常生活越来越离不开手机和各种应用程序。通讯录作为手机中最重要的功能之一,记录着我们的亲朋好友、同事和业务伙伴的联系方式。因此,定期备份通讯录变得尤为重要。iCloud作为苹果公司提供的一项云服务,可…

基于jenkins+docker实现CI/CD实践

项目简介 利用 Jenkins、Docker、SonarQube 和 Harbor 技术,搭建一个完整的 CI/CD 管道,实现持续集成、持续交付和持续部署的流程。通过自动化构建、测试、代码质量检查和容器化部署,将开发人员从繁琐的手动操作中解放出来,提高团…

求三个字符数组最大者(C语言)

一、N-S流程图&#xff1b; 二、运行结果&#xff1b; 三、源代码&#xff1b; # define _CRT_SECURE_NO_WARNINGS # include <stdio.h> # include <string.h>int main() {//初始化变量值&#xff1b;int i 0;char str[3][20];char string[20];//循环输入3个字符…

可以在手机端运行的大模型标杆:微软发布第三代Phi-3系列模型,评测结果超过同等参数规模水平,包含三个版本,最小38亿,最高140亿参数

本文原文来自DataLearnerAI官方网站&#xff1a; 可以在手机端运行的大模型标杆&#xff1a;微软发布第三代Phi-3系列模型&#xff0c;评测结果超过同等参数规模水平&#xff0c;包含三个版本&#xff0c;最小38亿&#xff0c;最高140亿参数 | 数据学习者官方网站(Datalearner…

React真的好难用

我发现React就像个宗教一样&#xff0c;网络上总有一群信徒。信徒&#xff1a;React天下第一&#xff0c;谁也不能说他不好。 网络上大佬对React的评价一般有几类&#xff1a; React跟Vue比就是手动档和自动档的区别&#xff0c;高手都开手动档。—— 就一个破打工的&#xf…

(待更)DRF: 序列化器、View、APIView、GenericAPIView、Mixin、ViewSet、ModelViewSet的源码解析

前言&#xff1a;还没有整理&#xff0c;后续有时间再整理&#xff0c;目前只是个人思路&#xff0c;文章较乱。 注意路径匹配的“/” 我们的url里面加了“/”&#xff0c;但是用apifox等非浏览器的工具发起请求时没有加“/”&#xff0c;而且还不是get请求&#xff0c;那么这…