Вопрос или проблема
Я предварительно обучил модель RoBERTa на новых данных, используя библиотеку ‘simpletransformers‘:
from simpletransformers.classification import ClassificationModel
OUTPUT_DIR = 'roberta_output/'
model = ClassificationModel('roberta', 'roberta-base', use_cuda=False, num_labels=22,
args={'overwrite_output_dir':True, 'output_dir':OUTPUT_DIR})
model.train_model(train_df)
result, model_outputs, wrong_predictions = model.eval_model(test_df) # оценка модели на тестовых данных
где ‘train_df‘ – это dataframe pandas, который состоит из множества образцов (=строк) с двумя столбцами: 1-й столбец – текстовая информация – входные данные; 2-й столбец – категория (=метка) – выходные данные.
Мне нужно создать такую же модель и предварительно обучить ее, как выше, но используя библиотеку ‘PyTorch‘ вместо библиотеки ‘Simpletransformers‘. Есть ли способ сделать это так же просто, как в приведенном коде выше?
Я загрузил предварительно обученную модель, как было сказано здесь:
import torch
roberta = torch.hub.load('pytorch/fairseq', 'roberta.large', pretrained=True)
roberta.eval() # отключить dropout (или оставить в режиме обучения для дообучения)
Я также изменил количество меток для предсказания в последнем слое:
roberta.register_classification_head('new_task', num_classes=22)
Но я не могу понять, как я могу предварительно обучить классификатор с помощью моего ‘train_df’.
Единственный способ, который я нашел до сих пор, это из здесь, где мы используем инструментальную платформу PyTorch ‘fairseq‘ и fairseq cli для предварительного обучения модели RoBERTa. Это единственный вариант или это можно сделать проще?
Я недавно сталкивался с подобной проблемой. Я следовал и модифицировал этот учебник от HuggingFace (который сейчас устарел, поскольку использует более старую версию transformers). Окончательный результат здесь. Надеюсь, это будет вам полезно.
Прежде всего, вы не предварительно обучаете модель. Вы дообучаете ее на своих данных. Во-вторых, вы можете следовать https://huggingface.co/docs/transformers/training. Там есть отличный способ показать, как вы можете использовать либо pytorch
, либо tensorflow
для дообучения вашей модели.
Ответ или решение
Для предварительного обучения модели RoBERTa с использованием библиотеки PyTorch, вам нужно будет вручную настроить процесс обучения, в отличие от использования специализированных библиотек, таких как ‘simpletransformers’. Ошибкой в ваших предыдущих данных является то, что вы пытаетесь выполнить предобучение, тогда как на самом деле вы проводите дообучение модели на новых данных. Давайте рассмотрим пошаговый подход к дообучению модели RoBERTa с использованием PyTorch.
Шаг 1: Установка необходимых библиотек
Если вы еще не сделали этого, установите следующие библиотеки:
pip install torch torchvision transformers pandas
Шаг 2: Импортирование библиотек
import torch
from torch import nn
from torch.utils.data import DataLoader, Dataset
from transformers import RobertaTokenizer, RobertaForSequenceClassification, AdamW
import pandas as pd
Шаг 3: Подготовка данных
Создайте класс Dataset для обработки вашего DataFrame:
class CustomDataset(Dataset):
def __init__(self, dataframe, tokenizer, max_len):
self.tokenizer = tokenizer
self.dataframe = dataframe
self.texts = dataframe.text.to_numpy()
self.labels = dataframe.label.to_numpy()
self.max_len = max_len
def __len__(self):
return len(self.dataframe)
def __getitem__(self, index):
text = str(self.texts[index])
label = self.labels[index]
encoding = self.tokenizer.encode_plus(
text,
add_special_tokens=True,
max_length=self.max_len,
return_token_type_ids=False,
padding='max_length',
return_attention_mask=True,
return_tensors='pt',
truncation=True
)
return {
'input_ids': encoding['input_ids'].flatten(),
'attention_mask': encoding['attention_mask'].flatten(),
'labels': torch.tensor(label, dtype=torch.long)
}
Шаг 4: Загрузка данных
Загрузите ваши данные и создайте DataLoader:
tokenizer = RobertaTokenizer.from_pretrained('roberta-base')
train_df = pd.read_csv('train_data.csv') # Замените на ваш файл
test_df = pd.read_csv('test_data.csv') # Замените на ваш файл
train_dataset = CustomDataset(train_df, tokenizer, max_len=128)
train_loader = DataLoader(train_dataset, batch_size=16, shuffle=True)
test_dataset = CustomDataset(test_df, tokenizer, max_len=128)
test_loader = DataLoader(test_dataset, batch_size=16, shuffle=False)
Шаг 5: Инициализация модели
Инициализируйте модель с необходимым количеством классов:
model = RobertaForSequenceClassification.from_pretrained('roberta-base', num_labels=22)
model.cuda() # Если у вас есть GPU
Шаг 6: Обучение модели
Определите оптимизатор и циклы обучения:
optimizer = AdamW(model.parameters(), lr=1e-5)
def train_epoch(model, data_loader, optimizer):
model = model.train()
total_loss = 0
for batch in data_loader:
input_ids = batch['input_ids'].to('cuda')
attention_mask = batch['attention_mask'].to('cuda')
labels = batch['labels'].to('cuda')
optimizer.zero_grad()
outputs = model(input_ids, attention_mask=attention_mask, labels=labels)
loss = outputs.loss
total_loss += loss.item()
loss.backward()
optimizer.step()
return total_loss / len(data_loader)
for epoch in range(3): # Замените на нужное количество эпох
loss = train_epoch(model, train_loader, optimizer)
print(f'Epoch {epoch + 1}, Loss: {loss}')
Шаг 7: Оценка модели
Выполните оценку модели на тестовом наборе данных:
def evaluate(model, data_loader):
model = model.eval()
total_correct = 0
total_count = 0
with torch.no_grad():
for batch in data_loader:
input_ids = batch['input_ids'].to('cuda')
attention_mask = batch['attention_mask'].to('cuda')
labels = batch['labels'].to('cuda')
outputs = model(input_ids, attention_mask=attention_mask)
_, preds = torch.max(outputs.logits, dim=1)
total_correct += (preds == labels).sum().item()
total_count += labels.size(0)
return total_correct / total_count
accuracy = evaluate(model, test_loader)
print(f'Accuracy: {accuracy:.2f}')
Заключение
Теперь вы обладаете полным методом дообучения модели RoBERTa с использованием PyTorch. Этот процесс включает в себя множество этапов, таких как создание пользовательского Dataset, инициализация модели, оптимизация и оценка. Если у вас есть дополнительные вопросы или вам нужна подробная информация о каком-либо из этапов, не стесняйтесь спрашивать!