NRJ*_*ney 4 nlp huggingface-transformers
对于我的用例,我需要使用 model.forward() 而不是 model.generate() 方法,即代替下面的代码
outs = model.model.generate(input_ids=batch['source_ids'],
attention_mask=batch['source_mask'],
output_scores=True,
max_length=model.model_arguments.max_output_seq_length)
preds_cleaned = [model.tokenizer.decode(ids, skip_special_tokens=True, clean_up_tokenization_spaces=True) for ids in outs]
Run Code Online (Sandbox Code Playgroud)
我需要使用
model_outputs = model.model(
input_ids=batch["source_ids"],
attention_mask=batch["source_mask"],
labels=lm_labels.to(device),
decoder_attention_mask=batch['target_mask']
)
logits = model_outputs.logits
softmax_logits = m(logits)
max_logits = torch.max(softmax_logits, dim=2)
Run Code Online (Sandbox Code Playgroud)
解码这些 logits 会给出未处理的文本,该文本存在许多问题,例如末尾重复单词等。我需要做什么才能获得与 model.generate() 相同的结果?
Jin*_*ich 12
这两种方法所做的事情完全不同。
调用模型(即forward方法)使用labels教师强制。这意味着解码器的输入将labels移位一位(请参阅文档)。通过教师强制,无论预测是什么,解码器在下一步中始终会获得真实标记。教师强制是在模型训练中使用的,所有步骤都是完全可微的。
当您调用该generate方法时,模型将以自回归方式使用。它生成的任何令牌都将作为下一步的输入。然而,选择令牌是一个“硬”决定,并且梯度无法通过该决定传播。生成方法不能用于训练。输出是连贯的,因为解码器对先前生成的内容做出反应。
通过教师强制,模型可能希望更喜欢生成令牌并继续与生成的令牌保持一致。但是,它不能一致地继续,因为它被迫继续,就好像它生成了参数中实际存在的标记一样labels。这就是为什么您会观察到不连贯的输出(尽管如此,它从来不是为了输出而只是用于训练)。
| 归档时间: |
|
| 查看次数: |
3176 次 |
| 最近记录: |