shibing624 / MedicalGPT

MedicalGPT: Training Your Own Medical GPT Model with ChatGPT Training Pipeline. 训练医疗大模型,实现了包括增量预训练(PT)、有监督微调(SFT)、RLHF、DPO、ORPO。
Apache License 2.0
3.24k stars 492 forks source link

训练后模型输出重复文本 #276

Closed J-G-Y closed 10 months ago

J-G-Y commented 10 months ago

感谢作者的项目分享,和您请教个问题。 1.预训练后输出长尾,一直到max_length,并且一直重复最后面的Token。我的领域预料4M的TEXT,3W句,300W Token的水平。 2.原模型初始Eval Acc 0.45左右,训练后在Val上稳定到 0.63,请问这个结果正常吗 我查看过之前的Issues发现有和我类似的问题,但是没有提及数据的用量。所以和您请教一下是否是因为我的数据量太少所导致的(尝试过非常多的炼丹办法,均无更大的提升,且长尾问题不能改善)

J-G-Y commented 10 months ago

已经看到您之前Issue的答复,再去练个丹,感谢

J-G-Y commented 8 months ago

作者您好,根据您之前相关ISSUE的回复,我针对这个问题做了很多很多尝试,但是依旧没有缓解该现象。最后使用了您提供的数据和您项目中所使用的参数,但是依旧出现了输出长尾现象。和您请教一下,该现象的可能原因。(我试验模型换成了ChatGLM-6B,是不是这个模型本身存在一些问题导致的这个现象呢。)

shibing624 commented 8 months ago

如果做过很多尝试,那你加下解码策略。我平时有遇到过训练好的模型有持续输出的问题,但一般很少,万条只有一个。

解码策略可以缓解该现象:

  1. do_sample=True, temperature=0.5
  2. greed 改为 beam search
  3. top_p = 0.1 以上策略用一个就可以。

另外,加个上线的过滤逻辑:

def clean_result(res):
    if len(res) < 2:
        res = None
    # 如果几个字多次重复,例如:平板平板平板平板。那么就去除
    elif len(set(res)) / len(res) < 0.5:
        res = None
    else:
        res = res.strip()
    return res
J-G-Y commented 8 months ago

好的,感谢您的回复。

J-G-Y commented 8 months ago

作者您好,和您请教几个问题:

1.您之前在其他 Issue 中提到了预训练的数据处理group_text()函数,这个数据构造思路(将数据拼接按照block_size划分)是沿用大模型原始预训练的思路进行的,所以跟您请教这个数据构造思路有详细的相关的论文或者技术报告参考吗。

2.之前一直跟您提问的模型输出重复,是我在做完继续预训练后,加载此阶段的模型出现的现象。我重新思考了您的代码逻辑,如果只是想让模型学习领域文本的语言模式和语义表达,那么是完全没有问题的。但是我使用了一些原始的Base版的模型(官方公布的),发现他们并没有这个现象,因此跟您请教,原始的Base模型是不是也经过了一定的SFT过程(因为按照咱们的预训练代码逻辑,数据处理完之后是没有eos标签的,所以训练完会输出到最大长度)。即经过预训练,SFT之后是base,经过强化学习后的才是Chat。

shibing624 commented 8 months ago
  1. 参考llama的 paper
  2. base就是基座模型,sft和rlhf后的都叫chat或者instruct。你出现重复是因为你训练的数据集多样性不够,一般不需要做pt,基座模型已经见过足够的数据了,做sft就可以,sft也需要加入多样 的高质量数据训练,否则模型能力会劣化。
J-G-Y commented 8 months ago
  1. 参考llama的 paper
  2. base就是基座模型,sft和rlhf后的都叫chat或者instruct。你出现重复是因为你训练的数据集多样性不够,一般不需要做pt,基座模型已经见过足够的数据了,做sft就可以,sft也需要加入多样 的高质量数据训练,否则模型能力会劣化。

好的,感谢您的指导。

sevenandseven commented 6 months ago

感谢作者的项目分享,和您请教个问题。 1.预训练后输出长尾,一直到max_length,并且一直重复最后面的Token。我的领域预料4M的TEXT,3W句,300W Token的水平。 2.原模型初始Eval Acc 0.45左右,训练后在Val上稳定到 0.63,请问这个结果正常吗 我查看过之前的Issues发现有和我类似的问题,但是没有提及数据的用量。所以和您请教一下是否是因为我的数据量太少所导致的(尝试过非常多的炼丹办法,均无更大的提升,且长尾问题不能改善)

你好,我想请问一下:1.我的领域预料4M的TEXT,3W句,300W Token的水平。这个有多少token的水平我该怎么计算? 2.目前预训练代码逻辑,数据处理完之后是没有eos标签的,我该怎么加上这个eos标签?对于基座模型灌领域知识的过程中需要有结束标签存在吗?

shibing624 commented 6 months ago

base model sft需要加入eos token,pt不用。