Создайте неанглийскую (немецкую) модель многоклассовой классификации текста BERT с помощью HuggingFace и Simple Transformers.

Первоначально опубликовано на https://www.philschmid.de 22 мая 2020 г.

Вступление

В настоящее время в мире проживает 7,5 миллиардов человек примерно в 200 странах. Только 1,2 миллиарда из них являются носителями английского языка. Это приводит к появлению большого количества неструктурированных текстовых данных не на английском языке.

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

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

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

«многоязычный или не многоязычный, вот в чем вопрос» - как сказал бы Шекспир

Многоязычные модели описывают модели машинного обучения, которые могут понимать разные языки. Примером многоязычной модели является mBERT из исследования Google. Эта модель поддерживает и понимает 104 языка. Одноязычные модели, как следует из названия, могут понимать один язык.

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

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

Руководство

Мы собираемся использовать Simple Transformers - библиотеку НЛП, основанную на библиотеке Transformers от HuggingFace. Simple Transformers позволяет нам настраивать модели Transformer с помощью нескольких строк кода.

В качестве набора данных мы будем использовать Germeval 2019, который состоит из немецких твитов. Мы собираемся обнаруживать и классифицировать твиты, содержащие оскорбления. Эти твиты делятся на 4 класса: PROFANITY, INSULT, ABUSE и OTHERS. Наивысший балл по этому набору данных - 0.7361.

Мы собираемся:

  • установить библиотеку Simple Transformers
  • выберите предварительно обученную одноязычную модель
  • загрузить набор данных
  • обучить / настроить нашу модель
  • оценивать результаты обучения
  • сохранить обученную модель
  • загрузить модель и спрогнозировать реальный пример

Для этого урока я использую Google Colab со средой выполнения на графическом процессоре. Если вы не знаете, как использовать GPU Runtime, загляните сюда.

Установить библиотеку Simple Transformers

Сначала мы устанавливаем simpletransformers с помощью pip. Если вы не используете Google colab, вы можете ознакомиться с руководством по установке здесь.

Выберите предварительно обученную одноязычную модель

Далее выбираем предварительно обученную модель. Как упоминалось выше, библиотека Simple Transformers основана на библиотеке Transformers от HuggingFace. Это позволяет нам использовать каждую предварительно обученную модель, представленную в Библиотеке Transformers, и все модели, загруженные сообществом. Список, включающий все модели, загруженные сообществом, можно найти на https://huggingface.co/models.

Мы собираемся использовать модель distilbert-base-german-cased, меньшую, более быструю и дешевую версию BERT. Он использует на 40% меньше параметров, чем bert-base-uncased, и работает на 60% быстрее, сохраняя при этом более 95% производительности Bert.

Загрузите набор данных

Набор данных хранится в двух текстовых файлах, которые мы можем получить со страницы соревнований. Один из вариантов их загрузки - использовать две простые wget команды CLI.

После этого мы используем некоторую pandas магию для создания фрейма данных.

Поскольку у нас нет тестового набора данных, мы разделили его - train_df и test_df. Мы используем 90% данных для обучения (train_df) и 10% для тестирования (test_df).

Загрузить предварительно обученную модель

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

  • архитектура (в нашем случае "bert")
  • предварительно обученная модель ("distilbert-base-german-cased")
  • количество меток класса (4)
  • и наш гиперпараметр для обучения (train_args).

Вы можете настроить гиперпараметр в широком диапазоне возможностей. Подробное описание каждого атрибута см. В документации.

Обучить / настроить нашу модель

Чтобы обучить нашу модель, нам нужно только запустить model.train_model() и указать, на каком наборе данных нужно тренироваться.

Оцените результаты обучения

После того, как мы успешно обучили нашу модель, мы можем ее оценить. Поэтому мы создаем простую вспомогательную функцию f1_multiclass(), которая используется для вычисления f1_score. f1_score - это показатель точности модели. Подробнее об этом здесь.

Мы достигли f1_score из 0.6895. Поначалу это кажется довольно низким, но имейте в виду: наибольшее количество заявок на Germeval 2019 было 0.7361. Мы бы попали в топ-20 без настройки гиперпараметра. Это впечатляет!

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

Сохраните обученную модель

Simple Transformers автоматически сохраняет model каждые 2000 шагов и в конце процесса обучения. Каталог по умолчанию - outputs/. Но output_dir является гиперпараметром и может быть перезаписан. Я создал вспомогательную функцию pack_model(), которую мы используем для pack всех необходимых файлов модели в tar.gz файл для развертывания.

Загрузите модель и спрогнозируйте реальный пример

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

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

После его инициализации мы можем использовать функцию model.predict() для классификации вывода с заданным вводом. В этом примере мы берем два твита из набора данных Germeval 2018.

Наша модель предсказала правильный класс OTHER и INSULT.

Продолжить

В заключение можно сказать, что мы достигли нашей цели по созданию неанглийской модели классификации текста на основе BERT.

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

Спасибо за прочтение. Записную книжку colab с полным кодом вы можете найти здесь.

Если у вас есть какие-либо вопросы, не стесняйтесь обращаться ко мне.