遇到一个场景, 拿几条数据用LORA微调了LLM, 根据Loss看已经接近了0, 但是拿训练集里的数据预测时 ,不管怎么调节generate的参数, 预测结果总是不对, 有整段话重复生成的结果, 有不重复生成, 但是生成的结果超出了label的长度。
经过排查, 原因是训练集构造的时候, 句子的结束符被attention mask掉了, 故模型在计算损失的时候, 虽然Loss为0, 但是这个loss是只计算了attention mask部分的Loss, 下述为错误代码
tokenizer = BloomTokenizerFast.from_pretrained(MODEL_PATH, use_fast=False)
tokenizer.pad_token = tokenizer.eos_token # 这一步代码出问题了
text = text + '\n' + '</s>'
to_regress_tokens = tokenizer(text,return_tensors="pt",padding="longest",truncation=True,max_length=160,add_special_tokens=False).to(device)targets = to_regress_tokens.input_ids.masked_fill(to_regress_tokens.input_ids == tokenizer.pad_token_id, -100).to(device) # 导致在这里mask的时候, 忽略了 </s> 终止符