LLM在Reranker任务上的最佳实践?A simple experiment report(with code)

news2024/10/25 0:45:03

知乎:车中草同学(已授权)
链接:https://zhuanlan.zhihu.com/p/987727357

引言

在BERT时代,对于Reranker任务,我们使用encoder-only的BERT为基座,拼接query和doc输入到BERT中去,在使用CLS的向量通过一个MLP,得到得分来做Reranker任务。

在LLM出来之后,一个很自然的想法是,我们能否使用decoder-only的LLM来作为Reranker任务的基座。

本篇实验报告中,在有监督微调的场景下,如下图所示,笔者探索了以下两种使用LLM做Reranker任务的方法。并且与BERT类模型做比较。

  • 生成的方法:直接用生成的方法去做,输入query和doc,直接让大模型预测相关(是)和不相关(否)。

  • 判别的方法:和传统的BERT一样,在大模型后面增加一个MLP层,来得到score。一般是:让llm的last_hidden_state通过MLP层去得到一个score。c88a1ebcd2cf0242c1abc75418b8d443.png

本篇实验报告试图回答这几个问题 ?

  1. 在reranker任务上使用llm,是否比bert类模型有优势?

  2. 两种使用LLM做Reranker任务的方法,哪种效果最好?

  3. 如果LLM做Reranker任务的方法效果比bert好,那么是否可以蒸馏这种信号到bert中?

注意:本篇实验报告所有的代码均在本人维护的RAG-Retrieval仓库中提供,欢迎大家给个star。

https://github.com/NLPJCL/RAG-Retrieval

RAG-Retrieval 提供了全链路的RAG检索微调(train)和推理(infer)代码。

  • 对于微调,支持微调任意开源的RAG检索模型,包括向量(embedding)、迟交互式模型(colbert)、排序模型(bert,llm)。

  • 对于推理,RAG-Retrieval专注于排序(reranker),开发了一个轻量级的python库rag-retrieval,提供统一的方式调用任意不同的RAG排序模型。

  • 对于蒸馏,支持将基于LLM的reranker模型,蒸馏到基于bert的reranker中。

方法

在讲具体的方法前,我们首先回顾下LLM的基座可能比BERT作为基座的好处是:

  1. 模型参数一般比较多:一般认为,模型参数量越多,在相同的数据训练下,其能力越强。bert-base一般就110M,约1.15亿参数(0.115b),而开源的LLM比这大的多。(0.5b,1.5b,72b)

  2. 预训练阶段见到的数据多:LLM一般比BERT在预训练阶段见过的数据多。并且decoder-only模型从所有的输入信息中学习,而不只是像bert一样,只从mask的部分学习。(15%)。

  3. 输入长度更长和多语言支持。

LLM做Reranker基座的两种方式

这里介绍下在有监督场景下,decoder-only的LLM来作为Reranker任务的基座的两种不同的方式。

生成的方法:直接用生成的方法去做,输入promot和query和doc,直接让大模型预测相关(是)和不相关(否)。1d332c24650b299503b3bd843c875f02.png

  1. 这种方法是把reranker任务当做SFT任务的一种子任务。

  2. LLM本身就有zero-shot的排序能力,直接上,这种方法,可以与LLM在预训练,SFT等阶段积累的能力对齐,充分利用LLM的潜力。

  3. 训练的loss:本质上是采用交叉熵loss,原本生成任务是固定的词表(qwen是25w)预测要生成词的概率,而该种方法,还是从词表中预测,不过只有一个词,并且生成的词只可能是:"是"和"否"。

判别的方法:和传统的BERT一样,在大模型后面增加一个MLP层,来得到score。一般是:让llm的last_hidden_state通过MLP层去得到一个score。66b38ef818af0f7cc784b56b6902695b.png

  1. 这种方法把reranker任务建模成一个判别任务,只利用LLM的基座,来得到query和passage上下文的表示,再通过一个MLP来做二分类。

  2. 对比直接把reranker任务建模成生成任务,这种方法只是将LLM作为编码层,而在解码层,需要完全从零训练一个随机的MLP层,并没有特别和LLM预训练和SFT阶段对齐。

  3. 训练的loss:使用BCEWithLogitsLoss loss。

蒸馏到BERT中的方法

