Создание полезных конвейеров для экспериментов с низким кодом и репозиторием huggingface / transformers проще, чем вы думаете

Быстрые эксперименты с НЛП позволяют получить большую пользу

Если вы читаете это, у вас может быть та же проблема, что и у меня когда-то назад: у вас есть набор данных НЛП и задача, которую нужно решить, вам нужно провести быстрые эксперименты, чтобы создать ценность и запустить модель в производство.

Вы открыли huggingface / transformers, увидели много примеров - и они сработали. Оказывается, когда дело дошло до адаптации к вашему собственному набору данных и задаче, код был слишком длинным, слишком конкретным и просто не мог использоваться для ваших целей.

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

Итак, давайте возьмемся за дело!

Прежде чем ты начнешь

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

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

Для сценария, который мы создадим здесь для запуска, убедитесь, что вы назвали текстовый столбец «предложением», а столбец меток - «меткой».

Теперь мы готовы к работе.

Дорожная карта внедрения

В этом посте наша дорожная карта внедрения будет следующей:

  • Импортируйте каждую библиотеку, которую мы здесь будем использовать, и объясните, почему мы ее используем;
  • Создайте классификатор последовательности с несколькими метками поверх класса AutoModel huggingface / transformers;
  • Создайте вспомогательную функцию для токенизации текстового набора данных;
  • Создавать вспомогательные функции для обучения, прогнозов и метрик из обученной модели;
  • Создайте целевую функцию optuna, чтобы облегчить автоматическую настройку гиперпараметров;
  • Оберните его в параметризуемый, многоразовый скрипт для быстрого экспериментирования с различными задачами НЛП.

Импорт

Вот импорт, который мы используем сегодня:

А теперь, как мы их используем:

  • Весь импорт PyTorch связан с созданием DataLoader, манипулированием тензорами, созданием обучаемой модели и функции потерь.
  • Из Transformers мы импортируем AutoModel, Optimizer, Tokenizer и Config, чтобы иметь возможность загружать любую предварительно обученную языковую модель из их репозитория. Это означает, что мы можем использовать разные языки и наборы данных, если файлы соответствуют предварительной обработке, которую мы делали раньше.
  • Мы импортируем nlp, еще один пакет из HuggingFace, чтобы создать набор данных с помощью файла .csv.
  • Optuna используется для автоматической оптимизации гиперпараметров, помогая нам достичь лучших показателей для нашей модели.
  • Sklearn.metrics и Numpy используются для расчета метрик, а tqdm - только для того, чтобы делать вещи красивыми.

Расширение трансформатора для мультиклассовой классификации

HuggingFace Transformers имеет встроенную классификацию AutoModelForSequenceClassification (FYI, это настоящее название), но поддерживает только двоичную классификацию. Поскольку мы хотим расширить ее на большее количество классов, мы должны создать эту модель самостоятельно.

Это будет несложно. как вы можете видеть здесь, мы просто создадим объект nn.Module, который создаст базу AutoModel, а затем слой Dropout и Linear с желаемым количеством выходных узлов. Обратите внимание, что мы параметризуем его только именем предварительно обученной модели и количеством меток:

Создание функции токенизации

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

Это так просто:

Функция обучения, оценки и метрик

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

Для этого, учитывая набор данных, мы используем очень простую функцию поезда с небольшой адаптацией для объекта набора данных huggingface / nlp:

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

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

Получив для сравнения тензоры меток и прогнозов, мы можем получить метрику. В этой функции я решил позволить пользователю определять метрику для расчета. Обратите внимание, что в дальнейшем мы настроим optuna для настройки гиперпараметров для этой конкретной метрики:

Мы решили поддерживать точность и среднюю точность для оценки всех этикеток и поддерживать бинаризацию + f1, показатели отзыва и точности для настраиваемых конкретных этикеток.

Поскольку у нас есть все эти части здания вместе, мы можем создать целевую функцию optuna. Чтобы вы поняли, это функция, которая выполняет обучение с некоторыми гиперпараметрами и получает объективные метрики. Optuna будет использовать эту целевую функцию, чтобы найти лучшие гиперпараметры в соответствии с желаемой метрикой:

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

Параметризация скрипта

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

Итак, здесь мы параметризуем:

  • Имя модели, поэтому мы можем получить любую модель из репозитория предварительно обученных моделей HuggingFace;
  • обучать и тестировать пути данных, просто чтобы определить имя и путь к файлам;
  • Максимальная длина последовательности, поэтому мы не тратим память при работе с текстом небольшого размера;
  • Имя метрики optuna будет оптимизироваться для поддержки точности а также
  • Обозначьте номер, чтобы мы могли установить количество выходных узлов модели.

Наконец, основная функция

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

С параметрами по умолчанию вы можете вписаться в графический процессор от Google Collab, если захотите его использовать, и он должен дать около 0,9 балла F1. Вот:

Обратите внимание, что мы создаем набор данных, используя nlp lib из HuggingFace, а затем сопоставляем функцию набора данных кодирования со всем набором данных. Это создает атрибут input_ids, который мы используем для получения токенизированных текстов при обучении и выводе.

Заключение

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

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

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

Если у вас есть какие-либо комментарии, критики или вы просто хотите поговорить о НЛП, глубоком обучении или даже написать эту серию вместе со мной, свяжитесь со мной в LinkedIn, чтобы мы могли поговорить.

Спасибо за ваше время, и я надеюсь, что помог вам.

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