FlagOpen / FlagEmbedding

Retrieval and Retrieval-augmented LLMs
MIT License
7.38k stars 533 forks source link

bge-reranker-v2-minicpm-layerwise微调结果出乎意料 #1031

Open momo4826 opened 3 months ago

momo4826 commented 3 months ago

您好,我用同样的数据集对bge-m3和bge-reranker-v2-minicpm-layerwise做了微调,但是得到的top1准确率出乎意料,结果如下:

  1. 未微调的bge-m3+未微调的bge-reranker-v2-minicpm-layerwise: 0.8909657320872274
  2. 微调后的bge-m3+未微调的bge-reranker-v2-minicpm-layerwise(结果还在情理中): 0.6573208722741433
  3. 微调后的bge-m3+基于bge-reranker-v2-minicpm-layerwise进行from_finetuned_model模式的微调(但是训练参数依旧使用的是官方提供的from_raw_model的参数;后来也有对参数进行简单调整后训练,结果没有什么区别): 0.6542056074766355
  4. 微调后的bge-m3+基于bge-reranker-v2-minicpm-layerwise进行from_raw_model模式的微调(这个选择本来是不小心的失误,但是却得到了最好的结果):0.9283489096573209
  5. 微调后的bge-m3+基于minicpm 2b的from_raw_model模式的微调(本来以为这一版效果会最好,结果却不尽人意):0.6573208722741433

出乎意料的点主要在于第4版的效果格外好以及第5版的结果格外不够好,分析和提问如下:

  1. 从数据层面来考虑,embedding和reranker的微调训练集用了一样的,pos:neg=1:7(hard negatives已放于negs中),是否是因为neg的数据量不够?因为看官方提供的reranekr微调集的negs数量更多
  2. 从训练参数的层面考虑,第5版的各方面都跟官方提供的一致,loss的记录简单总结下就是0.1epoch时从340降至了50,之后就一直在10到30之间振荡(偶尔会有50左右的出现),有可能是什么原因导致这样的结果呢?数据量不够(6k左右)?prompt不够精准(使用的是bge-reranker-v2-minicpm-layerwise默认的prompt,跟这个下游任务的契合度还是比较高的)?
  3. 基于bge-reranker-v2-minicpm-layerwise进行from_finetuned_model模式的微调,可否方便提供一个官方参考?
  4. 第4版的情况不知道您这边遇到过吗?确实很疑惑

提问有点长,thanks for your time, 期待回复!

545999961 commented 3 months ago
  1. 只使用embedding模型的结果怎样呢
  2. 微调reranker可以换一份数据,用微调好的embedding模型获取新的negatives,参考https://github.com/FlagOpen/FlagEmbedding/tree/master/examples/finetune#hard-negatives
  3. negatives数量确实会影响, 但是一般来讲7或15个都是足够的
  4. 从头训的话需要大量的数据,所以效果可能不会太好,得基于bge-reranker-v2-minicpm-layerwise进行微调,你这里batch size用的是多大呢,是128训了50 steps吗
  5. 基于bge-reranker-v2-minicpm-layerwise进行from_finetuned_model模式的微调其它参数都保持一致就行,你这里可以换份negatives训练,同时也测一下top-5,top-10之类的结果
momo4826 commented 3 months ago
  1. 只使用embedding模型的结果怎样呢
  2. 微调reranker可以换一份数据,用微调好的embedding模型获取新的negatives,参考https://github.com/FlagOpen/FlagEmbedding/tree/master/examples/finetune#hard-negatives
  3. negatives数量确实会影响, 但是一般来讲7或15个都是足够的
  4. 从头训的话需要大量的数据,所以效果可能不会太好,得基于bge-reranker-v2-minicpm-layerwise进行微调,你这里batch size用的是多大呢,是128训了50 steps吗
  5. 基于bge-reranker-v2-minicpm-layerwise进行from_finetuned_model模式的微调其它参数都保持一致就行,你这里可以换份negatives训练,同时也测一下top-5,top-10之类的结果

感谢回复!

  1. 只使用微调后的embedding模型是0.9252336448598131,只使用未微调的embedding模型的结果是0.8467966573816156

2.3.5. 好的,我按照这个建议试下

  1. 确实,对于从头训来说我的数据集就相对小了,这版的参数是直接使用的官方参考;因为我们下游任务的限制,即使扩充数据集大概也就最多triple,这样来看,这个微调方式应该就不适合了