我们使用蒸馏logits 的方法,来将大模型的能力蒸馏到bert中来。

构造训练数据:

具体来说,不管我们使用LLM做Reranker任务的,生成方法还是判别方法,都可以得到一个logits。

对于判别方法:因为其用BCEWithLogitsLoss,那么本身其MLP的输出加上一个Sigmoid就是一个0-1之间的score。

对于生成方法:我们取出softmax后的概率值。然后取出"是"的概率,作为query和doc的相关性得分。(预测为1的相关性得分,且在0-1之间)

蒸馏方法:

1.我们将蒸馏任务建模成一个回归任务,用mse loss来学习logits。04521986d004ed8ff848649da40f0cea.png

实验

实验设置

训练数据:我们使用T2-Reranking(搜狗和清华开源的搜索引擎段落排序数据集)的训练集共187502个query和对应的正例,并提前挖掘为每个query挖掘了15个难负例。

测试数据:C-MTEB中的T2-Reranking的测试集。

训练细节:

基座模型:对于BERT的基座,我们使用hfl/chinese-roberta-wwm-ext;对于LLM的基座,我们使用Qwen/Qwen2-1.5B-Instruct

实验细节:我们都使用了5e-5的学习率,并且设置batch_size为96,采用BCE loss来训练模型,共训练了2个epoch。

训练框架:

对于LLM做reranker任务:

对于生成方法:本篇文章使用LLaMA-Factory。

https://github.com/NLPJCL/LLaMA-Factory

对于判别方法:本篇文章使用RAG-Retrieval。

https://github.com/NLPJCL/RAG-Retrieval

训练代码:

https://github.com/NLPJCL/RAG-Retrieval/tree/master/rag_retrieval/train/reranker

对于蒸馏:把LLM做reranker任务的能力蒸馏到bert中,文章使用RAG-Retrieval。

https://github.com/NLPJCL/RAG-Retrieval

构造训练数据:

https://github.com/NLPJCL/RAG-Retrieval/tree/master/examples/distill_llm_to_bert

训练蒸馏模型:

https://github.com/NLPJCL/RAG-Retrieval/tree/master/rag_retrieval/train/reranker

实验结果

在实验中,我们首先在reranker数据较少或者难负例较少的情况下做了一些实验。

  1. 我们使用T2-Reranking 187502训练集中的1w个训练数据,每个训练数据带有15个难负例。e31d1c6b0e6a70482605f0afe26a3cf2.png实验结论:

  • 可以看出,在数据量较少的情况下,两个基于llm的方法都比bert的方法效果好。

  • 其中llm(生成方法)效果最好,在相同的数据情况下,其比bert的方法的map高了0.62,其比llm(判别)方法的map高了0.30。

  1. 我们使用全量的T2-Reranking 187502训练集,但只使用了5个难负例。4fa1811ea8a479d83b0603933da67267.png实验结论:

  • 可以看出,在难负例较少的情况下,bert的结果相比两个基于llm的结果较差,map只有65.50。这说明bert模型的泛化性不如两个基于llm的方法。

  • 两个基于llm的结果相差不大,其中llm(生成方法)效果最好,其比bert的方法的map高了1.61。

  • 蒸馏:在相同数据的前提下,通过将llm(生成方法)蒸馏到bert中来,其效果达到了66.95,比单纯训练bert模型的map高了1.45。

  1. 在最终,全量的T2-Reranking 187502训练集,同时使用了15个难负例。54d0d122481e0ed3ed7e9ca5aa2cf69f.png实验结论:

  • 可以看出,在全量数据,15个难负例的情况下,bert的结果和两个基于llm的方法结果相差不大。

  • 其中其中llm(生成方法)效果最好,其比bert的方法的map高了0.13,比llm(判别方法)高0.06了。

总结

