Полный код : https://github.com/gmihaila/ml_things/issues
Hugging Face включает в себя все функции, необходимые для использования GPT2 в задачах классификации.
Мне не удалось найти много информации о том, как использовать GPT2 для классификации, поэтому я решил сделать это руководство, используя аналогичную структуру с другими моделями трансформеров.
Основная идея: поскольку GPT2 является преобразователем декодера, последний токен входной последовательности используется для прогнозирования следующего токена, который должен следовать за входом. Это означает, что последний токен входной последовательности содержит всю информацию, необходимую для предсказания. Имея это в виду, мы можем использовать эту информацию для прогнозирования в задаче классификации вместо задачи генерации.
Другими словами, вместо того, чтобы использовать встраивание первого токена для прогнозирования, как мы делаем в Bert, мы будем использовать вложение последнего токена для прогнозирования с помощью GPT2.
Благодаря последнему обновлению HuggingFace Transformers мы можем настроить токенизатор GPT2 для этого.
Что мне нужно знать об этой статье?
Поскольку я использую PyTorch для точной настройки наших моделей трансформеров, любые знания о PyTorch очень полезны.
Также полезно немного узнать о библиотеке трансформеров.
Набор данных
В этой статье будет рассказано о предварительном обучении трансформеров на настраиваемом наборе данных. Я буду использовать хорошо известные обзоры фильмов, положительные и отрицательные, с пометкой «Большой набор данных обзора фильмов».
Описание на сайте Стэнфорда:
Это набор данных для двоичной классификации тональности, содержащий значительно больше данных, чем предыдущие наборы контрольных данных. Мы предоставляем набор из 25 000 крайне полярных обзоров фильмов для обучения и 25 000 для тестирования. Существуют также дополнительные немаркированные данные. Предусмотрены форматы исходного текста и уже обработанного пакета слов. См. Файл README, содержащийся в выпуске, для более подробной информации.
Почему этот набор данных? Я считаю, что это простой для понимания и использования набор данных для классификации. Я думаю, что с данными о настроениях всегда интересно работать.
Код
А теперь займемся кодированием! Мы рассмотрим каждую ячейку кодирования в записной книжке и опишем, что она делает, что это за код и когда это актуально, - покажем результат.
Я сделал этот формат простым, если вы решите запускать каждую ячейку кода в своем собственном блокноте Python.
Когда я учусь на уроках, я всегда стараюсь воспроизвести результаты. Я считаю, что легко следовать, если у вас есть код рядом с пояснениями.
Загрузка
Загрузите набор данных Large Movie Review и распакуйте его локально.
Установка
Чтобы использовать весь код из Hugging Face, необходимо установить библиотеку transformers. Чтобы получить последнюю версию, я установлю ее прямо с GitHub. https://github.com/huggingface/transformers
Библиотека ml_things, используемая для различных задач, связанных с машинным обучением. Я создал эту библиотеку, чтобы уменьшить объем кода, который мне нужно написать для каждого проекта машинного обучения. https://github.com/gmihaila/ml_things
Imports
Импортируйте все необходимые библиотеки для этой записной книжки. Объявите параметры, используемые для этой записной книжки:
- set_seed (123) - Всегда удобно устанавливать фиксированное начальное число для воспроизводимости.
- epochs - количество эпох обучения (авторы рекомендуют от 2 до 4).
- batch_size - Количество пакетов - в зависимости от максимальной длины последовательности и памяти GPU. При длине последовательности 512 пакет из 10 ОБЫЧНЫХ работает без проблем с памятью cuda. Для небольшой длины последовательности можно попробовать пакет из 32 и выше. max_length - дополняет или усекает текстовые последовательности до определенной длины. Я установлю 60, чтобы ускорить тренировку.
- device - графический процессор для использования.
- model_name_or_path - имя модели трансформера - будет использовать уже предварительно обученную модель. Путь к модели трансформера - загрузит вашу модель с локального диска. В этом уроке я буду использовать модель gpt2.
- label_ids - Словарь меток и их id - это будет использоваться для преобразования строковых меток в числа.
- n_labels - Сколько меток мы используем в этом наборе данных. Это используется для определения размера классификационной .
Вспомогательные функции
Мне нравится хранить все классы и функции, которые будут использоваться в этом блокноте, в этом разделе, чтобы помочь сохранить чистый внешний вид блокнота:
MovieReviewsDataset (набор данных)
Если вы раньше работали с PyTorch, это вполне стандартно. Нам нужен этот класс для чтения в нашем наборе данных, его анализа и возврата текстов с соответствующими метками.
В этом классе мне нужно только читать содержимое каждого файла, использовать fix_text, чтобы исправить любые проблемы с Unicode и отслеживать положительные и отрицательные настроения.
Я буду добавлять все тексты и надписи в списки.
Класс PyTorch Dataset состоит из трех основных частей:
init (), где мы читаем набор данных и преобразуем текст и метки в числа.
len (), где нам нужно вернуть количество примеров, которые мы читаем. Это используется при вызове len (MovieReviewsDataset ()).
getitem () всегда принимает в качестве входных данных значение типа int, которое представляет, какой пример из наших примеров следует вернуть из нашего набора данных. Если будет передано значение 3, мы вернем пример из нашего набора данных в позиции 3.
Gpt2ClassificationCollator
Я использую этот класс для создания сборщика данных. Это будет использоваться в DataLoader для создания наборов данных, которые передаются в модель. Я использую токенизатор и кодировщик меток в каждой последовательности для преобразования текстов и меток в числа.
К счастью для нас, Hugging Face продумал все и заставил токенизатор делать всю тяжелую работу (разбивать текст на токены, дополнять, усекать, кодировать текст в числа) и очень прост в использовании!
Этот класс Data Collator состоит из двух основных частей:
init (), где мы инициализируем токенизатор, который планируем использовать, как кодировать наши метки и нужно ли установить для длины последовательности другое значение.
call () используется как сопоставитель функций, который принимает в качестве входных данных набор примеров данных. Он должен вернуть объект в формате, который можно передать в нашу модель. К счастью, наш токенизатор делает это за нас и возвращает словарь переменных, готовых для передачи в модель следующим образом: модель (** входные данные). Поскольку мы дорабатываем модель, я также включил метки.
train(dataloader, optimizer_, scheduler_, device_)
Я создал эту функцию, чтобы выполнить полный проход через объект DataLoader (объект DataLoader создается из нашего объекта типа Dataset * с использованием класса ** MovieReviewsDataset). По сути, это обучение одной эпохи по всему набору данных.
Загрузчик данных создается из PyTorch DataLoader, который берет объект, созданный из класса MovieReviewsDataset, и помещает каждый пример в пакеты. Таким образом, мы можем кормить нашу модель пакетами данных!
Optimizer_ и scheduler_ очень распространены в PyTorch. Они необходимы для обновления параметров нашей модели и скорости обучения во время обучения. Есть еще много чего, но я не буду вдаваться в подробности. На самом деле это может быть огромная кроличья нора, поскольку за этими функциями стоит ОЧЕНЬ МНОГО, о чем нам не о чем беспокоиться. Спасибо, PyTorch!
В процессе мы отслеживаем фактические и прогнозируемые метки вместе с потерями.
validation(dataloader, device_)
Я реализовал эту функцию очень похоже на обучение, но без обновления параметров, обратного прохода и приличной части градиента. Нам не нужно выполнять все эти ОЧЕНЬ ресурсоемкие задачи, потому что нам важны только прогнозы нашей модели.
Я использую DataLoader так же, как и в обучении, чтобы вытащить партии для подачи в нашу модель.
В процессе я отслеживаю фактические метки и предсказанные метки вместе с потерями.
Модель загрузки и токенизатор
Загрузка трех основных частей предварительно обученного преобразователя GPT2: конфигурации, токенизатора и модели.
В этом примере я буду использовать gpt2 из предварительно обученных трансформеров HuggingFace. Вы можете использовать любые вариации GP2, какие захотите.
При создании model_config я упомяну количество меток, которые мне нужны для моей задачи классификации. Поскольку я предсказываю только два настроения: положительное и отрицательное, мне понадобятся только две метки для num_labels.
Создание токенизатора довольно стандартно при использовании библиотеки Transformers. После создания токенизатора для этого учебника критически важно установить заполнение влево tokenizer.padding_side = "left" и инициализировать токен заполнения в tokenizer.eos_token, который является исходным токеном конца последовательности GPT2. Это наиболее важная часть этого руководства, поскольку GPT2 использует последний токен для прогнозирования, поэтому нам нужно ввести его влево.
HuggingFace уже проделал большую часть работы за нас и добавил уровень классификации в модель GPT2. При создании модели я использовал GPT2ForSequenceClassification. Поскольку у нас есть собственный маркер заполнения, нам нужно инициализировать его для модели с помощью model.config.pad_token_id. Наконец, нам нужно будет переместить модель на устройство, которое мы определили ранее.
Набор данных и подборщик
Здесь я создаю набор данных PyTorch и загрузчик данных с объектами Data Collator, которые будут использоваться для передачи данных в нашу модель.
Здесь я использую класс MovieReviewsDataset для создания набора данных PyTorch, который будет возвращать тексты и метки.
Поскольку нам нужно вводить числа в нашу модель, нам нужно преобразовать тексты и метки в числа. Это цель подборщика! Он принимает данные, выводимые набором данных PyTorch, и передает их через функцию Data Collator для вывода последовательности для нашей модели.
Я держу токенизатор подальше от набора данных PyTorch, чтобы код был чище и лучше структурирован. Очевидно, вы можете использовать токенизатор внутри набора данных PyTorch и выходных последовательностей, которые можно использовать прямо в модели без использования сборщика данных.
Я настоятельно рекомендую использовать текстовый файл проверки, чтобы определить, сколько обучения необходимо, чтобы избежать переобучения. После того, как вы выясните, какие параметры дают наилучшие результаты, файл проверки можно включить в тренировку и запустить финальное обучение со всем набором данных.
Сортировщик данных используется для форматирования выходных данных PyTorch Dataset в соответствии с входными данными, необходимыми для GPT2.
Я создал оптимизатор и планировщик для использования PyTorch в обучении. Я использовал наиболее распространенные параметры, используемые моделями трансформеров.
Я перебрал количество определенных эпох и вызвал функции обучения и проверки.
Я пытаюсь выводить аналогичную информацию после каждой эпохи, как Keras: train_loss: - val_loss: - train_acc: - valid_acc.
После обучения постройте кривые потерь и точности для обучения и проверки, чтобы проверить, как прошло обучение.
Примечание. Графики обучения могут выглядеть немного странно: точность проверки начинается выше, чем точность обучения, а потери проверки начинаются ниже, чем потери при обучении. Обычно бывает наоборот. Я предполагаю, что разделение данных просто проще для части проверки или слишком сложно для части обучения или того и другого. Поскольку это руководство посвящено использованию GPT2 для классификации, я не буду слишком беспокоиться о результатах модели.
Оценка
Имея дело с классификацией, полезно посмотреть на точность и оценку F1.
Хорошим индикатором при оценке модели является confusion matrix.
Заключительное примечание
Если вы дошли до этого места, Поздравляем! 🎊 и спасибо! 🙏 за ваш интерес к моему руководству!
Я использую этот код уже некоторое время , он уже хорошо документирован и прост в использовании.
код : https://github.com/gmihaila/ml_things/issues