Обработка естественного языка — одна из самых сложных областей машинного обучения, в основном из-за сложности и неоднозначности языка. Тем не менее, это также одна из самых успешных областей со многими реальными приложениями, которые мы используем каждый день, такими как поисковые системы, инструменты перевода и многое другое.
Иногда самые сложные задачи решаются простейшими методами. В этой статье я попытаюсь исследовать это утверждение. Итак, я представлю полное решение для Sentiment Analysis на основе простейшей нейронной сети «Персептрон», используя реальную задачу и набор данных: классифицировать, являются ли отзывы о ресторанах на Yelp положительными или отрицательными.
Для этого я разделю эту статью на четыре части следующим образом:
- Обзор Yelp DataSet (ссылка)
- Словарь и векторизатор (ссылка)
- Тренировочная программа (данная статья касается этой части)
- Оценка и вывод
Заранее благодарим за вашу поддержку. Если вы решите зарегистрироваться на Medium, вот моя страница подписки: https://abdelkader-rhouati.medium.com/membership
Часть 3. Тренировочная программа
В этой статье мы опишем этапы тренировочной программы. Он отвечает за создание экземпляра модели, итерацию по набору данных, вычисление выходных данных, вычисление потерь (функции ошибки) и настройку параметров модели для повышения ее производительности. Эта процедура является общей. Вам нужно изменить несколько мест, чтобы адаптировать его к новым моделям, и поэтому он станет привычным и легким для разработки нового процесса глубокого обучения.
Бинарный классификатор
Используемая нами модель является повторной реализацией классификатора персептрона. Для получения более подробной информации вы можете обратиться к предыдущей статье, которую я написал на эту тему по ссылке: «НЛП с использованием учебников по глубокому обучению: понять персептрон». Модель персептрона — это простейшая нейронная сеть, а также одна из старейших. Тем не менее, но остается эффективным в ряде случаев.
Поскольку мы хотим классифицировать каждый отзыв как отрицательный или положительный, наша модель представляет собой бинарный классификатор. Итак, как вы можете видеть в приведенном ниже коде, модель ReviewClassifier наследуется от модели Pytorch и создает один линейный макет с одним выходом для отрицательного или положительного класса. В качестве конечной нелинейности используется сигмовидная функция. Это называется функцией активации, о которой я подробно рассказываю в своей статье НЛП с использованием учебников по глубокому обучению: понимание функции активации.
Код двоичного классификатора:
Настройка на обучение
Для обработки решения на уровне высоты о том, как работает модель, рекомендуется инициализировать объект args для централизованной координации всех решений. Как показано ниже, мы определяем все параметры модели, также называемые гиперпараметрами, о наборе данных и этапах обучения.
Гиперпараметры и опции для бинарного классификатора Perceptron:
Чтобы отслеживать информацию о ходе обучения (индекс эпох, список потерь при обучении, точность обучения, потери при проверке, точность проверки, потери при тестировании и точность тестирования), мы используем небольшую переменную словаря Python следующим образом:
Следующие шаги создают экземпляры следующих элементов
- Переменная устройства, которая указывает, используем ли мы GPU или CPU.
- Набор данных, загружающий данные из CSV-файла.
- Класс векторизатора для преобразования текстовых элементов в числовые векторы
- Модель классификатора, и мы перемещаем ее на устройство GPU или CPU.
- «BCEWithLogitsLoss» как функция потерь
- И оптимизатор ADAM, который не уступает другим оптимизаторам. (См. [3] для более подробной информации)
Код для создания экземпляра:
Тренировочный цикл
Цикл обучения использует объекты из предыдущей фазы для обновления параметров модели, что повышает ее производительность и точность. Цикл обучения состоит из двух основных циклов: внутреннего цикла для мини-пакетов в наборе данных и внешнего цикла, который повторяет внутренний цикл несколько раз, называемых эпохами. Количество эпох определяет, сколько проходов по набору данных должно выполнять обучение.
В верхней части внешнего цикла мы добавляем несколько экземпляров для индекса эпохи и генератора пакетов. Также мы переключаем модель в «режим обучения» с помощью метода «classifier.train()». Это обязательно для обновления гиперпараметров.
Внутренний цикл содержит основные операции, которые обновляют параметры модели. Это делается в 5 шагов:
- Шаг №1: Градиенты оптимизатора сбрасываются с помощью optimizer.zero_grad().
- Шаг № 2: Выходные данные — это компьютеры из модели.
- Шаг № 3: Функция потерь используется для вычисления потерь между выходными данными модели и целью наблюдения (истинные метки классов в наборе данных).
- Шаг № 4: с помощью «loss.backward()» градиенты распространяются обратно на каждый параметр
- Шаг № 5: этот последний шаг обновляет параметры модели с помощью метода «optimize.step ()».
Наконец, мы отслеживаем потери и точность каждой эпохи в переменной «train_states».
Вот код маршрутизации обучения:
Перед запуском обучения для следующей эпохи мы добавляем цикл для данных проверки, как показано в коде ниже. Цель состоит в том, чтобы измерить, насколько хорошо модель работает с данными, которые модель не видит во время обучения. Для этого мы делаем параметры модели неизменяемыми с помощью метода «classifier.eval()» и отключаем вычисление потерь и распространение градиентов. Это важно, потому что мы не хотим, чтобы модель корректировала свои параметры относительно данных проверки.
Код для проверки модели:
Вывод:
В этой статье мы рассмотрели суть нашей работы, которая заключается в разработке и обучении нашей модели машинного обучения. Мы видели, как определить бинарный классификатор на основе принципа персептрона. Мы создали код для обучения классификатора и измерения его производительности с использованием проверочного набора данных.
В следующей и последней статье этой серии мы представим часть вывода модели и закончим синтезом, который восстанавливает некоторые возможные улучшения представленной модели.
Ссылки:
- Книга Обработка естественного языка с помощью Pytorch (https://www.amazon.fr/Natural-Language-Processing-Pytorch-Applications/dp/1491978236)
- https://pytorch.org/tutorials/beginner/basics/data_tutorial.html?highlight=dataloader
- https://medium.com/mlearning-ai/optimizers-in-deep-learning-7bf81fed78a0
- https://pub.towardsai.net/nlp-using-deep-learning-tutorials-understand-the-perceptron-f2f20b324e63
- https://pub.towardsai.net/nlp-using-deep-learning-tutorials-understand-loss-function-2aaf73ec6c2b
- https://pub.towardsai.net/nlp-using-deep-learning-tutorials-understand-the-activation-function-8f62613e32d2