多条正样本
你好,我想请问一下,如果我的数据集中,每个query有很多正样本,应该怎么训练?如果正样本数量非常多,负样本应该如何选择?如果不同query有多个正样本,而且正样本的数目差异很大,应该如何构建数据集并训练?
fine-tune的数据集中可以包含多条正样本,每次过到该数据时候会随机从正样本列表中选取一条作为训练,所以正样本的数目差异很大目前对训练影响不大。 负样本可从整个集合中选取,并从中删除正样本。可以使用hn_min挖掘难负样本
那这样的话,如果不同query的正样本数目差异很大,会不会导致正样本多的那个query无法充分利用所有正样本数据进行训练了?还有如果正样本列表数据非常多,负样本列表需要设置的大一些么?还有能不能就是把正样本列表拆开呢,比如一个query有一千条正样本,我直接构建一千个样本对,让每个正样本列表都只有一条正样本,这样是不是就能充分利用所有的正样本数据了?
那这样的话,如果不同query的正样本数目差异很大,会不会导致正样本多的那个query无法充分利用所有正样本数据进行训练了?
是的
还有如果正样本列表数据非常多,负样本列表需要设置的大一些么?
负样本列表也是每次随机选取(train_group_size-1)个负样本。跑多个epoch,多一些能使见过的负样本多一些。
还有能不能就是把正样本列表拆开呢,比如一个query有一千条正样本,我直接构建一千个样本对,让每个正样本列表都只有一条正样本,这样是不是就能充分利用所有的正样本数据了?
是可以尝试的,但需要注意一些潜在的问题:由于会使用In-batch的negative,如果同一个batch出现了两个一样的query,那么另一个query的正样本会被错误的当成当前query的负样本;同时也有可能某个query数据过多,过多的优化那个query。
引用:是可以尝试的,但需要注意一些潜在的问题:由于会使用In-batch的negative,如果同一个batch出现了两个一样的query,那么另一个query的正样本会被错误的当成当前query的负样本;同时也有可能某个query数据过多,过多的优化那个query。
没太理解这个: 我的数据集是这样{query:"A", pos:["B","C","D"], neg:["E","F","G"]} 就是pos里是个列表,发现微调完效果并不好; 然后我就把pos都拆开了,上边的一条拆成3条: {query:"A", pos:["B"], neg:["E","F","G"]} {query:"A", pos:["C"], neg:["E","F","G"]} {query:"A", pos:["D"], neg:["E","F","G"]} 拆分后的效果有明显的提升;
按照您说的那个意思是C和D的正样本被错误的当成query:A的负样本?
是的,如果这些在一个batch里,就会产生伪负样本。需要修改代码避免,或者修改代码可以一次输入多个pos
我的为啥效果会提升这么明显,
参数设置:--num_train_epochs=5
--per_device_train_batch_size=10
怎么看有没有在一个batch里呢
我的为啥效果会提升这么明显, 参数设置:--num_train_epochs=5 --per_device_train_batch_size=10
per_device_train_batch_size比较小,数据量挺大的话,一个batch出现同一个query的概率也比较小,可以忽略。
我有两个问题:1、针对一个query具有多个pos的场景,如果拆分成多个训练数据,每个训练数据只有1个正样本,例如{query:"A", pos:["B","C"], neg:["E","F","G"]} 拆分成: {query:"A", pos:["B"], neg:["E","F","G"]} {query:"A", pos:["C"], neg:["E","F","G"]} 恰好这2个出现在了同一batch,那么其中一个会成为另一个的伪负样本,比如在训练第二条的时候,C是正样本,B会被当成负样本,但是这个改代码不就好了吗?只需要把共享负样本那块的逻辑,改成“只从同一批次的其他数据的neg数据中抽负样本,而不要从pos中抽负样本”,就好了,因为这个拆分逻辑,会把正样本拆到pos列表中 2、第二个问题,随机抽负样本的时候,有去重逻辑吗?比如抽到了E、E、F、G、G,多余的E和G会去重吗?
另外这个问题很好避免啊,我只需要控制train_group_size参数=neg的数量+1,就好了,比如我的neg有10个负向数据,那么train_group_size=11,这样的话,就只会使用当前训练数据的neg数据,而不会再去走共享neg的逻辑,因为此时负向数据量已经满了(11-1 = 10 == 10),除非train_group_size比neg的数据大于1,才会再去从同batch的其他数据中抽neg
- 是的,需要改代码
- 没有去重逻辑
- train_group_size-1指的是该query自带的负样本数量,他依然会去使用in-batch的样本(其他query的正样本和负样本)进行计算。
1、2、麻烦修改代码 3、有个疑问,一个query,在真正的训练过程中(注意是训练过程,非训练数据集)到底有多少个负向数据参与训练?我给一个猜想,请问是这个吗? 同一批次下,所有训练数据的所有(正向+负向)数据集的并集,然后减去该条数据的pos集合 如果是这样的话,我理解这样应该是不好的处理,因为不能把其他数据的正向+负向作为这条数据的负向,这样虽然大大增加了neg的量,但是,训练质量不能保证,怎么证明别的训练数据的正向+负向一定是这条数据的负向呢?证明不了,就不能用来做负向数据集吧?
原数据: {query:"A", pos:["B","C"], neg:["E","F","G"]} 拆分成: {query:"A", pos:["B"], neg:["E","F","G"]} {query:"A", pos:["C"], neg:["E","F","G"]}
是不是可以认为,BC 和EFG是不相似的。 那么将数据拆分成: {query:"B", pos:["A"], neg:["E","F","G"]} {query:"C", pos:["A"], neg:["E","F","G"]}
不修改代码的前提下。是不是就解决了上述的问题
Currently, you can set --use_inbatch_neg False to not use in-batch negatives.
如何设置--use_inbatch_neg False, 我设置这个显式没有这个参数,这个参数和https://github.com/FlagOpen/FlagEmbedding/issues/1352这里的no_in_batch_neg_flag是一个意思吗