Современная классификация текста с несколькими ярлыками и классами с помощью XLNet

На момент публикации 19 июня 2019 года XLNet достигла самых современных результатов по 18 задачам, включая классификацию текста, ответы на вопросы, вывод естественного языка, анализ тональности и ранжирование документов.

Он даже превзошел BERT на 20 задачах!

XLNet, разработанная Университетом Карнеги-Меллона и Google Brain, представляет собой авторегрессивную языковую модель на основе перестановок.

Мы не будем слишком углубляться во внутреннюю работу модели, поскольку для этой цели есть много отличных ресурсов. Скорее, в этой статье основное внимание будет уделено применению XLNet для решения проблемы классификации текста с несколькими метками и несколькими классами.

Вступление

Подведем итоги. В задаче классификации на несколько классов существует несколько классов, но любой заданный образец текста будет назначен одному классу.

С другой стороны, в задаче классификации текста с несколькими метками образец текста может быть отнесен к нескольким классам.

Мы будем использовать библиотеку Трансформеры, разработанную HuggingFace. Библиотека Transformers предоставляет простые в использовании реализации множества современных языковых моделей: BERT, XLNet, GPT-2, RoBERTa, CTRL и т. Д.

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

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

Вкратце, есть базовая версия и большая версия XLNet:

  • База XLNet: 12 уровней, 768 скрытых блоков, 12 головок внимания, параметры 110M.
  • XLNet Large: 24 слоя, 768 скрытых блоков, 16 головок внимания, 340M параметров

Мы будем обучать нашу модель на Google Colab, который предоставляет Tesla P100 на 16 ГБ бесплатно!

Из-за ограничений памяти графического процессора Tesla P100 мы будем использовать XLNet Base для нашей задачи.

Мы не будем обучать модель с нуля, а будем настраивать предварительно обученную модель. Эта концепция известна как трансферное обучение.

Без лишних слов, приступим!

Код

Щелкните здесь, чтобы увидеть записную книжку Colab, прилагаемую к этой статье.

Для начала установим необходимую библиотеку, собственно, просто трансформаторы.

Далее импортируем необходимые библиотеки.

Проверьте, доступен ли графический процессор.

Подключите диск Google к ноутбуку Colab.

В нашем примере мы создадим папку Data на нашем диске Google и поместим туда наборы данных.

Прочтите .csv файлы.

Давайте посмотрим на наборы данных.

Давайте быстро проведем EDA. Анализируя распределение этикеток, мы отмечаем несбалансированность этикеток.

Перед подачей фрагмента текста в модель, текст должен быть токенизирован в соответствующие подслова. Для этой цели мы можем использовать XLNetTokenizer от HuggingFace.

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

Мы можем проанализировать распределение количества подслов для комментариев.

Поскольку в большинстве комментариев содержится менее 250 вложенных слов, мы можем усечь или дополнить все комментарии до 250 вложенных слов.

Преобразуйте входящую текстовую последовательность в соответствующие числовые идентификаторы токенов.

Затем мы создадим маски внимания, которые укажут модели на соответствующие токены, на которые следует обратить внимание. Цель состоит в том, чтобы наша модель не обращала внимания на маркеры заполнения.

Добавьте токенизированные числовые входные данные и маски внимания к фрейму данных.

Мы проведем разделение на поезд и проверку для перекрестной проверки.

Создайте массивы функций, масок и меток и преобразуйте их в тензоры факела.

Затем создайте Dataloaders для наборов поездов и проверки. Мы будем использовать размер партии 32.

Если Colab назначит Tesla K80 12 ГБ для вашей среды выполнения, вы можете рассмотреть возможность уменьшения размера пакета до 16, чтобы избежать нехватки памяти графического процессора.

Давайте определим нашу модель классификации XLNet.

Поскольку входная последовательность состоит из 250 токенов, XLNet создаст 250 выходных векторов, каждый из которых будет иметь размерность 768. Мы выполним объединение средних значений выходных векторов и создадим один вектор с размерностью 768. Этот вектор будет вход в полностью связанный слой, который будет прогнозировать 6 меток токсичности комментариев.

Вы определенно можете изучить другие способы объединения выходных данных, такие как объединение выходных данных в один большой вектор или даже использование выходных данных из нескольких последних скрытых слоев XLNet.

Далее инициализируем оптимизатор. Мы будем использовать оптимизатор AdamW. При желании вы также можете настроить расписание скорости обучения.

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

Одна эпоха тренировки на Tesla P100 занимает около 1 часа 30 минут.

После обучения нашей модели мы можем сгенерировать прогнозы для 153 164 тестовых примеров.

Если мы попытаемся спрогнозировать метки для всех тестовых примеров за один раз, нашему графическому процессору, вероятно, не хватит памяти. Решением этого будет создание прогнозов для каждых 32 тестовых примеров и их объединение.

Конечно, размер пакета 32 может быть изменен в зависимости от объема памяти графического процессора.

Отправив результаты в Kaggle, мы получили общий балл 0,98182 и частный балл 0,98323 после единственной эпохи точной настройки. Не слишком потрепанный!

Обратите внимание, что мы не выполняли настройку параметров или разработку функций.

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

Вот и все! Ссылку на записную книжку Colab можно найти здесь.

Спасибо, что прочитали эту статью! Если у вас есть какие-либо мысли или отзывы, оставьте комментарий ниже или отправьте мне письмо по адресу [email protected]. Я был рад услышать от вас!