FlagEmbedding icon indicating copy to clipboard operation
FlagEmbedding copied to clipboard

关于embedding微调后使用reranker的效果反而下降问题

Open zeruiz99 opened this issue 1 year ago • 12 comments

其中有几个问题,首先使用的是bge-m3和bge-reranker-v2以及layerwise以及gemma-2b这几个都试着微调了,然后全部按要求进行微调以及评测数据集格式正确,各种都检查过,遇到了几个问题

  1. 在使用step0-rerank-result (https://github.com/FlagOpen/FlagEmbedding/blob/master/C_MTEB/MKQA/README.md 中multivector and all rerank)时,有显示: Some weights of XLMRobertaModel were not initialized from the model checkpoint at /embedding/m3reranklong and are newly initialized: ['roberta.pooler.dense.bias', 'roberta.pooler.dense.weight'] 不知道这是因为什么原因

  2. 在微调完embedding时,在评测dense retrival时,微调完分数recall 20: 0.723954, recall 100: 0.78522, 比微调之前分别都有提升,但是在8张卡,per_device_batch_size为1的情况下train group size 2 max len 1024, colbert : recall 100: 0.78522 recall 20: 0.494318 sparse : recall 100 : 0.78522. recall 20: 0.723954 dense : recall 100 : 0.78522. recall 20: 0.723954 这两个和embedding分数一样,很好奇为什么,感觉rerank中间有什么数据我调的不对吗 torchrun --nproc_per_node 8 -m FlagEmbedding.reranker.run --output_dir /embedding/m3rerank-v2 --model_name_or_path /embedding/bge-reranker-v2-m3 --train_data /embedding/FlagEmbedding/testdata_mined.jsonl --learning_rate 2e-4 --num_train_epochs 15 --per_device_train_batch_size 1 --gradient_accumulation_steps 5 --dataloader_drop_last True --train_group_size 2 --max_len 1024 --weight_decay 0.01 --logging_steps 10 --ddp_find_unused_parameters False

zeruiz99 avatar Apr 26 '24 06:04 zeruiz99

微调前后使用embedding / embedding + reranker的结果分别是多少呢

545999961 avatar Apr 26 '24 07:04 545999961

微调前后使用embedding / embedding + reranker的结果分别是多少呢

微调前embedding召回分数是75 68;bge-m3 + bge-reranker-v2-minicpm-layerwise的分数recall 100是72.6, 20的分别是39 41 51 直接会降就很怪,但是可能和我的max_len没有涵盖住所有的回答对有关系,但是依旧不是一个正常用reranker会提升的状态

zeruiz99 avatar Apr 26 '24 08:04 zeruiz99

reranker是对top-200排序吗,训练后结果比训练前还差吗 训练的时候如果数据支持的话train_group_size可以适当增大点,只用一个hard negative有点少

545999961 avatar Apr 26 '24 10:04 545999961

reranker是对top-200排序吗,训练后结果比训练前还差吗 训练的时候如果数据支持的话train_group_size可以适当增大点,只用一个hard negative有点少

reranker是对top100,训练后结果也超不过单独使用微调后的embedding的召回分数 train_group_size放到8也试了,召回率差不多 然后想问下那个参数max_len是问题+答案一起的长度吗还是什么

zeruiz99 avatar Apr 27 '24 11:04 zeruiz99

max_len是问题+答案一起的长度 只对top-100重排的话embedding的recall@100和使用reranker后的recall@100应该是同一个值,是不会出现75.68和72.4的情况的 39 41 51这三个分别是什么结果呢

545999961 avatar Apr 28 '24 04:04 545999961

max_len是问题+答案一起的长度 只对top-100重排的话embedding的recall@100和使用reranker后的recall@100应该是同一个值,是不会出现75.68和72.4的情况的 39 41 51这三个分别是什么结果呢

是的,只对top100的话是recall@100的分数都一样,给一个最新的分数吧,微调后embedding的recall@20的分数是0.72329,然后微调后embedding+微调后reranker-m3-v2的分数 dense和sparse层的recall@20的分数也和embedding的一样是0.72329,colbert层的recall@20的分数是0.492,使用了reranker以后的召回分数并不能超过只使用微调embedding的分数

zeruiz99 avatar Apr 28 '24 04:04 zeruiz99

应该还是领域相关的问题,在特定领域上reranker需要进行微调,同时数据量越多越好,num_train_epochs也不需要那么大,基本上一两个epoch就可以收敛,每组数据最好多放点hard negative,如果hard negative数量少于train_group_size - 1的话,那么只是简单的重复hard negative,并不会带来提升 关于reranker与embedding效果一样这方面,可以测一下MRR或NDCG等指标,看是否存在差距

545999961 avatar Apr 28 '24 09:04 545999961

应该还是领域相关的问题,在特定领域上reranker需要进行微调,同时数据量越多越好,num_train_epochs也不需要那么大,基本上一两个epoch就可以收敛,每组数据最好多放点hard negative,如果hard negative数量少于train_group_size - 1的话,那么只是简单的重复hard negative,并不会带来提升 关于reranker与embedding效果一样这方面,可以测一下MRR或NDCG等指标,看是否存在差距

数据大概是8万5千条,然后挖掘负例用的是80个负例去挖的,取10-120好像是,然后train_group_size太大的话会out of memory,之前试了train group size放8

zeruiz99 avatar Apr 28 '24 09:04 zeruiz99

数据量是足够的,可以使用gradient_checkpointing / deepspeed / fp16 / bf16等节省显存

545999961 avatar Apr 28 '24 09:04 545999961

数据量是足够的,可以使用gradient_checkpointing / deepspeed / fp16 / bf16等节省显存

把train_group_size 调到16,换了几次评估,然后dense和sparse的召回率依旧是和微调后的embedding得分一样,唯一就是colbert的分数不一样,感觉不太对劲

zeruiz99 avatar May 06 '24 09:05 zeruiz99

可以考虑通过评估MRR或NDCG等指标,以确定是否存在差异。同时,也可以尝试在不同的数据集上进行评估。 如果MRR和NDCG的结果相同,可能是reranker的使用存在问题。 否则,可能是reranker在训练过程中出现了问题。可以尝试使用m3-reranker模型进行训练和测试,观察不同步数和学习率等参数设置下的结果差异,以及loss的下降趋势。

545999961 avatar May 07 '24 08:05 545999961

微调前后使用embedding / embedding + reranker的结果分别是多少呢

微调前embedding召回分数是75 68;bge-m3 + bge-reranker-v2-minicpm-layerwise的分数recall 100是72.6, 20的分别是39 41 51 直接会降就很怪,但是可能和我的max_len没有涵盖住所有的回答对有关系,但是依旧不是一个正常用reranker会提升的状态

你好,请问下你评测的时候这些召回分数用的是那个脚本?我看eval_mamarco.py只能用于评测不同embedding模型的指标。

sevenandseven avatar May 13 '24 03:05 sevenandseven