【RAG 论文】Contriever:对比学习来无监督训练文本嵌入模型

论文:Unsupervised Dense Information Retrieval with Contrastive Learning

⭐⭐⭐⭐⭐

Facebook Research, arXiv:2112.09118

Code:github.com/facebookresearch/contriever

一、论文速读

本文使用对比学习的方法来对文本检索模型做无监督学习训练,从而实现在多个领域的泛化性。

提出的 motivation:在有大量数据集的 domain 上做监督训练得到的 dense retriever 具有强大的表现,但是当被应用到其他 domain 时,表现可能还不如 BM25 这类经典方法。于是想到,无监督学习是迁移学习的一种自然选择,本文的研究问题就是:有没有可能在无监督的情况下训练一个 dense retriever,并与 BM25 的性能相匹配

本工作提出了 Contriever 模型,采用 bi-encoder 架构,query 和 doc 分别进行编码,其相关性得分由两者的 vector representation 的 dot product 计算得出。经验表明,query encoder 与 doc encoder 采用相同的 encoder 通常可以在零样本迁移或者少样本学习的背景下提高鲁棒性(原 paper 第 3 节提出),因此本工作使用了相同的 encoder,encoder 基于 BERT 来进行训练。

论文的重点创新是其训练思路,下面详细介绍。

二、模型的训练

2.1 对比学习(Contrastive Learning)

训练数据包含 positive pairs 和 negative pairs,对比学习采用 InfoNCE 损失,具体如下论文所示:

1715417066478

2.2 构建 positive pairs

对比学习的一个关键因素是如何从单个 input 中构建 positive pairs,本文的方法如下:

  • 反完形填空任务Inverse Cloze TaskICT):是一种训练 retriever 的数据增强方法,经常被用来生成用于训练的正样本对,具体来说,ICT 的步骤如下:
    1. 文本分段:将 document 分割成若干的 segments
    2. 随机采样:从每个 segment 中随机采样出一个 span 的文本作为 query,该 segment 的剩余部分作为 context,(query, context) 就可以作为一个正样本
    3. 训练检索器:训练 retriever,使其能够根据 query 检索出原始的 context
  • Independent cropping:从一个 document 中,完全独立随机地采样出两个 span tokens 作为正样本对
  • Additional data augmentation:额外的数据增强,如随即删除单词、替换或者屏蔽等。

在之后的消融实验中,该工作发现使用“independent cropping”来训练 retriever 是 ICT 的一个有力替代方案

2.3 构建大量的 negative pairs

这里主要用了两种思路:in-batch negatives 方法和 MoCo 方法。

in-batch negatives 方法已经在其他论文讲解中介绍了。

Moco(Momentum Contrast)是一种用于无监督或自监督学习的对比学习方法,它在处理大规模数据集时特别有效,因为它可以高效地利用大量的负样本。MoCo 的核心思想是使用一个动态更新的 queue 来存储 negative example 的 vector representation

MoCo 方法的几个关键步骤如下:

  1. 正样本对:对于每个 input,先按照前面的方法构造一个 positive pair
  2. 负样本队列:维护了一个 negative queue,用于存储之前 batch 的 negative example 的 vector representation,其大小是固定预先设定的。每个训练步骤中,最新的负样本表示会被加入到 queue 中,而队首则会被移除。queue 反映了最近的训练状态。
  3. Query Network:该网络负责对 input query 生成 vector representation,训练过程中会通过梯度下降进行更新
  4. 动量编码器(momentum encoder):MoCo 中,负样本的 representation 由动量编码器生成,该编码器的参数更新也不是通过梯度下降更新,而是通过“指数移动平均”来更新(具体可参考原论文)。这意味着动量编码器的参数更新速度较慢,从而在训练过程中提供了更加平滑和一致的负样本表示。
  5. 对比损失:使用对比损失来训练 encoder,对于每个正样本对,模型需要将其与队列中的负样本区分开来。

以上就是 MoCo 的思路。

