GPT2 на объятиях (преобразователи pytorch) RuntimeError: grad может быть неявно создан только для скалярных выходов

Я пытаюсь настроить 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()

person Berkay Berabi    schedule 16.09.2020    source источник


Ответы (1)


Я наконец-то понял. Проблема заключалась в том, что образцы данных не содержали целевого вывода. Даже жесткий GPT является самоконтролируемым, об этом нужно явно сообщить модели.

вам нужно добавить строку:

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

к функции getitem класса Dataset, и тогда она работает нормально!

person Berkay Berabi    schedule 17.09.2020
comment
Разве этот индекс не должен быть индексом в вашем наборе данных, а не индексом в вашем векторе кодирования? - person Chirag; 10.10.2020
comment
да, индекс относится к набору данных. В моем случае self.encodings [input_ids] - это список списка, поэтому он содержит векторы кодирования в 2D-матрице, так сказать. Вот почему я применяю индекс, я фактически получаю вектор кодирования, соответствующий набору данных. - person Berkay Berabi; 12.10.2020
comment
Мне пришлось пойти и сделать это самому, и тогда я понял, что вы имели в виду. Отлично! - person Chirag; 12.10.2020