FlagOpen / FlagEmbedding

Retrieval and Retrieval-augmented LLMs
MIT License
7.04k stars 514 forks source link

训练参数和警告问题 #689

Open Anthony-Sun-S opened 5 months ago

Anthony-Sun-S commented 5 months ago

您好, 1.我在训练reranker-m3的时候发现模型是按照每500个step自动保存的,我想修改保存的步数或者增加判断条件进行保存应该在哪里修改呢? 2.在训练的时候reranker-m3和bge-reranker-large都会出现一个报错 Be aware, overflowing tokens are not returned for the setting you have chosen, i.e. sequence pairs with the 'longest_first' truncation strategy. So the returned list will always be empty even if some tokens have been removed. 这个是不管我max_len怎么设置都会出现,貌似是pos的list有几个样本就会报错几次,但是我的正样本和query其实都不是很长,加起来也不会超过max_len

顺便像问一下模型合并的原理,我发现我微调之后的模型和通用模型合并之后指标上还能有提升,但是合并的随机性特别强

545999961 commented 5 months ago
  1. 修改save_steps参数可以设置保存的步数
  2. 可能是有个别样例会超过最长的max_len,可以修改https://github.com/FlagOpen/FlagEmbedding/blob/53cfac4a50ac0e023b2f8d19b10667c9c210fa41/FlagEmbedding/reranker/data.py#L40 的truncation=Truetruncation='longest_first'
  3. 模型合并指的是LLM-reranker合并吗,LLM-reranker的合并是将lora的参数合并到原始的模型之上
Anthony-Sun-S commented 5 months ago
  1. 修改save_steps参数可以设置保存的步数
  2. 可能是有个别样例会超过最长的max_len,可以修改https://github.com/FlagOpen/FlagEmbedding/blob/53cfac4a50ac0e023b2f8d19b10667c9c210fa41/FlagEmbedding/reranker/data.py#L40 的truncation=Truetruncation='longest_first'
  3. 模型合并指的是LLM-reranker合并吗,LLM-reranker的合并是将lora的参数合并到原始的模型之上

1.可以自己修改保存规则吗 2.超长的不到总训练集的十分之一,但是每一个step都会至少报错一遍,设置成了'longest_first'也没有效果 image 3.模型合并我是用的LM_cocktail合并了原始的reranker-m3和我微调之后的reranker-m3,目前是还没有用数据合并,今天会尝试一下,用的代码是示例那种,encoder这个合并的随机性就非常大,同样的代码跑几遍的指标就差距还蛮大的,有的会非常好,有的就不太好;reranker合并之后比较稳定,指标也不错,第一次接触模型合并,想了解一下是合并的方法是什么,如果是非bge的模型可以用LM_cocktail进行合并吗?谢谢您 model = mix_models( model_names_or_paths=["BAAI_bge-reranker-v2-m3", "reranker/output/0412"], model_type='encoder', weights=[0.4, 0.6], output_path="model/mixed_reranker")

545999961 commented 5 months ago
  1. 在训练的时候添加save_steps参数就可以了
  2. 可以修改这部分代码
    qry_inputs = self.tokenizer.encode(qry_encoding,
                                   truncation=True,
                                   max_length=self.args.max_len * 3 // 4,
                                   add_special_tokens=False)
    doc_inputs = self.tokenizer.encode(doc_encoding,
                                   truncation=True,
                                   max_length=self.args.max_len,
                                   add_special_tokens=False)
    item = self.tokenizer.prepare_for_model(
    qry_inputs,
    doc_inputs,
    truncation='only_second',
    max_length=self.args.max_len,
    )
  3. 模型合并可以参考论文LM-Cocktail
zeruiz99 commented 5 months ago
  1. 在训练的时候添加save_steps参数就可以了
  2. 可以修改这部分代码
qry_inputs = self.tokenizer.encode(qry_encoding,
                                   truncation=True,
                                   max_length=self.args.max_len * 3 // 4,
                                   add_special_tokens=False)
doc_inputs = self.tokenizer.encode(doc_encoding,
                                   truncation=True,
                                   max_length=self.args.max_len,
                                   add_special_tokens=False)
item = self.tokenizer.prepare_for_model(
    qry_inputs,
    doc_inputs,
    truncation='only_second',
    max_length=self.args.max_len,
)
  1. 模型合并可以参考论文LM-Cocktail

在第二个问题上,我用最新的代码,是longest first也是同样还是会出现not returned的同样问题

Anthony-Sun-S commented 5 months ago
  1. 在训练的时候添加save_steps参数就可以了
  2. 可以修改这部分代码
qry_inputs = self.tokenizer.encode(qry_encoding,
                                   truncation=True,
                                   max_length=self.args.max_len * 3 // 4,
                                   add_special_tokens=False)
doc_inputs = self.tokenizer.encode(doc_encoding,
                                   truncation=True,
                                   max_length=self.args.max_len,
                                   add_special_tokens=False)
item = self.tokenizer.prepare_for_model(
    qry_inputs,
    doc_inputs,
    truncation='only_second',
    max_length=self.args.max_len,
)
  1. 模型合并可以参考论文LM-Cocktail

