Построение языкового классификатора с использованием вложения предложений

Сотрудники Google опубликовали многоязычную модель встраивания BERT под названием LaBSE. Он производит не зависящие от языка вложения предложений для более чем 100 языков в одной модели. Модель обучена генерировать похожие вложения для двуязычных пар предложений, которые являются переводами друг друга.

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

Данные обучения

Мои данные о тренировках состояли из ~ 550 тысяч коротких текстов, половина из которых была связана с футболом. Вот некоторые примеры:

  • В этот раз мы временами играли хорошо и усложняли им задачу, и это нелегко, потому что у них есть болельщики, и они являются очень хорошей футбольной командой ». 26-летний болельщик "Ливерпуля" был выписан из больницы в Неаполе в среду после нападения фанатов соперника перед игрой.
  • Соединение смерти Макнила и Чалмерса также сопровождалось жутким ощущением вмешательства из другого измерения. В субботу, после яркого празднования карьеры Макнила, игра против Килмарнока была завершена голом, забитым на 67-й минуте игры центральным полузащитником с пятым номером Макнила.
  • Плата в размере 180 миллионов евро (166,4 миллиона) была установлена ​​для 18-летнего нападающего, который очень хотел присоединиться к ПСЖ, клубу, который он поддерживал, когда рос в Париже. Мбаппе отказывается подписывать новый контракт с Монако, которое надеялось удержать его еще на один год.

Загрузка LaBSE

LaBSE доступен в Tensorflow Hub, что упрощает интеграцию с Keras. Вы можете использовать слой Tensorflow Hub в своей модели и просто указать его на предварительно обученную сохраненную модель (https://tfhub.dev/google/LaBSE/1).

Входные данные такие же, как в стандартном BERT: токенизированный текст, маска ввода, определяющая, как текст был дополнен, и идентификаторы сегментов, которые всегда равны нулю.

Остальная часть модели

Поскольку я обучал свою модель только относительно небольшому количеству данных на английском языке, я не хотел трогать изученные веса из LaBSE. Вы можете сделать это, установив для флага trainable значение false для слоя LaBSE, что замораживает веса во время обучения. Я просто добавил пару полностью связанных слоев, которые используют необработанные вложения в качестве входных данных, и настроил эти слои для этой конкретной задачи.

Окончательная модель представлена ​​в таблице ниже. Модель выглядит простой, потому что KerasLayer скрывает сложность LaBSE.

Благодаря LaBSE почти полмиллиарда параметров, но при обучении будет корректироваться только 0,1%. Размер ввода - 256, что является максимальной длиной вводимого текста. Более короткие тексты в данных будут дополнены до этой длины.

Предварительная обработка данных

Сначала вам нужно создать токенизатор BERT для преобразования входящего текста в токены, которые понимает модель. Функция create_bert_input преобразует текст в идентификаторы токенов с помощью токенизатора, а затем либо усекает, либо дополняет его в зависимости от его длины.

Вы можете найти следующий код в Tensorflow Hub: https://tfhub.dev/google/LaBSE/1

У меня есть помеченные данные в CSV с двумя столбцами: «цель» и «предложение». Первое - просто 1, если предложение касается футбола, и ноль, если нет. А с помощью функции create_bert_input, определенной ранее, предложения преобразуются в три массива numpy, совместимых с моделью.

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

Я обучил модель на платформе искусственного интеллекта Google Cloud, которая предлагает размещенные ноутбуки Jupyter с бэкэндами графического процессора. Обучение в течение одной эпохи заняло примерно час с одним Nvidia V100, и только после двух эпох точность проверки упала до 98,6%. В обратном вызове EarlyStopping я установил терпение на единицу, поэтому он тренировался 4 эпохи перед остановкой.

Train on 496965 samples, validate on 55219 samples
Epoch 1/20
- loss: 0.0615 - accuracy: 0.9810 - auc: 0.9941 
- val_loss: 0.0564 - val_accuracy: 0.9826 - val_auc: 0.9953
Epoch 2/20
- loss: 0.0488 - accuracy: 0.9857 - auc: 0.9956
- val_loss: 0.0480 - val_accuracy: 0.9863 - val_auc: 0.9951
Epoch 3/20
- loss: 0.0438 - accuracy: 0.9873 - auc: 0.9963
- val_loss: 0.0458 - val_accuracy: 0.9863 - val_auc: 0.9960
Epoch 4/20
- loss: 0.0401 - accuracy: 0.9883 - auc: 0.9968
- val_loss: 0.0470 - val_accuracy: 0.9869 - val_auc: 0.9951

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

Оценивайте с другими языками

Первоначальная цель заключалась в создании не зависящего от языка классификатора, поэтому я также оценил модель с финскими и немецкими текстами. У меня было 20–30 тысяч положительных и отрицательных текстов о футболе на обоих языках, и модель смогла правильно классифицировать их с точностью ›80%.

Finnish (41022 examples):
- loss: 0.8141 - accuracy: 0.8224 - auc: 0.9332
German (66754 examples):
- loss: 0.5621 - accuracy: 0.8688 - auc: 0.9415

Измерение точности с помощью случайных текстов

Я также классифицировал набор случайных финских текстов с помощью модели, чтобы лучше понять точность. Из ~ 2000 текстов он классифицировал 14 текстов как футбол, и 11 из них были правильными, согласно моему ручному обзору. Что не так уж и плохо. Ну, это была небольшая выборка, но все же.

Вот некоторые из текстов (на финском), классифицируемых как футбол. Например. один текст Формулы 1 по какой-то причине был неправильно отнесен к футболу.

  • 0.981406 Viistosti kohti maalia […]. Lue lisää.
  • 0.9838743 Ohjeistus oli selvä, että meidän pitää pysyä täällä, joten olin hieman yllättynyt, että jotkut matkustivat koteihinsa, ranskalainen kommentoi. Ferrarille varoitus oli toinen, sillä Sebastian Vettel oli nähty viime viikolla keskustelemassa Red Buliin Christian Hornerin ja Helmut Markon kanssa ilman maskia.
  • 0.8813341 ManU-kamppailu mukaan luettuna sen taivalta tämän kauden liigassa on jäljellä vain 13 ottelua. ManUlle ottelu merkitsee lähinnä kunniasta pelaamista ja Mestarien liigaan oikeuttavien sijojen jahtaamista.
  • 0.9545789 Кеоун (кувасса) корваа каптенина селкаваивайзен Тони Адамсин, джонка вамма тули маанантаин амухарджойтуксисса. Aiemmin olivat loukkaantumisen takia jo sivuun jääneet puolustaja Graeme Le Saux, varakapteeni David Beckham ja Steven Gerrad.
  • 0.6568378 Saa nähdä värjääkö hän koko päänsä kultaiseksi, jos Ranska vie mestaruuden.

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