Closed lljpwrs closed 5 months ago
我理解你是想做sft,用来做问答的。处理:只做sft,清洗数据,只用1千条,训练10epochs。如果不懂pt和sft的作用,自行百度。
不是,就是想先看看效果,代码大概是这样的:
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 的效果也差不多就是这样,如果问题是中文,得到的回答就是各种语言都有
我是用的原始模型是 llama2-7b-hf,然后我尝试使用 generate 的方法测试模型的效果,分别测试中文和英文, 中文问题:宫颈癌的症状有哪些 英文问题:What are the symptoms of cervical cancer?
原始模型的效果: 对于中文问题:
对于英文问题:
不管怎样,至少生成的语句该是英文就是英文,该是中文就是中文
然后我预训练之后,使用的数据是关于宫颈癌的,数据量比较少,训练轮次也比较少,大约不到3个 epoch,然后 merge 后生成新的模型,同样使用 generate 进行测试: 对于中文问题:
对于英文问题:
就感觉效果变得特别差,生成的文本包含多种语言,感觉跟乱码差不多了,所以想问问大佬是不是因为训练样本太少或者训练轮次太少的原因?