Простое и быстрое трансферное обучение с использованием новейших моделей НЛП

Прошлой осенью, пытаясь настроить предварительно обученную многоязычную модель BERT для интеллектуального анализа аргументов (выявления структур аргументов в тексте) в контексте моей магистерской диссертации, я наткнулся на фреймворк с открытым исходным кодом FARM (F Рамка для A создания R презентации (M моделей) от Deepset.ai. Они предоставили не только немецкую модель BERT, но и легко реализуемую структуру с обширными функциями для трансферного обучения. Не сказал бы, что это спасло мою диссертацию, но хоть много нервов и волос на голове.

В этой статье я даю руководство по классификации жанров новостных статей с использованием структуры на основе необработанного набора данных BBC News Article Д. Грина и П. Каннингема [1]. О процессе подготовки данных читайте в моей последней статье.

Сначала я кратко опишу трансферное обучение и BERT. Затем я предоставлю вам руководство, которое сделает из вас настоящего ФЕРМЕРА 👩‍🌾👨‍🌾.

BERT и трансферное обучение

BERT (Представления двунаправленного кодера от трансформаторов) был опубликован год назад Девлином, Чангом, Ли и Тутановой [2]. Эта инновационная новая модель позволила достичь новейших результатов в одиннадцати задачах НЛП, таких как ответы на вопросы (SQuAD) или распознавание именованных сущностей (NER).

Он сочетает в себе технические инновации, такие как двунаправленное обучение Transformers для языкового моделирования, с возможностью переноса обучения для множества различных задач. Если вы хотите узнать больше о модели, я настоятельно рекомендую прочитать исходную статью, поскольку я не буду описывать ее более подробно.

Адаптация обучения от одной проблемы к новой и отличной задаче представляет собой идею трансферного обучения. Если подумать, человеческое обучение во многом основано на этом подходе к обучению. Благодаря переносу обучения изучение Java показалось мне довольно легким, поскольку я уже имел представление о концепциях программирования и синтаксисе Python, когда начинал процесс обучения.

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

Станьте ФЕРМЕРОМ 👩‍🌾👨‍🌾

После этого краткого введения в тему давайте готовимся к работе.

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

Итак, теперь мы однозначно готовы выйти на поле. Запустите предпочитаемую IDE (я опишу, как использовать ее в Google Colab), сделайте глубокий вдох и вперед.

Настраивать

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

Чтобы использовать FARM в Google Colab, вам необходимо установить его. Это можно сделать двумя разными способами:

Если вы хотите работать со стабильным релизом, то ищите последний релиз на вкладке релиза в репозитории Github. В настоящее время последней версией является версия 0.4.3, которую мы устанавливаем в Google Colab с помощью следующей команды:

!pip install farm==0.4.3

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

!git clone https://github.com/deepset-ai/FARM.git
!pip install -r FARM/requirements.txt
!pip install FARM/

После установки FARM в нашу среду нам также необходимо загрузить данные для обучения нашей модели. Клонируя мой репозиторий GitHub, мы можем получить доступ к данным из Colab.

!git clone https://github.com/guggio/bbc_news

Если мы откроем нашу левую панель в пользовательском интерфейсе Colab, теперь мы увидим папку bbc_news, добавленную к нашим файлам. Для точной настройки мы будем использовать данные поезда и тестирования, расположенные в папке generated_data в каталоге bbc_news.

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

Если нас интересует более подробная аналитика для нашего эксперимента, мы можем отслеживать обучение на публичном сервере MLflow FARM.

Итак, мы почти готовы перейти к реальной части кодирования. Но прежде чем приступить к этому, давайте инициализируем некоторые переменные среды, которые нам понадобятся в процессе.

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

Обработка данных

Я помню, как отчаянно пытался предварительно обработать свои данные для анализа аргументов (классификация по токенам, аналогично NER) и в конечном итоге потерпел неудачу из-за токенизации словесных блоков BERT в соответствии с традиционным подходом с HuggingFace.

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

Чтобы преобразовать входные данные (файлы или запросы) в наборы данных PyTorch, мы используем процессоры.

Для выполнения своей работы процессору требуется токенизатор, который мы можем просто загрузить на основе нашей требуемой языковой модели. Поскольку мы работаем с английскими текстами, которые содержат слова в верхнем и нижнем регистрах, мы будем использовать базовую модель BERT и установить do_lower_case false.

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

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

После создания процессора мы можем загрузить хранилище данных.

Моделирование и обучение

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

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

Достаточно поговорить о структуре адаптивной модели, давайте определим нашу модель и инициализируем оптимизатор.

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

Теперь пора нажать на кнопку. Пусть обучение начнется:

trainer.train()

Это запустит процесс обучения, который займет от 3 до 4 минут для нашего набора данных. Тогда пора пожинать то, что мы сеем 🌽

Сразу после двух эпох модель показала невероятные результаты на тестовом наборе с общим средним макро-средним баллом F1 0,97. Обратите внимание, что эти результаты были достигнуты без какой-либо настройки гиперпараметров.

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

В случае, если мы инициализировали ML-ведение журнала в начале, теперь мы можем получить доступ к дополнительной информации о нашем эксперименте на сервере MLflow, например, о развитии потерь при обучении.

Сохранение и выполнение вывода

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

Мы также можем извлечь модель из Colab и загрузить ее с помощью следующей команды. Перейдите на левую панель в пользовательском интерфейсе Colab, выберите zip-файл и загрузите его.

!zip -r saved_models/model.zip saved_models/bert-english-news-article

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

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

Разберем подготовленные статьи!

Заключение

Если вы дойдете до этого места, у вас будет замечательный урожай! 🌽

Как показано в этой статье, трансферное обучение с помощью FARM - это простой и понятный процесс, который предлагает множество возможностей настройки. Таким образом, вы можете рассмотреть ФАРМ для решения следующих задач НЛП.

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

Большое спасибо за чтение и удачного кодирования!

использованная литература

[1] Д. Грин и П. Каннингем. «Практические решения проблемы диагонального доминирования в кластеризации ядерных документов», Тр. ICML 2006.

[2] Девлин, Дж., Чанг, М.-В., Ли, К., и Тутанова, К. (2019). BERT: Предварительная подготовка глубоких двунаправленных преобразователей для понимания языка. Google AI Language. Https://arxiv.org/pdf/1810.04805.pdf