Как тренировать / настраивать предварительно обученную Роберту с многоканальной головой?
Итак, для университетского проекта мы пытаемся настроить предварительно обученную модель 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.
Заранее спасибо!