在第二个问题上,我用最新的代码,是longest first也是同样还是会出现not returned的同样问题

修改之后也没有用,我目前只有是加大了长度才解决

zeruiz99 commented 5 months ago
  1. 在训练的时候添加save_steps参数就可以了
  2. 可以修改这部分代码
qry_inputs = self.tokenizer.encode(qry_encoding,
                                   truncation=True,
                                   max_length=self.args.max_len * 3 // 4,
                                   add_special_tokens=False)
doc_inputs = self.tokenizer.encode(doc_encoding,
                                   truncation=True,
                                   max_length=self.args.max_len,
                                   add_special_tokens=False)
item = self.tokenizer.prepare_for_model(
    qry_inputs,
    doc_inputs,
    truncation='only_second',
    max_length=self.args.max_len,
)
  1. 模型合并可以参考论文LM-Cocktail

在第二个问题上,我用最新的代码,是longest first也是同样还是会出现not returned的同样问题

修改之后也没有用,我目前只有是加大了长度才解决

你的reranker-m3测出来召回率有正提升不,我用了reranker以后反而掉了

Anthony-Sun-S commented 5 months ago

你的reranker-m3测出来召回率有正提升不,我用了reranker以后反而掉了

你试一下用LM_Cocktail再做一次模型融合,我训练完也是掉了,然后融合之后提升蛮大的

zeruiz99 commented 5 months ago

你的reranker-m3测出来召回率有正提升不,我用了reranker以后反而掉了

你试一下用LM_Cocktail再做一次模型融合,我训练完也是掉了,然后融合之后提升蛮大的

我embedding用的bge-m3的,目前感觉有提升,但是好像还是没超过embedding的分数的

Anthony-Sun-S commented 5 months ago

我embedding用的bge-m3的,目前感觉有提升,但是好像还是没超过embedding的分数的

我是微调的reranker-m3,先embedding再reranker的话我这边不微调也有提升

zeruiz99 commented 5 months ago

我embedding用的bge-m3的,目前感觉有提升,但是好像还是没超过embedding的分数的

我是微调的reranker-m3,先embedding再reranker的话我这边不微调也有提升

没有微调embedding模型只微调了reranker模型是吗

Anthony-Sun-S commented 5 months ago

没有微调embedding模型只微调了reranker模型是吗

对,embedding是还没来得及微调,单纯使用原本的bge-m3和reranker-m3也有提升的效果,embedding用的sentence_transformer没有用那个混合分数的,整体指标也是有再提升的

zeruiz99 commented 5 months ago

没有微调embedding模型只微调了reranker模型是吗

对,embedding是还没来得及微调,单纯使用原本的bge-m3和reranker-m3也有提升的效果,embedding用的sentence_transformer没有用那个混合分数的,整体指标也是有再提升的

好像就是embedding微调了以后超不过embedding提升后的分数我看别人也说,我还在试

Anthony-Sun-S commented 5 months ago

好像就是embedding微调了以后超不过embedding提升后的分数我看别人也说,我还在试

正好今天差不多reranker就训练完了,我也是一下训练embedding看看

WangTianYuan commented 5 months ago

请问你是加大了max_len参数,还是修改了tokenizer的max_length?我这边max_len变大了,会报下面的错误 The expanded size of the tensor (1024) must match the existing size (514) at non-singleton dimension 1. Target sizes: [8, 1024]. Tensor sizes: [1, 514]

zeruiz99 commented 5 months ago

好像就是embedding微调了以后超不过embedding提升后的分数我看别人也说,我还在试

正好今天差不多reranker就训练完了,我也是一下训练embedding看看

你试了下能超过微调后的embedding的召回分数吗

sevenandseven commented 4 months ago
  1. 在训练的时候添加save_steps参数就可以了
  2. 可以修改这部分代码
qry_inputs = self.tokenizer.encode(qry_encoding,
                                   truncation=True,
                                   max_length=self.args.max_len * 3 // 4,
                                   add_special_tokens=False)
doc_inputs = self.tokenizer.encode(doc_encoding,
                                   truncation=True,
                                   max_length=self.args.max_len,
                                   add_special_tokens=False)
item = self.tokenizer.prepare_for_model(
    qry_inputs,
    doc_inputs,
    truncation='only_second',
    max_length=self.args.max_len,
)
  1. 模型合并可以参考论文LM-Cocktail

在第二个问题上,我用最新的代码,是longest first也是同样还是会出现not returned的同样问题

修改之后也没有用,我目前只有是加大了长度才解决

你的reranker-m3测出来召回率有正提升不,我用了reranker以后反而掉了

你好,想请问一下微调之后的reranker召回率,你是怎么做测试的?

JingBob commented 4 months ago

请问你是加大了max_len参数,还是修改了tokenizer的max_length?我这边max_len变大了,会报下面的错误 The expanded size of the tensor (1024) must match the existing size (514) at non-singleton dimension 1. Target sizes: [8, 1024]. Tensor sizes: [1, 514]

用bge-reranker-base/large,貌似最长只支持512长度,想用更长就要用LLM-rerank了,支持8k