shibing624 / MedicalGPT

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

预训练的模型效果比之原始模型差太多 #310

Closed lljpwrs closed 5 months ago

lljpwrs commented 5 months ago

我是用的原始模型是 llama2-7b-hf,然后我尝试使用 generate 的方法测试模型的效果,分别测试中文和英文, 中文问题:宫颈癌的症状有哪些 英文问题:What are the symptoms of cervical cancer?

原始模型的效果: 对于中文问题:

宫颈癌的症状有哪些?
尿道皮肤炎的治疗方法
胆管��

对于英文问题:

What are the symptoms of cervical cancer?
Cervical Cancer Treatment, Symptoms, and More
Signs of Cervix Cancers | Signs & Symtoms
The Sympton of cancer

不管怎样,至少生成的语句该是英文就是英文,该是中文就是中文

然后我预训练之后,使用的数据是关于宫颈癌的,数据量比较少,训练轮次也比较少,大约不到3个 epoch,然后 merge 后生成新的模型,同样使用 generate 进行测试: 对于中文问题:

宫颈癌的症状有哪些 championnat publicationsRandom Railway Stan Stan antenлові Лон Лон Medic╚телемOK anten show gewählt antenг Chinaൻfilters antenparallel като++; Stan HeimatISTS

对于英文问题:

What are the symptoms of cervical cancer? commit Iowa Stan egg ř antenactual ÎnStudent esteitzerland která Notification antenStudentipsitzerland Fried antenBrushльных Лоно dont Man anten která Colomb Cambridge Cambridge銀maker finit Cambridge argent anten anten ranked

就感觉效果变得特别差,生成的文本包含多种语言,感觉跟乱码差不多了,所以想问问大佬是不是因为训练样本太少或者训练轮次太少的原因?

shibing624 commented 5 months ago

我理解你是想做sft,用来做问答的。处理:只做sft,清洗数据,只用1千条,训练10epochs。如果不懂pt和sft的作用,自行百度。

lljpwrs commented 5 months ago

不是,就是想先看看效果,代码大概是这样的:

from transformers import LlamaTokenizer, LlamaForCausalLM, AutoConfig

model_path = 'llama-lora-pretrain-merged'

model = LlamaForCausalLM.from_pretrained(model_path)
tokenizer = LlamaTokenizer.from_pretrained(model_path)

text = '宫颈癌的症状有哪些'
input_ids = tokenizer.encode(text, return_tensors='pt')

# 使用 model.generate 生成文本
output = model.generate(
    input_ids,
    max_length=50,  # 生成文本的最大长度
    num_return_sequences=1,  # 生成的序列数
    no_repeat_ngram_size=2,  # 避免重复的 n-gram
    temperature=0.7,  # 生成文本的随机性,数值越大,文本越随机
    top_k=50,  # 在生成过程中仅考虑概率最高的 top_k 个词
    top_p=0.95,  # 在生成过程中仅考虑累积概率超过 top_p 的词
    do_sample=True,  # 从候选词中随机采样,而不是选择概率最高的词
    eos_token_id=tokenizer.eos_token_id,  # 结束标记的 ID
)

# 解码生成的文本
generated_text = tokenizer.decode(output[0], skip_special_tokens=True)
print(generated_text)

就是尝试一下 generate 的效果,因为之前试了一下 pretrain、sft 之后,进行 inference 的效果也差不多就是这样,如果问题是中文,得到的回答就是各种语言都有