Тонкая настройка RoBERTa для тематической классификации

Тонкая настройка RoBERTa для тематической классификации

29 марта 2023 г.

В этом руководстве мы настраиваем модель RoBERTa для классификации тем, используя библиотеки Hugging Face Transformers и Datasets. К концу этого урока у вас будет мощная отлаженная модель для классификации тем, и вы опубликуете ее в Hugging Face 🤗 для использования людьми.

Предпосылки

В этой статье предполагается, что у вас есть аккаунт Hugging Face 🤗 и работа с Python, НЛП и знаниями глубокого обучения.

  1. Понимание концепций машинного обучения: базовое понимание концепций машинного обучения, таких как контролируемое обучение, обучение и оценка.
  2. Опыт программирования на Python поможет понять код, представленный в руководстве.
  3. Знакомство с глубоким обучением и обработкой естественного языка : некоторый опыт работы с концепциями глубокого обучения и обработки естественного языка (NLP), такими как нейронные сети, встраивание слов и токенизация, будет полезен для понимания идей, представленных в руководстве.
  4. Доступ к среде Google Colab или Jupyter Notebook.
  5. Аккаунт 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/

:::


Оригинал