最后,我们来回答下开头的三个提问:

  1. 在reranker任务上使用llm,是否比bert类模型有优势?
    在训练数据量较少或者难负例较少的情况下,两者llm的方法相比bert都有较大的优势。但在数据充足(训练数据足够,难负例足够)的情况下,这种优势会被减弱。

  2. 两种使用LLM做Reranker任务的方法,哪种效果最好?
    llm(判别方法)和llm(生成方法)没有较大的差距,但始终是llm(生成方法)效果更好一点,可能是因为其更好的和llm在训练过程中的训练目标对齐了。

  3. 如果LLM做Reranker任务的方法效果比bert好,那么是否可以蒸馏这种信号到bert中?
    在数据量较少或者难负例较少的情况下,在相同的训练数据下,通过先训练llm(生成方法),再蒸馏到bert中,这样可以兼顾效果和效率。对于效果,蒸馏后的bert模型,可以比单纯只训练bert的map高了1.45,和训练llm(生成方法)只差了0.16。

最佳实践建议

我们建议:

  1. 如果您的数据较为充足(且没有利用大模型的两个特性的需求:输入更长,多语言支持),那么可以直接训练bert模型来做reranker任务,那么其可以在效果不错的前提下兼顾高效推理。

  2. 如果您的数据较少或者需要输入更长,多语言支持,那么请优先选择已llm为基座的两种方法,且优先选择llm(生成)的方法。如果您考虑推理效率,那么可以再将其蒸馏到BERT中去。


备注:昵称-学校/公司-方向/会议(eg.ACL),进入技术/投稿群

384b407fb2f5a7763397ddfd92c5ca90.png

id:DLNLPer,记得备注呦

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

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

相关文章

身份证识别JAVA+OPENCV+OCR

一、相关的地址 https://github.com/tesseract-ocr/tessdata Releases - OpenCV opencv要装好,我装的是4.5.3的,最新版的没试过。 tessdata就下载了需要用的。好像还有best和fast的版本,我试了一下报错,不知道是不是版本不支持…

华为配置 之 远程管理配置

