FlagEmbedding
FlagEmbedding copied to clipboard
bge模型深入使用后思考与疑问
本人是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全部不再收敛,训练后模型推理丧失多样性,所有的输出全部为同一个值
简单来说,就是基于【微调前bge_embedding模型】挖掘难负例的训练数据集,同时训练embedding和reranker,单独看两者和微调前的模型对比,效果都会有提升,但是,叠加使用,即先向量粗召回再重排序后,召回效果会降低,即不如单纯向量粗召回的效果,叠加reranker后会不升反降。 我在考虑这个问题时,想的原因是,应该基于微调后的embedding再一次挖掘难负例,然后训练reranker,结果,更恐怖的事情发生了,这样训练后的reranker丢失了多样性,所有的输出score都是一个值或者近似一个值。 没搞清楚为什么,我自认为我的数据应该没有问题
我这边有类似的结论,embedding+reranker 对比只使用embedding或者embeddig+bm25算法都有提升。但是只要微调了embedding模型,效果就会下降。 感觉和embedding模型的微调的关系比较大。
对,如果是裸embedding,不管reranker有没有微调,叠加使用后效果都会提升(reranker微调效果更好),但是只要微调了bge_embedding,那不管reranker有没有微调,效果都会降低(甚至,reranker微调了效果反而更差),即不如单纯使用微调的bge_embedding
@Xls1994 老哥,你试一下,用你微调后的bge_embedding模型作为你难负例挖掘的向量模型,然后挖掘难负例,给reranker训练,我的结论是reranker训练会崩溃,loss不收敛,模型效果没有区分度,你看看
@mechigonft 尝试了老哥你的方案,发现reranker模型训练确实有问题,最后输出的结果没有区分度了。我还尝试训练了一个epoch的方式,reranker模型还是会存在问题;但是换成其他的向量模型挖掘,或者不使用难负例去微调,reranker模型输出就还算正常,recall 50 大概有0.01的提升
@mechigonft 尝试了老哥你的方案,发现reranker模型训练确实有问题,最后输出的结果没有区分度了。我还尝试训练了一个epoch的方式,reranker模型还是会存在问题;但是换成其他的向量模型挖掘,或者不使用难负例去微调,reranker模型输出就还算正常,recall 50 大概有0.01的提升
这种情况下,可能是负样本中包含了一些伪负列(即与query相关,但不在pos列表里),可以通过该表采样范围来降低负样本难度,如range_for_sampling设为60-300,从top60-top300中采取负样本,这样的话不会从top60以内采取样本,降低伪负列概率。
@staoxiao 我理解就是像你说的,就是伪负样本的问题,这种情况在我的训练场景中比较常见,我的pos是人工打标的,但是人工打的并不全面,在neg中确实还存在一定的跟query相关的,但是被划分到了neg
Hi, 我们发现reranker的微调在transformers版本大于等于4.35时会出现问题,模型存储出错,加载时会显示
Some weights of XLMRobertaForSequenceClassification were not initialized from the model checkpoint at *** and are newly initialized
, 这种情况下会重新初始化模型参数,没有经过训练,输出的分数会非常接近。
目前模型存储的代码已更新,如果加载时出现以上warning,可以重新训练模型并存储。
@staoxiao 感谢你的修复,我看了我的transformers版本,是4.34.1,应该不是这个问题
@Xls1994 @staoxiao @zh217 @YingchaoX 各位,关于reranker叠加embedding后效果<单纯embedding的问题,我后续又经过了多次调参,目前叠加效果已经超过单纯embedding模型效果提升了10%以上。 我的做法是: reranker模型在难负例挖掘时使用的向量模型是难负例挖掘的embedding 调参主要是调整1、难负例挖掘的范围2、难负例的个数
过程中依然有多次的调参模型的loss不收敛,score同一个值的情况,但是也有正常的情况,最后我找了一个效果提升的模型, 感觉这个有点玄学,仍然没有发现为什么会出现loss不收敛,score同值的问题, 建议大家多多尝试不同的微调参数,多微调几个模型,评测一下
是先用bge_large进行难负例挖掘吗,楼主一条pos对应了几条难负例啊
首先,基于bge-large-zh-1.5,难负例微调,微调一个embedding模型 再基于这个微调后的embedding模型,难负例挖掘,微调reranker模型 第二步的neg是80(记得很清楚,因为当时大部分的参数都不行),第一步当时没做多参数的对比测试,用的默认数量,15
首先,基于bge-large-zh-1.5,难负例微调,微调一个embedding模型 再基于这个微调后的embedding模型,难负例挖掘,微调reranker模型 第二步的neg是80(记得很清楚,因为当时大部分的参数都不行),第一步当时没做多参数的对比测试,用的默认数量,15
BGE 模型分为三步:1. pretrain 2. fineturn 3.rerank 请问你的微调一个embedding模型是指pretrain 和fineturn 之后,对吗?
首先,基于bge-large-zh-1.5,难负例微调,微调一个embedding模型 再基于这个微调后的embedding模型,难负例挖掘,微调reranker模型 第二步的neg是80(记得很清楚,因为当时大部分的参数都不行),第一步当时没做多参数的对比测试,用的默认数量,15
有没有尝试过用相同的难负例数据集微调embedding和reranker呢
本人是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,还没跑完。
本人是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
https://zhuanlan.zhihu.com/p/681370855 这篇文章的2.1和2.2可能有帮助
我的 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就有问题
我的 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)
微调前embedding+微调后reranker叠加使用:↑↑
请教一下,微调bge的embedding、reranker,大约需要准备多少样本