FlagEmbedding icon indicating copy to clipboard operation
FlagEmbedding copied to clipboard

难负例挖掘有问题

Open mechigonft opened this issue 2 years ago • 15 comments

1、设置的--negative_number 100,没用,挖掘的结果还是只有15个neg 2、日志报错:./hard_negatives.sh: line 6: --range_for_sampling: command not found,但是挖掘数据是成功的,成功产出了挖掘结果。 我的脚本: python -m FlagEmbedding.baai_general_embedding.finetune.hn_mine
--model_name_or_path /ossfs/workspace/vector/model/bge-large-zh-v1.5
--input_file /ossfs/workspace/vector/data/zheng_data.jsonl
--output_file /ossfs/workspace/vector/data/before_model_minedHN_100_neg_count.jsonl
--range_for_sampling 2-200
--candidate_pool /ossfs/workspace/vector/data/candidate_pool.jsonl
--negative_number 100

mechigonft avatar Nov 21 '23 08:11 mechigonft

查看了代码,没发现问题。可能是你的corpus就这么大?

staoxiao avatar Nov 21 '23 09:11 staoxiao

我的candidate_pool有5w5千条数据

mechigonft avatar Nov 21 '23 09:11 mechigonft

corpus是啥意思?

mechigonft avatar Nov 21 '23 09:11 mechigonft

我去,我知道原因了,我的脚本里面有一行注释的参数,我删掉了注释的那一行,然后就正常了,请问这个是怎么回事?是不是bash脚本里面不能有注释

mechigonft avatar Nov 21 '23 09:11 mechigonft

corpus是啥意思?

candidate_pool

staoxiao avatar Nov 22 '23 03:11 staoxiao

我去,我知道原因了,我的脚本里面有一行注释的参数,我删掉了注释的那一行,然后就正常了,请问这个是怎么回事?是不是bash脚本里面不能有注释

是的

staoxiao avatar Nov 22 '23 03:11 staoxiao

作为一个小白,请问难负样本生成后neg中的元素是和pos中的元素相似度相差大还是小呢? 例如(1.是neg中元素和pos中尽可能不想似,2.则反之。): 1.{"query": "中国有多少条大河?", "pos": ["中国有两条"], "neg": ["天气冷了", "我饿了"]} 2.{"query": "中国有多少条大河?", "pos": ["中国有两条"], "neg": ["中国有两条长江和黄河", "长江和黄河两条"]} 请问难负样本构造后的结果应该是1好呢,还是2好呢?

zhaizhijiang avatar Nov 29 '23 09:11 zhaizhijiang

挖掘难负例本意是,首先基于candidate_pool对query进行检索,然后从返回值里面剔除pos,剩下的都叫做neg,然后再从里面随机抽作为neg(默认15个) 因为你提前定好了pos,所以剔除pos后,全部都是负向数据,随机抽样作为neg就好 至于你说的相似度大还是小,我理解都有可能,如果随机抽样的时候抽的是比较靠前的neg,那就相似度大,如果是从比较靠后的检索结果抽的,那就相似度小

mechigonft avatar Nov 29 '23 09:11 mechigonft

挖掘难负例是随机的,所以你每次挖掘的结果都不一致,理论上,每次挖掘的数据微调的模型效果也千奇百怪,可以多挖几次,评测一下效果,取最好的

mechigonft avatar Nov 29 '23 09:11 mechigonft

作为一个小白,请问难负样本生成后neg中的元素是和pos中的元素相似度相差大还是小呢? 例如(1.是neg中元素和pos中尽可能不想似,2.则反之。): 1.{"query": "中国有多少条大河?", "pos": ["中国有两条"], "neg": ["天气冷了", "我饿了"]} 2.{"query": "中国有多少条大河?", "pos": ["中国有两条"], "neg": ["中国有两条长江和黄河", "长江和黄河两条"]} 请问难负样本构造后的结果应该是1好呢,还是2好呢?

难负样本的原则是和问题有一些相关度,但无法回答问题。你给出的例子中,2里面的neg实际上是可以回答query的,用作neg的话可以会使模型效果下降。1的样本确实稍微简单了些。理想的neg类似于:“中国有1座世界上最高的山”, “长江有很多鱼”,这种有些相关但对问题没有帮助的句子。

staoxiao avatar Nov 29 '23 09:11 staoxiao

挖掘难负例是随机的,所以你每次挖掘的结果都不一致,理论上,每次挖掘的数据微调的模型效果也千奇百怪,可以多挖几次,评测一下效果,取最好的

可以通过调整range_for_sampling参数来控制负样本的难度,如设置"100-200", 会从top100-200这个区间选择样本,降低难度,减少出现伪负例的情况。

staoxiao avatar Nov 29 '23 09:11 staoxiao

请问,生成训练难负例的corpus中要把验证集的正例剔除吗,会导致数据泄漏吗?

mingwu2333 avatar Jan 24 '24 03:01 mingwu2333

请问,生成训练难负例的corpus中要把验证集的正例剔除吗,会导致数据泄漏吗?

如果担心此类问题,建议按query划分数据集,一部分query用来训练,一部分用来测试。而不是把一个query的一部分pos用来训练,一部分pos进行预测。

staoxiao avatar Jan 24 '24 09:01 staoxiao

大佬,你们的LLaRA啥时候上线,已经迫不及待想试用了

mechigonft avatar Jan 24 '24 09:01 mechigonft

大佬,你们的LLaRA啥时候上线,已经迫不及待想试用了

这个模型属于科研探索,后续会开源到社区方便复现,但实际任务中效果无法担保。一方面,这个模型过大,有7b,效率很低,另一方面, 只用单个英文数据训练过(msmarco 数据),数据量少,且不支持中文。

staoxiao avatar Jan 25 '24 02:01 staoxiao