bge-m3使用带标注数据finetue,negatives_cross_device设置问题
背景: 请问我做bge-m3的finetune,训练数据是自有的分类数据,最终finetune样本示例: {"query": "这商品真差,质量一点也不好", "pos": ["评价非常差,评分应为1"], "neg":["评价非常高,评分应为5","评价还不错,评分应为4","评价一般,评分应为3","评价一般,评分应为2"]
问题:
- 我理解finetune阶段如果negatives_cross_device设置为true,则会采样其他样本的neg扩充negatives,但元数据是5分类,大概率采样到当前样本对应的pos?这个需要去修改训练参数吗?
- 但官方bge-m3的finetune脚本https://github.com/FlagOpen/FlagEmbedding/blob/master/examples/finetune/embedder/encoder_only/m3_same_dataset.sh,里面也有一个分类任务/example_data/classification-no_in_batch_neg,看起来negatives_cross_device会产生通用的问题,导致计算nce loss的时候负样本里大概率包含正样本?
- 通过2中脚本的设置,我做了消融实验(数据包含ABCD四标签,均剔除一个标签D的数据作为outdomain测试),用原始bge-m3,自有监督数据训练bge-m3-w-label、自有数据+bge-m3-data混合训练。发现加上自有数据后,在ABC分类上比bge-m3都要强不少,但是D的分类上,加入自有数据随着step增加,性能会不断下降且低于原始bge-m3。请问有什么合适的方案去减少这种知识遗忘吗?在D分类上能尽量不损失性能。
你好,@KeepGoingCSU。对于分类任务,需要在数据集所在文件夹的名称中添加后缀 no_in_batch_neg,像我们给的例子一样。代码中在开启 same_dataset_within_batch 的情况下,如果识别到某个文件夹的后缀为 no_in_batch_neg 则对于来自该文件夹下的数据的 batch 只使用提供的 negs,而不会去通过 in-batch 和 cross-device 的方式去扩展 negs,这样就避免了可能的伪负例。相关代码如下:
-
https://github.com/FlagOpen/FlagEmbedding/blob/master/FlagEmbedding/abc/finetune/embedder/AbsDataset.py#L286
-
https://github.com/FlagOpen/FlagEmbedding/blob/master/FlagEmbedding/abc/finetune/embedder/AbsModeling.py#L140
对于提到的“知识遗忘”问题,可以尝试使用仓库中的 LM-Cocktail 方法去做模型融合:https://github.com/FlagOpen/FlagEmbedding/tree/master/research/LM_Cocktail
你好,@KeepGoingCSU。对于分类任务,需要在数据集所在文件夹的名称中添加后缀
no_in_batch_neg,像我们给的例子一样。代码中在开启same_dataset_within_batch的情况下,如果识别到某个文件夹的后缀为no_in_batch_neg则对于来自该文件夹下的数据的 batch 只使用提供的 negs,而不会去通过 in-batch 和 cross-device 的方式去扩展 negs,这样就避免了可能的伪负例。相关代码如下:
- https://github.com/FlagOpen/FlagEmbedding/blob/master/FlagEmbedding/abc/finetune/embedder/AbsDataset.py#L286
- https://github.com/FlagOpen/FlagEmbedding/blob/master/FlagEmbedding/abc/finetune/embedder/AbsModeling.py#L140
对于提到的“知识遗忘”问题,可以尝试使用仓库中的 LM-Cocktail 方法去做模型融合:https://github.com/FlagOpen/FlagEmbedding/tree/master/research/LM_Cocktail
还有个问题想请教下,train_group_size是用来限制nce loss计算时抽取的neg数量(train_group_size-1),那如果我训练样本negs比如是10条,train_group_size=8,然后我用上了in-batch neg训练,这个时候抽取负样本逻辑是什么?
还有个问题想请教下,train_group_size是用来限制nce loss计算时抽取的neg数量(train_group_size-1),那如果我训练样本negs比如是10条,train_group_size=8,然后我用上了in-batch neg训练,这个时候抽取负样本逻辑是什么?
你好 @KeepGoingCSU。这时抽取负样本的逻辑是:
- 对于每条 query,先从给定的 10 条 negs 中抽取 7 条 negs 出来作为 hard negatives;
- 对于每条 query,使用它所在 batch 内其他 query 的 pos + hard negatives (每条其他的 query 共 8 条)作为自己的 in-batch negatives
在不使用 cross-device negatives 的情况下,这时每条 query 下面的负例数目即为 train_group_size * batch_size - 1;在使用 cross-device negatives 的情况下,这时每条 query 下面的负例数目即为 train_group_size * batch_size * num_devices - 1。