FlagEmbedding
FlagEmbedding copied to clipboard
关于对 bge-reranker 进行排序修正和指令微调的问题
感谢开源这么好的工作,我有几个关于 bge-reranker 微调的问题想请教下:
-
对于一个 query,我通过微调 embedding 模型已经召回一个跟 query 都相关的 candidates 列表,我想通过微调 reranker 改变 candidates 的排序,例如句子 A 有三个相关的句子 B、C、D,原始 bge-reranker 模型给出的相关度排序就是 B、C、D,我现在想把顺序改成 D、C、B,但 B 本身是跟 A 很相似的,如果按照
{ "query": "A", "pos": ["D"], "neg": ["B"] }
这样构造训练集,会不会有什么不好的影响?而且如果 list 的相对顺序我想改动很多,这种「正例-反例」的数据构造方式可能会产生很多行,例如上面的例子至少还需要{ "query": "A", "pos": ["D"], "neg": ["C"] }
、{ "query": "A", "pos": ["C"], "neg": ["B"] }
。对于这种场景应该如果进行更好的微调呢? -
如果要在 reranker 上进行 instruction tuning a. 关于实现方式,以下两种方式是否可行?或者有什么更好的方式? i. 最简单的实现方式可能是在 sentence1 和 sentence2 前都加入同样的 prefix; ii. 修改 transformers 对于 sentence_pair 的拼接方式,改成
prefix <sep> sentence1 <sep> sentence2
b. 只对 bge-reranker 模型进行 instruction 微调大概需要多少条数据效果有可能会比较好?
- 这个问题很有意思,在现有的代码下不太好做到,需要修改损失计算方式。目前使用的是cross-entropy损失,你这种情况可以尝试更换成一些其他loss,比如同时计算多个pairloss, a>b, b>c, c>d。
- 没有试过对reranker进行instruction tuning,可以都尝试一下。数据上,建议每种Instruction下都有一些训练数据,在千这个级别应该就够了。
B是很相近的话,不就是硬负例吗?我看到这个项目有挖掘硬负例的方法,只不过数据集不好搞