Узнайте, как использовать модели трансформаторов для выполнения классификации по нескольким меткам всего в 3 строчки кода с помощью простых преобразователей.
Предисловие
Библиотека Простые трансформеры построена на основе превосходной библиотеки Трансформеры от Hugging Face. Вы, ребята, невероятные!
Simple Transformers теперь поддерживает:
- Бинарная классификация
- Мультиклассовая классификация
- Распознавание именованных сущностей (и аналогичные задачи уровня токена)
- Классификация по нескольким меткам
В разработке еще много чего.
Вступление
Модели-трансформеры и методы трансферного обучения продолжают стремительно продвигать вперед область обработки естественного языка. Однако за высокую производительность слишком часто приходится расплачиваться тоннами (сложного) кода.
Simple Transformers позволяет избежать всей сложности и позволяет перейти к тому, что действительно важно, обучению и использованию моделей Transformer. Избегайте всех сложных настроек, шаблонов и других общих неприятностей, чтобы инициализировать модель в одной строке, обучить в следующей и оценить в третьей.
В этом руководстве показано, как можно использовать простые преобразователи для выполнения классификации по нескольким меткам. В классификации Multilabel каждый образец может иметь любую комбинацию (ни одной, одной, некоторых или всех) этикеток из заданного набора этикеток.
Весь исходный код доступен на Github Repo. Если у вас есть какие-либо проблемы или вопросы, вы можете их решить. Пожалуйста, проверьте это!
Установка
- Установите Anaconda или Miniconda Package Manager отсюда.
- Создайте новую виртуальную среду и установите пакеты.
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
- Установите Apex, если вы используете тренировку по fp16. Следуйте инструкциям здесь. (Установка Apex из pip вызвала проблемы у нескольких человек.)
- Установите простые трансформаторы.
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
, который можно использовать для обучения, оценки и прогнозирования задач классификации с несколькими ярлыками. Первый параметр - это тип_модели, второй - имя_модели, а третий - количество меток в данных.
model_type
может быть одним из['bert', 'xlnet', 'xlm', 'roberta', 'distilbert'].
- Полный список предварительно обученных моделей, которые можно использовать для
model_name
, см. В Текущие предварительно обученные модели.
Параметр 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 поможет сгладить несколько неровностей на пути к их использованию.