Поскольку обработка естественного языка (NLP) быстро развивалась за последние несколько лет, архитектуры на основе преобразователей продемонстрировали огромный успех в различных задачах NLP. Механизм внимания, который позволяет модели улавливать контекстную информацию, стал значительным прорывом в области НЛП. Одной из популярных моделей на основе трансформаторов является BERT (двунаправленные представления кодировщика от трансформаторов). BERT успешно справляется с различными задачами НЛП, такими как классификация текста, распознавание именованных сущностей, ответы на вопросы и многие другие.

В этом сообщении блога мы сосредоточимся на тонкой настройке DistilBERT, уменьшенной и быстрой версии BERT, на нашем собственном наборе данных для задачи множественной классификации. В этом блоге мы рассмотрим следующие темы:

  • Знакомство с токенизатором.
  • Обзор DistilBERT.
  • Подготовка данных для задачи мультиклассификации.
  • Обучение и оценка DistilBERT на нашем собственном наборе данных.

Введение в токенизатор

Токенизация — это процесс разделения текста на более мелкие части, называемые токенами, и каждый токен представляет собой слово, знак препинания или часть слова. В NLP токенизатор является одним из основных компонентов, который преобразует необработанные текстовые данные в форму, которую может обрабатывать модель машинного обучения. Токенизатор преобразует каждое слово в уникальное целое число, которое используется в качестве входных данных для модели.

В этом сообщении блога мы будем использовать AutoTokenizer, предоставленный Hugging Face, популярной библиотекой НЛП. Он автоматически выбирает подходящий токенизатор для данной модели на основе преобразователя, и нам не нужно беспокоиться о выборе токенизатора вручную.

Обзор DistilBERT

DistilBERT — это уменьшенная и более быстрая версия BERT, предварительно обученная на больших наборах данных. Основная идея DistilBERT состоит в том, чтобы удалить некоторые избыточные параметры BERT, сохранив при этом его производительность. DistilBERT имеет меньше параметров и требует меньше вычислительной мощности, что упрощает точную настройку на небольших наборах данных.

Подготовка данных для задачи мультиклассификации

Чтобы обучить и оценить DistilBERT на нашем собственном наборе данных для задачи множественной классификации, нам нужно преобразовать наш набор данных в формат, понятный DistilBERT. В этом сообщении блога мы будем использовать набор данных, содержащий помеченные твиты, и классифицируем твиты по трем категориям: разжигание ненависти, оскорбительные выражения и ни то, ни другое.

Сначала мы загрузим набор данных с помощью библиотеки pandas и разделим его на наборы для обучения, проверки и тестирования. Затем мы создадим собственный класс набора данных, который будет считывать данные из CSV-файла и токенизировать каждый твит с помощью AutoTokenizer, предоставляемого Hugging Face. Наконец, мы создадим загрузчики данных для обучающих, проверочных и тестовых наборов с помощью PyTorch DataLoader.

Обучение и оценка DistilBERT на нашем собственном наборе данных

Мы будем использовать наш собственный набор данных: Набор данных о разжигании ненависти и оскорбительном языке, с тысячами помеченных твитов в 3 классах: Разжигание ненависти, Оскорбление или Ни то, ни другое, метки классов уже закодированы как 0,1,2 соответственно. И мы загрузим DistilBert с помощью библиотеки трансформеров HuggingFace, а затем переобучим модель на основе DistilBert и нашего собственного точно настроенного набора данных для задачи классификации.

Введение в Трансформеры

Преобразователи — это тип архитектуры нейронной сети, который использовался для достижения самой современной производительности в широком спектре задач обработки естественного языка, включая анализ тональности. Преобразователи предназначены для обработки последовательностей входных данных (например, последовательности слов в предложении) путем использования механизмов внимания для выборочного фокусирования на различных частях входной последовательности. Это позволяет модели фиксировать долгосрочные зависимости между различными частями входной последовательности, что может быть важно для таких задач, как анализ тональности.

Набор данных

В этом уроке мы будем использовать набор данных твитов, помеченных оценкой тональности. Набор данных содержит тысячи твитов, помеченных одной из трех оценок настроений: 0 (ненависть), 1 (оскорбление) или 2 (ни то, ни другое). Мы будем использовать этот набор данных для обучения и оценки нашей модели анализа настроений.

