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

Предисловие

Библиотека Простые трансформеры построена на основе превосходной библиотеки Трансформеры от Hugging Face. Вы, ребята, невероятные!

Simple Transformers теперь поддерживает:

В разработке еще много чего.

Вступление

Модели-трансформеры и методы трансферного обучения продолжают стремительно продвигать вперед область обработки естественного языка. Однако за высокую производительность слишком часто приходится расплачиваться тоннами (сложного) кода.

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

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

Весь исходный код доступен на Github Repo. Если у вас есть какие-либо проблемы или вопросы, вы можете их решить. Пожалуйста, проверьте это!

Установка

  1. Установите Anaconda или Miniconda Package Manager отсюда.
  2. Создайте новую виртуальную среду и установите пакеты.
    conda create -n simpletransformers python pandas tqdm
    conda activate simpletransformers
    При использовании cuda:
    conda install pytorch cudatoolkit=10.0 -c pytorch
    else:
    conda install pytorch cpuonly -c pytorch
    conda install -c anaconda scipy
    conda install -c anaconda scikit-learn
    pip install transformers
    pip install seqeval
    pip install tensorboardx
  3. Установите Apex, если вы используете тренировку по fp16. Следуйте инструкциям здесь. (Установка Apex из pip вызвала проблемы у нескольких человек.)
  4. Установите простые трансформаторы.
    pip install simpletransformers

Классификация по нескольким этикеткам

Чтобы продемонстрировать классификацию Multilabel, мы будем использовать набор данных Toxic Comments от Kaggle. Загрузите набор данных по ссылке выше и поместите файлы csv в каталог data/.

Подготовка данных

Комментарии в наборе данных были помечены в соответствии с приведенными ниже критериями.

  • toxic
  • severe_toxic
  • obscene
  • threat
  • insult
  • identity_hate

Набор данных содержит столбец для каждого критерия с логическим значением 1 или 0, указывающим, содержит ли комментарий соответствующую токсичность.

Однако для Simple Transformers требуется столбец labels, который содержит списки меток с горячим кодированием, а также столбец text, содержащий весь текст (да!).

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

Теперь набор данных готов к использованию!

Модель классификации с несколькими метками

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

Параметр args принимает дополнительный словарь Python, содержащий значения гиперпараметров и параметры конфигурации. Очень рекомендую проверить все варианты здесь.

Значения по умолчанию показаны ниже.

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

model = MultiLabelClassificationModel('xlnet', 'path_to_model/', num_labels=6)

Обучение

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

Метод train_model создает контрольную точку (сохранение) модели на каждом n -м шаге, где n равно self.args['save_steps']. По завершении обучения окончательная модель будет сохранена в self.args['output_dir'].

Оценка

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

  • результат: Результат оценки в виде dict. По умолчанию для классификации по нескольким меткам указывается только средняя точность ранжирования меток (LRAP).
  • model_outputs: list выходных данных модели для каждого элемента в наборе данных оценки. Это полезно, если вам нужны вероятности для каждого класса, а не одно предсказание. Обратите внимание, что функция sigmoid была применена к каждому выходу для сжатия значений от 0 до ..
  • неправильные_предсказания: list из InputFeature каждого неверного прогноза. Текст можно получить из атрибута InputFeature.text_a. (Класс InputFeature можно найти в файле utils.py в репо)

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

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

Прогнозирование / Тестирование

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

Мы можем попробовать это на тестовых данных, представленных в наборе данных Toxic Comments.

Отправив это в Kaggle, я получил оценку 0,98468, еще раз демонстрируя, как далеко продвинулось НЛП с момента появления Трансформаторов и Трансферного обучения. Имейте в виду, что здесь я не особо настраивал гиперпараметры!

Заключение

BERT и его производные потрясающие! Я надеюсь, что Simple Transformers поможет сгладить несколько неровностей на пути к их использованию.