【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,并发现它表现出良好的检索性能,具有不错的泛化性。

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MySQL-索引篇

文章目录 什么是索引?索引的优缺点索引底层数据结构选型Hash表二叉查找树AVL树红黑树B树&B树 索引类型总结主键索引二级索引聚集索引与非聚集索引聚集索引非聚集索引 覆盖索引与关联索引覆盖索引联合查询最左前缀匹配原则 索引下推如何正确使用索引选择合适的字…

信息检索(35):LEXMAE: LEXICON-BOTTLENECKED PRETRAINING FOR LARGE-SCALE RETRIEVAL

LEXMAE: LEXICON-BOTTLENECKED PRETRAINING FOR LARGE-SCALE RETRIEVAL 标题摘要1 引言2 相关工作3 LEXMAE:词典瓶颈屏蔽自动编码器3.1 语言建模编码器3.2 词典瓶颈模块3.3 弱化掩蔽式解码器3.4 词汇加权检索器的预训练目标和微调 4 实验4.1 主要评估4.2 效率分析与…

「云渲染教程」3D渲染时GPU内存不足怎么解决?

在进行三维场景渲染时,如果遇到模型较为复杂,用户们可能会面临图形处理单元(GPU)内存不足的挑战。这种情况通常意味着现有的硬件配置不足以满足渲染任务的需求。为了缓解GPU的工作压力,可以采取一些策略来优化资源的分…

如何使用联合体判断一个机器是大端还是小端

如何使用联合体判断一个机器是大端还是小端 #include<iostream> using namespace std; union Checker//联合体中的数据共享内存 {int val;char ch[2]; }; int main() {Checker checker;checker.val 0x1234;if (checker.ch[0] 0x34)//数组中的数据是由低地址往高地址存放…

Arduino-ILI9341驱动开发TFT屏显示任意内容三

Arduino-ILI9341驱动开发TFT屏显示任意内容三 1.概述 这篇文章介绍使用ILI9341驱动提供的函数控制TFT屏显示字符串、图形、符号等等内容的编辑和展示。 2.硬件 2.1.硬件列表 名称数量Arduino Uno12.8" TFT彩色液晶触摸屏模块&#xff08;ILI9431&#xff09;110K 电阻…

什么是web3D?应用场景有哪些?如何实现web3D展示?

Web3D是一种将3D技术与网络技术完美结合的全新领域&#xff0c;它可以实现将数字化的3D模型直接在网络浏览器上运行&#xff0c;从而实现在线交互式的浏览和操作。 Web3D通过将多媒体技术、3D技术、信息网络技术、计算机技术等多种技术融合在一起&#xff0c;实现了它在网络上…

QT6 android程序界面强制横屏显示不旋转

QT6开发的Android程序有时候旋转后程序会变形&#xff0c;比如想让其固定位横屏显示&#xff0c;就需要进行特殊设置&#xff0c;本文提供一种简便的设置方法。 一.AndroidManifest.xml文件介绍 Android的Manifest.xml文件是一个重要的配置文件&#xff0c;用于描述应用程序的…

2024.5.9 关于 SpringCloud —— Nacos 的安装与配置

目录 Windos 安装步骤 docker 启动 nacos Windos 安装步骤 1&#xff09;点击下方链接&#xff0c;进入并访问 nacos 官网 Nacos官网 | Nacos 官方社区 | Nacos 下载 | Nacos 2&#xff09;按照下图箭头指示下载对应版本的压缩包 3&#xff09;此时我们将得到一个压缩包&…

ARM时钟树结构(GD32)

时钟树的简易框图 初始化配置系统时钟 配置系统初始化时钟&#xff08;参考手册&#xff09; 对应hal库函数 使用72MHz的系统时钟 do -----------while&#xff08;0&#xff09;的使用方法 系统时钟 #include <stdint.h> #include "gd32f30x.h"int main(void)…

分布式事务技术方案

