Тонкая настройка RoBERTa для тематической классификации
29 марта 2023 г.В этом руководстве мы настраиваем модель RoBERTa для классификации тем, используя библиотеки Hugging Face Transformers и Datasets. К концу этого урока у вас будет мощная отлаженная модель для классификации тем, и вы опубликуете ее в Hugging Face 🤗 для использования людьми.
Предпосылки
В этой статье предполагается, что у вас есть аккаунт Hugging Face 🤗 и работа с Python, НЛП и знаниями глубокого обучения.
- Понимание концепций машинного обучения: базовое понимание концепций машинного обучения, таких как контролируемое обучение, обучение и оценка.
- Опыт программирования на Python поможет понять код, представленный в руководстве.
- Знакомство с глубоким обучением и обработкой естественного языка : некоторый опыт работы с концепциями глубокого обучения и обработки естественного языка (NLP), такими как нейронные сети, встраивание слов и токенизация, будет полезен для понимания идей, представленных в руководстве.
- Доступ к среде Google Colab или Jupyter Notebook.
- Аккаунт Hugging Face. Чтобы опубликовать свою доработанную модель в Hugging Face Hub, вам понадобится аккаунт Hugging Face. Если у вас еще нет учетной записи, вы можете создать ее на странице https://huggingface.co/join.
Соблюдая эти предварительные условия, вы будете хорошо подготовлены к тому, чтобы следовать руководству и извлечь из него максимальную пользу.
Давайте запачкаем руки 😁
Начнем с установки зависимостей.
!pip install transformers datasets huggingface_hub tensorboard==2.11
!sudo apt-get install git-lfs --yes
n Затем мы импортируем необходимые модули.
import torch
from datasets import load_dataset
from transformers import (
RobertaTokenizerFast,
RobertaForSequenceClassification,
TrainingArguments,
Trainer,
AutoConfig,
)
from huggingface_hub import HfFolder, notebook_login
n Нам нужно войти в Hugging Face с помощью токена.
notebook_login()
Давайте установим некоторые переменные для упрощения настройки.
model_id = "roberta-base"
dataset_id = "ag_news"
# relace the value with your model: ex <hugging-face-user>/<model-name>
repository_id = "achimoraites/roberta-base_ag_news"
Предварительная обработка
Затем мы загружаем наш набор данных и выполняем предварительную обработку.
# Load dataset
dataset = load_dataset(dataset_id)
# Training and testing datasets
train_dataset = dataset['train']
test_dataset = dataset["test"].shard(num_shards=2, index=0)
# Validation dataset
val_dataset = dataset['test'].shard(num_shards=2, index=1)
# Preprocessing
tokenizer = RobertaTokenizerFast.from_pretrained(model_id)
# This function tokenizes the input text using the RoBERTa tokenizer.
# It applies padding and truncation to ensure that all sequences have the same length (256 tokens).
def tokenize(batch):
return tokenizer(batch["text"], padding=True, truncation=True, max_length=256)
train_dataset = train_dataset.map(tokenize, batched=True, batch_size=len(train_dataset))
val_dataset = val_dataset.map(tokenize, batched=True, batch_size=len(val_dataset))
test_dataset = test_dataset.map(tokenize, batched=True, batch_size=len(test_dataset))
Установите формат набора данных
Функция set_format()
используется для указания формата набора данных, что делает его совместимым с PyTorch.
Аргумент columns
перечисляет столбцы, которые должны быть включены в отформатированный набор данных.
В данном случае это столбцы "input_ids", "attention_mask" и "label".
Установив формат и указав соответствующие столбцы, мы подготавливаем наборы данных для использования с классом Hugging Face Trainer, для которого в качестве входных данных требуются тензоры PyTorch.
# Set dataset format
train_dataset.set_format("torch", columns=["input_ids", "attention_mask", "label"])
val_dataset.set_format("torch", columns=["input_ids", "attention_mask", "label"])
test_dataset.set_format("torch", columns=["input_ids", "attention_mask", "label"])
Чтобы упростить использование нашей модели, мы создадим сопоставление id2label. Это сопоставит идентификаторы классов с их ярлыками.
Это облегчает интерпретацию выходных данных модели во время логического вывода.
# We will need this to directly output the class names when using the pipeline without mapping the labels later.
# Extract the number of classes and their names
num_labels = dataset['train'].features['label'].num_classes
class_names = dataset["train"].features["label"].names
print(f"number of labels: {num_labels}")
print(f"the labels: {class_names}")
# Create an id2label mapping
id2label = {i: label for i, label in enumerate(class_names)}
# Update the model's configuration with the id2label mapping
config = AutoConfig.from_pretrained(model_id)
config.update({"id2label": id2label})
Обучение и оценка
Теперь мы настроим параметры обучения, репозиторий Hugging Face 🤗 и Tensorboard.
# TrainingArguments
training_args = TrainingArguments(
output_dir=repository_id,
num_train_epochs=5,
per_device_train_batch_size=8,
per_device_eval_batch_size=8,
evaluation_strategy="epoch",
logging_dir=f"{repository_id}/logs",
logging_strategy="steps",
logging_steps=10,
learning_rate=5e-5,
weight_decay=0.01,
warmup_steps=500,
save_strategy="epoch",
load_best_model_at_end=True,
save_total_limit=2,
report_to="tensorboard",
push_to_hub=True,
hub_strategy="every_save",
hub_model_id=repository_id,
hub_token=HfFolder.get_token(),
)
# Trainer
trainer = Trainer(
model=model,
args=training_args,
train_dataset=train_dataset,
eval_dataset=val_dataset,
)
Мы можем начать процесс обучения, запустив:
# Fine-tune the model
trainer.train()
Оцените модель:
# Evaluate the model
trainer.evaluate()
Публикация
Мы готовы опубликовать нашу модель в Hugging Face 🤗
# Save our tokenizer and create a model card
tokenizer.save_pretrained(repository_id)
trainer.create_model_card()
# Push the results to the hub
trainer.push_to_hub()
Проверить модель
К этому моменту наша модель должна быть опубликована и доступна для использования. Проверим!
# TEST MODEL
from transformers import pipeline
classifier = pipeline('text-classification',repository_id)
text = "Kederis proclaims innocence Olympic champion Kostas Kederis today left hospital ahead of his date with IOC inquisitors claiming his innocence and vowing: quot;After the crucifixion comes the resurrection. quot; .."
result = classifier(text)
predicted_label = result[0]["label"]
print(f"Predicted label: {predicted_label}")
Поздравляем
Вы настроили и опубликовали модель RoBERTa для классификации текста с использованием трансформеров Hugging Face 🤗 и библиотек наборов данных!
Для справки, вот моя доработанная модель Hugging Face 🤗 n https://huggingface.co/achimoraites/roberta- base_ag_news
Удачного 🤖 обучения 😀!
:::информация Также опубликовано здесь а>
:::
:::подсказка Feature image: Фото Влады Карпович из Pexels: https://www.pexels.com/photo/crop-young-businesswoman-using-laptop-while-drinking-tea-at-home-4050347/
:::
Оригинал