Как тренировать / настраивать предварительно обученную Роберту с многоканальной головой?

Итак, для университетского проекта мы пытаемся настроить предварительно обученную модель RoBERTa, чтобы проверить, какой из трех возможных ответов с множественным выбором на ложное предложение является правильным ответом, почему предложение не имеет смысла.

Например:

  • Ложный приговор -> «Я жаляю комара»
  • optionA -> «Человек - не млекопитающее»
  • optionB ->"Человек всеяден"
  • optionC ->"Человек не жалит"

В этом примере модель должна выдавать optionC в качестве вывода.

Мы используем предварительно обученную модель RoBERTa с многоканальной головкой, но мы как бы застряли, поскольку не знаем, как настроить модель / обучить ее на нашем собственном наборе данных.

Код, который у нас есть прямо сейчас:

      # Modules
from transformers import RobertaConfig, RobertaModel
from transformers import RobertaTokenizer, RobertaForMultipleChoice
import torch
import numpy as np # linear algebra
import pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)
import os

# Initializing a RoBERTa configuration
configuration = RobertaConfig()

# Initializing a model from the configuration
model = RobertaModel(configuration)

# Accessing the model configuration
configuration = model.config

tokenizer = RobertaTokenizer.from_pretrained("roberta-large")
model = RobertaForMultipleChoice.from_pretrained('roberta-large')

loss = outputs.loss
logits = outputs.logits

# Data inlezen
sample_data = pd.read_csv("sample.csv")
train_data = pd.read_csv("train_data.csv")
train_answers = pd.read_csv("train_answers.csv")
test_data = pd.read_csv("test_data.csv")

print("train data columns:", train_data.columns)
print("test data columns:", test_data.columns)

for i in range(0, len(train_data)):
    prompt = train_data['FalseSent'][i]
    A = train_data['OptionA'][i]
    B = train_data['OptionB'][i]
    C = train_data['OptionC'][i]
    labels = torch.tensor(0).unsqueeze(0)
    
    encoding = tokenizer([prompt, prompt, prompt], [A, B, C], return_tensors='pt', padding=True)
    outputs = model(**{k: v.unsqueeze(0) for k,v in encoding.items()}, labels=labels)  # batch size is 1

from transformers import DistilBertForSequenceClassification, Trainer, TrainingArguments

training_args = TrainingArguments(
    output_dir='C:/Users/samvd/Documents/Master/Applied Machine Learning/FinalV2/results',  # output directory
    num_train_epochs=3,              # total number of training epochs
    per_device_train_batch_size=32,  # batch size per device during training
    per_device_eval_batch_size=32,   # batch size for evaluation
    warmup_steps=500,                # number of warmup steps for learning rate scheduler
    weight_decay=0.01,               # strength of weight decay
    logging_dir='C:/Users/samvd/Documents/Master/Applied Machine Learning/FinalV2/logs', # directory for storing logs
    logging_steps=10,
)

model = RobertaForMultipleChoice.from_pretrained('roberta-large')

trainer = Trainer(
    model=model,                         # the instantiated 🤗 Transformers model to be trained
    args=training_args,                  # training arguments, defined above
    train_dataset= train_data,           # training dataset
    eval_dataset= train_answers          # evaluation dataset
)

trainer.train()

Если бы кто-нибудь мог указать нам правильное направление, мы были бы очень благодарны. Мы посмотрели репозиторий github, чтобы узнать, как это делают другие, но код не имел большого смысла. Приведенный выше код в основном основан на документации huggingface.

Заранее спасибо!

0 ответов

Другие вопросы по тегам