Предварительная обработка данных

Мы начнем с предварительной обработки данных, которая включает в себя загрузку набора данных и его разделение на наборы для обучения, проверки и тестирования. Мы будем использовать функцию load_dataset_into_dataframe() для загрузки набора данных из файла CSV и преобразования его в DataFrame pandas.

df = load_dataset_into_dataframe()

Далее мы разделим данные на наборы для обучения, проверки и тестирования, используя функцию partition_dataset(). Эта функция перемешивает данные и разбивает их на три набора в соотношении 70/15/15.

partition_dataset(df)

Токенизация

Прежде чем мы сможем обучить нашу модель анализа настроений, нам нужно разметить текстовые данные. Токенизация включает в себя разбиение текста на отдельные слова или подслова, которые затем могут быть введены в модель в качестве входных данных. Мы будем использовать класс AutoTokenizer из библиотеки трансформаторов для токенизации текстовых данных.

tokenizer = AutoTokenizer.from_pretrained("distilbert-base-uncased")

Мы будем использовать класс CustomDataset для создания объекта набора данных PyTorch, который можно будет передать в модель во время обучения. Класс CustomDataset читает CSV-файлы, содержащие текстовые данные и метки, размечает текст с помощью tokenizer и возвращает размеченные данные вместе с метками.

train_dataset = CustomDataset("train.csv")
val_dataset = CustomDataset("val.csv")
test_dataset = CustomDataset("test.csv")

Обучение модели

Мы будем использовать класс AutoModelForSequenceClassification из библиотеки трансформаторов для создания предварительно обученной модели анализа тональности. Затем мы точно настроим модель на наших обучающих данных, используя функцию train().

model = AutoModelForSequenceClassification.from_pretrained("distilbert-base-uncased", num_labels=3)
optimizer = torch.optim.Adam(model.parameters(), lr=2e-5)
train_loader = DataLoader(train_dataset, batch_size=16, shuffle=True)
val_loader = DataLoader(val_dataset, batch_size=16)
train(5, model, optimizer, train_loader, val_loader, device="cuda")

Функция train() обучает модель в течение заданного количества эпох, используя обучающие данные, и оценивает модель по проверочным данным после каждой эпохи. Мы используем оптимизатор Adam со скоростью обучения 2e-5 и размером пакета 16.

Адам Оптимизатор

Оптимизатор Адама — это популярный алгоритм оптимизации, используемый в машинном обучении для обучения нейронных сетей. Это вариант алгоритма стохастического градиентного спуска (SGD), в котором используются адаптивные скорости обучения.

Проще говоря, оптимизатор Adam регулирует скорость обучения каждого параметра на основе градиента параметра и исторических градиентов этого параметра. Это помогает гарантировать, что скорость обучения не будет ни слишком высокой, ни слишком низкой, что приведет к более быстрой сходимости во время обучения.

Подводя итог, оптимизатор Адама — это алгоритм, используемый для оптимизации весов и смещений в нейронной сети во время обучения путем адаптации скорости обучения каждого параметра на основе градиентов и исторических градиентов. Это помогает повысить скорость и эффективность процесса обучения.

Стохастический градиентный спуск (SGD)

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

Проще говоря, SGD обновляет параметры модели, вычисляя градиент функции потерь по отношению к параметрам для небольшого пакета случайно выбранных обучающих данных. Затем параметры обновляются с использованием градиента и скорости обучения, которая определяет размер шага в направлении градиента. Этот процесс повторяется для нескольких пакетов обучающих данных, пока модель не изучит закономерности в данных.

Подводя итог, SGD — это алгоритм оптимизации, который обновляет параметры нейронной сети, используя мини-пакеты обучающих данных и градиент функции потерь по отношению к параметрам. Это эффективный и действенный способ обучения моделей на больших наборах данных, который широко используется в глубоком обучении.

Хватит болтать, покажи код:

Удачного кодирования, наслаждайтесь им



Дополнительные материалы на PlainEnglish.io.

Подпишитесь на нашу бесплатную еженедельную рассылку новостей. Подпишитесь на нас в Twitter, LinkedIn, YouTube и Discord .

Заинтересованы в масштабировании запуска вашего программного обеспечения? Ознакомьтесь с разделом Схема.