如何正确提示Transformer模型的解码器?

问题描述 投票:0回答:1

我正在使用拥抱脸部变形金刚。我有一个预训练的编码器 + 解码器模型 (Pegasus),并且想要按照本文中所述对其进行微调。

具体来说,他们使用以下流程:

换句话说,他们在生成模型本身之前添加了“手动”提示。 我的问题与解码器输入有关。具体来说,我想微调模型,以便它接受提示(实体链),并从该点开始生成摘要。

例如:

<s> [ENTITYCHAIN] Frozen | Disney [SUMMARY] $tok_1 $tok_2 $tok_3 ... =========================================== ^^^^^^ ^^^^^^ ^^^^^^ This is not generated Generate from here

但是,正如您所期望的,该模型正在为实体链中的每个令牌生成预测,这是我不需要的。但最重要的是,
loss

的计算还考虑了与实体链相关的预测。这显然破坏了训练的目的,因为它混淆了模型,因为它应该学习只生成摘要,而不是实体链(已经作为提示给出)。 正如我所说,我想要的是给解码器一个提示(实体链),并使其生成摘要,同时能够关注提示中的额外信息。当然,损失应该只在生成的令牌中计算,不包括提示令牌。

通过查看

模型文档

,我似乎找不到执行此操作的选项。有任何想法吗? :)

pytorch nlp artificial-intelligence huggingface-transformers summarization
1个回答
2
投票
文档

以轻松解决问题。 这是一个最小的代码示例:

# Libraries import transformers from transformers import AutoTokenizer, AutoModelForSeq2SeqLM from copy import deepcopy # Get the tokenizer and the model checkpoint = 't5-small' tokenizer = AutoTokenizer.from_pretrained(checkpoint) model = AutoModelForSeq2SeqLM.from_pretrained(checkpoint) # Sample text inp = 'Here is my input' outp = 'Here is my output' # Get token IDs inp_ids = tokenizer(inp, return_tensors = 'pt').input_ids outp_ids = tokenizer(outp, return_tensors = 'pt').input_ids # Calculate loss loss = model(input_ids = inp_ids, labels = outp_ids).loss.item() print(loss) # Let's set the first token to -100 and recalculate loss modified_outp_ids = deepcopy(outp_ids) modified_outp_ids[0][0] = -100 # the first [0] is because we only have one sequence in our batch model_output = model(input_ids = inp_ids, labels = modified_outp_ids) print(model_output.loss.item())

© www.soinside.com 2019 - 2024. All rights reserved.