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

BERT (сокращение от Bidirectional Encoder Views from Transformers) - первая модель, использующая двунаправленное обучение трансформеров для решения языковых проблем, таких как ответы на вопросы или логический вывод на естественном языке, с довольно значительными улучшениями результатов, вплоть до этот момент. Например, показатель GLUE (набор диагностических данных, предназначенный для оценки и анализа производительности модели в отношении широкого спектра языковых явлений, обнаруженных в естественном языке) повышается до 80,5% (72,8% ранее) или до 93,2% в тесте F1 ( 90% раньше) для SQuAD (тест вопрос-ответ).

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

BERT был предварительно обучен работе с BookCorpus и Wikipedia и требует специальной настройки, адаптированной к задаче, которую мы пытаемся выполнить.

Но как именно работает BERT?

BERT использует Transformer, механизм внимания, который изучает контекстные отношения между словами (или подсловами) в тексте. Механизмы внимания ранее использовались с довольно хорошими результатами, но революция, подразумеваемая в этой модели, заключается в потере направленности. Направленные модели НЛП читают вводимый текст последовательно (слева направо или справа налево). Однако BERT читает сразу все предложение. Эта функция позволяет модели узнавать контекст слова на основе всех слов, которые его окружают, а не только предыдущих или следующих.

Основная проблема при обучении языковых моделей - определить, что мы стремимся прогнозировать. Естественный подход - попытаться предсказать следующее слово на основе предыдущего: «Вчера я ел пасту на ___». Однако это подразумевает направленный подход, и, как мы уже говорили ранее, цель этой модели состоит в том, чтобы избежать направленности. BERT объединяет два метода обучения, чтобы преодолеть эту проблему: модель маскированного языка и прогнозирование следующего предложения.

Маскированная языковая модель

Модель заменяет 15% слов в каждом предложении токеном (который будет называться маской), а затем пытается предсказать эти замаскированные слова на основе контекста, заданного немаскированными словами. После этого функция потерь BERT вычисляется только с учетом прогноза замаскированных значений и игнорированием остальных. Из-за этого модели требуется больше времени для схождения, чем модели направления, но, в свою очередь, эта модель лучше осведомлена о контексте.

Предсказание следующего предложения

Другой процесс прогнозирования связан с контекстом между предложениями, а не в предложениях. Эта модель получает пары предложений и учится определять, является ли второе предложение тем, которое следует за первым предложением в тексте. Соотношение истинных и ложных пар составляет 50–50 (т. Е. Половина пар, представленных в модели, состоит из последовательных предложений, а другая половина - нет).

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

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

Краткий практический пример

Давайте проверим пример текстовой двоичной классификации с использованием BERT. В этом примере мы выполняем анализ настроений по набору данных, состоящему из мнений, оставленных пользователями на IMDB. Фильмы классифицируются как плохие (0) или хорошие (1). Набор данных доступен по следующей ссылке.

Мы будем использовать следующие модули:

Мы повторно используем токенизатор и модель, хранящиеся в TensorFlow Hub (библиотека для многоразовых модулей машинного обучения). Мы реализуем следующую функцию, чтобы получить токенизатор из хаба:

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

Мы определяем модель, которую собираемся использовать:

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

Наконец, мы завершаем это функцией, которая принимает данные и параметры, адаптируя все данные к форме ввода, ожидаемой моделью, обучает BERT над ней, а затем тестирует ее; возвращает результат ранее определенных показателей оценки:

Итак, теперь мы готовы настроить модель, чтобы выполнить двоичную классификацию. Зафиксируем каталог, в котором будет храниться получившаяся модель:

OUTPUT_DIR = '/results/BERT_Imdb'

Файл данных, который мы используем, имеет формат pickle. Мы читаем из него данные и загружаем их в два фрейма данных Pandas (один для обучения и один для тестирования):

Мы можем взглянуть и увидеть, как выглядят эти данные:

train.head()
test.head()

Далее нам просто нужно исправить параметры модели:

  • DATA_COLUMN: Имя столбца, в котором хранится вводимый текст.
  • LABEL_COLUMN: Имя столбца, в котором хранятся теги.
  • LEARNING_RATE: значение скорости обучения.
  • NUM_TRAIN_EPOCHS: Количество эпох, в течение которых длится тренировочный процесс.

Мы используем словарь, чтобы исправить их:

myparam = {
        "DATA_COLUMN": "text",
        "LABEL_COLUMN": "sentiment",
        "LEARNING_RATE": 2e-5,
        "NUM_TRAIN_EPOCHS":10
    }

Наконец, мы готовы настроить модель, обучить ее и протестировать на наших данных:

Перед печатью результатов мы определим небольшую функцию, чтобы получить более приятный результат:

Теперь просто набрав:

pretty_print(result)

Получаем таблицу с результатом всех ранее определенных метрик, вычисленных в ходе теста: