FlagEmbedding icon indicating copy to clipboard operation
FlagEmbedding copied to clipboard

bge模型深入使用后思考与疑问

Open mechigonft opened this issue 1 year ago • 21 comments

本人是bge的深度使用者,完成了embedding、reranker的部署、推理、微调全链路跑通与评测,目前发现一个问题,提出来,供大家思考: 首先给出我的数据结论,关键数据已脱敏处理,一个箭头代表5%提升或下降,提升或下降是指与【只embedding不reranker】做对比: 微调前embedding+微调前reranker叠加使用:↑ 微调前embedding+微调后reranker叠加使用:↑↑ 微调后embedding+微调前reranker叠加使用:↓ 微调后embedding+微调后reranker叠加使用:↓↓↓ 也就是说,对于微调后的embedding效果而言,叠加reranker会导致效果更差,我个人感觉是:同样的微调方式(难负例),微调后的reranker效果跟不上embedding的效果,导致叠加会变坏。 后来,我针对reranker的微调方式进行修改再尝试,具体是将难负例挖掘的向量模型切换成我微调后的embedding模型(之前用的都是微调前的),结果发现了一个更令人震惊的事情,不管我怎么修改reranker训练数据:拆条/不拆条,增加neg数量从15->100,无一例外,训练loss全部不再收敛,训练后模型推理丧失多样性,所有的输出全部为同一个值

mechigonft avatar Nov 22 '23 07:11 mechigonft

简单来说,就是基于【微调前bge_embedding模型】挖掘难负例的训练数据集,同时训练embedding和reranker,单独看两者和微调前的模型对比,效果都会有提升,但是,叠加使用,即先向量粗召回再重排序后,召回效果会降低,即不如单纯向量粗召回的效果,叠加reranker后会不升反降。 我在考虑这个问题时,想的原因是,应该基于微调后的embedding再一次挖掘难负例,然后训练reranker,结果,更恐怖的事情发生了,这样训练后的reranker丢失了多样性,所有的输出score都是一个值或者近似一个值。 没搞清楚为什么,我自认为我的数据应该没有问题

mechigonft avatar Nov 22 '23 09:11 mechigonft

我这边有类似的结论,embedding+reranker 对比只使用embedding或者embeddig+bm25算法都有提升。但是只要微调了embedding模型,效果就会下降。 感觉和embedding模型的微调的关系比较大。

Xls1994 avatar Nov 22 '23 09:11 Xls1994

对,如果是裸embedding,不管reranker有没有微调,叠加使用后效果都会提升(reranker微调效果更好),但是只要微调了bge_embedding,那不管reranker有没有微调,效果都会降低(甚至,reranker微调了效果反而更差),即不如单纯使用微调的bge_embedding

mechigonft avatar Nov 22 '23 09:11 mechigonft

@Xls1994 老哥,你试一下,用你微调后的bge_embedding模型作为你难负例挖掘的向量模型,然后挖掘难负例,给reranker训练,我的结论是reranker训练会崩溃,loss不收敛,模型效果没有区分度,你看看

mechigonft avatar Nov 22 '23 09:11 mechigonft

@mechigonft 尝试了老哥你的方案,发现reranker模型训练确实有问题,最后输出的结果没有区分度了。我还尝试训练了一个epoch的方式,reranker模型还是会存在问题;但是换成其他的向量模型挖掘,或者不使用难负例去微调,reranker模型输出就还算正常,recall 50 大概有0.01的提升

Xls1994 avatar Dec 06 '23 02:12 Xls1994

@mechigonft 尝试了老哥你的方案,发现reranker模型训练确实有问题,最后输出的结果没有区分度了。我还尝试训练了一个epoch的方式,reranker模型还是会存在问题;但是换成其他的向量模型挖掘,或者不使用难负例去微调,reranker模型输出就还算正常,recall 50 大概有0.01的提升

