我正在使用拥抱脸部变形金刚。我有一个预训练的编码器 + 解码器模型 (Pegasus),并且想要按照本文中所述对其进行微调。
具体来说,他们使用以下流程:
换句话说,他们在生成模型本身之前添加了“手动”提示。 我的问题与解码器输入有关。具体来说,我想微调模型,以便它接受提示(实体链),并从该点开始生成摘要。
例如:
<s> [ENTITYCHAIN] Frozen | Disney [SUMMARY] $tok_1 $tok_2 $tok_3 ...
=========================================== ^^^^^^ ^^^^^^ ^^^^^^
This is not generated Generate from here
但是,正如您所期望的,该模型正在为实体链中的每个令牌生成预测,这是我不需要的。但最重要的是,loss
的计算还考虑了与实体链相关的预测。这显然破坏了训练的目的,因为它混淆了模型,因为它应该学习只生成摘要,而不是实体链(已经作为提示给出)。 正如我所说,我想要的是给解码器一个提示(实体链),并使其生成摘要,同时能够关注提示中的额外信息。当然,损失应该只在生成的令牌中计算,不包括提示令牌。
通过查看
模型文档# 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())