Простое и быстрое трансферное обучение с использованием новейших моделей НЛП
Прошлой осенью, пытаясь настроить предварительно обученную многоязычную модель 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