目录 简介: 知识点: Telnet远程管理 (1)配置接口IP并确保R1和R2处于同一个网段 (2)使用password认证模式远程登录 (3)使用AAA认证模式远程登录 SSH远程管理 (1&a…

基于springboot的网上服装商城推荐系统的设计与实现

基于springboot的网上服装商城推荐系统的设计与实现 开发语言:Java 框架:springboot JDK版本:JDK1.8 服务器:tomcat7 数据库:mysql 5.7 数据库工具:Navicat11 开发软件:idea 源码获取&#xf…

【deathStarBench】2.安装k8s集群

安装docker 通过以下命令安装docker: sudo yum install docker-ce-26.1.4 docker-ce-cli-26.1.4 containerd.io随后通过查看docker --version,可以确定是否安装的版本一样 启动docker systemctl start docker && systemctl enable docker.se…

《纳瓦尔宝典:财富和幸福指南》读书随笔

最近在罗胖的得到听书中听到一本书,感觉很有启发,书的名字叫《纳瓦尔宝典》,从书名上看给人的感觉应该财富知识类、鸡汤爆棚哪类。纳瓦尔,这个名字之前确实没有听说过,用一句话介绍一下,一个印度裔的硅谷中…

【LeetCode】修炼之路-0006-Zigzag Conversion (Z 字形变换)【python】

题目 The string “PAYPALISHIRING” is written in a zigzag pattern on a given number of rows like this: (you may want to display this pattern in a fixed font for better legibility) P A H N A P L S I I G Y I R And then read line by line: “PAHNAPLSIIGYIR” …

荣耀电脑管家-系统重装之查询设备序列号

winr输入cmd,再命令行中输入 wmic bios get serialnumber 如下所示

代码随想录算法训练营第六天|454四数相加II、 383赎金信、15三数之和、18四数之和

day06 1. 454四数相加II 首先定义 一个unordered_map,key放a和b两数之和,value 放a和b两数之和出现的次数。遍历大A和大B数组,统计两个数组元素之和,和出现的次数,放到map中。定义int变量count,用来统计 …

YAML格式校验API:免费工具的使用指南

YAML(YAML Ain’t Markup Language)是一种人类可读的数据序列化格式,广泛用于配置文件、数据交换等场景。由于其简洁的语法和良好的可读性,YAML 在开发和运维领域中越来越受到欢迎。然而,在使用 YAML 时,格…

Xcode文件默认存储位置-使用c++file保存文件默认路径以及设置为路径为当前项目路径

Xcode文件默认存储位置-使用cfile保存文件默认路径以及设置为路径为当前项目路径 1.概述 使用Xcode工具开发时候,遇到C调用file创建文件后,在当前项目中找不到文件路径。这是由于xcode会将文件保存到默认设置的路径。下面是查看文件默认存储路径和修改…

数组中的算法

目录 1.什么是数组 2.数组上的算法 2.1二分查找算法 什么是二分查找算法? 算法步骤 算法时间复杂度 一个问题 例题 题目分析 解题代码 2.2双指针法 什么是双指针法? 例题 题目分析 解题代码 1.什么是数组 数组是在一块连续的内存空间…

C++,STL 047(24.10.24)

内容 对set容器的元素进行查找与统计。 运行代码 #include <iostream> #include <set>using namespace std;void printSet(set<int> &s) {for (set<int>::iterator it s.begin(); it ! s.end(); it){cout << *it << " ";…

linux-牛刀小试

题目一&#xff1a; 1.第一问 首先创建用户tab在超级用户root的终端输入useradd tab 切换到tab用户&#xff1a; 推出重新登录到tab用户或者su – tab切换到tab用户 2.第二问 在桌面创建SHEGNCHAN目录 在SHENGCHAN文件夹下创建相应的文件&#xff1a; 3.第三问 首先&#…

哈希表【闭散列/开散列】

&#x1f33b;个人主页&#xff1a;路飞雪吖~ &#x1f320;专栏&#xff1a;C/C 目录 一、unordered系列关联式容器 &#x1f31f;unordered_map ⭐unordered_map接口说明 二、底层结构 &#x1f31f;哈希概念 &#x1f31f;哈希冲突 &#x1f31f;哈希函数 &#x1f3…

基于Leaflet和SpringBoot的全球国家综合检索WebGIS可视化

目录 前言 一、Java后台程序设计 1、业务层设计 2、控制层设计 二、WebGIS可视化实现 1、侧边栏展示 2、空间边界信息展示 三、标注成果展示 1、面积最大的国家 2、国土面积最小的国家 3、海拔最低的国家 4、最大的群岛国家 四、总结 前言 在前面的博文中&#xff…

【随手笔记】远程升级之如何平衡下载包大小与速率?

1. 远程升级基本信息 使用NB_BC26模组&#xff0c;通过AT指令使用TCP的协议与公司后台交互升级的固件为BIN文件&#xff0c;使用原始固件包升级&#xff0c;未使用差分方式原始固件包有110K,大小左右&#xff0c;固件的存储为外置的FLASH W25Q16,w25q16最小存储单位为页&#…

AListFlutter(手机alist)——一键安装,可在手机/电视上运行并挂载各个网盘

前面提到软路由系统OpenWRT的时候&#xff0c;当时说过可以在OpenWRT里安装alist&#xff0c;然后挂载网盘&#xff0c;这样就可以通过webdav的方式在家庭局域网下的任何设备都可以访问操作这些网盘&#xff0c;摆脱硬盘空间不够的问题。 但alist的官方版本是没有手机版本的&a…

【Java】探秘正则表达式:深度解析与精妙运用

目录 引言 一、基本概念 1.1 元字符 1.2 预定义字符类 1.3 边界匹配符 1.4 数量标识符 1.5 捕获与非捕获分组 二、Java中的正则表达式支持 三、正则表达式的使用示例 3.1 匹配字符串 3.2 替换字符串 3.3 分割字符串 3.4 使用Pattern和Matcher 3.5 捕获组和后向…

我了个超绝MATLAB——基础

由于要参加美赛&#xff0c;不想拖对队友们的后腿&#xff0c;于是一怒之下……怒了一下 创建MATLAB脚本 创建脚本 在主页——新建——脚本 中新建脚本&#xff08;Ctrln&#xff09; 保存 编辑器——保存&#xff08;Ctrls&#xff09; 运行 编辑器——运行&#xff08;F5&…

iOS--利用UITableViewDataSourcePrefetching实现平滑如丝的无限滚动

前言&#xff1a; 相信大家在网络不好的时候使用列表分页的App会获得非常不好的体验&#xff0c;由于网络的问题&#xff0c;会有明显的卡顿&#xff0c;就像抖音等App&#xff0c;那么我们是否能使用一些手段来优化这个体验呢&#xff1f;这里可以用到UITableView中另一个协议…