三、结论

该工作主要探索了使用 MoCo 技术来基于对比学习和无监督学习来训练 retriever,并发现它表现出良好的检索性能,具有不错的泛化性。

如果继续对其微调的话,可以进一步改进其表现,从而产生强大的结果。
triever,并发现它表现出良好的检索性能,具有不错的泛化性。

如果继续对其微调的话,可以进一步改进其表现,从而产生强大的结果。

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

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

相关文章

windows设置软件开机自启动

winr 输入 shell:startup C:\Users\用户名\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup把要开机自动启动的程序的快捷方式放进来 输入快捷键 ctrlshiftesc 打开任务管理器 同时在任务管理器也可以看到

已解决【nvidia-smi】Failed to initialize NVML: Driver/library version mismatch解决方法

本文摘要:【nvidia-smi】Failed to initialize NVML: Driver/library version mismatch解决方法。 😎 作者介绍:我是程序员洲洲,一个热爱写作的非著名程序员。CSDN全栈优质领域创作者、华为云博客社区云享专家、阿里云博客社区专…

【大数据·Hadoop】从词频统计由浅入深介绍MapReduce分布式计算的设计思想和原理

一、引入:词频统计问题 假如我们有一亿份文档,需要统计这一亿份文档的词频。我们会怎么做,有以下思路 使用单台PC执行:能不能存的下不说,串行计算,一份一份文档读,然后进行词频统计&#xff0…

视频号小店做店的最新最全攻略,小白也能快速上手轻松变现!

大家好,我是电商花花。 从开始接触视频号小店到现在已经两年多时间了,关于视频号小店也有不少经验和感触。 最近越来越多的人开始进入视频号小店的电商赛道,有人日均销售额做到几万甚至十几万。 想在视频号上变现赚钱,但是苦于…

【Android】Apk图标的提取、相同目录下相同包名提取的不同图标apk但是提取结果相同的bug解决

一般安卓提取apk图标我们有两种常用方法: 1、如果已经获取到 ApplicationInfo 对象(假设名为 appInfo),那么我们获取方法为: appInfo.loadIcon(packageManager)// 返回一个 Drawable 对象2、 如果还没获取到 Applica…

DPDK e1000 ring buffer

基本原理 如图(盗图) 内存(RAM)和网卡(NIC)之间通过Descriptor ring 交互网络报文数据内存中需要申请内存 packet buffer 的内存池,内存池中的每个实例,地址是物理连续的或者IOVA…

【Vue基础】Vue在组件数据传递详解

Vue核心基础-CSDN博客 先回顾Vue特性: Vue.js 是一个用于构建用户界面的渐进式框架,具有许多强大的特性。以下是一些主要的 Vue 特性: 响应式数据:Vue 使用双向绑定来实现数据的响应式更新。当数据发生变化时,视图会自…

JAVA毕业设计138—基于Java+Springboot+Vue的医院预约挂号小程序(源代码+数据库)

毕设所有选题: https://blog.csdn.net/2303_76227485/article/details/131104075 基于JavaSpringbootVue的医院预约挂号小程序(源代码数据库)138 一、系统介绍 本系统前后端分离带小程序和后台 小程序(用户端),后台管理系统&a…

OpenCv中cv2.subtract(image,blurred)与(image-blurred)的区别

目录 一、cv2.subtract()函数二、cv2.subtract(image,blurred)和(image-blurred)处理效果对比2.1 代码2.2 输出结果 三、总结 一、cv2.subtract()函数 cv2.subtract是OpenCV库中的一个函数,用于进行图像减法运算。它可以很方便地进行两个图像…

鸿蒙OpenHarmony:【关于deps、external_deps的使用】

关于deps、external_deps的使用 在添加一个模块的时候,需要在BUILD.gn中声明它的依赖,为了便于后续处理部件间依赖关系,我们将依赖分为两种——部件内依赖deps和部件间依赖external_deps。 依赖分类 开发前请熟悉鸿蒙开发指导文档&#xff…