这种情况下,可能是负样本中包含了一些伪负列(即与query相关,但不在pos列表里),可以通过该表采样范围来降低负样本难度,如range_for_sampling设为60-300,从top60-top300中采取负样本,这样的话不会从top60以内采取样本,降低伪负列概率。

staoxiao avatar Dec 06 '23 08:12 staoxiao

@staoxiao 我理解就是像你说的,就是伪负样本的问题,这种情况在我的训练场景中比较常见,我的pos是人工打标的,但是人工打的并不全面,在neg中确实还存在一定的跟query相关的,但是被划分到了neg

mechigonft avatar Dec 06 '23 09:12 mechigonft

Hi, 我们发现reranker的微调在transformers版本大于等于4.35时会出现问题,模型存储出错,加载时会显示 Some weights of XLMRobertaForSequenceClassification were not initialized from the model checkpoint at *** and are newly initialized, 这种情况下会重新初始化模型参数,没有经过训练,输出的分数会非常接近。 目前模型存储的代码已更新,如果加载时出现以上warning,可以重新训练模型并存储。

staoxiao avatar Dec 19 '23 05:12 staoxiao

@staoxiao 感谢你的修复,我看了我的transformers版本,是4.34.1,应该不是这个问题

mechigonft avatar Dec 19 '23 05:12 mechigonft

@Xls1994 @staoxiao @zh217 @YingchaoX 各位,关于reranker叠加embedding后效果<单纯embedding的问题,我后续又经过了多次调参,目前叠加效果已经超过单纯embedding模型效果提升了10%以上。 我的做法是: reranker模型在难负例挖掘时使用的向量模型是难负例挖掘的embedding 调参主要是调整1、难负例挖掘的范围2、难负例的个数

过程中依然有多次的调参模型的loss不收敛,score同一个值的情况,但是也有正常的情况,最后我找了一个效果提升的模型, 感觉这个有点玄学,仍然没有发现为什么会出现loss不收敛,score同值的问题, 建议大家多多尝试不同的微调参数,多微调几个模型,评测一下

mechigonft avatar Dec 26 '23 07:12 mechigonft

是先用bge_large进行难负例挖掘吗,楼主一条pos对应了几条难负例啊

hn529945497 avatar Dec 26 '23 07:12 hn529945497

首先,基于bge-large-zh-1.5,难负例微调,微调一个embedding模型 再基于这个微调后的embedding模型,难负例挖掘,微调reranker模型 第二步的neg是80(记得很清楚,因为当时大部分的参数都不行),第一步当时没做多参数的对比测试,用的默认数量,15

mechigonft avatar Dec 26 '23 07:12 mechigonft

首先,基于bge-large-zh-1.5,难负例微调,微调一个embedding模型 再基于这个微调后的embedding模型,难负例挖掘,微调reranker模型 第二步的neg是80(记得很清楚,因为当时大部分的参数都不行),第一步当时没做多参数的对比测试,用的默认数量,15

BGE 模型分为三步:1. pretrain 2. fineturn 3.rerank 请问你的微调一个embedding模型是指pretrain 和fineturn 之后,对吗?

hellomaxwell avatar Jan 05 '24 04:01 hellomaxwell

首先,基于bge-large-zh-1.5,难负例微调,微调一个embedding模型 再基于这个微调后的embedding模型,难负例挖掘,微调reranker模型 第二步的neg是80(记得很清楚,因为当时大部分的参数都不行),第一步当时没做多参数的对比测试,用的默认数量,15

有没有尝试过用相同的难负例数据集微调embedding和reranker呢

zeruiz99 avatar Apr 01 '24 02:04 zeruiz99

