Nlp 如何使用forward()方法代替T5模型的model.generate()

Nlp 如何使用forward()方法代替T5模型的model.generate(),nlp,huggingface-transformers,Nlp,Huggingface Transformers,对于我的用例,我需要使用model.forward()而不是model.generate()方法 i、 e而不是下面的代码 outs = model.model.generate(input_ids=batch['source_ids'], attention_mask=batch['source_mask'], output_scores=True,

对于我的用例,我需要使用model.forward()而不是model.generate()方法 i、 e而不是下面的代码

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]
我需要使用

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)

    
对这些逻辑进行解码会产生未经处理的文本,这些文本存在许多问题,如结尾重复单词等。
要获得与model.generate()相同的结果,我需要做什么?

这两种方法做的事情完全不同

调用模型(这意味着
forward
方法)使用
标签进行教师强制。这意味着解码器的输入是移位1的
标签
(请参阅)。在教师的强制下,无论预测结果是什么,解码器在下一步都会得到地面真相标记。教师强制是从模型训练中使用的,所有步骤都是完全可微的

调用
generate
方法时,将以自回归方式使用模型。它生成的任何令牌都将作为下一步的输入。然而,选择令牌是一个“困难”的决定,并且梯度不能通过该决定传播。生成方法不能用于培训。由于解码器对先前生成的内容作出反应,因此输出是一致的


在教师强制的情况下,模型可能希望生成一个令牌,并与生成的令牌保持一致。但是,它无法持续,因为它被迫继续,就像它生成了实际位于
labels
参数中的标记一样。这就是为什么您会观察到不连贯的输出(尽管如此,它从来没有打算输出,只是用于培训)。

感谢您的回答。这解释了很多。因此,本质上对于我的用例,在从T5模型生成时,我需要使用inputs_嵌入而不是input_id。model.model()支持这一点,但generate()方法不支持。我该怎么做?