【问题标题】:GPT2 on Hugging face(pytorch transformers) RuntimeError: grad can be implicitly created only for scalar outputsGPT2 on Hugging face(pytorch transformers) RuntimeError: grad can be implicitly created only for scalar outputs
【发布时间】:2021-01-03 13:15:00
【问题描述】:

我正在尝试使用我的自定义数据集微调 gpt2。我使用来自拥抱脸变压器的文档创建了一个基本示例。我收到提到的错误。我知道这意味着什么:(基本上它是在非标量张量上向后调用)但由于我几乎只使用 API 调用,所以我不知道如何解决这个问题。有什么建议吗?

from pathlib import Path
from absl import flags, app
import IPython
import torch
from transformers import GPT2LMHeadModel, Trainer,  TrainingArguments
from data_reader import GetDataAsPython

# this is my custom data, but i get the same error for the basic case below
# data = GetDataAsPython('data.json')
# data = [data_point.GetText2Text() for data_point in data]
# print("Number of data samples is", len(data))

data = ["this is a trial text", "this is another trial text"]

train_texts = data

from transformers import GPT2Tokenizer
tokenizer = GPT2Tokenizer.from_pretrained('gpt2')

special_tokens_dict = {'pad_token': '<PAD>'}
num_added_toks = tokenizer.add_special_tokens(special_tokens_dict)
train_encodigs = tokenizer(train_texts, truncation=True, padding=True)


class BugFixDataset(torch.utils.data.Dataset):
    def __init__(self, encodings):
        self.encodings = encodings
    
    def __getitem__(self, index):
        item = {key: torch.tensor(val[index]) for key, val in self.encodings.items()}
        return item

    def __len__(self):
        return len(self.encodings['input_ids'])

train_dataset = BugFixDataset(train_encodigs)

training_args = TrainingArguments(
    output_dir='./results',          
    num_train_epochs=3,              
    per_device_train_batch_size=1,  
    per_device_eval_batch_size=1,   
    warmup_steps=500,                
    weight_decay=0.01,               
    logging_dir='./logs',
    logging_steps=10,
)

model = GPT2LMHeadModel.from_pretrained('gpt2', return_dict=True)
model.resize_token_embeddings(len(tokenizer))

trainer = Trainer(
    model=model,
    args=training_args,
    train_dataset=train_dataset,
)

trainer.train()

【问题讨论】:

    标签: python nlp pytorch huggingface-transformers huggingface-tokenizers


    【解决方案1】:

    我终于明白了。问题是数据样本不包含目标输出。即使是严格的 gpt 也是自我监督的,这必须明确告知模型。

    你必须添加行:

    item['labels'] = torch.tensor(self.encodings['input_ids'][index])
    

    到Dataset类的getitem函数,然后就可以正常运行了!

    【讨论】:

    • 这个索引不应该是数据集的索引,而不是编码向量的索引吗?
    • 是的,索引是相对于数据集的。就我而言, self.encodings[input_ids] 是一个列表列表,因此它包含二维矩阵中的编码向量。这就是为什么我应用索引的原因,我实际上得到了一个与数据集对应的编码向量。
    • 我必须自己去做,然后我才明白你的意思。这太棒了!
    猜你喜欢
    • 2021-07-12
    • 2019-12-11
    • 2020-10-19
    • 2020-10-28
    • 2023-01-11
    • 2020-08-22
    • 2022-10-07
    • 2018-07-28
    • 2022-12-02
    相关资源
    最近更新 更多