本人是bge的深度使用者,完成了embedding、reranker的部署、推理、微调全链路跑通与评测,目前发现一个问题,提出来,供大家思考: 首先给出我的数据结论,关键数据已脱敏处理,一个箭头代表5%提升或下降,提升或下降是指与【只embedding不reranker】做对比: 微调前embedding+微调前reranker叠加使用:↑ 微调前embedding+微调后reranker叠加使用:↑↑ 微调后embedding+微调前reranker叠加使用:↓ 微调后embedding+微调后reranker叠加使用:↓↓↓ 也就是说,对于微调后的embedding效果而言,叠加reranker会导致效果更差,我个人感觉是:同样的微调方式(难负例),微调后的reranker效果跟不上embedding的效果,导致叠加会变坏。 后来,我针对reranker的微调方式进行修改再尝试,具体是将难负例挖掘的向量模型切换成我微调后的embedding模型(之前用的都是微调前的),结果发现了一个更令人震惊的事情,不管我怎么修改reranker训练数据:拆条/不拆条,增加neg数量从15->100,无一例外,训练loss全部不再收敛,训练后模型推理丧失多样性,所有的输出全部为同一个值

做finetune有对,词表进行修改、优化吗?我在用llamaindex finetune bge,还没跑完。

lzh1998-jansen avatar Apr 16 '24 08:04 lzh1998-jansen

本人是bge的深度使用者,完成了embedding、reranker的部署、推理、微调全链路跑通与评测,目前发现一个问题,提出来,供大家思考: 首先给出我的数据结论,关键数据已脱敏处理,一个箭头代表5%提升或下降,提升或下降是指与【只embedding不reranker】做对比: 微调前embedding+微调前reranker叠加使用:↑ 微调前embedding+微调后reranker叠加使用:↑↑ 微调后embedding+微调前reranker叠加使用:↓ 微调后embedding+微调后reranker叠加使用:↓↓↓ 也就是说,对于微调后的embedding效果而言,叠加reranker会导致效果更差,我个人感觉是:同样的微调方式(难负例),微调后的reranker效果跟不上embedding的效果,导致叠加会变坏。 后来,我针对reranker的微调方式进行修改再尝试,具体是将难负例挖掘的向量模型切换成我微调后的embedding模型(之前用的都是微调前的),结果发现了一个更令人震惊的事情,不管我怎么修改reranker训练数据:拆条/不拆条,增加neg数量从15->100,无一例外,训练loss全部不再收敛,训练后模型推理丧失多样性,所有的输出全部为同一个值

我遇到的问题是,在我的数据上,根据query,根本检索不到答案所在的段落,所以我目前只微调了embedding

lzh1998-jansen avatar Apr 16 '24 08:04 lzh1998-jansen

https://zhuanlan.zhihu.com/p/681370855 这篇文章的2.1和2.2可能有帮助

markma0617 avatar May 16 '24 01:05 markma0617

我的 neg是 20 --train_group_size 为21 --max_len 1024为什么一直 报这个错误RuntimeError: The expanded size of the tensor (888) must match the existing size (514) at non-singleton dimension 1. Target sizes: [16, 888]. Tensor sizes: [1, 514] 我的数据集是中文的 就是格式不是唯一的 我的pos不总是一个 有可能两三个 等等 neg唯一 我改--max_len 为1024就有问题

zgf1005 avatar Jun 12 '24 04:06 zgf1005

我的 neg是 20 --train_group_size 为21 --max_len 1024为什么一直 报这个错误RuntimeError: The expanded size of the tensor (888) must match the existing size (514) at non-singleton dimension 1. Target sizes: [16, 888]. Tensor sizes: [1, 514] 我的数据集是中文的 就是格式不是唯一的 我的pos不总是一个 有可能两三个 等等 neg唯一 我改--max_len 为1024就有问题

bge-v1.5仅支持512最大长度,支持1024的长度的是bge-m3(最大8192)

staoxiao avatar Jun 12 '24 06:06 staoxiao

微调前embedding+微调后reranker叠加使用:↑↑

请教一下,微调bge的embedding、reranker,大约需要准备多少样本

transcope avatar Aug 09 '24 23:08 transcope