我在一个新任务上对t5基础模型(从拥抱脸)进行了微调,其中每个输入和目标都是256个单词的句子。损失收敛到低值,但是当我使用generate
方法时,输出总是太短。我试着给最小和最大长度值的方法,但它似乎是不够的。我怀疑这个问题与以下事实有关:标记化之前的句子长度是256,而标记化之后,它不是恒定的(在训练期间使用填充来确保所有输入都具有相同的大小)。下面是我的生成方法:
model = transformers.T5ForConditionalGeneration.from_pretrained('t5-base')
tokenizer = T5Tokenizer.from_pretrained('t5-base')
generated_ids = model.generate(
input_ids=ids,
attention_mask=attn_mask,
max_length=1024,
min_length=256,
num_beams=2,
early_stopping=False,
repetition_penalty=10.0
)
preds = [tokenizer.decode(g, skip_special_tokens=True, clean_up_tokenization_spaces=True) for g in generated_ids][0]
preds = preds.replace("<pad>", "").replace("</s>", "").strip().replace(" ", " ")
target = [tokenizer.decode(t, skip_special_tokens=True, clean_up_tokenization_spaces=True) for t in reference][0]
target = target.replace("<pad>", "").replace("</s>", "").strip().replace(" ", " ")
使用
创建输入tokens = tokenizer([f"task: {text}"], return_tensors="pt", max_length=1024, padding='max_length')
inputs_ids = tokens.input_ids.squeeze().to(dtype=torch.long)
attention_mask = tokens.attention_mask.squeeze().to(dtype=torch.long)
labels = self.tokenizer([target_text], return_tensors="pt", max_length=1024, padding='max_length')
label_ids = labels.input_ids.squeeze().to(dtype=torch.long)
label_attention = labels.attention_mask.squeeze().to(dtype=torch.long)
对于可能关心的人,我发现问题是与生成方法的max_length
参数有关。它限制了令牌的最大数量,包括输入令牌。在我的情况下,需要设置max_new_tokens=1024
而不是问题中提供的参数。