conan2 基础入门(01)-介绍

conan2 基础入门(01)-介绍 文章目录 conan2 基础入门(01)-介绍⭐什么是conan官网Why use Conan? ⭐使用现状版本情况个人知名开源企业 ⭐ConanCenter包中心github ⭐说明文档END ⭐什么是conan 官网 官网:Conan 2.0: C and C Open Source Package Manager 一句话来…

Array.map解析

map方法会创建一个新数组。该方法会循环数组中的每个值,如果仅仅是想循环数组不需要返回值使用数组的forEach方法就可以。原数组中的每个元素都调用一次提供的函数后的返回值组成。Array.map 它接收一个函数 这个函数可以接收三个参数 数组的每个值item 这个值的索引…

SC-Lego-LOAM建图与ndt_localization的实车实现

参考:https://blog.csdn.net/weixin_44303829/article/details/121524380 https://github.com/AbangLZU/SC-LeGO-LOAM.git https://github.com/AbangLZU/ndt_localizer.git 将建图和定位分别使用lego-loam和ndt来进行,实车上的效果非常不错,…

STM32F103学习笔记 | 7.使用寄存器点亮LED灯

int main(void) { // 分析指南者硬件原理图得知要实现点亮灯泡需要将PB0设置为低电位, // 查阅STM32F10x中文手册的端口配置低寄存器,得知一个PB有8个配置位,查阅手册找到了PB0的位置是3:2位置, // 插入未知知识:将端…

EMAIL-PHP功能齐全的发送邮件类可以发送HTML和附件

EMAIL-PHP功能齐全的发送邮件类可以发送HTML和附件 <?php class Email { //---设置全局变量 var $mailTo ""; // 收件人 var $mailCC ""; // 抄送 var $mailBCC ""; // 秘密抄送 var $mailFrom ""; // 发件人 var $mailSubje…

获取Android开发板已连接WiFi密码

硬件/软件环境&#xff1a; 1&#xff09;全志芯片开发板A40i 2&#xff09;Android Studio Giraffe | 2022.3.1 Patch 3 连接条件&#xff1a; 1)两端都是USB-A接口线&#xff0c;一端插入电脑端USB接口&#xff0c;另一端插入开发板USB接口&#xff1b; 2&#xff09;Andr…

基于 LlaMA 3 + LangGraph 在windows本地部署大模型 (二)

基于 LlaMA 3 LangGraph 在windows本地部署大模型 &#xff08;二&#xff09; #Options local_llm llama3 llm ChatOllama(modellocal_llm, format"json", temperature0) #embeddings #embeddings OllamaEmbeddings(model"nomic-embed-text") embed…

作为网络安全工程师需要掌握的安全小知识!

网络安全风险无处不在&#xff0c;今天为大家梳理了一些网络安全相关的小知识&#xff0c;希望能进一步提升大家的安全意识&#xff0c;帮助大家建立更加安全的网络环境。 一、主机电脑安全 1、操作系统安全&#xff1a;安装操作系统时需要选择合适的版本&#xff0c;及时打补…

制造业如何选择合适的项目管理软件?(内含软件推荐)

近期&#xff0c;收到很多小伙伴的提问&#xff1a;“想了解制造行业如何选择到合适的项目管理软件&#xff1f;”在竞争激烈的市场环境中&#xff0c;有效的项目管理对于制造业的发展至关重要&#xff0c;而项目管理软件则是重要支撑&#xff0c;能帮助企业更好地规划和跟踪项…

ok_Keil实用小技巧 | Keil定制Hex文件名实现的方法

Keil实用小技巧 | Keil定制Hex文件名实现的方法 echo off REM 可执行文件&#xff08;Hex&#xff09;文件名 set HEX_NAMEDemo REM 可执行文件&#xff08;Hex&#xff09;文件路径 set HEX_PATH.\Objects REM 定制Hex输出路径 set OUTPUT_PATH.\Output REM 软件版本文件…