什么是分布式事务 一次课程发布操作需要向数据库、redis、elasticsearch、MinIO写四份数据&#xff0c;这里存在分布式事务问题。 什么是分布式事务&#xff1f; 首先理解什么是本地事务&#xff1f; 平常我们在程序中通过spring去控制事务是利用数据库本身的事务特性来实现…

Rancher-Kubewarden-保姆级教学-含Demo测试

一、什么是Kubewarden&#xff1f; What is Kubewarden? | Kubewarden 1、就是容器集群的准入策略引擎。 1、使用的策略其实就是k8s原生的security context. 2、使用WebAssembly来编写策略。 1、WebAssembly&#xff0c;可以使用擅长的开发语言来编写策略。&#xff08;下面的…

shared_ptr 引用计数相关问题

前言 智能指针是 C11 增加的非常重要的特性&#xff0c;并且也是面试的高频考点&#xff0c;本文主要解释以下几个问题&#xff1a; 引用计数是怎么共享的、怎么解决并发问题的资源释放时&#xff0c;控制块的内存释放吗weak_ptr 怎么判断对象是否已经释放 文中源码用的是 L…

CSS的基础语法和常见的语法简单归纳

CSS CSS 是层叠样式表&#xff08;Cascading Style Sheets&#xff09;的缩写。它是一种用来控制网页样式和布局的标记语言。通过 CSS&#xff0c;可以定义网页中的元素&#xff08;如文字、图像、链接等&#xff09;的外观和排版方式&#xff0c;包括字体、颜色、大小、间距、…

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

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

静态分析-RIPS-源码解析记录-01

token流扫描重构部分&#xff0c;这一部分主要利用php的token解析api解析出来的token流&#xff0c;对其中的特定token进行删除、替换、对于特定的语法结构进行重构&#xff0c;保持php语法结构上的一致性 解析主要在lib/scanner.php中通过Tokenizer这个类来实现,也就是在main…

ICode国际青少年编程竞赛- Python-4级训练场-列表综合练习

ICode国际青少年编程竞赛- Python-4级训练场-列表综合练习 1、 Flyer[3].step(1) Flyer[7].step(2) Flyer[11].step(1) for i in range(4):Flyer[i * 2].step(1) Flyer[8].step(3)for i in range(3):Dev.turnRight()Dev.step(-5)2、 for i in range(5):Flyer[i5].step(Flyer[…

git 推送github 选https遇到登录 openSSH问题

使用https需要使用github令牌token作为密码&#xff0c; 使用SSH不需要登录。 还有一个问题&#xff1a; 创建github仓库后没有quick setup页面解决办法 千万不要点击任何多的操作&#xff01;&#xff01;&#xff01;输入仓库名&#xff0c;直接create&#xff01;&#x…

数据分析——业务指标分析

业务指标分析 前言一、业务指标分析的定义二、业务问题构建问题构建的要求 三、业务问题的识别在识别问题的阶段对于企业内部收益者的补充 四、竞争者分析竞争者分析的内容竞争者分析目的案例 五、市场机会识别好的市场机会必须满足的条件市场机会案例 六、风险控制数据分析师常…

多模态CLIP和BLIP

一、CLIP 全称为Contrastive Language-Image Pre-Training用于做图-文匹配&#xff0c;部署在预训练阶段&#xff0c;最终理解为图像分类器。 1.背景 以前进行分类模型时&#xff0c;存在类别固定和训练时要进行标注。因此面对这两个问题提出CLIP&#xff0c;通过这个预训练…

1.前端环境搭建

1.安装nodejs 因为我们开发Vue项目需要使用npm命令来创建和启动&#xff0c;安装node.js是为了获得这个命令&#xff0c;目前和使用node.js无关 下载地址&#xff1a;http://nodejs.cn/download/ 下载完之后安装&#xff0c;通过cmd查看是否安装成功 node --version2.创建项目…